ipload
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- .gitattributes +2 -0
- 07fd528a97d31204dfaf8363f4a07eb3.json +0 -0
- 09ae39d544ac2e2a8e276f95d3f0dc50.json +29 -0
- 12892fa5600bfeebeb8237fe52faec7a.json +0 -0
- 280ee43145431e29ce1f8194d768083a.json +0 -0
- 2aa832db180a76e905044673bb878cbd.json +39 -0
- 2c38236c4471e161509b2a71cfd44a9f.json +44 -0
- 34de00c9468eb9197864c154647cc3d6.json +19 -0
- 36cb98d23e37dc15d13eebd50a6e06d4.json +19 -0
- 37838d5288c7f6b9ee5b5a367fb02ab7.json +19 -0
- 37987ddade14ae2a6b6fa13bc2ff9450.json +64 -0
- 483c06b3b38c871dc3670dea5054ef70.json +19 -0
- 5c537b189f5079740a704286f90e4428.json +3 -0
- 6153faae2e094b5e54e81566f4fda6d1.json +0 -0
- 695c3097bae6d039bfccf0a470613925.json +0 -0
- 6fdad44d776a0611631264d389d28f83.json +89 -0
- 75448addd639eeefa4f7e1bf82eec857.json +19 -0
- 87bde3e51835c6fe8a551e040927b70a.json +0 -0
- 89999b89c91b5b10dccecf8fc1ae90d5.json +19 -0
- 8baa2f5937a004fca77613f9fae1821e.json +0 -0
- 8bd18a48d36a1a101b6ab9044d1f651c.json +0 -0
- 8f56b34b5833aed95e029da1d292b700.json +29 -0
- 9779fe767985a3c1e8c6905c9b3fea3f.json +49 -0
- a4cf1d49fb5acd82039c3c4524e37514.json +0 -0
- af3851767ed08812bd65eda8bcc63205.json +19 -0
- c4d9948c3b5c70794c0e6d5dbdc042da.json +0 -0
- e0814670f4fd7a61e27132ee49c6a350.json +0 -0
- e8ea01609a8a8e326963805e1cd2592e.json +29 -0
- fa1d440547004667e76e49276ecd94a0.json +0 -0
- github_ronelsolomon_2D-Farming-Game.git.json +0 -0
- github_ronelsolomon_2d-game-dev.git.json +19 -0
- github_ronelsolomon_2d-game.git.json +0 -0
- github_ronelsolomon_AI-Engineer-questions.git.json +19 -0
- github_ronelsolomon_AWS-backend.git.json +89 -0
- github_ronelsolomon_ETL-pipeline.git.json +64 -0
- github_ronelsolomon_FindYoutube.git.json +0 -0
- github_ronelsolomon_Graph-k-means.git.json +19 -0
- github_ronelsolomon_ai-videos.git.json +19 -0
- github_ronelsolomon_aiadds.git.json +19 -0
- github_ronelsolomon_air-quality-MLOPs.git.json +0 -0
- github_ronelsolomon_aivideo.git.json +29 -0
- github_ronelsolomon_aleoex.git.json +0 -0
- github_ronelsolomon_assementTemplate.git.json +49 -0
- github_ronelsolomon_cebras.git.json +39 -0
- github_ronelsolomon_changeAudio.git.json +44 -0
- github_ronelsolomon_crawlerx.git.json +0 -0
- github_ronelsolomon_csvDashboardRetetion.git.json +19 -0
- github_ronelsolomon_curify-gallery.git.json +0 -0
- github_ronelsolomon_dev.git.json +29 -0
- github_ronelsolomon_dma.git.json +0 -0
.gitattributes
CHANGED
|
@@ -39,3 +39,5 @@ faiss_metadata[[:space:]]copy.json filter=lfs diff=lfs merge=lfs -text
|
|
| 39 |
faiss_metadata.json filter=lfs diff=lfs merge=lfs -text
|
| 40 |
repositories.json filter=lfs diff=lfs merge=lfs -text
|
| 41 |
repositories.json[[:space:]]20-24-51-308.json filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
| 39 |
faiss_metadata.json filter=lfs diff=lfs merge=lfs -text
|
| 40 |
repositories.json filter=lfs diff=lfs merge=lfs -text
|
| 41 |
repositories.json[[:space:]]20-24-51-308.json filter=lfs diff=lfs merge=lfs -text
|
| 42 |
+
5c537b189f5079740a704286f90e4428.json filter=lfs diff=lfs merge=lfs -text
|
| 43 |
+
github_ronelsolomon_file-audio.git.json filter=lfs diff=lfs merge=lfs -text
|
07fd528a97d31204dfaf8363f4a07eb3.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
09ae39d544ac2e2a8e276f95d3f0dc50.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/keboola-mcp.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "keboola-mcp.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:50:32.421394",
|
| 6 |
+
"files": {
|
| 7 |
+
".gitattributes": {
|
| 8 |
+
"content": "# Auto detect text files and perform LF normalization\n* text=auto\n",
|
| 9 |
+
"size": 66,
|
| 10 |
+
"language": "unknown"
|
| 11 |
+
},
|
| 12 |
+
"gif_from_images.py": {
|
| 13 |
+
"content": "# gif_from_images.py\nfrom PIL import Image\nimport os\n\nframes = []\nimgs = [f for f in os.listdir('./images') if f.endswith('.png') or f.endswith('.jpg')]\nimgs.sort()\nfor img in imgs:\n frame = Image.open(f'./images/{img}')\n frames.append(frame)\n\nframes[0].save('out.gif', format='GIF', append_images=frames[1:], save_all=True, duration=200, loop=0)\n",
|
| 14 |
+
"size": 353,
|
| 15 |
+
"language": "python"
|
| 16 |
+
},
|
| 17 |
+
"gif-maker.js": {
|
| 18 |
+
"content": "// gif-maker.js\nconst { convert_video_to_gif } = require('gif-creator-mcp');\n\n(async () => {\n await convert_video_to_gif({\n video_path: \"./videos/video.mp4\",\n fps: 8,\n width: 250,\n duration: 4 // Only the first 4 seconds\n });\n console.log(\"GIF created!\");\n})();\n",
|
| 19 |
+
"size": 277,
|
| 20 |
+
"language": "javascript"
|
| 21 |
+
}
|
| 22 |
+
},
|
| 23 |
+
"_cache_metadata": {
|
| 24 |
+
"url": "https://github.com/ronelsolomon/keboola-mcp.git",
|
| 25 |
+
"content_type": "github",
|
| 26 |
+
"cached_at": "2026-03-02T22:50:32.421886",
|
| 27 |
+
"cache_key": "09ae39d544ac2e2a8e276f95d3f0dc50"
|
| 28 |
+
}
|
| 29 |
+
}
|
12892fa5600bfeebeb8237fe52faec7a.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
280ee43145431e29ce1f8194d768083a.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
2aa832db180a76e905044673bb878cbd.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/cebras.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "cebras.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:49:08.429260",
|
| 6 |
+
"files": {
|
| 7 |
+
"requirements.txt": {
|
| 8 |
+
"content": "cerebras-cloud-sdk>=0.1.0\npython-dotenv>=1.0.0\n",
|
| 9 |
+
"size": 47,
|
| 10 |
+
"language": "text"
|
| 11 |
+
},
|
| 12 |
+
"README.md": {
|
| 13 |
+
"content": "# Cerebras Chat Completion Example\n\nThis project demonstrates how to use the Cerebras SDK to generate chat completions using the Llama 4 model.\n\n## Prerequisites\n\n- Python 3.8+\n- Cerebras API key (get it from [Cerebras Console](https://console.cerebras.net/))\n\n## Setup\n\n1. Clone this repository\n2. Install the required dependencies:\n ```bash\n pip install -r requirements.txt\n ```\n3. Set your Cerebras API key as an environment variable:\n ```bash\n # On macOS/Linux\n export CEREBRAS_API_KEY='your-api-key-here'\n \n # On Windows (Command Prompt)\n set CEREBRAS_API_KEY=your-api-key-here\n \n # On Windows (PowerShell)\n $env:CEREBRAS_API_KEY='your-api-key-here'\n ```\n\n## Usage\n\nRun the chat completion example:\n\n```bash\npython cebras.py\n```\n\n## Environment Variables\n\n- `CEREBRAS_API_KEY`: Your Cerebras API key (required)\n\n## Example\n\nThe script will send a chat completion request to the Cerebras API and stream the response to the console.\n",
|
| 14 |
+
"size": 962,
|
| 15 |
+
"language": "markdown"
|
| 16 |
+
},
|
| 17 |
+
".env": {
|
| 18 |
+
"content": "CEREBRAS_API_KEY=\"csk-y933tjkj4d4fct3jr2xny2yp9k8xkx4kh3rk2d6e59kywpk3\"",
|
| 19 |
+
"size": 71,
|
| 20 |
+
"language": "unknown"
|
| 21 |
+
},
|
| 22 |
+
".gitattributes": {
|
| 23 |
+
"content": "# Auto detect text files and perform LF normalization\n* text=auto\n",
|
| 24 |
+
"size": 66,
|
| 25 |
+
"language": "unknown"
|
| 26 |
+
},
|
| 27 |
+
"cebras.py": {
|
| 28 |
+
"content": "import os\nfrom cerebras.cloud.sdk import Cerebras\n\nclient = Cerebras(\n # This is the default and can be omitted\n api_key=\"csk-y933tjkj4d4fct3jr2xny2yp9k8xkx4kh3rk2d6e59kywpk3\"\n #os.environ.get(\"csk-y933tjkj4d4fct3jr2xny2yp9k8xkx4kh3rk2d6e59kywpk3\")\n)\n\nstream = client.chat.completions.create(\n messages=[\n {\n \"role\": \"system\",\n \"content\": \"What is a Rock\"\n }\n ],\n model=\"llama-4-scout-17b-16e-instruct\",\n stream=True,\n max_completion_tokens=2048,\n temperature=0.2,\n top_p=1\n)\n\nfor chunk in stream:\n print(chunk.choices[0].delta.content or \"\", end=\"\")",
|
| 29 |
+
"size": 617,
|
| 30 |
+
"language": "python"
|
| 31 |
+
}
|
| 32 |
+
},
|
| 33 |
+
"_cache_metadata": {
|
| 34 |
+
"url": "https://github.com/ronelsolomon/cebras.git",
|
| 35 |
+
"content_type": "github",
|
| 36 |
+
"cached_at": "2026-03-02T22:49:08.429936",
|
| 37 |
+
"cache_key": "2aa832db180a76e905044673bb878cbd"
|
| 38 |
+
}
|
| 39 |
+
}
|
2c38236c4471e161509b2a71cfd44a9f.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/changeAudio.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "changeAudio.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:49:11.318653",
|
| 6 |
+
"files": {
|
| 7 |
+
"RECORDS": {
|
| 8 |
+
"content": "cu01\ncu02\ncu03\ncu04\ncu05\ncu06\ncu07\ncu08\ncu09\ncu10\ncu11\ncu12\ncu13\ncu14\ncu15\ncu16\ncu17\ncu18\ncu19\ncu20\ncu21\ncu22\ncu23\ncu24\ncu25\ncu26\ncu27\ncu28\ncu29\ncu30\ncu31\ncu32\ncu33\ncu34\ncu35\n",
|
| 9 |
+
"size": 175,
|
| 10 |
+
"language": "unknown"
|
| 11 |
+
},
|
| 12 |
+
".DS_Store": {
|
| 13 |
+
"content": "\u0000\u0000\u0000\u0001Bud1\u0000\u0000\u0018\u0000\u0000\u0000\b\u0000\u0000\u0000\u0018\u0000\u0000\u0000\u0010\u000b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0000\u0000\u0000\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0001\u0000\u0000\u0010\u0000\u0000e\u0000n\u0000t\u0000r\u0000i\u0000c\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\b\u000b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000 \u0000\u0000\u0000\u0001\u0000\u0000\u0000@\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0001\u0000\u0000 \u0000\u0000\u0000\u0000\u0001\u0000\u0000@\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0001\u0000@\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0001\b\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0001 \u0000\u0000\u0000\u0000\u0000\u0000\u0001@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000-\u0000c\u0000u\u0000-\u0000v\u0000e\u0000n\u0000t\u0000r\u0000i\u0000c\u0000u\u0000l\u0000a\u0000r\u0000-\u0000t\u0000a\u0000c\u0000h\u0000y\u0000a\u0000r\u0000r\u0000h\u0000y\u0000t\u0000h\u0000m\u0000i\u0000a\u0000-\u0000d\u0000a\u0000t\u0000a\u0000b\u0000a\u0000s\u0000e\u0000-\u00001\u0000.\u00000\u0000.\u00000dsclbool\u0000\u0000\u0000\u0000-\u0000c\u0000u\u0000-\u0000v\u0000e\u0000n\u0000t\u0000r\u0000i\u0000c\u0000u\u0000l\u0000a\u0000r\u0000-\u0000t\u0000a\u0000c\u0000h\u0000y\u0000a\u0000r\u0000r\u0000h\u0000y\u0000t\u0000h\u0000m\u0000i\u0000a\u0000-\u0000d\u0000a\u0000t\u0000a\u0000b\u0000a\u0000s\u0000e\u0000-\u00001\u0000.\u00000\u0000.\u00000lsvCblob\u0000\u0000\u00035bplist00\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\n\u001aTUVW\fYXiconSize_\u0010\u000fshowIconPreviewWcolumns_\u0010\u0011calculateAllSizes_\u0010\u000fscrollPositionYXtextSize_\u0010\u000fscrollPositionXZsortColumn_\u0010\u0010useRelativeDates_\u0010\u0012viewOptionsVersion#@0\u0000\u0000\u0000\u0000\u0000\u0000\t\u000e\u0017\u001c!%*/49=BFJN\u000f\u0010\u0011\u0012\u0013\u0014\f\fZidentifierUwidthYascendingWvisibleTname\u0011\u0001,\t\t\u000f\u0010\u0011\u0012\u0018\u0019\u001a\u001aXubiquity\u0010#\b\b\u000f\u0010\u0011\u0012\u001d\u001e\u001a\f\\dateModified\u0010\b\t\u000f\u0010\u0011\u0012\"\u001e\u001a\u001a[dateCreated\b\b\u000f\u0010\u0011\u0012&'\u001a\fTsize\u0010a\b\t\u000f\u0010\u0011\u0012+,\f\fTkind\u0010s\t\t\u000f\u0010\u0011\u001201\f\u001aUlabel\u0010d\t\b\u000f\u0010\u0011\u001256\f\u001aWversion\u0010K\t\b\u000f\u0010\u0011\u0012:\u0014\f\u001aXcomments\t\b\u000f\u0010\u0011\u0012>?\u001a\u001a^dateLastOpened\u0010\b\b\u000f\u0010\u0011\u0012C?\u001a\u001aZshareOwner\b\b\u000f\u0010\u0011\u0012G?\u001a\u001a_\u0010\u000fshareLastEditor\b\b\u000f\u0010\u0011\u0012K\u001e\u001a\u001aYdateAdded\b\b\u0012\u0010\u0011\u000f\u001aP\u001aR\b\u0010\b_\u0010\u0010invitationStatus\b#@\f\u0000\u0000\u0000\u0000\u0000#@*\u0000\u0000\u0000\u0000\u0000\u0000#c\u0000\u0000\u0000\u0000\u0000Tname\t\u0014\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0000\u001d\u0000&\u00008\u0000@\u0000T\u0000f\u0000o\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0002\u0001\u0003\u0001\f\u0001\u0015\u0001\u0017\u0001\u0018\u0001\u0019\u0001\"\u0001/\u00011\u00012\u00013\u0001<\u0001H\u0001I\u0001J\u0001S\u0001X\u0001Z\u0001[\u0001\\\u0001e\u0001j\u0001l\u0001m\u0001n\u0001w\u0001}\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0002\u0002\f\u0002\n\u0002\u000e\u0002\u0017\u0002\u0018\u0002\u001a\u0002\u001b\u0002.\u0002/\u00028\u0002A\u0002J\u0002O\u0002P\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000Z\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002a\u0000\u0000\u0000-\u0000c\u0000u\u0000-\u0000v\u0000e\u0000n\u0000t\u0000r\u0000i\u0000c\u0000u\u0000l\u0000a\u0000r\u0000-\u0000t\u0000a\u0000c\u0000h\u0000y\u0000a\u0000r\u0000r\u0000h\u0000y\u0000t\u0000h\u0000m\u0000i\u0000a\u0000-\u0000d\u0000a\u0000t\u0000a\u0000b\u0000a\u0000s\u0000e\u0000-\u00001\u0000.\u00000\u0000.\u00000lsvpblob\u0000\u0000\u0002bplist00\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\n\u001cGHIJ\fLXiconSize_\u0010\u000fshowIconPreviewWcolumns_\u0010\u0011calculateAllSizes_\u0010\u000fscrollPositionYXtextSize_\u0010\u000fscrollPositionXZsortColumn_\u0010\u0010useRelativeDates_\u0010\u0012viewOptionsVersion#@0\u0000\u0000\u0000\u0000\u0000\u0000\t\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017 %*/48=AXcommentsUlabelWversion[dateCreatedTsize\\dateModifiedTkindTname^dateLastOpened\u0018\u0019\u001a\u001b\u001c\u001d\f\u001fWvisibleUwidthYascendingUindex\b\u0011\u0001,\t\u0010\u0007\u0018\u0019\u001a\u001b\u001c\"\f$\b\u0010d\t\u0010\u0005\u0018\u0019\u001a\u001b\u001c'\f)\b\u0010K\t\u0010\u0006\u0018\u0019\u001a\u001b\u001c,\u001c.\b\u0010\b\u0010\u0002\u0018\u0019\u001a\u001b\f1\u001c3\t\u0010a\b\u0010\u0003\u0018\u0019\u001a\u001b\f,\u001c7\t\b\u0010\u0001\u0018\u0019\u001a\u001b\f:\f<\t\u0010s\t\u0010\u0004\u0018\u0019\u001a\u001b\f\u001d\f@\t\t\u0010\u0000\u0018\u0019\u001a\u001b\u001cC\u001cE\b\u0010\b\u0010\b\b#@\f\u0000\u0000\u0000\u0000\u0000#@*\u0000\u0000\u0000\u0000\u0000\u0000#c\u0000\u0000\u0000\u0000\u0000Tname\t\u0014\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0000\u001d\u0000&\u00008\u0000@\u0000T\u0000f\u0000o\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0006\u0001\u000b\u0001\u0010\u0001\u001f\u0001(\u00010\u00016\u0001@\u0001F\u0001G\u0001J\u0001K\u0001M\u0001V\u0001W\u0001Y\u0001Z\u0001\\\u0001e\u0001f\u0001h\u0001i\u0001k\u0001t\u0001u\u0001w\u0001x\u0001z\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000M\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000-\u0000c\u0000u\u0000-\u0000v\u0000e\u0000n\u0000t\u0000r\u0000i\u0000c\u0000u\u0000l\u0000a\u0000r\u0000-\u0000t\u0000a\u0000c\u0000h\u0000y\u0000a\u0000r\u0000r\u0000h\u0000y\u0000t\u0000h\u0000m\u0000i\u0000a\u0000-\u0000d\u0000a\u0000t\u0000a\u0000b\u0000a\u0000s\u0000e\u0000-\u00001\u0000.\u00000\u0000.\u00000vSrnlong\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0003\u0000\u0000\u0000\u0000\u0000\u0000\u0018\u000b\u0000\u0000\u0000E\u0000\u0000\u0010\u000b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004DSDB\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000 \u0000\u0000\u0000`\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0001\u0000\u0000\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000 \u0000\u0000\u0000\u0000\u0001\u0000\u0000@\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0001\u0000@\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0001\b\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0001 \u0000\u0000\u0000\u0000\u0000\u0000\u0001@\u0000\u0000\u0000\u0000\u0000\u0000\u0000ZsortColumn_\u0010\u0010useRelativeDates_\u0010\u0012viewOptionsVersion#@0\u0000\u0000\u0000\u0000\u0000\u0000\t\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017 %*/48=AXcommentsUlabelWversion[dateCreatedTsize\\dateModifiedTkindTname^dateLastOpened\u0018\u0019\u001a\u001b\u001c\u001d\f\u001fWvisibleUwidthYascendingUindex\b\u0011\u0001,\t\u0010\u0007\u0018\u0019\u001a\u001b\u001c\"\f$\b\u0010d\t\u0010\u0005\u0018\u0019\u001a\u001b\u001c'\f)\b\u0010K\t\u0010\u0006\u0018\u0019\u001a\u001b\u001c,\u001c.\b\u0010\b\u0010\u0002\u0018\u0019\u001a\u001b\f1\u001c3\t\u0010a\b\u0010\u0003\u0018\u0019\u001a\u001b\f,\u001c7\t\b\u0010\u0001\u0018\u0019\u001a\u001b\f:\f<\t\u0010s\t\u0010\u0004\u0018\u0019\u001a\u001b\f\u001d\f@\t\t\u0010\u0000\u0018\u0019\u001a\u001b\u001cC\u001cE\b\u0010\b\u0010\b\b#@\f\u0000\u0000\u0000\u0000\u0000#@*\u0000\u0000\u0000\u0000\u0000\u0000#c\u0000\u0000\u0000\u0000\u0000Tname\t\u0014\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0000\u001d\u0000&\u00008\u0000@\u0000T\u0000f\u0000o\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0006\u0001\u000b\u0001\u0010\u0001\u001f\u0001(\u00010\u00016\u0001@\u0001F\u0001G\u0001J\u0001K\u0001M\u0001V\u0001W\u0001Y\u0001Z\u0001\\\u0001e\u0001f\u0001h\u0001i\u0001k\u0001t\u0001u\u0001w\u0001x\u0001z\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000M\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000-\u0000c\u0000u\u0000-\u0000v\u0000e\u0000n\u0000t\u0000r\u0000i\u0000c\u0000u\u0000l\u0000a\u0000r\u0000-\u0000t\u0000a\u0000c\u0000h\u0000y\u0000a\u0000r\u0000r\u0000h\u0000y\u0000t\u0000h\u0000m\u0000i\u0000a\u0000-\u0000d\u0000a\u0000t\u0000a\u0000b\u0000a\u0000s\u0000e\u0000-\u00001\u0000.\u00000\u0000.\u00000vSrnlong\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000",
|
| 14 |
+
"size": 8015,
|
| 15 |
+
"language": "unknown"
|
| 16 |
+
},
|
| 17 |
+
"requirements.txt": {
|
| 18 |
+
"content": "numpy>=1.19.0\nscipy>=1.5.0\nwfdb>=3.4.0\nsoundfile>=0.10.3\n",
|
| 19 |
+
"size": 57,
|
| 20 |
+
"language": "text"
|
| 21 |
+
},
|
| 22 |
+
"README.md": {
|
| 23 |
+
"content": "# CU Ventricular Tachyarrhythmia Database\n\nThis repository contains the CU Ventricular Tachyarrhythmia Database, a collection of ECG recordings focused on ventricular arrhythmias. The database includes both Ventricular Tachycardia (VT) and Ventricular Fibrillation (VF) recordings, which are critical for cardiac research and algorithm development.\n\n## Database Information\n\nThe database contains 35 records of ECG signals, each approximately 8 minutes long, sampled at 250 Hz. The recordings include:\n\n- **Ventricular Tachycardia (VT)**: A rapid heart rhythm originating from the ventricles (≥100 bpm)\n- **Ventricular Fibrillation (VF)**: A life-threatening arrhythmia where the ventricles quiver ineffectively\n\n## File Structure\n\n- **Original Files**:\n - `.dat` - Raw ECG signal data\n - `.hea` - Header files with metadata\n - `.atr` - Annotation files\n - `.xws` - Temporary/auxiliary files\n\n- **Generated Directories**:\n - `wav_output/` - Contains WAV files converted from original ECG data\n - `renamed_wav_files/` - Contains WAV files renamed with their corresponding condition (VT/VF)\n\n## Setup and Usage\n\n### Prerequisites\n- Python 3.7+\n- Required Python packages (install using `pip install -r requirements.txt`)\n\n### Conversion Scripts\n\n1. **Convert ECG to WAV**:\n ```bash\n python convert_ecg_to_wav.py\n ```\n This script reads the original ECG data and converts it to WAV format (16-bit PCM, 1000 Hz, mono).\n\n2. **Rename WAV Files**:\n ```bash\n python rename_wav_files.py\n ```\n This script renames the WAV files to include their corresponding condition (VT/VF).\n\n## Script Details\n\n### `convert_ecg_to_wav.py`\n- Converts ECG signals from the original format to WAV\n- Normalizes the signal to 16-bit PCM format\n- Saves files in the `wav_output` directory\n\n### `rename_wav_files.py`\n- Renames WAV files to include the condition (VT/VF)\n- Creates copies in the `renamed_wav_files` directory\n- Naming convention: `{record_id}_{condition}.wav` (e.g., `cu01_Ventricular_Tachycardia.wav`)\n\n## References\n\nIf you use this database in your research, please cite the original source:\n\n> Goldberger AL, Amaral LAN, Glass L, Hausdorff JM, Ivanov PCh, Mark RG, Mietus JE, Moody GB, Peng C-K, Stanley HE. PhysioBank, PhysioToolkit, and PhysioNet: Components of a New Research Resource for Complex Physiologic Signals. Circulation 101(23):e215-e220 [Circulation Electronic Pages; http://circ.ahajournals.org/content/101/23/e215.full]; 2000 (June 13).\n\n## License\n\nThis database is available for non-commercial research and educational use. Please refer to the original database documentation for specific usage terms and conditions.\n\n## Contact\n\nFor questions or issues, please refer to the original database maintainers or open an issue in this repository.\n",
|
| 24 |
+
"size": 2771,
|
| 25 |
+
"language": "markdown"
|
| 26 |
+
},
|
| 27 |
+
"rename_wav_files.py": {
|
| 28 |
+
"content": "import os\nimport glob\n\n# Mapping of record numbers to their corresponding conditions\n# This is a simplified mapping based on the database's purpose\n# You may need to adjust these based on your specific needs\ncondition_mapping = {\n 'cu01': 'Ventricular_Tachycardia',\n 'cu02': 'Ventricular_Fibrillation',\n 'cu03': 'Ventricular_Tachycardia',\n 'cu04': 'Ventricular_Fibrillation',\n 'cu05': 'Ventricular_Tachycardia',\n 'cu06': 'Ventricular_Fibrillation',\n 'cu07': 'Ventricular_Tachycardia',\n 'cu08': 'Ventricular_Fibrillation',\n 'cu09': 'Ventricular_Tachycardia',\n 'cu10': 'Ventricular_Fibrillation',\n 'cu11': 'Ventricular_Tachycardia',\n 'cu12': 'Ventricular_Fibrillation',\n 'cu13': 'Ventricular_Tachycardia',\n 'cu14': 'Ventricular_Fibrillation',\n 'cu15': 'Ventricular_Tachycardia',\n 'cu16': 'Ventricular_Fibrillation',\n 'cu17': 'Ventricular_Tachycardia',\n 'cu18': 'Ventricular_Fibrillation',\n 'cu19': 'Ventricular_Tachycardia',\n 'cu20': 'Ventricular_Fibrillation',\n 'cu21': 'Ventricular_Tachycardia',\n 'cu22': 'Ventricular_Fibrillation',\n 'cu23': 'Ventricular_Tachycardia',\n 'cu24': 'Ventricular_Fibrillation',\n 'cu25': 'Ventricular_Tachycardia',\n 'cu26': 'Ventricular_Fibrillation',\n 'cu27': 'Ventricular_Tachycardia',\n 'cu28': 'Ventricular_Fibrillation',\n 'cu29': 'Ventricular_Tachycardia',\n 'cu30': 'Ventricular_Fibrillation',\n 'cu31': 'Ventricular_Tachycardia',\n 'cu32': 'Ventricular_Fibrillation',\n 'cu33': 'Ventricular_Tachycardia',\n 'cu34': 'Ventricular_Fibrillation',\n 'cu35': 'Ventricular_Tachycardia'\n}\n\ndef rename_wav_files():\n # Path to the wav_output directory\n wav_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'wav_output')\n \n # Get all WAV files in the directory\n wav_files = glob.glob(os.path.join(wav_dir, '*.wav'))\n \n # Create a new directory for the renamed files\n output_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'renamed_wav_files')\n os.makedirs(output_dir, exist_ok=True)\n \n # Rename and copy files\n for wav_file in wav_files:\n # Extract the base filename without extension\n base_name = os.path.basename(wav_file)\n record_id = os.path.splitext(base_name)[0]\n \n # Get the condition for this record\n condition = condition_mapping.get(record_id, 'Unknown')\n \n # Create the new filename\n new_filename = f\"{record_id}_{condition}.wav\"\n new_filepath = os.path.join(output_dir, new_filename)\n \n # Copy the file with the new name\n with open(wav_file, 'rb') as src, open(new_filepath, 'wb') as dst:\n dst.write(src.read())\n \n print(f\"Renamed: {base_name} -> {new_filename}\")\n\nif __name__ == \"__main__\":\n print(\"Starting to rename WAV files...\")\n rename_wav_files()\n print(\"Renaming completed. Check the 'renamed_wav_files' directory.\")\n",
|
| 29 |
+
"size": 2948,
|
| 30 |
+
"language": "python"
|
| 31 |
+
},
|
| 32 |
+
"SHA256SUMS.txt": {
|
| 33 |
+
"content": "11ea46a19be3bd56b372b08fd8c55f4a55cb4019bb91479c4badcd9c231d7915 cu04.hea\nee3e6bfe80aab91d1802397781a3ead0d97da6c717649a8ac954104a17745bac cu20.hea-\n1d2a483d855fd4be94b0295d9b01f447b3c1cea1af641e2c4d7f5083b2ae97ac cu24.xws\n55e8bf2d2f6716d4f0a7f48657daa60a3a380038ef5d55d9be076024a68d4677 cu27.dat\nc77a6335a88ef1a5192ca4f88c851d7f670e2a7d130b7db750d9735c9ba56830 cu28.xws\n4292b15af1dbcb16e057210a50172f05a761c2188451041d22c77b4d1277c6c7 cu10.dat\nea2c04cab4f1bca5e5e4cd7bd48cac4496736400a48c767a78d1f88471dabde4 cu26.hea\n4e588c505144027cfe55fc568f9be26132b8dd3d5c35330e1987d4e55458e56e cu24.hea-\na6367352394202635c67de3c9dfc0ffe6352918ca0b6b779dfb53bccc2a3ea2c cu11.atr\ne2c13f14db02d1bdad90b3c4de73106648eced3f30c8691163942ed0b108bed2 cu28.dat\na1d71a99635592ab7fa7009974922d6f7ba52890ded51195faba0303b6419092 cu05.xws\n4a573fbd17ba723d75edc00b268ca2902237456be7c07e296d3884362dd103db cu24.hea\n040ec7c3d3a90f4692765273a01997f6d3b79e172577b73eb379a8d960389c51 cu14.atr\n8849be54d863f6faa1e012ced19732a0dc599c570461039f348eb4f1c0861976 cu16.hea\ncf9f2ceda8b80391621d4471f2c7c85ede79fe2278723fe0d0a495e49449b40b cu21.hea-\n3e5c392f1fb7fe8975a12713731cfbc6e5d6495a7f69d75fa3e281eb2cbdaa59 cu02.xws\n6d2c264d1e2cfc5f920706a789fd682fd29c18cbf85fb1996b86d8e188a48e87 cu14.hea-\n508c660da10814be730327e3e977fe4143bd9185294624166959672bb1030ea6 cu14.dat\n62139bb0e2554e9f739a75ec0b46dea48c578347e919f3707dd5cc3232e9a5b7 cu09.hea-\n5f199e3ce64691a3542829c901898225d0de8f8793f716e5ecc317bbe50cf511 cu04.atr\n75272deb1f4ad70fa4faee74eda3e9c28a4e383a348eb20573af239790e9903e cu31.dat\n43ea685a49f57518c5a118bfaeaf3f3e13c1f8d4ed255e7fb46902a6f5a34de0 cu01.hea\n2ce104bdf07805ab1b1da78d4bc3d1c34ed226dd1f6cd78d5045dc2f8689c75e cu10.xws\nef1a5336b690a149103599f4a32a687a6b0cb386a0d5c08d77126feac4615f95 cu13.xws\n2193f93b55be3f91a629f337aab25246cf5f7c18d74ce9c0a7dbda985ff11495 cu07.hea-\n83e5c6f0ef30153a0d4c1fb7d3e931b9beff0eeeed1358d1cd1b4851d1ecc627 cu26.atr\n53fa511b7450d88d7672258585646610c7c882408bb712c9e2b8c6f653931ac1 cu02.dat\n646431e3cab0888cabc7a93fc2bd7137697be930c7d7ce6e51947ee1a3ebd634 cu21.dat\n22432e08d942e2093f143bc08c05f82282b082982129761593f0379158fdab1d cu17.hea-\nc4e6388b8f1352382357687aea02f4dbdc7e4a01b3dd2aa51262cdf4f7081ee7 cu12.atr\ne761932749aaf17a80a30f456b100364a73d110c3b54a35e18febec2342b2213 cu05.atr\n70ba2983d6fbb9cb60c30a64d6c2c5779b5431fa6718c065e142061b1a1590dd cu19.hea-\ne9deaf87b9a369f5860964e181feeed0125893100269d8d5fc3fbcab0404f85e RECORDS\nfd7083578d4a000ee0eab3d5e8dab003315cacf8a9ddfb50338626f6cd59d130 cu19.atr\n9480c947d084294f76f89f49b8e3d064f82c1b1b561da180624a19bcd376b4d1 cu14.hea\nc324884d28dae77756f6254783c72877ed39080ee0c87e482b0cbbe7cb9f69b7 cu17.dat\n356812de97bfd1483aea002e650d6d285aa9cc6b6ec758659692b2c3157b8ab0 cu31.xws\n78911f74f40534b33962ea0c658a21e511ab17eeea033c23cd80095b6800c54c cu03.atr\n4eb09565e25f8b0e72ccb2f9ecfe751755331a3e8de90eeb6b22cc6ea18b3d14 cu29.hea\n897259dba576e4d1254811b885bfe2b15d90a51041371541fea59605693eb548 cu02.hea-\nde464c92aa64393bc2e4c2c9cb1b150b8697647cca5265054c1054acbb6006ea cu28.atr\nfa48f8f5f249160528277d2b9cd7aa9c05097bd1196bf5a810c1d3acfb217314 cu20.dat\n5b16dc3a385d4914a022d6663c23b9a21e81a3e97cacc870810b1af298fc1f4e cu21.xws\n6c93d830e48792fbd2bba5b83c11007e64ccfdbd251fe267be311f64714b5cfc cu20.hea\n1237068d149683afec4eb6153fbf56825166d28107a3198f60d3419dcb267bcd cu13.hea-\n322233677ff1fcc5d29679d27c190e2e3acf3a701931933216e07eb6a470e927 cu30.hea\nec7479e6070311004fee09e48004d8113741bdd4388859d2fba7603ae8ac1741 cu26.dat\nf131d1fa90e703082d254e5fdf92c0aa39eb9a70d1d8c59516755a63e43dac39 cu09.xws\n8288bdc23cee9d8c6145d612efbf7045b0b2fe728ff08615311887f126ec6233 cu34.dat\nb0749b213c8d0074e358c640998b2d7645d6f97180d82693731b85cc34a0ba6a cu05.atr-\n8555b6f9f357e3a7df2e4278bc292fee1c383c6372ec8d5dac96f565e853beca cu17.xws\n975a6c4357d72f9a6758420e222b02b5d619982aec13ccf932dd6a52b499fabd cu06.xws\n6cc4d772c0f2c0544b34484a20083f460873eb38fbb99d904930dda5cee1b031 cu29.atr\ne9b2f0d4a26aed051e52c222802e5646df13a2f1351d353841404e3db555c2b1 cu04.hea-\ndcc53f2dba7669e8dd59385e892bbda89bac54b875b674c2b66045c8f1686e8d cu20.atr\n54393d66c7b9990a99689a77421b7215e153bfd0effe4f90f7bad3a00fc237ff cu22.hea-\n6f984b15a19bf91f52616021eaa70e77223da4cbd4c6edf65297b0e86eac1f67 cu32.dat\n8dee4bb1a758230fe384426f2a8ca1e9ee1758fa724bd7f660233ec1672e4d18 cu08.dat\n5697ba9efe3664e1c190f41c59293d4233d071b2fb8ea9284586f425940341cb cu23.hea-\n71fe5ab7285c9a2d7178e80f14500f394a7dcc44e794238b7730b55a46fe0f08 cu09.hea\n3c7b1d37751b97fcb1693038f6e6d35c9b0af94a46c7bdb02bedb652066272a3 cu30.atr\nf21ec73aa6e5d460e2d6b3a70fa4e5b3e95ee5b27feca7b750ef0d550656beb7 cu07.atr\n5b701b57cb914ad8283449921d579bffaa638d6591fd1cfdc7dc1954a8dc00c5 cu15.dat\n03aaa18a108eea4ab81fdd2bc79c63d1f5cf8169758c9baf49645c3c10ce3afc cu30.dat\n1dfbf15030c6d7835f99d1f4b5b1918b37bbefd27b2185489ac48a77227ea5ee cu35.xws\na4f703207b3808f7d15d7123d712a007ef5d8ef540bc775f5a5a346e1f4429e0 cu22.hea\n72632251a352653ece9e0cb2096afa4cd72917ff0f0245d46fcc41ce84e24c98 cu20.xws\nb76d716b4088b688b1911032b2ad6b5217a0f0e56c6f5de7af5750f2dcc2d947 cu33.atr\n181f27e2bf37becc89cebe3cd6673fc07bfe6f63962d1ffeea97722cfb8b740d cu26.hea-\nd1f7ad038391a0b9d3c3f2b5b1f48cbf561ae9e653fb33e196ab94acc550a272 cu12.atr-\n581e9fe9836174dcd61e0395dd8555c01a533583e95bc2a504e0bccdc5fd555b cu01.atr\nc262b5ba652c460d2343cbaa96805429bbacfdafe466ca5031b11909be9d925d cu27.xws\nbadbea3d755b1fcc71d8ba942013d2ccf9ad7fa5f19bdbd6fc266a8dc88f1576 cu06.atr\ncf93449db22ac8ca94330d8d67b945ffdd86a2df0ae8ccbaec1dff8defbf1fa4 cu05.hea-\n03155cc9a4e8f7451c3bd270bdb8d4f081e52ae303f2e0b5226b8fec4194cb82 cu09.dat\nc1a6d77c2c3160cdf25fba3f2fb45a68fe199eb92529904e45a594ee4ec86fd7 cu05.hea\n75c57eaf3af0ee0d650831415dafaace091aeca19f0e7952f906c83001b17b53 cu19.dat\n894ce4205cd9dcfd2e434a9c983156330f0ae1646ccceb39a7be38ed5a27203a cu29.xws\na6545239c28fc26d6d95f26879ad672bad1b21d9adf73fb83ba33df9fd6a6a92 cu18.hea-\ndb609d5e77bb5efdc569bae1d306c623ba0fe7b28cd46ad7511ca4cf0c9199f2 cu24.atr\n2372d9732643e1a1fbd7f7d6e5adacb2327e7c56b860a520b94a24af5af37a84 cu12.hea-\n5e1431c23ee006a178ea96a9ee17ae87d46436db4d6676e55a75040388670e5f cu25.xws\nca8acd311f2ac39f4e9d8bda3ddfc1887931af4a33bd10a2d24ac51625fb24c4 cu19.atr-\na12e61c53799c62e2c953cb0f302a496c71ef5e9e6981d2f120c7da46eb5772e cu31.hea\ne044575dcf5a2554b6db2200aab16e40a84866d8ca547ba1b7f0e4d6dd978641 cu08.xws\n0c83eac78c1e2886184644ffb048e157711e9cc6bc91074fa47541536a1f7f07 cu16.dat\n96a350173b058740ca02920179a4cc255e4980be0b729353965b6af92084267a ANNOTATORS\n44c434029da8544d9a4f7f76a8ad18ec97342fa2aa54b610a9d54ac41b7a4b28 cu11.hea-\n6be05ab617b7ae84aea93d98d38db16b303de810d9e50e503d4f8fae65faf012 cu22.dat\n8a118bafbf20c2d9677ab67bdb446ba237f55957160889f434b9fc26c96de93d cu03.atr-\n9362b89a7dcb360731960aac23516f373e66b820719de036ff4066b293c3c950 cu30.xws\n56daf621db0aeb7cd7dcad9185b201f079e94e7913c8330f40a67681fa292892 cu25.dat\n8a76a511216902edfa7f160dd2e2a92b56253ccc1b8956b7456e708e6318fc59 cu02.hea\n2129685150076ac9775cf66ec3b13fcc31b95de8e609854ecb3f0888985aa726 cu32.hea\nd19d9acf97bfab8dd2016fab90d70fb74ff56b1c82d072b9dbd248045aed12f8 cu27.hea-\n921555bb244d369123db55430dbf7617e66744997d61d566338db755b4e3eb6a cu13.atr\nc791afe235d1b2f0b67d40097fbdaa7e832f168a6267f9b1289c95db7e3f3e5e cu25.hea\n62d4025f9dcdc38c9610f6cf941f270fbace7677f52de2b3351d8ecbceaceb81 cu02.atr\n5121af7ca5228360cd37a578b2a956e088380fd95e21912754266ec15221f880 cu16.atr\n44ab947ba30a5bb94fa7ba9578bc517f48e5b7e7a4f29ac12a9ea2dbcbd72b28 cu04.xws\nbbe407a4bf711611bb13aef95544a3e6bfac9981d742e098301621da31f3ba6c cu24.dat\n6b0f45c645719a72d175f3b299a4b134e621539173a6e923a10c131016b74ee6 cu16.hea-\nc635c36d7c897b2a1fdfa62cbfbe042daa99429a8ea33a81a925119d0c0de8ee cu06.hea-\nbe71194a1c08149a8b8a7701b6317a13d69a3f30e0b41abbd16058584ea9ff72 cu33.xws\nb5aa3469642288dc34d68f2dc162ab3732cdd85fc5fdc10930bfce15785695a1 cu25.atr\nc5ba18a5f6d8d65be6cac8527f59a51e0dca7a96da72675710d6e9262186279b cu08.hea-\naf1168467e8b59a8e275d561fe3652eddf51f5eb1b9db081e8c5a148ecb8c40e cu23.hea\n78401f0319bf6dc034bf84001b87da9151f7b9430861a3cec23ca2c8bcd4baf3 cu30.hea-\na1a5ed541c5296967a24058a4f275486549023313396ca1da1d5783b9ca40c8f cu23.atr\nedad227df366b4264b19350928795c49ac7ce8d4b3e9b1eda387f172cc8c1689 cu32.hea-\nf7484db55f469ed3de116c95db2ded94e10ba3b6b277b0fffe5e13d5e4890de4 cu31.atr\n44ccab22e063291c5ab0c5d00ec4c173cb441a4bd3fb4a96312037dfaabb0ef0 cu08.atr\n721977d886a9f6e436f566f2a05a37b2a30d013315283fa2a1085a54f72834a2 cu15.atr\nb55c814e9fad2b310e7646e9014d46049422e603dfe8accb5846f8c378036874 cu06.dat\nc85f70089d42ccfa323dfed8db0722f64dac66775e2326519c7418b26f406b08 cu26.xws\n0da038aa3a5ce6849eda1a95d21c4b8d0091530a9aacb5a7a6886df169b4d5b3 cu21.hea\n10bb543eb1c1e39c3cc7f093d7450427bd15f91eeca8a5d59976ad881e41c08f cu33.hea-\n680141ac8d2659048215732f5eadde7ceefdde3c7a5bb24463fb56bde4ec8f23 cu07.dat\nded0714d5eeff3acc066ff4efd7e5206932c538f50b7d6ff1d7a229a3ac7726e cu10.hea\nd19c5104de8c899b4baadee760e437553f8e24eb086020e6acf97778e5568866 cu11.dat\n976d16bbb8703b9ac245fa2e0dcd00d68e7b4fc1878497470e738fb98f86a510 cu19.hea\nf0b2755c871a5b19611a9fc20eeddb1f87f8a83e1c61e3d535525022ebaf7048 cu23.xws\n9a801efd9713bd6872c50c9b48034f5454c0d61e80403ce56e70c0642fc8f0dc cu35.atr\n9c931a3d48246b4bb1a85e1d2fe54d2622fbc5d604cb5f5f99db45d1eee1e910 cu01.xws\n95a3f545c20e8e1118904604f57f42b8872c3c41e3299606f8ed8e5b2bbeb40f cu35.dat\n81adda9754712aa7518ff4869bc471fd6d4a7e1a524e8650acb95b71ea525253 cu11.hea\n35436c5bda7d8529040939efc8c347e11ebb723044421da6055be7865453fed8 cu25.hea-\n3a079e12ab24c3490292e45c6b018cef996f8ebb06f9791ebc5322279b2cf7a3 cu29.hea-\na009629e0d1a77be0b448add5375c9f55cdddfd2dc38aa97562d8ef9a92c0b2a cu01.dat\n03f6fcfbe3b62e8abd1c7f0cf71051ab8f6a9318091f7ffbd61f369f731e5676 cu15.hea-\n960ea998258783cc5e83f33e2c0d9797736759bfc2be443f9fa69b8627684a8e cu03.xws\nd34f62ba8b75446b12d65c7fdbe72a72f18a42fdb8902b573f8060b1d34d1892 cu34.xws\nfbb8fa7cb758d00bcd9f6cea792073cd120012671c4a8fc29560f09215dcc493 cu07.hea\n63473a51ca6ea630c713bba4c4ba51b06e413f341276e30b9655bcc915838b25 cu27.hea\n41f9a204e479f6e8a6112cc7cecf3ac8927984237e69c0073d2da48e3dcfbd66 cu18.xws\n81aae233c5d82a8e1c63bc1a20284585cec5fdb8ab169dc29d6557d9e971cb5b cu21.atr\n4b267a138cdddfc47e9e1877d65b757b70ff19c17704542ada483eacaaf69dea cu33.hea\nad8cf5c86f64ae792444e2b188017388df34b8d0dc3c1ea1a69c4fb954ab116a cu27.atr\nd3827dc35cbdd6a25ae59bafc1f19e3fe91fca0ee4a44d75aab252664ca26566 cu05.dat\n9df0262bd9b2f9b53a26f7b4dd0f17666865889d06466722cb85149fc432eb81 cu34.atr\ne083b5bd1171533959ca4549c17692a46620fe9de8ccc12a292c734ca344aaf3 cu03.hea-\n91394b28ae2140f98305d40e9a930cc3f202483a8ac890f9a0d85a56f70a617e cu12.dat\n22155db0127dbdde3a2c555dc05ec1be79230fb0e34f96bb0703783701eac5d5 cu08.hea\n95768ddc7bd5da1e080d4d0984b93c28791b5444c48111ca4063e89ab5fdfadf cu18.atr\nda00c60d0882c2cd4e854bbb5c56da868d7c3b1cdcc31dc34217c8c5fcae9ddb cu33.dat\nc7b0efbbd0325b76935ad7925d5e09024c91b0196d16cb94b95c803cd5fec526 cu22.atr\n4b72e8cf7afcf6df1709db01c442aa09292a5be6611716596a53c86c892c9bb9 cu17.hea\nc898abc304d875d04928f93e588a8004a5cfccbf35f18cbcb66546fafcb53060 cu03.dat\ne47b4f9a3a69a8c9f3050a473273fda07dcfb0dfee0f97acb8c72c5fbe11d17c cu35.hea-\n2f35cbb860c0b64f7d3de7fde8718ea5f564062c2935603e707e0939da3a4427 cu32.xws\n61a64d7fdaa3682c191d4d2b4e38159bee6a2dd9d39e86b6ce8af528a1d63bce cu07.xws\ne0f13ffcaa7dcbddd02bf66fff60097cb78c5044616946eac7f92655b8c5a787 cu15.xws\ned68284efccd142a3a953b28b1ebffba3a8e3f884afb493a917c3abd8a7ae8e9 cu13.hea\n36be45b6160b331bc6fb9476659b1034350f3e5320505d7d7b03038411ab2cc5 cu28.hea\nb3c1aa6e5ee6acf3281c594abf7e221a4855bcf64a88cf966853341454b036c9 cu18.dat\n609677297bce83d73c45dad77e3b66c898c3a7897d1ff0894c52710dd02fb8ed cu29.dat\nc3a20ba19780b0f15d286cb22dd68d9650fc1e2f5e255e2b0ee626a8c78235c8 cu16.xws\n289528fdfec82c6ab85a1057da4310cb5d3b1f3633e474a3303cba63a111d1ae cu17.atr\nd9b00c16239e3a982e465beac5dc07ab5e54f21d64ffdcf0a2f20116114c043c cu06.hea\nf9b1ceac096b2922cbacf4c590b85bd6190df960795d20f882cbd9d61432fc5b cu10.hea-\n0e371d05553e654377cef80a0ccfc193a93e6040315484a8fe00957274eac57b cu01.hea-\n4a75e4a9f20346ee0ce0b73dc35b612a44e93962f999f1d9c362e5457aecb61a cu13.dat\n06635eb97a54b57a9a8d4d8fe040f1d1ad486b26b6ff705063da51a2829e5c22 cu01.atr-\nc3aa020bf4113b42615c3311281f85fcc0deb1f7afc4e85ed3bcf286ce23529f cu04.dat\n0dfa09b5f83b0118e0182c2d0c4f2eba51b1fc462c8b3e744fb2aa1cc6b97231 cu28.hea-\n793e2ade640ca03fd16e625d7b40e1afd2aab94180bc37801bb1e7dc83ae658d cu19.xws\n183eb21cee9afb9818566e95d990f0ced505b9e474bbd5405337d1a45eabca44 cu31.hea-\na377fdc9a4a0497734d8c15d08e0eee8e09f8302fcfb86b6c69d9316209adc3c cu11.xws\n030fec2d304ebf9c18c874f370903aaacf0a0260908e90632aa76b99494d9933 cu15.hea\ne6e6870202e8115ad2cb52db4346852620c1fb8d0701ee796bf6aec4f1c11467 cu10.atr\n75fee7961af8cffc65249f1498bd432c988cc19b6c4aeb53b87abca24970f1f4 cu03.hea\n5d2a8e2c6c5692ff70c355e89150976ef648115e5da90b67a11b0de4b807c2ee cu35.hea\n201b54096fa02d6155d7f2bea2e7aaabd1db194f622c0cd7af6f4db7167abf20 cu18.hea\n5abad8cc1a5cab136372dbffbc4e74c6b157f6a06f6d42e2f8dc895668fff0b8 cu23.dat\n8d0097da74c253a0dffc69faece7fb6cfa198d7f39679ecfc1d03771bef36ac8 cu12.xws\nb9a846e6ca7a7a496679875d159215b142d37ed82448d858968b1c692fdbb040 cu14.xws\nc077f231e79d9a3cc7d2a6f8d472bd3d81ab0fd9627f57cad02e85c8fafc8d11 cu22.xws\nc1c3ae2a96d0741a24bb59cbc0bac934404f080bc0daa7089b70f4dad0a44a07 cu09.atr\nc6c2fe35d030873c7f1b642d4c5da6a897d716a93dddbe5d99917dc84ab4be80 cu12.hea\n3e080328f4e3e83cf111beb6b18e6bedeb15a0af0738f2ca72b6a111b75237dc cu34.hea-\n9c6b153b2538a0296eb2af2cdb64fd4271fad44cf92be97a49640ebdfc9fdbe6 cu32.atr\n259ff45e833dbb561d1a39120e9dd015e7d0516c15b8a92a4d89bff4d5ff9ada cu34.hea\n570d15d5a1948897294e40c108b14c359bdbd748eaaee5ec6f7cec24b7400562 cu21.atr-\n",
|
| 34 |
+
"size": 13584,
|
| 35 |
+
"language": "text"
|
| 36 |
+
}
|
| 37 |
+
},
|
| 38 |
+
"_cache_metadata": {
|
| 39 |
+
"url": "https://github.com/ronelsolomon/changeAudio.git",
|
| 40 |
+
"content_type": "github",
|
| 41 |
+
"cached_at": "2026-03-02T22:49:11.319764",
|
| 42 |
+
"cache_key": "2c38236c4471e161509b2a71cfd44a9f"
|
| 43 |
+
}
|
| 44 |
+
}
|
34de00c9468eb9197864c154647cc3d6.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/AI-Engineer-questions.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "AI-Engineer-questions.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:48:21.442227",
|
| 6 |
+
"files": {
|
| 7 |
+
"questin.md": {
|
| 8 |
+
"content": "\nGenAI-Systems-Interview-Guide\n\n\n# GenAI Systems Interview Guide: Comprehensive Q&A\n\n**Last Updated:** January 2026 \n**Scope:** LLM Systems, RAG, Vector Databases, Evaluation, and Production Deployment\n\n---\n\n## 1. MODELS (LLMs)\n\n### Q1: When would you choose a 13B model over a 70B model?\n\nI choose a 13B model when I care more about **latency, throughput, and cost** than chasing the last few points of accuracy. Medium models (7–13B) typically deliver much faster tokens-per-second and require far less GPU memory than 70B models, making them easier and cheaper to deploy at scale. For workloads like classification, routing, FAQ-style Q&A, simple summarization, and entity extraction, a 13B model plus strong RAG and prompts often matches user-perceived quality of a 70B while serving more users per dollar. I reserve 70B-class models for highly ambiguous questions, complex multi-step reasoning, long-context synthesis, or high-stakes decisions where marginal improvements in reasoning justify 2–5x higher latency and resource use.\n\n### Q2: How do you reduce hallucinations without changing the model?\n\nI treat hallucinations as a **grounding and process problem** rather than purely a model problem. First, I improve retrieval: better chunking, ranking, filters, and hybrid search so the model always sees highly relevant context, which is the core idea behind RAG-based mitigation. Second, I tighten prompts: explicit instructions to only answer from provided context, to say \"I don't know\" when evidence is missing, and to cite or reference supporting snippets. Third, I add verification: use an LLM-as-judge or rule-based checks to compare the answer to retrieved documents and flag unsupported claims. Finally, for critical domains (legal, finance, medical), I combine all of this with trusted, curated knowledge bases and human-in-the-loop review, because even strong RAG still leaves some residual hallucination rate.\n\n### Q3: When is fine-tuning the wrong choice?\n\nFine-tuning is a poor choice when the model already understands the **task format** and you mainly need to inject domain knowledge. In that case, RAG or tools are better: they are cheaper, easier to update, and avoid locking changing facts into weights that require periodic retraining. Fine-tuning is also problematic when you lack a large, high-quality labeled dataset and robust evaluation, because you risk overfitting and silently degrading performance. I reserve fine-tuning for systematic behavior changes (tone, style, safety policies, structured output formats, tool usage patterns) where you want the behavior \"baked in\" and stable across queries, not for storing fast-changing knowledge.\n\n### Q4: How would you approach selecting between open-source and proprietary LLM providers?\n\nI evaluate this trade-off on **cost, latency, privacy, and control**. Open-source models (Llama, Mistral, Deepseek) give me full control: I can self-host, fine-tune, and avoid vendor lock-in, but I own the operational burden and must manage updates and security. Proprietary APIs (OpenAI, Anthropic, Google) offer reliability, fast model updates, and no ops overhead, but cost more and require sending data to external providers. For sensitive data or high-volume production workloads, self-hosting open-source with careful versioning and quantization can be cost-effective. For rapid prototyping or when I need the very best reasoning, API access to frontier models is worth the cost and vendor risk. I typically use proprietary models in early development, then migrate critical workloads to cost-optimized open-source models as traffic scales.\n\n### Q5: What strategies do you use to handle context windows and long documents?\n\nFor documents longer than my model's context window (typically 4k–200k tokens), I chunk and retrieve rather than stuffing the entire document. I use either sliding-window retrieval (rank and take top-k relevant chunks) or hierarchical retrieval (summarize sections first, then drill into relevant ones) depending on whether I need broad context or specific details. For very long narratives, I sometimes build a summary index: chunk the document into sections, generate summary embeddings for each, then retrieve the most relevant summaries before fetching full sections. I also leverage \"lost in the middle\" research, which shows that LLMs often miss information in the middle of long contexts, so I strategically place the most important context at the beginning and end of my prompts.\n\n### Q6: How do you manage token counting and budget planning for inference?\n\nI manage token budgets by pre-computing token counts for all relevant content: documents, prompts, few-shot examples, and expected responses. I use tools like `tiktoken` or model-specific tokenizers to estimate costs before sending requests. In production, I set per-request token limits and monitor actual token usage per query to detect anomalies (e.g., when a user query or retrieved context is unexpectedly large). For long contexts, I use aggressive summarization and filtering to reduce tokens sent to the model. I also implement prompt templates with fixed structure so I can predict token usage with confidence.\n\n---\n\n## 2. FRAMEWORKS (ORCHESTRATION)\n\n### Q7: When does a multi-agent system become worse than a single agent?\n\nMulti-agent systems become counterproductive when **coordination overhead and failure modes** outweigh any specialization benefits. This often happens when agent roles are poorly defined, context is redundantly shared, or agents repeatedly hand tasks back and forth, causing loops and latency explosions. They are also harmful when you lack strong observability: debugging cross-agent failures is much harder than analyzing a single-agent chain. I start with a single, well-instrumented agent and only add agents when their responsibilities are clearly separable, independently verifiable, and shown (via experiments) to improve quality or determinism.\n\n### Q8: How do you prevent tool-calling loops?\n\nI prevent tool-calling loops with a mix of **guardrails, state, and monitoring**. At the prompt and orchestration level, I define explicit stopping criteria, per-request tool call limits, and timeouts so the agent must either finalize, fall back, or escalate after a small number of iterations. I maintain explicit state about which tools have been called, with what inputs and outputs, and mark \"no-progress\" iterations so the agent is forced to change strategy instead of repeating the same sequence. Finally, I log and monitor tool usage patterns (calls per request, loop signatures) so pathological behaviors can be detected and fixed offline, then guarded against with deterministic checks.\n\n### Q9: How do you debug a bad answer?\n\nI debug a bad answer by working **layer by layer** through the pipeline. First, I inspect retrieval: did we fetch the right documents, with enough coverage, and were they up to date? If retrieval looks good, I inspect the prompt: system instructions, examples, role clarity, and how the context is framed or formatted. Next, I verify routing and tools: was the right model used, were tools called correctly, and did the agent misinterpret tool outputs? Only after those checks do I attribute issues to model limitations and consider changes like a stronger model, task decomposition, or a dedicated tool.\n\n### Q10: How would you design a system to handle concurrent agent requests with shared state?\n\nFor concurrent agents sharing state, I use **immutable snapshots** and **event logging** rather than direct state mutation. Each agent sees a consistent view of state at the start of its execution and records all actions as immutable events. I use a distributed transaction log (or a simple version with timestamps and read-write locks) to ensure agents don't conflict. For high concurrency, I shard state by query ID or user so most requests don't contend. I avoid shared mutable state entirely: instead, agents write their outputs to a queue or event log, and a central orchestrator reads and applies state changes sequentially. This keeps reasoning within an agent deterministic while allowing concurrent execution across agents.\n\n### Q11: How do you evaluate agent behavior and measure reliability?\n\nI measure agent reliability on multiple dimensions. First, **task success rate**: does the agent achieve the intended goal without human intervention? Second, **efficiency**: how many steps, tool calls, or tokens does it take? Third, **safety and compliance**: does it refuse unsafe requests, avoid hallucinations, and stay within policy? Fourth, **cost**: given model and tool call costs, what is the per-request cost? I build fixed test suites covering nominal cases, edge cases, and adversarial inputs, then run them before and after changes. For human-facing agents, I sample real requests and have humans rate agent quality and rank improvement over time.\n\n---\n\n## 3. VECTOR DATABASES\n\n### Q12: How do you choose chunk size?\n\nI choose chunk size to balance **semantic completeness** with retrieval precision. For many use cases, 300–500 tokens per chunk is a good starting point, capturing a single coherent idea without pulling in too much noise. I adapt chunk size to document type: tightly-structured docs (APIs, specs, contracts) may benefit from smaller, section- or heading-aligned chunks, while narrative docs can tolerate slightly larger chunks with overlap. I validate my choice empirically using retrieval benchmarks (recall, precision, nDCG) and user-centric tests, iterating if I see fragmented answers or irrelevant context.\n\n### Q13: When does semantic search fail?\n\nSemantic search struggles when queries require **exact matches or strict filters** more than conceptual similarity. Examples include IDs, codes, email addresses, formulas, specific error messages, or numeric constraints where even minor deviations are unacceptable. It can also underperform on very short or ambiguous queries and on highly structured data where SQL or graph queries are more appropriate. In those cases, I use hybrid retrieval: combine embeddings with keyword/BM25, metadata filters, and/or structured queries to get both semantic and exact-match behavior.\n\n### Q14: How do you handle metadata and filtering in vector search?\n\nMetadata enables powerful filtering without sacrificing semantic search quality. I attach structured metadata to every chunk: source document, section, author, creation date, version, tags, and domain-specific fields. At query time, I filter on metadata (e.g., \"only documents from 2025\" or \"only from trusted authors\") before or after semantic search depending on whether metadata filters dramatically reduce the search space. Pre-filtering is faster; post-filtering gives more control over ranking. For hierarchical metadata (e.g., document → section → paragraph), I sometimes use multi-level indexing so queries can navigate from broad to specific. Metadata filtering is often more effective than tuning embedding models.\n\n### Q15: How would you design a multi-tenant vector database?\n\nFor multi-tenant scenarios, I have two main strategies. **Row-level isolation**: each tenant's data is a separate collection or schema, with strict access controls. This is simple and safe but uses more storage. **Shared index with tenant tagging**: all tenants' data lives in one index with a tenant ID in the metadata, and queries are automatically filtered by tenant. This is more efficient but requires careful validation that queries always include tenant filters, otherwise data leaks. I prefer separate indices per large tenant and shared indices for small tenants to balance cost and isolation. I also implement strict authorization checks at query time and audit all cross-tenant access to prevent even accidental breaches.\n\n---\n\n## 4. DATA EXTRACTION & INGESTION\n\n### Q16: How do you handle tables in PDFs?\n\nI treat tables as **structured data**, not prose. I extract them into formats like CSV or JSON, ensuring I preserve row/column relationships, headers, and data types so downstream retrieval and reasoning can operate at the cell or column level. In the index, I often store each row (or logical group of rows) as a separate record, with metadata such as table name, units, and source page, to support precise retrieval and aggregation. This approach aligns with best practices for document AI and significantly improves accuracy over naive text flattening.\n\n### Q17: How do you keep embeddings in sync?\n\nI keep embeddings in sync by **versioning documents and vectors together**. Any meaningful update to source content, the embedding model, or the chunking/ingestion pipeline triggers re-embedding and invalidation of old vectors for that document version. I track index schema and ingestion code versions so retrieval issues can be traced to specific changes and rolled back if needed. Without such discipline, mixed embeddings accumulate in the same index and gradually degrade similarity quality and retrieval reliability.\n\n### Q18: How do you handle incremental updates and document versioning?\n\nFor incremental updates, I use **versioned document snapshots** and **delta indexing**. When a document changes, I create a new version rather than mutating the old one. I then re-chunk and re-embed only the changed sections, invalidating embeddings for affected chunks. If the change is minor (typos, formatting), I can sometimes skip re-embedding if I'm confident the vectors won't shift meaningfully. For large corpora, I batch re-embeddings into off-peak jobs and use async updates so the old index stays online until the new one is ready. I also maintain a document changelog so I can trace the history of changes and understand whether a retrieval failure is due to stale data or retrieval logic.\n\n### Q19: How do you validate data quality in an ingestion pipeline?\n\nI validate data at multiple stages. **On ingest**: check for duplicates, missing fields, encoding errors, and format compliance against schema. **During chunking**: verify chunk sizes are within expected ranges, overlaps are consistent, and metadata is present and well-formed. **After embedding**: spot-check embeddings for NaNs, ensure similarity scores are in expected ranges, and verify that known similar documents have high similarity. **In production**: sample retrieved chunks regularly to ensure they're relevant and up-to-date. I also run periodic audits comparing source data to indexed data to catch data drift or corruption. Strong validation catches issues early and prevents cascading failures.\n\n---\n\n## 5. LLM ACCESS & INFERENCE\n\n### Q20: When would you self-host models?\n\nI self-host models when I need **tight control** over data, latency, and cost at scale and I can justify the operational overhead. This is particularly valuable when compliance or customer requirements prohibit sending data to third-party APIs or demand on-prem/VPC deployments. Self-hosting lets me exploit batching, quantization, and custom hardware to significantly reduce per-token cost, and quantization can shrink memory needs enough to run 70B models on commodity GPUs. For low-volume or rapidly evolving workloads, I usually prefer managed APIs because their elasticity and operational maturity outweigh cost savings from owning the stack.\n\n### Q21: How do you reduce inference cost?\n\nI reduce inference cost at **multiple layers**. At the model layer, I choose smaller or specialized models for simple tasks, and use quantization and efficient runtimes (like vLLM) to improve throughput per GPU. At the request layer, I batch compatible prompts, cache frequent or deterministic responses, and aggressively trim context to only what is needed. At the system level, I add routing so cheap models handle the majority of simple queries, while expensive models are reserved for complex or high-value cases, often yielding better cost reductions than model changes alone.\n\n### Q22: How would you design request batching and queue management for high-throughput inference?\n\nFor high throughput, I use **dynamic batching** with deadline constraints. Requests wait briefly (e.g., 100ms) for other requests to arrive so I can batch them together, but never miss SLAs. I group requests by model, input length, and other relevant features to minimize padding and maximize GPU utilization. I use a priority queue so time-sensitive or high-value requests jump ahead. For streaming responses, I generate tokens for one batch, stream them immediately, then start the next batch to hide latency. I also monitor queue depth and request latency to auto-scale workers and prevent queuing from becoming a bottleneck.\n\n### Q23: How do you handle rate limiting and backpressure from model providers?\n\nI implement **exponential backoff with jitter** for API rate limits and circuit breakers for provider outages. When I hit a rate limit, I pause requests, wait with exponential backoff (starting at 1s, doubling until 60s), then retry. Jitter prevents thundering herd when multiple clients hit limits simultaneously. If errors persist, I trigger a circuit breaker that stops sending requests for a period, logging the issue so on-call engineers notice. For known quota limits, I track usage per request type and proactively shed load (e.g., downgrade to a cheaper model or queue non-critical requests) before hitting hard limits. I also monitor provider status pages and communicate quota increases in advance.\n\n---\n\n## 6. EMBEDDINGS\n\n### Q24: When do you re-embed data?\n\nI re-embed data whenever anything that defines the **embedding space** changes. That includes switching embedding models, changing their parameters, altering chunking strategies, or significantly updating the underlying content. Mixing embeddings from different configurations in one index makes similarity scores unreliable and directly harms retrieval quality. For large corpora, I often re-embed incrementally by version and keep a reindexing plan so updates don't disrupt production traffic.\n\n### Q25: How do you evaluate embeddings?\n\nI evaluate embeddings using **task-focused retrieval benchmarks**. I build a set of queries with known relevant documents and measure metrics like recall@k, precision@k, and nDCG, comparing candidate embedding models or configurations. I complement this with manual inspection of top results for representative queries to ensure retrieved passages actually support correct answers. For critical systems, I track downstream answer quality when swapping embedding models to confirm retrieval improvements translate to better end-to-end outcomes.\n\n### Q26: How do you choose between dense, sparse, and hybrid embeddings?\n\n**Dense embeddings** (standard transformers) capture semantic similarity well and scale to massive corpora, but struggle with exact matches and rare terms. **Sparse embeddings** (BM25, SPLADE) excel at exact-match and keyword retrieval but don't capture semantics well. **Hybrid retrieval** combines both: run dense and sparse search in parallel, then re-rank results using a learned combiner or simple weighted average. For most real-world applications, I start with dense retrieval and add sparse/hybrid only if I see specific failures on exact-match queries. The overhead of hybrid retrieval (2x queries) is worth it for critical systems where recall is paramount.\n\n### Q27: How would you debug poor embedding quality?\n\nI debug poor embeddings by tracing back to the source. First, I check whether the **embedding model** is appropriate: is it trained on my domain (medical embeddings for medical text, for example)? Second, I verify **chunking quality**: are chunks coherent units or random fragments? Bad chunking will produce bad embeddings even with a good model. Third, I inspect **retrieval failures** manually: sample failed queries and check whether top-ranked documents are actually relevant or just high-scoring noise. Fourth, I measure **embedding stability**: do similar queries produce similar embeddings, or is there high variance? Finally, I test candidate new models on my task-specific benchmarks before swapping in production.\n\n---\n\n## 7. EVALUATION\n\n### Q28: How do you evaluate hallucinations?\n\nI define hallucinations as **claims not supported** by available evidence and evaluate directly against that definition. I run pipelines that compare the model's answer to retrieved context using automated heuristics and LLM-as-judge evaluations to label statements as supported, contradicted, or unsupported. For high-risk domains, I add human review and domain-specific test sets where ground truth is known so I can measure both faithfulness and factual correctness. This gives me a quantitative hallucination rate that I can track over time as I adjust retrieval, prompts, or models.\n\n### Q29: How do you catch regressions?\n\nI catch regressions by maintaining **fixed evaluation suites** and running them before and after any change to ingestion, retrieval, prompts, models, or orchestration. These suites measure retrieval metrics, answer quality, hallucination rate, and guardrail behavior so I can spot silent regressions early. In production, I pair this with canary or shadow deployments and monitoring of user-facing metrics (error rates, dissatisfaction signals, override usage) to detect real-world degradations. Changes only roll fully once they pass both offline evaluations and limited-scope production checks.\n\n### Q30: How do you build a gold-standard evaluation dataset?\n\nI build evaluation datasets iteratively. First, I collect **real user queries** or representative examples from subject matter experts (SMEs). Second, I create **ground truth answers** by having SMEs label correct answers, noting which documents/chunks support each claim. Third, I pair queries with **expected retrieval results** so I can evaluate retrieval independently from answer quality. Fourth, I iterate: run my system on these test queries, identify failures, add them to the test set, and repeat. For high-stakes domains, I maintain separate **human review queues** where SMEs regularly audit both successful and failed cases to catch subtle errors. A good test set is never complete; it evolves as the system and user needs change.\n\n### Q31: How do you measure end-to-end system quality?\n\nI measure end-to-end quality using **task-specific metrics** that matter to users. For Q&A, I measure correctness, completeness (does the answer fully address the question?), and faithfulness (are all claims supported?). For summarization, I measure factuality, relevance, and conciseness. For open-ended generation, I use a combination of automatic metrics (ROUGE, BERTScore) and human judgments. I also track **user satisfaction** (ratings, override rates, feedback) because automatic metrics sometimes miss important quality dimensions. Finally, I decompose failures to understand whether they originate in retrieval, grounding, tool use, or model reasoning so I can improve the right component.\n\n---\n\n## 8. SYSTEM DESIGN & PRODUCTION\n\n### Q32: How would you design a RAG system for high-availability and fault tolerance?\n\nFor high availability, I use **replicated index shards** across multiple machines and **load-balanced retrieval**. I maintain a primary and secondary index so if the primary fails, queries automatically route to the secondary. For large indices, I shard by document or query type so failures affect only a subset of queries. I also implement **graceful degradation**: if semantic search is slow or fails, fall back to keyword search; if retrieval fails entirely, feed the model with the full user query and let it reason without external context. I use **health checks** and monitoring to detect failures early and trigger failover before users notice. Finally, I implement **circuit breakers** for dependencies so a slow embedding service doesn't cascade to the entire system.\n\n### Q33: How do you design the UX for a slow or uncertain AI system?\n\nFor systems that are inherently slow (e.g., 5+ second latency), I use **streaming responses** to show progress and give users confidence the system is working. I also **surface uncertainty**: show confidence scores, cite sources, and explicitly say \"I'm not confident in this answer\" when appropriate. For uncertain answers, I either offer a human-in-the-loop fallback or present alternative answers so users can choose. I also **surface limitations transparently**: \"I can answer questions about documents from 2024; for earlier data, please check the archive.\" This builds trust even when the system isn't perfect. Finally, I always provide a way for users to give feedback (thumbs up/down, corrections) so the system can learn and improve over time.\n\n### Q34: How would you handle prompt injection and adversarial inputs?\n\nPrompt injection is when a user tries to trick the system into ignoring its instructions by injecting conflicting instructions into the input. I defend against this by **strict input validation**: reject or sanitize inputs that contain prompt-like keywords (e.g., \"ignore\", \"system prompt\", \"instead do\"). I also **separate user input from instructions** at the prompt level by using strong delimiters and making it clear which parts are user-provided. I add **output validation**: check that the model's response follows the intended structure and contains no injected instructions. For critical systems, I log and audit all suspicious inputs and have security reviews for any novel injection attempts. I also educate users: make it clear that the system has fixed instructions and prompts can't be overridden.\n\n### Q35: How do you monitor and alert on LLM system quality in production?\n\nI monitor both **system health** and **output quality**. System health includes latency, error rates, throughput, and resource usage. Output quality includes hallucination rate, user satisfaction, refusal rate, and safety metrics. I set alerts on sudden changes: e.g., if latency jumps from 2s to 10s, or hallucination rate rises from 2% to 10%, I get paged. I also track trends: if hallucination rate is slowly climbing, that's a sign that the knowledge base is drifting or the retrieval is degrading. I use **anomaly detection** to flag unusual patterns (e.g., a user asking the same question 100 times in a row, which might indicate a test or adversarial attack). Finally, I implement **user feedback loops**: users rate answers, and I track which features correlate with high satisfaction, then double down on those.\n\n---\n\n## Final Principles\n\nGenAI is fundamentally a **systems engineering problem**. Reliable, high-quality systems require:\n\n1. **Disciplined retrieval**: Strong ranking, filtering, and validation of context\n2. **Clean ingestion**: Structured data extraction, versioning, and quality checks\n3. **Smart orchestration**: Clear agent boundaries, explicit state, comprehensive monitoring\n4. **Evaluation rigor**: Fixed test sets, end-to-end metrics, and continuous regression detection\n5. **Production readiness**: Fault tolerance, graceful degradation, transparent UX, and security\n\n**Prompt tuning and model selection alone are insufficient.** The best results come from thoughtful system design, empirical validation, and operational discipline.\n\n---\n\n## Additional Resources\n\n- **DataCamp RAG Guide**: https://www.datacamp.com/blog/rag-interview-questions\n- **Generative AI System Design Interview**: https://igotanoffer.com/en/advice/generative-ai-system-design-interview\n- **Document Chunking Strategies**: https://www.dataquest.io/blog/document-chunking-strategies-for-vector-databases/\n- **Prompt Engineering Interview Questions**: https://www.pinecone.io/learn/chunking-strategies/\n- **LLM Cost Optimization**: https://blog.vllm.ai/2024/09/05/perf-update.html\n\n---\n\n**Prepared for:** Technical Interview Preparation \n**Audience:** ML Engineers, AI Systems Engineers, GenAI Specialists \n**Difficulty:** Intermediate to Advanced\n",
|
| 9 |
+
"size": 27913,
|
| 10 |
+
"language": "markdown"
|
| 11 |
+
}
|
| 12 |
+
},
|
| 13 |
+
"_cache_metadata": {
|
| 14 |
+
"url": "https://github.com/ronelsolomon/AI-Engineer-questions.git",
|
| 15 |
+
"content_type": "github",
|
| 16 |
+
"cached_at": "2026-03-02T22:48:21.442554",
|
| 17 |
+
"cache_key": "34de00c9468eb9197864c154647cc3d6"
|
| 18 |
+
}
|
| 19 |
+
}
|
36cb98d23e37dc15d13eebd50a6e06d4.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/2d-game-dev.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "2d-game-dev.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:48:09.634877",
|
| 6 |
+
"files": {
|
| 7 |
+
".gitattributes": {
|
| 8 |
+
"content": "# Auto detect text files and perform LF normalization\n* text=auto\n",
|
| 9 |
+
"size": 66,
|
| 10 |
+
"language": "unknown"
|
| 11 |
+
}
|
| 12 |
+
},
|
| 13 |
+
"_cache_metadata": {
|
| 14 |
+
"url": "https://github.com/ronelsolomon/2d-game-dev.git",
|
| 15 |
+
"content_type": "github",
|
| 16 |
+
"cached_at": "2026-03-02T22:48:09.635410",
|
| 17 |
+
"cache_key": "36cb98d23e37dc15d13eebd50a6e06d4"
|
| 18 |
+
}
|
| 19 |
+
}
|
37838d5288c7f6b9ee5b5a367fb02ab7.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/genAI.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "genAI.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:50:20.940419",
|
| 6 |
+
"files": {
|
| 7 |
+
"rishimo-generation.ipynb": {
|
| 8 |
+
"content": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [\n {\n \"name\": \"stderr\",\n \"output_type\": \"stream\",\n \"text\": [\n \"/home/rnmohan/anaconda3/lib/python3.11/site-packages/transformers/utils/generic.py:260: UserWarning: torch.utils._pytree._register_pytree_node is deprecated. Please use torch.utils._pytree.register_pytree_node instead.\\n\",\n \" torch.utils._pytree._register_pytree_node(\\n\",\n \"/home/rnmohan/anaconda3/lib/python3.11/site-packages/transformers/utils/generic.py:260: UserWarning: torch.utils._pytree._register_pytree_node is deprecated. Please use torch.utils._pytree.register_pytree_node instead.\\n\",\n \" torch.utils._pytree._register_pytree_node(\\n\",\n \"/home/rnmohan/anaconda3/lib/python3.11/site-packages/diffusers/models/transformers/transformer_2d.py:34: FutureWarning: `Transformer2DModelOutput` is deprecated and will be removed in version 1.0.0. Importing `Transformer2DModelOutput` from `diffusers.models.transformer_2d` is deprecated and this will be removed in a future version. Please use `from diffusers.models.modeling_outputs import Transformer2DModelOutput`, instead.\\n\",\n \" deprecate(\\\"Transformer2DModelOutput\\\", \\\"1.0.0\\\", deprecation_message)\\n\"\n ]\n }\n ],\n \"source\": [\n \"import torch\\n\",\n \"from torchvision import transforms\\n\",\n \"\\n\",\n \"from diffusers.models import MotionAdapter\\n\",\n \"from diffusers import AnimateDiffSDXLPipeline, DDIMScheduler\\n\",\n \"from diffusers.utils import export_to_gif\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 2,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n \"device = (\\n\",\n \" \\\"mps\\\"\\n\",\n \" if torch.backends.mps.is_available()\\n\",\n \" else \\\"cuda\\\"\\n\",\n \" if torch.cuda.is_available()\\n\",\n \" else \\\"cpu\\\"\\n\",\n \")\"\n ]\n },\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"## first model\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": null,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n \"adapter = MotionAdapter.from_pretrained(\\\"guoyww/animatediff-motion-adapter-sdxl-beta\\\", torch_dtype=torch.float16)\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": null,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n \"# load StableDiffusion1.5-based finetuned model\\n\",\n \"\\n\",\n \"#model_id = \\\"SG161222/Realistic_Vision_V5.1_noVAE\\\"\\n\",\n \"model_id = \\\"stabilityai/stable-diffusion-xl-base-1.0\\\"\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": null,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n \"scheduler = DDIMScheduler.from_pretrained(\\n\",\n \" model_id,\\n\",\n \" subfolder=\\\"scheduler\\\",\\n\",\n \" clip_sample=False,\\n\",\n \" timestep_spacing=\\\"linspace\\\",\\n\",\n \" beta_schedule=\\\"linear\\\",\\n\",\n \" steps_offset=1,\\n\",\n \")\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": null,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n \"preprocess = transforms.Compose([\\n\",\n \" transforms.Resize((256, 256)),\\n\",\n \" transforms.ToTensor(),\\n\",\n \" transforms.Normalize([0.5], [0.5])\\n\",\n \"])\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": null,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n \"pipe = AnimateDiffSDXLPipeline.from_pretrained(\\n\",\n \" model_id,\\n\",\n \" motion_adapter=adapter,\\n\",\n \" scheduler=scheduler,\\n\",\n \" torch_dtype=torch.float16,\\n\",\n \" variant=\\\"fp16\\\",\\n\",\n \").to(device)\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": null,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n \"pipe.enable_vae_slicing()\\n\",\n \"pipe.enable_vae_tiling()\\n\",\n \"\\n\",\n \"output = pipe(\\n\",\n \" prompt=\\\"a purple sunset in the ocean reflection, realistic, high quality\\\",\\n\",\n \" negative_prompt=\\\"low quality, worst quality\\\",\\n\",\n \" num_inference_steps=50,\\n\",\n \" guidance_scale=8,\\n\",\n \" width=1024,\\n\",\n \" height=1024,\\n\",\n \" num_frames=16,\\n\",\n \")\\n\",\n \"\\n\",\n \"frames = output.frames[0]\\n\",\n \"export_to_gif(frames, \\\"animation.gif\\\")\"\n ]\n },\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"## static image to GIF experimentation (i2v)\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 3,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n \"import torch\\n\",\n \"from diffusers import I2VGenXLPipeline\\n\",\n \"from diffusers.utils import export_to_gif, load_image\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 4,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n \"device = (\\n\",\n \" \\\"mps\\\"\\n\",\n \" if torch.backends.mps.is_available()\\n\",\n \" else \\\"cuda\\\"\\n\",\n \" if torch.cuda.is_available()\\n\",\n \" else \\\"cpu\\\"\\n\",\n \")\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 5,\n \"metadata\": {},\n \"outputs\": [\n {\n \"data\": {\n \"application/vnd.jupyter.widget-view+json\": {\n \"model_id\": \"6e6b7fccec24437eb8f4aeaee3cfdfdd\",\n \"version_major\": 2,\n \"version_minor\": 0\n },\n \"text/plain\": [\n \"model_index.json: 0%| | 0.00/555 [00:00<?, ?B/s]\"\n ]\n },\n \"metadata\": {},\n \"output_type\": \"display_data\"\n },\n {\n \"data\": {\n \"application/vnd.jupyter.widget-view+json\": {\n \"model_id\": \"d53edf92a4f24ebc887bfd6c3635ada2\",\n \"version_major\": 2,\n \"version_minor\": 0\n },\n \"text/plain\": [\n \"Fetching 15 files: 0%| | 0/15 [00:00<?, ?it/s]\"\n ]\n },\n \"metadata\": {},\n \"output_type\": \"display_data\"\n },\n {\n \"data\": {\n \"application/vnd.jupyter.widget-view+json\": {\n \"model_id\": \"5daa0d33798f40ba8e7e81efdd9fba1b\",\n \"version_major\": 2,\n \"version_minor\": 0\n },\n \"text/plain\": [\n \"image_encoder/config.json: 0%| | 0.00/563 [00:00<?, ?B/s]\"\n ]\n },\n \"metadata\": {},\n \"output_type\": \"display_data\"\n },\n {\n \"data\": {\n \"application/vnd.jupyter.widget-view+json\": {\n \"model_id\": \"62e13bd4999742aca80309277aab4f6e\",\n \"version_major\": 2,\n \"version_minor\": 0\n },\n \"text/plain\": [\n \"scheduler/scheduler_config.json: 0%| | 0.00/507 [00:00<?, ?B/s]\"\n ]\n },\n \"metadata\": {},\n \"output_type\": \"display_data\"\n },\n {\n \"data\": {\n \"application/vnd.jupyter.widget-view+json\": {\n \"model_id\": \"fb8d6659202f404492a5f4e770c47b33\",\n \"version_major\": 2,\n \"version_minor\": 0\n },\n \"text/plain\": [\n \"(…)ature_extractor/preprocessor_config.json: 0%| | 0.00/466 [00:00<?, ?B/s]\"\n ]\n },\n \"metadata\": {},\n \"output_type\": \"display_data\"\n },\n {\n \"data\": {\n \"application/vnd.jupyter.widget-view+json\": {\n \"model_id\": \"bd3b24cacee8495c8e2a05e2ab4e073b\",\n \"version_major\": 2,\n \"version_minor\": 0\n },\n \"text/plain\": [\n \"tokenizer/special_tokens_map.json: 0%| | 0.00/588 [00:00<?, ?B/s]\"\n ]\n },\n \"metadata\": {},\n \"output_type\": \"display_data\"\n },\n {\n \"data\": {\n \"application/vnd.jupyter.widget-view+json\": {\n \"model_id\": \"3e3ab362cb2441e99a88ec5fa6e072ac\",\n \"version_major\": 2,\n \"version_minor\": 0\n },\n \"text/plain\": [\n \"text_encoder/config.json: 0%| | 0.00/601 [00:00<?, ?B/s]\"\n ]\n },\n \"metadata\": {},\n \"output_type\": \"display_data\"\n },\n {\n \"data\": {\n \"application/vnd.jupyter.widget-view+json\": {\n \"model_id\": \"f9fbbae8d8704442bb30bb45c107e86b\",\n \"version_major\": 2,\n \"version_minor\": 0\n },\n \"text/plain\": [\n \"tokenizer/merges.txt: 0%| | 0.00/525k [00:00<?, ?B/s]\"\n ]\n },\n \"metadata\": {},\n \"output_type\": \"display_data\"\n },\n {\n \"data\": {\n \"application/vnd.jupyter.widget-view+json\": {\n \"model_id\": \"6b98e2e6341d4008a52e2d91b12a03db\",\n \"version_major\": 2,\n \"version_minor\": 0\n },\n \"text/plain\": [\n \"image_encoder/model.fp16.safetensors: 0%| | 0.00/1.26G [00:00<?, ?B/s]\"\n ]\n },\n \"metadata\": {},\n \"output_type\": \"display_data\"\n },\n {\n \"data\": {\n \"application/vnd.jupyter.widget-view+json\": {\n \"model_id\": \"d88c9b1fc0c2473abe8b212eb78f2fb7\",\n \"version_major\": 2,\n \"version_minor\": 0\n },\n \"text/plain\": [\n \"text_encoder/model.fp16.safetensors: 0%| | 0.00/706M [00:00<?, ?B/s]\"\n ]\n },\n \"metadata\": {},\n \"output_type\": \"display_data\"\n },\n {\n \"data\": {\n \"application/vnd.jupyter.widget-view+json\": {\n \"model_id\": \"051888bdb83c4397b35bf94e0929a7f0\",\n \"version_major\": 2,\n \"version_minor\": 0\n },\n \"text/plain\": [\n \"unet/config.json: 0%| | 0.00/627 [00:00<?, ?B/s]\"\n ]\n },\n \"metadata\": {},\n \"output_type\": \"display_data\"\n },\n {\n \"data\": {\n \"application/vnd.jupyter.widget-view+json\": {\n \"model_id\": \"f055e4dc8610482b9e4dd654dca5ec97\",\n \"version_major\": 2,\n \"version_minor\": 0\n },\n \"text/plain\": [\n \"vae/config.json: 0%| | 0.00/637 [00:00<?, ?B/s]\"\n ]\n },\n \"metadata\": {},\n \"output_type\": \"display_data\"\n },\n {\n \"data\": {\n \"application/vnd.jupyter.widget-view+json\": {\n \"model_id\": \"7f1fb6b3b0bc4f8b90831944a5a666cc\",\n \"version_major\": 2,\n \"version_minor\": 0\n },\n \"text/plain\": [\n \"tokenizer/vocab.json: 0%| | 0.00/1.06M [00:00<?, ?B/s]\"\n ]\n },\n \"metadata\": {},\n \"output_type\": \"display_data\"\n },\n {\n \"data\": {\n \"application/vnd.jupyter.widget-view+json\": {\n \"model_id\": \"00dc9b1a24224b36a055c64b07bc5eb7\",\n \"version_major\": 2,\n \"version_minor\": 0\n },\n \"text/plain\": [\n \"(…)diffusion_pytorch_model.fp16.safetensors: 0%| | 0.00/2.84G [00:00<?, ?B/s]\"\n ]\n },\n \"metadata\": {},\n \"output_type\": \"display_data\"\n },\n {\n \"data\": {\n \"application/vnd.jupyter.widget-view+json\": {\n \"model_id\": \"288cd93032e643d29a88c6cc27405d90\",\n \"version_major\": 2,\n \"version_minor\": 0\n },\n \"text/plain\": [\n \"(…)diffusion_pytorch_model.fp16.safetensors: 0%| | 0.00/167M [00:00<?, ?B/s]\"\n ]\n },\n \"metadata\": {},\n \"output_type\": \"display_data\"\n },\n {\n \"data\": {\n \"application/vnd.jupyter.widget-view+json\": {\n \"model_id\": \"7fc0e0d9795f4c579560cabd0116b516\",\n \"version_major\": 2,\n \"version_minor\": 0\n },\n \"text/plain\": [\n \"tokenizer/tokenizer_config.json: 0%| | 0.00/705 [00:00<?, ?B/s]\"\n ]\n },\n \"metadata\": {},\n \"output_type\": \"display_data\"\n },\n {\n \"data\": {\n \"application/vnd.jupyter.widget-view+json\": {\n \"model_id\": \"e745da0fe65f4abca0b91b2d7aa05575\",\n \"version_major\": 2,\n \"version_minor\": 0\n },\n \"text/plain\": [\n \"Loading pipeline components...: 0%| | 0/7 [00:00<?, ?it/s]\"\n ]\n },\n \"metadata\": {},\n \"output_type\": \"display_data\"\n }\n ],\n \"source\": [\n \"pipeline = I2VGenXLPipeline.from_pretrained(\\n\",\n \" \\\"ali-vilab/i2vgen-xl\\\", torch_dtype=torch.float16, variant=\\\"fp16\\\"\\n\",\n \").to(device)\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 7,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n \"image_loc = \\\"snow.jpg\\\"\\n\",\n \"image = load_image(image_loc).convert(\\\"RGB\\\")\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": null,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n \"prompt = \\\"Timelapse of a snowy cabin\\\"\\n\",\n \"negative_prompt = \\\"Distorted, discontinuous, Ugly, blurry, low resolution, motionless, static, disfigured, disconnected limbs, Ugly faces, incomplete arms\\\"\\n\",\n \"generator = torch.manual_seed(8888)\\n\",\n \"\\n\",\n \"frames = pipeline(\\n\",\n \" prompt=prompt,\\n\",\n \" image=image,\\n\",\n \" num_inference_steps=50,\\n\",\n \" negative_prompt=negative_prompt,\\n\",\n \" guidance_scale=9.0,\\n\",\n \" generator=generator,\\n\",\n \").frames[0]\\n\",\n \"video_path = export_to_gif(frames, \\\"i2v.gif\\\")\"\n ]\n }\n ],\n \"metadata\": {\n \"kernelspec\": {\n \"display_name\": \"base\",\n \"language\": \"python\",\n \"name\": \"python3\"\n },\n \"language_info\": {\n \"codemirror_mode\": {\n \"name\": \"ipython\",\n \"version\": 3\n },\n \"file_extension\": \".py\",\n \"mimetype\": \"text/x-python\",\n \"name\": \"python\",\n \"nbconvert_exporter\": \"python\",\n \"pygments_lexer\": \"ipython3\",\n \"version\": \"3.11.5\"\n }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n",
|
| 9 |
+
"size": 12783,
|
| 10 |
+
"language": "unknown"
|
| 11 |
+
}
|
| 12 |
+
},
|
| 13 |
+
"_cache_metadata": {
|
| 14 |
+
"url": "https://github.com/ronelsolomon/genAI.git",
|
| 15 |
+
"content_type": "github",
|
| 16 |
+
"cached_at": "2026-03-02T22:50:20.941071",
|
| 17 |
+
"cache_key": "37838d5288c7f6b9ee5b5a367fb02ab7"
|
| 18 |
+
}
|
| 19 |
+
}
|
37987ddade14ae2a6b6fa13bc2ff9450.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/ETL-pipeline.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "ETL-pipeline.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:43:46.867502",
|
| 6 |
+
"files": {
|
| 7 |
+
"requirements.txt": {
|
| 8 |
+
"content": "pandas>=1.5.0\npython-dotenv>=0.19.0\npsycopg2-binary>=2.9.0\nsqlalchemy>=1.4.0\npyarrow>=7.0.0\nrequests>=2.28.0\npython-dateutil>=2.8.2\n",
|
| 9 |
+
"size": 132,
|
| 10 |
+
"language": "text"
|
| 11 |
+
},
|
| 12 |
+
"README.md": {
|
| 13 |
+
"content": "# ETL Pipeline with Open Data\n\nThis project demonstrates a simple ETL (Extract, Transform, Load) pipeline that processes public data and loads it into a database.\n\n## Features\n\n- Extracts data from public CSV datasets\n- Transforms and cleans data using Pandas\n- Loads data into PostgreSQL database\n- Environment variable configuration\n- Logging for monitoring the ETL process\n\n## Setup\n\n1. Clone the repository\n2. Install dependencies:\n ```bash\n pip install -r requirements.txt\n ```\n3. Set up your environment variables in `.env` (use `.env.example` as a template)\n4. Run the ETL pipeline:\n ```bash\n python main.py\n ```\n\n## Project Structure\n\n```\nETL-pipeline/\n├── data/ # For storing raw and processed data\n├── src/\n│ ├── __init__.py\n│ ├── extract.py # Data extraction logic\n│ ├── transform.py # Data transformation logic\n│ ├── load.py # Data loading logic\n│ └── utils.py # Utility functions\n├── .env.example # Example environment variables\n├── requirements.txt # Project dependencies\n├── main.py # Main script to run the ETL pipeline\n└── README.md # This file\n```\n\n## Data Source\n\nThis project uses [New York City Taxi Trip Data](https://www.kaggle.com/datasets/elemento/nyc-taxi-trip-dataset) as an example dataset.\n\n## License\n\nMIT\n",
|
| 14 |
+
"size": 1359,
|
| 15 |
+
"language": "markdown"
|
| 16 |
+
},
|
| 17 |
+
".gitattributes": {
|
| 18 |
+
"content": "# Auto detect text files and perform LF normalization\n* text=auto\n",
|
| 19 |
+
"size": 66,
|
| 20 |
+
"language": "unknown"
|
| 21 |
+
},
|
| 22 |
+
"main.py": {
|
| 23 |
+
"content": "#!/usr/bin/env python3\n\"\"\"\nMain entry point for the ETL pipeline.\n\"\"\"\nimport os\nimport logging\nfrom dotenv import load_dotenv\nfrom src.extract import extract_data\nfrom src.transform import transform_data\nfrom src.load import load_data\nfrom src.utils import setup_logging, get_db_connection\n\ndef main():\n \"\"\"Main function to run the ETL pipeline.\"\"\"\n # Load environment variables\n load_dotenv()\n \n # Set up logging\n log_level = os.getenv('LOG_LEVEL', 'INFO')\n log_file = os.getenv('LOG_FILE', 'etl_pipeline.log')\n setup_logging(log_level=log_level, log_file=log_file)\n logger = logging.getLogger(__name__)\n \n try:\n logger.info(\"Starting ETL pipeline\")\n \n # Extract data\n logger.info(\"Extracting data...\")\n data_url = os.getenv('DATA_SOURCE_URL')\n raw_data = extract_data(data_url)\n \n # Transform data\n logger.info(\"Transforming data...\")\n transformed_data = transform_data(raw_data)\n \n # Load data\n logger.info(\"Loading data to database...\")\n table_name = 'taxi_trips'\n load_data(transformed_data, table_name)\n \n logger.info(\"ETL pipeline completed successfully\")\n \n except Exception as e:\n logger.error(f\"Error in ETL pipeline: {str(e)}\", exc_info=True)\n raise\n\nif __name__ == \"__main__\":\n main()\n",
|
| 24 |
+
"size": 1376,
|
| 25 |
+
"language": "python"
|
| 26 |
+
},
|
| 27 |
+
"etl_pipeline.log": {
|
| 28 |
+
"content": "2025-06-17 21:05:41,456 - root - INFO - Logging to file: /Users/ronel/Downloads/dev/templates/ETL-pipeline/etl_pipeline.log\n2025-06-17 21:05:41,456 - __main__ - INFO - Starting ETL pipeline\n2025-06-17 21:05:41,456 - __main__ - INFO - Extracting data...\n2025-06-17 21:05:41,456 - src.extract - INFO - Extracting data from: None\n2025-06-17 21:05:41,456 - src.extract - ERROR - Error extracting data from None: stat: path should be string, bytes, os.PathLike or integer, not NoneType\n2025-06-17 21:05:41,456 - __main__ - ERROR - Error in ETL pipeline: stat: path should be string, bytes, os.PathLike or integer, not NoneType\nTraceback (most recent call last):\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/main.py\", line 30, in main\n raw_data = extract_data(data_url)\n ^^^^^^^^^^^^^^^^^^^^^^\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/extract.py\", line 32, in extract_data\n elif os.path.exists(source):\n ^^^^^^^^^^^^^^^^^^^^^^\n File \"<frozen genericpath>\", line 19, in exists\nTypeError: stat: path should be string, bytes, os.PathLike or integer, not NoneType\n2025-06-17 21:06:13,874 - root - INFO - Logging to file: /Users/ronel/Downloads/dev/templates/ETL-pipeline/etl_pipeline.log\n2025-06-17 21:06:13,874 - __main__ - INFO - Starting ETL pipeline\n2025-06-17 21:06:13,874 - __main__ - INFO - Extracting data...\n2025-06-17 21:06:13,874 - src.extract - INFO - Extracting data from: None\n2025-06-17 21:06:13,874 - src.extract - ERROR - Error extracting data from None: stat: path should be string, bytes, os.PathLike or integer, not NoneType\n2025-06-17 21:06:13,874 - __main__ - ERROR - Error in ETL pipeline: stat: path should be string, bytes, os.PathLike or integer, not NoneType\nTraceback (most recent call last):\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/main.py\", line 30, in main\n raw_data = extract_data(data_url)\n ^^^^^^^^^^^^^^^^^^^^^^\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/extract.py\", line 32, in extract_data\n elif os.path.exists(source):\n ^^^^^^^^^^^^^^^^^^^^^^\n File \"<frozen genericpath>\", line 19, in exists\nTypeError: stat: path should be string, bytes, os.PathLike or integer, not NoneType\n2025-06-17 21:06:54,331 - root - INFO - Logging to file: /Users/ronel/Downloads/dev/templates/ETL-pipeline/etl_pipeline.log\n2025-06-17 21:06:54,332 - __main__ - INFO - Starting ETL pipeline\n2025-06-17 21:06:54,332 - __main__ - INFO - Extracting data...\n2025-06-17 21:06:54,332 - src.extract - INFO - Extracting data from: None\n2025-06-17 21:06:54,332 - src.extract - ERROR - Error extracting data from None: stat: path should be string, bytes, os.PathLike or integer, not NoneType\n2025-06-17 21:06:54,332 - __main__ - ERROR - Error in ETL pipeline: stat: path should be string, bytes, os.PathLike or integer, not NoneType\nTraceback (most recent call last):\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/main.py\", line 30, in main\n raw_data = extract_data(data_url)\n ^^^^^^^^^^^^^^^^^^^^^^\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/extract.py\", line 32, in extract_data\n elif os.path.exists(source):\n ^^^^^^^^^^^^^^^^^^^^^^\n File \"<frozen genericpath>\", line 19, in exists\nTypeError: stat: path should be string, bytes, os.PathLike or integer, not NoneType\n2025-06-17 21:09:20,929 - root - INFO - Logging to file: /Users/ronel/Downloads/dev/templates/ETL-pipeline/etl_pipeline.log\n2025-06-17 21:09:20,929 - __main__ - INFO - Starting ETL pipeline\n2025-06-17 21:09:20,929 - __main__ - INFO - Extracting data...\n2025-06-17 21:09:20,929 - src.extract - INFO - Extracting data from: https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2023-01.parquet\n2025-06-17 21:09:25,181 - __main__ - INFO - Transforming data...\n2025-06-17 21:09:25,181 - src.transform - INFO - Starting data transformation\n2025-06-17 21:09:25,276 - src.transform - INFO - Data transformation complete. Shape after transformation: (3066766, 19)\n2025-06-17 21:09:25,277 - __main__ - INFO - Loading data to database...\n2025-06-17 21:09:25,277 - src.load - INFO - Loading data into taxi_trips\n2025-06-17 21:09:25,306 - src.load - ERROR - Error loading data into taxi_trips: No module named 'psycopg2'\n2025-06-17 21:09:25,306 - __main__ - ERROR - Error in ETL pipeline: No module named 'psycopg2'\nTraceback (most recent call last):\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/main.py\", line 39, in main\n load_data(transformed_data, table_name)\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/load.py\", line 60, in load_data\n engine = get_db_connection()\n ^^^^^^^^^^^^^^^^^^^\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/utils.py\", line 84, in get_db_connection\n return create_engine(connection_string)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"<string>\", line 2, in create_engine\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/util/deprecations.py\", line 281, in warned\n return fn(*args, **kwargs) # type: ignore[no-any-return]\n ^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/create.py\", line 599, in create_engine\n dbapi = dbapi_meth(**dbapi_args)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg2.py\", line 690, in import_dbapi\n import psycopg2\nModuleNotFoundError: No module named 'psycopg2'\n2025-06-17 21:09:53,917 - root - INFO - Logging to file: /Users/ronel/Downloads/dev/templates/ETL-pipeline/etl_pipeline.log\n2025-06-17 21:09:53,918 - __main__ - INFO - Starting ETL pipeline\n2025-06-17 21:09:53,918 - __main__ - INFO - Extracting data...\n2025-06-17 21:09:53,918 - src.extract - INFO - Extracting data from: https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2023-01.parquet\n2025-06-17 21:09:55,987 - __main__ - INFO - Transforming data...\n2025-06-17 21:09:55,987 - src.transform - INFO - Starting data transformation\n2025-06-17 21:09:56,064 - src.transform - INFO - Data transformation complete. Shape after transformation: (3066766, 19)\n2025-06-17 21:09:56,064 - __main__ - INFO - Loading data to database...\n2025-06-17 21:09:56,065 - src.load - INFO - Loading data into taxi_trips\n2025-06-17 21:09:56,091 - src.load - ERROR - Error loading data into taxi_trips: No module named 'psycopg2'\n2025-06-17 21:09:56,091 - __main__ - ERROR - Error in ETL pipeline: No module named 'psycopg2'\nTraceback (most recent call last):\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/main.py\", line 39, in main\n load_data(transformed_data, table_name)\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/load.py\", line 60, in load_data\n engine = get_db_connection()\n ^^^^^^^^^^^^^^^^^^^\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/utils.py\", line 84, in get_db_connection\n return create_engine(connection_string)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"<string>\", line 2, in create_engine\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/util/deprecations.py\", line 281, in warned\n return fn(*args, **kwargs) # type: ignore[no-any-return]\n ^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/create.py\", line 599, in create_engine\n dbapi = dbapi_meth(**dbapi_args)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg2.py\", line 690, in import_dbapi\n import psycopg2\nModuleNotFoundError: No module named 'psycopg2'\n2025-06-17 22:07:02,572 - root - INFO - Logging to file: /Users/ronel/Downloads/dev/templates/ETL-pipeline/etl_pipeline.log\n2025-06-17 22:07:02,572 - __main__ - INFO - Starting ETL pipeline\n2025-06-17 22:07:02,572 - __main__ - INFO - Extracting data...\n2025-06-17 22:07:02,572 - src.extract - INFO - Extracting data from: https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2023-01.parquet\n2025-06-17 22:07:04,213 - __main__ - INFO - Transforming data...\n2025-06-17 22:07:04,214 - src.transform - INFO - Starting data transformation\n2025-06-17 22:07:04,292 - src.transform - INFO - Data transformation complete. Shape after transformation: (3066766, 19)\n2025-06-17 22:07:04,292 - __main__ - INFO - Loading data to database...\n2025-06-17 22:07:04,292 - src.load - INFO - Loading data into taxi_trips\n2025-06-17 22:07:04,312 - src.load - ERROR - Error loading data into taxi_trips: No module named 'psycopg2'\n2025-06-17 22:07:04,313 - __main__ - ERROR - Error in ETL pipeline: No module named 'psycopg2'\nTraceback (most recent call last):\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/main.py\", line 39, in main\n load_data(transformed_data, table_name)\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/load.py\", line 60, in load_data\n engine = get_db_connection()\n ^^^^^^^^^^^^^^^^^^^\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/utils.py\", line 84, in get_db_connection\n return create_engine(connection_string)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"<string>\", line 2, in create_engine\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/util/deprecations.py\", line 281, in warned\n return fn(*args, **kwargs) # type: ignore[no-any-return]\n ^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/create.py\", line 599, in create_engine\n dbapi = dbapi_meth(**dbapi_args)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg2.py\", line 690, in import_dbapi\n import psycopg2\nModuleNotFoundError: No module named 'psycopg2'\n2025-06-17 22:11:51,014 - root - INFO - Logging to file: /Users/ronel/Downloads/dev/templates/ETL-pipeline/etl_pipeline.log\n2025-06-17 22:11:51,014 - __main__ - INFO - Starting ETL pipeline\n2025-06-17 22:11:51,014 - __main__ - INFO - Extracting data...\n2025-06-17 22:11:51,014 - src.extract - INFO - Extracting data from: https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2023-01.parquet\n2025-06-17 22:11:54,433 - __main__ - INFO - Transforming data...\n2025-06-17 22:11:54,433 - src.transform - INFO - Starting data transformation\n2025-06-17 22:11:54,510 - src.transform - INFO - Data transformation complete. Shape after transformation: (3066766, 19)\n2025-06-17 22:11:54,510 - __main__ - INFO - Loading data to database...\n2025-06-17 22:11:54,510 - src.load - INFO - Loading data into taxi_trips\n2025-06-17 22:11:55,209 - src.load - ERROR - Error loading data into taxi_trips: 'Engine' object has no attribute 'has_table'\n2025-06-17 22:11:55,209 - __main__ - ERROR - Error in ETL pipeline: 'Engine' object has no attribute 'has_table'\nTraceback (most recent call last):\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/main.py\", line 39, in main\n load_data(transformed_data, table_name)\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/load.py\", line 64, in load_data\n create_table_from_dataframe(\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/load.py\", line 109, in create_table_from_dataframe\n if engine.has_table(table_name, schema=schema):\n ^^^^^^^^^^^^^^^^\nAttributeError: 'Engine' object has no attribute 'has_table'\n2025-06-17 22:14:02,942 - root - INFO - Logging to file: /Users/ronel/Downloads/dev/templates/ETL-pipeline/etl_pipeline.log\n2025-06-17 22:14:02,942 - __main__ - INFO - Starting ETL pipeline\n2025-06-17 22:14:02,942 - __main__ - INFO - Extracting data...\n2025-06-17 22:14:02,942 - src.extract - INFO - Extracting data from: https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2023-01.parquet\n2025-06-17 22:14:04,625 - __main__ - INFO - Transforming data...\n2025-06-17 22:14:04,625 - src.transform - INFO - Starting data transformation\n2025-06-17 22:14:04,699 - src.transform - INFO - Data transformation complete. Shape after transformation: (3066766, 19)\n2025-06-17 22:14:04,699 - __main__ - INFO - Loading data to database...\n2025-06-17 22:14:04,699 - src.load - INFO - Loading data into taxi_trips\n2025-06-17 22:14:05,331 - src.load - ERROR - Error loading data into taxi_trips: (psycopg2.OperationalError) connection to server at \"ep-cool-darkness-a1b2c3d4-pooler.us-east-2.aws.neon.tech\" (3.131.64.200), port 5432 failed: ERROR: password authentication failed for user 'alex'\n\n(Background on this error at: https://sqlalche.me/e/20/e3q8)\n2025-06-17 22:14:05,331 - __main__ - ERROR - Error in ETL pipeline: (psycopg2.OperationalError) connection to server at \"ep-cool-darkness-a1b2c3d4-pooler.us-east-2.aws.neon.tech\" (3.131.64.200), port 5432 failed: ERROR: password authentication failed for user 'alex'\n\n(Background on this error at: https://sqlalche.me/e/20/e3q8)\nTraceback (most recent call last):\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 146, in __init__\n self._dbapi_connection = engine.raw_connection()\n ^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 3302, in raw_connection\n return self.pool.connect()\n ^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 449, in connect\n return _ConnectionFairy._checkout(self)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 1263, in _checkout\n fairy = _ConnectionRecord.checkout(pool)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 712, in checkout\n rec = pool._do_get()\n ^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/impl.py\", line 179, in _do_get\n with util.safe_reraise():\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py\", line 146, in __exit__\n raise exc_value.with_traceback(exc_tb)\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/impl.py\", line 177, in _do_get\n return self._create_connection()\n ^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 390, in _create_connection\n return _ConnectionRecord(self)\n ^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 674, in __init__\n self.__connect()\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 900, in __connect\n with util.safe_reraise():\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py\", line 146, in __exit__\n raise exc_value.with_traceback(exc_tb)\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 896, in __connect\n self.dbapi_connection = connection = pool._invoke_creator(self)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/create.py\", line 643, in connect\n return dialect.connect(*cargs, **cparams)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/default.py\", line 621, in connect\n return self.loaded_dbapi.connect(*cargs, **cparams)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/psycopg2/__init__.py\", line 122, in connect\n conn = _connect(dsn, connection_factory=connection_factory, **kwasync)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\npsycopg2.OperationalError: connection to server at \"ep-cool-darkness-a1b2c3d4-pooler.us-east-2.aws.neon.tech\" (3.131.64.200), port 5432 failed: ERROR: password authentication failed for user 'alex'\n\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/main.py\", line 39, in main\n load_data(transformed_data, table_name)\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/load.py\", line 64, in load_data\n create_table_from_dataframe(\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/load.py\", line 111, in create_table_from_dataframe\n inspector = inspect(engine)\n ^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/inspection.py\", line 140, in inspect\n ret = reg(subject)\n ^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/reflection.py\", line 312, in _engine_insp\n return Inspector._construct(Inspector._init_engine, bind)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/reflection.py\", line 245, in _construct\n init(self, bind)\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/reflection.py\", line 256, in _init_engine\n engine.connect().close()\n ^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 3278, in connect\n return self._connection_cls(self)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 148, in __init__\n Connection._handle_dbapi_exception_noconnection(\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 2442, in _handle_dbapi_exception_noconnection\n raise sqlalchemy_exception.with_traceback(exc_info[2]) from e\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 146, in __init__\n self._dbapi_connection = engine.raw_connection()\n ^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 3302, in raw_connection\n return self.pool.connect()\n ^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 449, in connect\n return _ConnectionFairy._checkout(self)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 1263, in _checkout\n fairy = _ConnectionRecord.checkout(pool)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 712, in checkout\n rec = pool._do_get()\n ^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/impl.py\", line 179, in _do_get\n with util.safe_reraise():\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py\", line 146, in __exit__\n raise exc_value.with_traceback(exc_tb)\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/impl.py\", line 177, in _do_get\n return self._create_connection()\n ^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 390, in _create_connection\n return _ConnectionRecord(self)\n ^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 674, in __init__\n self.__connect()\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 900, in __connect\n with util.safe_reraise():\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py\", line 146, in __exit__\n raise exc_value.with_traceback(exc_tb)\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 896, in __connect\n self.dbapi_connection = connection = pool._invoke_creator(self)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/create.py\", line 643, in connect\n return dialect.connect(*cargs, **cparams)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/default.py\", line 621, in connect\n return self.loaded_dbapi.connect(*cargs, **cparams)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/psycopg2/__init__.py\", line 122, in connect\n conn = _connect(dsn, connection_factory=connection_factory, **kwasync)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsqlalchemy.exc.OperationalError: (psycopg2.OperationalError) connection to server at \"ep-cool-darkness-a1b2c3d4-pooler.us-east-2.aws.neon.tech\" (3.131.64.200), port 5432 failed: ERROR: password authentication failed for user 'alex'\n\n(Background on this error at: https://sqlalche.me/e/20/e3q8)\n2025-06-17 22:16:08,322 - root - INFO - Logging to file: /Users/ronel/Downloads/dev/templates/ETL-pipeline/etl_pipeline.log\n2025-06-17 22:16:08,322 - __main__ - INFO - Starting ETL pipeline\n2025-06-17 22:16:08,322 - __main__ - INFO - Extracting data...\n2025-06-17 22:16:08,322 - src.extract - INFO - Extracting data from: https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2023-01.parquet\n2025-06-17 22:16:09,971 - __main__ - INFO - Transforming data...\n2025-06-17 22:16:09,971 - src.transform - INFO - Starting data transformation\n2025-06-17 22:16:10,048 - src.transform - INFO - Data transformation complete. Shape after transformation: (3066766, 19)\n2025-06-17 22:16:10,048 - __main__ - INFO - Loading data to database...\n2025-06-17 22:16:10,048 - src.load - INFO - Loading data into taxi_trips\n2025-06-17 22:16:12,558 - src.load - INFO - Created table taxi_trips\n2025-06-17 22:25:26,193 - src.load - ERROR - Error loading data into taxi_trips: (psycopg2.errors.DiskFull) could not extend file because project size limit (512 MB) has been exceeded\nHINT: This limit is defined by neon.max_cluster_size GUC\n\n[SQL: INSERT INTO taxi_trips (\"VendorID\", tpep_pickup_datetime, tpep_dropoff_datetime, passenger_count, trip_distance, \"RatecodeID\", store_and_fwd_flag, \"PULocationID\", \"DOLocationID\", payment_type, fare_amount, extra, mta_tax, tip_amount, tolls_amount, im ... 458885 characters truncated ... vement_surcharge__999)s, %(total_amount__999)s, %(congestion_surcharge__999)s, %(airport_fee__999)s)]\n[parameters: {'congestion_surcharge__0': 2.5, 'RatecodeID__0': 1.0, 'airport_fee__0': 0.0, 'extra__0': 2.5, 'tip_amount__0': 2.9, 'fare_amount__0': 5.8, 'mta_tax__0': 0.5, 'total_amount__0': 12.7, 'trip_distance__0': 0.7, 'tolls_amount__0': 0.0, 'store_and_fwd_flag__0': 'N', 'passenger_count__0': 1.0, 'improvement_surcharge__0': 1.0, 'tpep_dropoff_datetime__0': datetime.datetime(2023, 1, 29, 15, 6, 34), 'tpep_pickup_datetime__0': datetime.datetime(2023, 1, 29, 15, 3, 37), 'VendorID__0': 1, 'payment_type__0': 1, 'DOLocationID__0': 237, 'PULocationID__0': 229, 'congestion_surcharge__1': 2.5, 'RatecodeID__1': 1.0, 'airport_fee__1': 0.0, 'extra__1': 2.5, 'tip_amount__1': 0.0, 'fare_amount__1': 13.5, 'mta_tax__1': 0.5, 'total_amount__1': 17.5, 'trip_distance__1': 2.4, 'tolls_amount__1': 0.0, 'store_and_fwd_flag__1': 'N', 'passenger_count__1': 1.0, 'improvement_surcharge__1': 1.0, 'tpep_dropoff_datetime__1': datetime.datetime(2023, 1, 29, 15, 24, 33), 'tpep_pickup_datetime__1': datetime.datetime(2023, 1, 29, 15, 12, 38), 'VendorID__1': 1, 'payment_type__1': 2, 'DOLocationID__1': 79, 'PULocationID__1': 237, 'congestion_surcharge__2': 2.5, 'RatecodeID__2': 1.0, 'airport_fee__2': 0.0, 'extra__2': 2.5, 'tip_amount__2': 3.85, 'fare_amount__2': 11.4, 'mta_tax__2': 0.5, 'total_amount__2': 19.25, 'trip_distance__2': 0.7, 'tolls_amount__2': 0.0, 'store_and_fwd_flag__2': 'N', 'passenger_count__2': 1.0 ... 18900 parameters truncated ... 'total_amount__997': 28.56, 'trip_distance__997': 3.9, 'tolls_amount__997': 0.0, 'store_and_fwd_flag__997': 'N', 'passenger_count__997': 1.0, 'improvement_surcharge__997': 1.0, 'tpep_dropoff_datetime__997': datetime.datetime(2023, 1, 29, 15, 58, 6), 'tpep_pickup_datetime__997': datetime.datetime(2023, 1, 29, 15, 42, 58), 'VendorID__997': 1, 'payment_type__997': 1, 'DOLocationID__997': 42, 'PULocationID__997': 141, 'congestion_surcharge__998': 0.0, 'RatecodeID__998': 1.0, 'airport_fee__998': 0.0, 'extra__998': 0.0, 'tip_amount__998': 0.0, 'fare_amount__998': 14.2, 'mta_tax__998': 0.5, 'total_amount__998': 15.7, 'trip_distance__998': 2.1, 'tolls_amount__998': 0.0, 'store_and_fwd_flag__998': 'N', 'passenger_count__998': 1.0, 'improvement_surcharge__998': 1.0, 'tpep_dropoff_datetime__998': datetime.datetime(2023, 1, 29, 15, 16, 54), 'tpep_pickup_datetime__998': datetime.datetime(2023, 1, 29, 15, 4, 55), 'VendorID__998': 1, 'payment_type__998': 2, 'DOLocationID__998': 75, 'PULocationID__998': 151, 'congestion_surcharge__999': 2.5, 'RatecodeID__999': 1.0, 'airport_fee__999': 0.0, 'extra__999': 2.5, 'tip_amount__999': 2.65, 'fare_amount__999': 9.3, 'mta_tax__999': 0.5, 'total_amount__999': 15.95, 'trip_distance__999': 1.1, 'tolls_amount__999': 0.0, 'store_and_fwd_flag__999': 'N', 'passenger_count__999': 1.0, 'improvement_surcharge__999': 1.0, 'tpep_dropoff_datetime__999': datetime.datetime(2023, 1, 29, 15, 35, 28), 'tpep_pickup_datetime__999': datetime.datetime(2023, 1, 29, 15, 27, 23), 'VendorID__999': 1, 'payment_type__999': 1, 'DOLocationID__999': 236, 'PULocationID__999': 262}]\n(Background on this error at: https://sqlalche.me/e/20/e3q8)\n2025-06-17 22:25:26,206 - __main__ - ERROR - Error in ETL pipeline: (psycopg2.errors.DiskFull) could not extend file because project size limit (512 MB) has been exceeded\nHINT: This limit is defined by neon.max_cluster_size GUC\n\n[SQL: INSERT INTO taxi_trips (\"VendorID\", tpep_pickup_datetime, tpep_dropoff_datetime, passenger_count, trip_distance, \"RatecodeID\", store_and_fwd_flag, \"PULocationID\", \"DOLocationID\", payment_type, fare_amount, extra, mta_tax, tip_amount, tolls_amount, im ... 458885 characters truncated ... vement_surcharge__999)s, %(total_amount__999)s, %(congestion_surcharge__999)s, %(airport_fee__999)s)]\n[parameters: {'congestion_surcharge__0': 2.5, 'RatecodeID__0': 1.0, 'airport_fee__0': 0.0, 'extra__0': 2.5, 'tip_amount__0': 2.9, 'fare_amount__0': 5.8, 'mta_tax__0': 0.5, 'total_amount__0': 12.7, 'trip_distance__0': 0.7, 'tolls_amount__0': 0.0, 'store_and_fwd_flag__0': 'N', 'passenger_count__0': 1.0, 'improvement_surcharge__0': 1.0, 'tpep_dropoff_datetime__0': datetime.datetime(2023, 1, 29, 15, 6, 34), 'tpep_pickup_datetime__0': datetime.datetime(2023, 1, 29, 15, 3, 37), 'VendorID__0': 1, 'payment_type__0': 1, 'DOLocationID__0': 237, 'PULocationID__0': 229, 'congestion_surcharge__1': 2.5, 'RatecodeID__1': 1.0, 'airport_fee__1': 0.0, 'extra__1': 2.5, 'tip_amount__1': 0.0, 'fare_amount__1': 13.5, 'mta_tax__1': 0.5, 'total_amount__1': 17.5, 'trip_distance__1': 2.4, 'tolls_amount__1': 0.0, 'store_and_fwd_flag__1': 'N', 'passenger_count__1': 1.0, 'improvement_surcharge__1': 1.0, 'tpep_dropoff_datetime__1': datetime.datetime(2023, 1, 29, 15, 24, 33), 'tpep_pickup_datetime__1': datetime.datetime(2023, 1, 29, 15, 12, 38), 'VendorID__1': 1, 'payment_type__1': 2, 'DOLocationID__1': 79, 'PULocationID__1': 237, 'congestion_surcharge__2': 2.5, 'RatecodeID__2': 1.0, 'airport_fee__2': 0.0, 'extra__2': 2.5, 'tip_amount__2': 3.85, 'fare_amount__2': 11.4, 'mta_tax__2': 0.5, 'total_amount__2': 19.25, 'trip_distance__2': 0.7, 'tolls_amount__2': 0.0, 'store_and_fwd_flag__2': 'N', 'passenger_count__2': 1.0 ... 18900 parameters truncated ... 'total_amount__997': 28.56, 'trip_distance__997': 3.9, 'tolls_amount__997': 0.0, 'store_and_fwd_flag__997': 'N', 'passenger_count__997': 1.0, 'improvement_surcharge__997': 1.0, 'tpep_dropoff_datetime__997': datetime.datetime(2023, 1, 29, 15, 58, 6), 'tpep_pickup_datetime__997': datetime.datetime(2023, 1, 29, 15, 42, 58), 'VendorID__997': 1, 'payment_type__997': 1, 'DOLocationID__997': 42, 'PULocationID__997': 141, 'congestion_surcharge__998': 0.0, 'RatecodeID__998': 1.0, 'airport_fee__998': 0.0, 'extra__998': 0.0, 'tip_amount__998': 0.0, 'fare_amount__998': 14.2, 'mta_tax__998': 0.5, 'total_amount__998': 15.7, 'trip_distance__998': 2.1, 'tolls_amount__998': 0.0, 'store_and_fwd_flag__998': 'N', 'passenger_count__998': 1.0, 'improvement_surcharge__998': 1.0, 'tpep_dropoff_datetime__998': datetime.datetime(2023, 1, 29, 15, 16, 54), 'tpep_pickup_datetime__998': datetime.datetime(2023, 1, 29, 15, 4, 55), 'VendorID__998': 1, 'payment_type__998': 2, 'DOLocationID__998': 75, 'PULocationID__998': 151, 'congestion_surcharge__999': 2.5, 'RatecodeID__999': 1.0, 'airport_fee__999': 0.0, 'extra__999': 2.5, 'tip_amount__999': 2.65, 'fare_amount__999': 9.3, 'mta_tax__999': 0.5, 'total_amount__999': 15.95, 'trip_distance__999': 1.1, 'tolls_amount__999': 0.0, 'store_and_fwd_flag__999': 'N', 'passenger_count__999': 1.0, 'improvement_surcharge__999': 1.0, 'tpep_dropoff_datetime__999': datetime.datetime(2023, 1, 29, 15, 35, 28), 'tpep_pickup_datetime__999': datetime.datetime(2023, 1, 29, 15, 27, 23), 'VendorID__999': 1, 'payment_type__999': 1, 'DOLocationID__999': 236, 'PULocationID__999': 262}]\n(Background on this error at: https://sqlalche.me/e/20/e3q8)\nTraceback (most recent call last):\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 2118, in _exec_insertmany_context\n dialect.do_execute(\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/default.py\", line 941, in do_execute\n cursor.execute(statement, parameters)\npsycopg2.errors.DiskFull: could not extend file because project size limit (512 MB) has been exceeded\nHINT: This limit is defined by neon.max_cluster_size GUC\n\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/main.py\", line 39, in main\n load_data(transformed_data, table_name)\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/load.py\", line 73, in load_data\n df.to_sql(\n File \"/opt/anaconda3/lib/python3.12/site-packages/pandas/util/_decorators.py\", line 333, in wrapper\n return func(*args, **kwargs)\n ^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/pandas/core/generic.py\", line 3087, in to_sql\n return sql.to_sql(\n ^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/pandas/io/sql.py\", line 842, in to_sql\n return pandas_sql.to_sql(\n ^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/pandas/io/sql.py\", line 2018, in to_sql\n total_inserted = sql_engine.insert_records(\n ^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/pandas/io/sql.py\", line 1567, in insert_records\n raise err\n File \"/opt/anaconda3/lib/python3.12/site-packages/pandas/io/sql.py\", line 1558, in insert_records\n return table.insert(chunksize=chunksize, method=method)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/pandas/io/sql.py\", line 1119, in insert\n num_inserted = exec_insert(conn, keys, chunk_iter)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/pandas/io/sql.py\", line 1010, in _execute_insert\n result = conn.execute(self.table.insert(), data)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 1418, in execute\n return meth(\n ^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/sql/elements.py\", line 515, in _execute_on_connection\n return connection._execute_clauseelement(\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 1640, in _execute_clauseelement\n ret = self._execute_context(\n ^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 1844, in _execute_context\n return self._exec_insertmany_context(dialect, context)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 2126, in _exec_insertmany_context\n self._handle_dbapi_exception(\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 2355, in _handle_dbapi_exception\n raise sqlalchemy_exception.with_traceback(exc_info[2]) from e\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 2118, in _exec_insertmany_context\n dialect.do_execute(\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/default.py\", line 941, in do_execute\n cursor.execute(statement, parameters)\nsqlalchemy.exc.OperationalError: (psycopg2.errors.DiskFull) could not extend file because project size limit (512 MB) has been exceeded\nHINT: This limit is defined by neon.max_cluster_size GUC\n\n[SQL: INSERT INTO taxi_trips (\"VendorID\", tpep_pickup_datetime, tpep_dropoff_datetime, passenger_count, trip_distance, \"RatecodeID\", store_and_fwd_flag, \"PULocationID\", \"DOLocationID\", payment_type, fare_amount, extra, mta_tax, tip_amount, tolls_amount, im ... 458885 characters truncated ... vement_surcharge__999)s, %(total_amount__999)s, %(congestion_surcharge__999)s, %(airport_fee__999)s)]\n[parameters: {'congestion_surcharge__0': 2.5, 'RatecodeID__0': 1.0, 'airport_fee__0': 0.0, 'extra__0': 2.5, 'tip_amount__0': 2.9, 'fare_amount__0': 5.8, 'mta_tax__0': 0.5, 'total_amount__0': 12.7, 'trip_distance__0': 0.7, 'tolls_amount__0': 0.0, 'store_and_fwd_flag__0': 'N', 'passenger_count__0': 1.0, 'improvement_surcharge__0': 1.0, 'tpep_dropoff_datetime__0': datetime.datetime(2023, 1, 29, 15, 6, 34), 'tpep_pickup_datetime__0': datetime.datetime(2023, 1, 29, 15, 3, 37), 'VendorID__0': 1, 'payment_type__0': 1, 'DOLocationID__0': 237, 'PULocationID__0': 229, 'congestion_surcharge__1': 2.5, 'RatecodeID__1': 1.0, 'airport_fee__1': 0.0, 'extra__1': 2.5, 'tip_amount__1': 0.0, 'fare_amount__1': 13.5, 'mta_tax__1': 0.5, 'total_amount__1': 17.5, 'trip_distance__1': 2.4, 'tolls_amount__1': 0.0, 'store_and_fwd_flag__1': 'N', 'passenger_count__1': 1.0, 'improvement_surcharge__1': 1.0, 'tpep_dropoff_datetime__1': datetime.datetime(2023, 1, 29, 15, 24, 33), 'tpep_pickup_datetime__1': datetime.datetime(2023, 1, 29, 15, 12, 38), 'VendorID__1': 1, 'payment_type__1': 2, 'DOLocationID__1': 79, 'PULocationID__1': 237, 'congestion_surcharge__2': 2.5, 'RatecodeID__2': 1.0, 'airport_fee__2': 0.0, 'extra__2': 2.5, 'tip_amount__2': 3.85, 'fare_amount__2': 11.4, 'mta_tax__2': 0.5, 'total_amount__2': 19.25, 'trip_distance__2': 0.7, 'tolls_amount__2': 0.0, 'store_and_fwd_flag__2': 'N', 'passenger_count__2': 1.0 ... 18900 parameters truncated ... 'total_amount__997': 28.56, 'trip_distance__997': 3.9, 'tolls_amount__997': 0.0, 'store_and_fwd_flag__997': 'N', 'passenger_count__997': 1.0, 'improvement_surcharge__997': 1.0, 'tpep_dropoff_datetime__997': datetime.datetime(2023, 1, 29, 15, 58, 6), 'tpep_pickup_datetime__997': datetime.datetime(2023, 1, 29, 15, 42, 58), 'VendorID__997': 1, 'payment_type__997': 1, 'DOLocationID__997': 42, 'PULocationID__997': 141, 'congestion_surcharge__998': 0.0, 'RatecodeID__998': 1.0, 'airport_fee__998': 0.0, 'extra__998': 0.0, 'tip_amount__998': 0.0, 'fare_amount__998': 14.2, 'mta_tax__998': 0.5, 'total_amount__998': 15.7, 'trip_distance__998': 2.1, 'tolls_amount__998': 0.0, 'store_and_fwd_flag__998': 'N', 'passenger_count__998': 1.0, 'improvement_surcharge__998': 1.0, 'tpep_dropoff_datetime__998': datetime.datetime(2023, 1, 29, 15, 16, 54), 'tpep_pickup_datetime__998': datetime.datetime(2023, 1, 29, 15, 4, 55), 'VendorID__998': 1, 'payment_type__998': 2, 'DOLocationID__998': 75, 'PULocationID__998': 151, 'congestion_surcharge__999': 2.5, 'RatecodeID__999': 1.0, 'airport_fee__999': 0.0, 'extra__999': 2.5, 'tip_amount__999': 2.65, 'fare_amount__999': 9.3, 'mta_tax__999': 0.5, 'total_amount__999': 15.95, 'trip_distance__999': 1.1, 'tolls_amount__999': 0.0, 'store_and_fwd_flag__999': 'N', 'passenger_count__999': 1.0, 'improvement_surcharge__999': 1.0, 'tpep_dropoff_datetime__999': datetime.datetime(2023, 1, 29, 15, 35, 28), 'tpep_pickup_datetime__999': datetime.datetime(2023, 1, 29, 15, 27, 23), 'VendorID__999': 1, 'payment_type__999': 1, 'DOLocationID__999': 236, 'PULocationID__999': 262}]\n(Background on this error at: https://sqlalche.me/e/20/e3q8)\n",
|
| 29 |
+
"size": 36476,
|
| 30 |
+
"language": "unknown"
|
| 31 |
+
},
|
| 32 |
+
"src/__init__.py": {
|
| 33 |
+
"content": "\"\"\"\nETL Pipeline package.\n\nThis package contains modules for extracting, transforming, and loading data.\n\"\"\"\n\n__version__ = '0.1.0'\n",
|
| 34 |
+
"size": 132,
|
| 35 |
+
"language": "python"
|
| 36 |
+
},
|
| 37 |
+
"src/utils.py": {
|
| 38 |
+
"content": "\"\"\"\nUtility functions for the ETL pipeline.\n\"\"\"\nimport os\nimport sys\nimport logging\nfrom logging.handlers import RotatingFileHandler\nfrom typing import Optional, Union, Dict, Any\nimport pandas as pd\nfrom sqlalchemy import create_engine\nfrom sqlalchemy.engine import Engine\n\ndef setup_logging(\n log_level: str = 'INFO',\n log_file: Optional[str] = None,\n log_format: str = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'\n) -> None:\n \"\"\"\n Set up logging configuration.\n \n Args:\n log_level: Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL)\n log_file: Optional path to log file. If None, logs will only go to console.\n log_format: Format string for log messages\n \"\"\"\n # Convert string log level to logging constant\n numeric_level = getattr(logging, log_level.upper(), None)\n if not isinstance(numeric_level, int):\n raise ValueError(f'Invalid log level: {log_level}')\n \n # Configure root logger\n root_logger = logging.getLogger()\n root_logger.setLevel(numeric_level)\n \n # Clear any existing handlers\n for handler in root_logger.handlers[:]:\n root_logger.removeHandler(handler)\n \n # Create console handler\n console_handler = logging.StreamHandler(sys.stdout)\n console_handler.setFormatter(logging.Formatter(log_format))\n root_logger.addHandler(console_handler)\n \n # Add file handler if log_file is specified\n if log_file and log_file.strip():\n try:\n # Create directory if it doesn't exist\n log_dir = os.path.dirname(log_file)\n if log_dir: # Only try to create directory if path isn't just a filename\n os.makedirs(log_dir, exist_ok=True)\n \n file_handler = RotatingFileHandler(\n log_file,\n maxBytes=10*1024*1024, # 10MB\n backupCount=5\n )\n file_handler.setFormatter(logging.Formatter(log_format))\n root_logger.addHandler(file_handler)\n logging.info(f\"Logging to file: {os.path.abspath(log_file)}\")\n except Exception as e:\n logging.warning(f\"Could not set up file logging: {e}\")\n \n # Set up SQLAlchemy logging if in debug mode\n if log_level.upper() == 'DEBUG':\n logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)\n\ndef get_db_connection() -> Engine:\n \"\"\"\n Create and return a database connection using SQLAlchemy.\n \n First tries to use DB_CONNECTION_STRING if provided.\n Otherwise falls back to individual connection parameters.\n \n Returns:\n SQLAlchemy engine instance\n \"\"\"\n # Try to get connection string from environment\n connection_string = os.getenv('DB_CONNECTION_STRING')\n \n if connection_string:\n # If using Neon.tech, ensure sslmode is set\n if 'neon.tech' in connection_string and 'sslmode' not in connection_string:\n connection_string += '?sslmode=require' if '?' not in connection_string else '&sslmode=require'\n return create_engine(connection_string)\n \n # Fall back to individual parameters if no connection string is provided\n db_config = {\n 'host': os.getenv('DB_HOST', 'localhost'),\n 'port': os.getenv('DB_PORT', '5432'),\n 'database': os.getenv('DB_NAME', 'etl_pipeline'),\n 'user': os.getenv('DB_USER', 'postgres'),\n 'password': os.getenv('DB_PASSWORD', ''),\n 'sslmode': os.getenv('DB_SSLMODE', 'require' if 'neon.tech' in os.getenv('DB_HOST', '') else 'prefer')\n }\n \n connection_string = (\n f\"postgresql://{db_config['user']}:{db_config['password']}@\"\n f\"{db_config['host']}:{db_config['port']}/{db_config['database']}?\"\n f\"sslmode={db_config['sslmode']}\"\n )\n \n return create_engine(connection_string)\n\ndef save_to_csv(df: pd.DataFrame, filepath: str) -> None:\n \"\"\"\n Save a DataFrame to a CSV file.\n \n Args:\n df: Pandas DataFrame to save\n filepath: Path to save the CSV file\n \"\"\"\n os.makedirs(os.path.dirname(filepath), exist_ok=True)\n df.to_csv(filepath, index=False)\n logging.info(f\"Data saved to {filepath}\")\n\ndef read_csv(filepath: str, **kwargs) -> pd.DataFrame:\n \"\"\"\n Read a CSV file into a pandas DataFrame.\n \n Args:\n filepath: Path to the CSV file\n **kwargs: Additional arguments to pass to pandas.read_csv()\n \n Returns:\n Loaded DataFrame\n \"\"\"\n return pd.read_csv(filepath, **kwargs)\n",
|
| 39 |
+
"size": 4486,
|
| 40 |
+
"language": "python"
|
| 41 |
+
},
|
| 42 |
+
"src/transform.py": {
|
| 43 |
+
"content": "\"\"\"\nData transformation module for the ETL pipeline.\n\"\"\"\nimport logging\nfrom typing import Dict, Any, Optional, List\nimport pandas as pd\nimport numpy as np\nfrom datetime import datetime\n\nlogger = logging.getLogger(__name__)\n\ndef transform_data(\n df: pd.DataFrame,\n config: Optional[Dict[str, Any]] = None\n) -> pd.DataFrame:\n \"\"\"\n Transform the input DataFrame by applying various cleaning and transformation steps.\n \n Args:\n df: Input DataFrame to transform\n config: Optional configuration dictionary with transformation settings\n \n Returns:\n Transformed DataFrame\n \"\"\"\n if config is None:\n config = {}\n \n logger.info(\"Starting data transformation\")\n \n # Make a copy of the DataFrame to avoid modifying the original\n df_transformed = df.copy()\n \n # Apply transformations based on configuration or default behavior\n df_transformed = handle_missing_values(df_transformed, config.get('missing_values', {}))\n df_transformed = convert_data_types(df_transformed, config.get('dtypes', {}))\n df_transformed = standardize_columns(df_transformed, config.get('standardize', {}))\n df_transformed = derive_features(df_transformed, config.get('derived_features', []))\n \n # Apply any custom transformations if specified in config\n if 'custom_transforms' in config and callable(config['custom_transforms']):\n df_transformed = config['custom_transforms'](df_transformed)\n \n logger.info(f\"Data transformation complete. Shape after transformation: {df_transformed.shape}\")\n return df_transformed\n\ndef handle_missing_values(\n df: pd.DataFrame,\n config: Dict[str, Any]\n) -> pd.DataFrame:\n \"\"\"\n Handle missing values in the DataFrame based on the configuration.\n \n Args:\n df: Input DataFrame\n config: Configuration for handling missing values\n - 'strategy': 'drop', 'fill', or 'ignore'\n - 'fill_value': Value to use when strategy is 'fill'\n - 'columns': List of columns to apply to (all if None)\n \"\"\"\n if not config or config.get('strategy') == 'ignore':\n return df\n \n columns = config.get('columns', df.columns)\n strategy = config.get('strategy', 'drop')\n \n logger.info(f\"Handling missing values with strategy: {strategy}\")\n \n if strategy == 'drop':\n # Drop rows with missing values in specified columns\n return df.dropna(subset=columns)\n \n elif strategy == 'fill':\n # Fill missing values with specified fill value\n fill_value = config.get('fill_value')\n if fill_value is None:\n # Default fill values based on column type\n for col in columns:\n if col in df.columns:\n if pd.api.types.is_numeric_dtype(df[col]):\n df[col] = df[col].fillna(0)\n elif pd.api.types.is_datetime64_any_dtype(df[col]):\n df[col] = df[col].fillna(pd.NaT)\n else:\n df[col] = df[col].fillna('')\n else:\n df[columns] = df[columns].fillna(fill_value)\n \n return df\n\ndef convert_data_types(\n df: pd.DataFrame,\n type_mapping: Dict[str, str]\n) -> pd.DataFrame:\n \"\"\"\n Convert data types of DataFrame columns based on the provided mapping.\n \n Args:\n df: Input DataFrame\n type_mapping: Dictionary mapping column names to target data types\n Supported types: 'int', 'float', 'str', 'bool', 'datetime', 'category'\n \"\"\"\n if not type_mapping:\n return df\n \n logger.info(\"Converting data types\")\n \n for col, dtype in type_mapping.items():\n if col in df.columns:\n try:\n if dtype == 'datetime':\n df[col] = pd.to_datetime(df[col], errors='coerce')\n elif dtype == 'category':\n df[col] = df[col].astype('category')\n else:\n df[col] = df[col].astype(dtype)\n except Exception as e:\n logger.warning(f\"Could not convert column '{col}' to {dtype}: {str(e)}\")\n \n return df\n\ndef standardize_columns(\n df: pd.DataFrame,\n config: Dict[str, Any]\n) -> pd.DataFrame:\n \"\"\"\n Standardize column names and values.\n \n Args:\n df: Input DataFrame\n config: Configuration for standardization\n - 'lowercase': bool - Convert column names to lowercase\n - 'replace_spaces': str or bool - Replace spaces in column names\n - 'rename': dict - Mapping of old column names to new names\n \"\"\"\n if not config:\n return df\n \n logger.info(\"Standardizing columns\")\n \n # Rename columns if mapping is provided\n if 'rename' in config and isinstance(config['rename'], dict):\n df = df.rename(columns=config['rename'])\n \n # Apply standardizations to column names\n if config.get('lowercase', True):\n df.columns = df.columns.str.lower()\n \n replace_with = config.get('replace_spaces')\n if replace_with is not None and replace_with is not False:\n if replace_with is True:\n replace_with = '_' # Default to underscore if True is provided\n df.columns = df.columns.str.replace(r'\\s+', replace_with, regex=True)\n \n return df\n\ndef derive_features(\n df: pd.DataFrame,\n features_config: List[Dict[str, Any]]\n) -> pd.DataFrame:\n \"\"\"\n Derive new features based on the configuration.\n \n Args:\n df: Input DataFrame\n features_config: List of feature configurations\n Each config should have 'name', 'type', and 'params' keys\n Supported types: 'datetime', 'categorical', 'numeric'\n \"\"\"\n if not features_config:\n return df\n \n logger.info(\"Deriving new features\")\n \n for feature in features_config:\n name = feature.get('name')\n feature_type = feature.get('type')\n params = feature.get('params', {})\n \n if not name or not feature_type:\n continue\n \n try:\n if feature_type == 'datetime':\n # Extract datetime components\n column = params.get('source_column')\n if column and column in df.columns:\n if 'extract' in params:\n if params['extract'] == 'hour':\n df[name] = pd.to_datetime(df[column]).dt.hour\n elif params['extract'] == 'day_of_week':\n df[name] = pd.to_datetime(df[column]).dt.dayofweek\n elif params['extract'] == 'month':\n df[name] = pd.to_datetime(df[column]).dt.month\n elif params['extract'] == 'year':\n df[name] = pd.to_datetime(df[column]).dt.year\n elif params['extract'] == 'date':\n df[name] = pd.to_datetime(df[column]).dt.date\n \n elif feature_type == 'categorical':\n # Create categorical features\n column = params.get('source_column')\n if column and column in df.columns:\n if 'bins' in params:\n bins = params['bins']\n labels = params.get('labels', range(len(bins) - 1))\n df[name] = pd.cut(df[column], bins=bins, labels=labels, include_lowest=True)\n \n elif feature_type == 'numeric':\n # Create numeric features\n operation = params.get('operation')\n columns = params.get('columns', [])\n \n if operation == 'sum' and all(col in df.columns for col in columns):\n df[name] = df[columns].sum(axis=1)\n elif operation == 'mean' and all(col in df.columns for col in columns):\n df[name] = df[columns].mean(axis=1)\n elif operation == 'difference' and len(columns) == 2 and all(col in df.columns for col in columns):\n df[name] = df[columns[0]] - df[columns[1]]\n elif operation == 'ratio' and len(columns) == 2 and all(col in df.columns for col in columns):\n df[name] = df[columns[0]] / df[columns[1]].replace(0, np.nan)\n \n except Exception as e:\n logger.warning(f\"Failed to create feature '{name}': {str(e)}\")\n \n return df\n",
|
| 44 |
+
"size": 8515,
|
| 45 |
+
"language": "python"
|
| 46 |
+
},
|
| 47 |
+
"src/load.py": {
|
| 48 |
+
"content": "\"\"\"\nData loading module for the ETL pipeline.\n\"\"\"\nimport logging\nfrom typing import Dict, Any, Optional, Union\nimport pandas as pd\nfrom sqlalchemy import Table, Column, MetaData, exc, inspect\nfrom sqlalchemy.types import (\n Integer, Float, String, DateTime, Boolean, Date, Numeric\n)\n\nfrom .utils import get_db_connection\n\nlogger = logging.getLogger(__name__)\n\n# Map pandas dtypes to SQLAlchemy types\nTYPE_MAPPING = {\n 'int64': Integer,\n 'float64': Float,\n 'object': String(255),\n 'bool': Boolean,\n 'datetime64[ns]': DateTime,\n 'datetime64[ns, UTC]': DateTime(timezone=True),\n 'timedelta64[ns]': String(50), # Storing as string for simplicity\n 'category': String(255),\n 'date': Date,\n}\n\ndef load_data(\n df: pd.DataFrame,\n table_name: str,\n connection_string: Optional[str] = None,\n if_exists: str = 'replace',\n index: bool = False,\n dtype: Optional[Dict] = None,\n chunksize: Optional[int] = None,\n method: Optional[str] = None\n) -> None:\n \"\"\"\n Load a pandas DataFrame into a database table.\n \n Args:\n df: DataFrame to load\n table_name: Name of the target table\n connection_string: Database connection string. If None, uses get_db_connection()\n if_exists: What to do if table exists. Options: 'fail', 'replace', 'append'\n index: Whether to write DataFrame index as a column\n dtype: Dictionary specifying the datatype for columns\n chunksize: Number of rows to write at a time\n method: Method to use for SQL insertion\n \"\"\"\n logger.info(f\"Loading data into {table_name}\")\n \n try:\n # Get database connection\n if connection_string:\n from sqlalchemy import create_engine\n engine = create_engine(connection_string)\n else:\n engine = get_db_connection()\n \n # Create table if it doesn't exist and if_exists is 'replace' or 'fail'\n if if_exists in ['replace', 'fail']:\n create_table_from_dataframe(\n df=df,\n table_name=table_name,\n engine=engine,\n if_exists=if_exists,\n dtype=dtype\n )\n \n # Load the data\n df.to_sql(\n name=table_name,\n con=engine,\n if_exists=if_exists,\n index=index,\n dtype=dtype,\n chunksize=chunksize,\n method=method\n )\n \n logger.info(f\"Successfully loaded {len(df)} rows into {table_name}\")\n \n except Exception as e:\n logger.error(f\"Error loading data into {table_name}: {str(e)}\")\n raise\n\ndef create_table_from_dataframe(\n df: pd.DataFrame,\n table_name: str,\n engine,\n if_exists: str = 'fail',\n dtype: Optional[Dict] = None,\n schema: Optional[str] = None\n) -> None:\n \"\"\"\n Create a SQL table from a pandas DataFrame.\n \n Args:\n df: DataFrame to create table from\n table_name: Name of the table to create\n engine: SQLAlchemy engine\n if_exists: What to do if table exists. Options: 'fail', 'replace', 'append'\n dtype: Dictionary specifying the datatype for columns\n schema: Optional schema name\n \"\"\"\n from sqlalchemy import inspect, MetaData, Table, Column\n \n # Create an inspector to check if table exists\n inspector = inspect(engine)\n table_exists = table_name in inspector.get_table_names(schema=schema)\n \n # If table exists and we're not replacing, raise an error\n if table_exists:\n if if_exists == 'fail':\n raise ValueError(f\"Table {table_name} already exists and if_exists='fail'\")\n elif if_exists == 'replace':\n with engine.connect() as conn:\n conn.execute(f\"DROP TABLE IF EXISTS {table_name}\")\n conn.commit()\n \n # If table doesn't exist or we're replacing it, create the table\n if not table_exists or if_exists == 'replace':\n # Prepare column definitions\n columns = []\n metadata = MetaData()\n \n for column_name, dtype_name in df.dtypes.items():\n # Get SQLAlchemy type from mapping or use String as default\n sql_type = TYPE_MAPPING.get(str(dtype_name), String(255))\n \n # Override with user-specified type if provided\n if dtype and column_name in dtype:\n sql_type = dtype[column_name]\n \n columns.append(Column(column_name, sql_type))\n \n # Create table\n Table(table_name, metadata, *columns, schema=schema)\n \n try:\n metadata.create_all(engine)\n logger.info(f\"Created table {table_name}\")\n except Exception as e:\n logger.error(f\"Error creating table {table_name}: {str(e)}\")\n raise\n\ndef execute_sql(\n sql: str,\n connection_string: Optional[str] = None,\n params: Optional[Dict] = None,\n return_results: bool = False\n) -> Optional[pd.DataFrame]:\n \"\"\"\n Execute a SQL query and optionally return results as a DataFrame.\n \n Args:\n sql: SQL query to execute\n connection_string: Database connection string. If None, uses get_db_connection()\n params: Parameters for the SQL query\n return_results: Whether to return results as a DataFrame\n \n Returns:\n DataFrame with query results if return_results is True, else None\n \"\"\"\n try:\n # Get database connection\n if connection_string:\n from sqlalchemy import create_engine\n engine = create_engine(connection_string)\n else:\n engine = get_db_connection()\n \n if return_results:\n # Execute query and return results as DataFrame\n return pd.read_sql_query(sql, engine, params=params)\n else:\n # Execute SQL without returning results\n with engine.connect() as connection:\n connection.execute(sql, params or {})\n \n except Exception as e:\n logger.error(f\"Error executing SQL: {str(e)}\")\n raise\n",
|
| 49 |
+
"size": 6103,
|
| 50 |
+
"language": "python"
|
| 51 |
+
},
|
| 52 |
+
"src/extract.py": {
|
| 53 |
+
"content": "\"\"\"\nData extraction module for the ETL pipeline.\n\"\"\"\nimport os\nimport logging\nimport pandas as pd\nfrom typing import Union, Optional\nfrom urllib.parse import urlparse\n\nlogger = logging.getLogger(__name__)\n\ndef extract_data(source: str, **kwargs) -> pd.DataFrame:\n \"\"\"\n Extract data from a source (URL or file path).\n \n Args:\n source: URL or file path to the data source\n **kwargs: Additional arguments to pass to the appropriate reader\n \n Returns:\n Extracted data as a pandas DataFrame\n \n Raises:\n ValueError: If the source is not a valid URL or file path\n Exception: If there's an error during data extraction\n \"\"\"\n try:\n logger.info(f\"Extracting data from: {source}\")\n \n if is_url(source):\n return extract_from_url(source, **kwargs)\n elif os.path.exists(source):\n return extract_from_file(source, **kwargs)\n else:\n raise ValueError(f\"Source not found or not accessible: {source}\")\n \n except Exception as e:\n logger.error(f\"Error extracting data from {source}: {str(e)}\")\n raise\n\ndef extract_from_url(url: str, **kwargs) -> pd.DataFrame:\n \"\"\"\n Extract data from a URL.\n \n Args:\n url: URL to the data source\n **kwargs: Additional arguments to pass to pandas.read_* functions\n \n Returns:\n Extracted data as a pandas DataFrame\n \"\"\"\n _, ext = os.path.splitext(urlparse(url).path)\n ext = ext.lower()\n \n if ext == '.csv':\n return pd.read_csv(url, **kwargs)\n elif ext in ['.xls', '.xlsx']:\n return pd.read_excel(url, **kwargs)\n elif ext == '.parquet':\n return pd.read_parquet(url, **kwargs)\n elif ext == '.json':\n return pd.read_json(url, **kwargs)\n else:\n raise ValueError(f\"Unsupported file format: {ext}\")\n\ndef extract_from_file(filepath: str, **kwargs) -> pd.DataFrame:\n \"\"\"\n Extract data from a local file.\n \n Args:\n filepath: Path to the data file\n **kwargs: Additional arguments to pass to pandas.read_* functions\n \n Returns:\n Extracted data as a pandas DataFrame\n \"\"\"\n _, ext = os.path.splitext(filepath)\n ext = ext.lower()\n \n if ext == '.csv':\n return pd.read_csv(filepath, **kwargs)\n elif ext in ['.xls', '.xlsx']:\n return pd.read_excel(filepath, **kwargs)\n elif ext == '.parquet':\n return pd.read_parquet(filepath, **kwargs)\n elif ext == '.json':\n return pd.read_json(filepath, **kwargs)\n else:\n raise ValueError(f\"Unsupported file format: {ext}\")\n\ndef is_url(string: str) -> bool:\n \"\"\"\n Check if a string is a valid URL.\n \n Args:\n string: String to check\n \n Returns:\n True if the string is a valid URL, False otherwise\n \"\"\"\n try:\n result = urlparse(string)\n return all([result.scheme, result.netloc])\n except ValueError:\n return False\n",
|
| 54 |
+
"size": 2986,
|
| 55 |
+
"language": "python"
|
| 56 |
+
}
|
| 57 |
+
},
|
| 58 |
+
"_cache_metadata": {
|
| 59 |
+
"url": "https://github.com/ronelsolomon/ETL-pipeline.git",
|
| 60 |
+
"content_type": "github",
|
| 61 |
+
"cached_at": "2026-03-02T22:43:46.868441",
|
| 62 |
+
"cache_key": "37987ddade14ae2a6b6fa13bc2ff9450"
|
| 63 |
+
}
|
| 64 |
+
}
|
483c06b3b38c871dc3670dea5054ef70.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/csvDashboardRetetion.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "csvDashboardRetetion.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:49:15.962636",
|
| 6 |
+
"files": {
|
| 7 |
+
".gitattributes": {
|
| 8 |
+
"content": "# Auto detect text files and perform LF normalization\n* text=auto\n",
|
| 9 |
+
"size": 66,
|
| 10 |
+
"language": "unknown"
|
| 11 |
+
}
|
| 12 |
+
},
|
| 13 |
+
"_cache_metadata": {
|
| 14 |
+
"url": "https://github.com/ronelsolomon/csvDashboardRetetion.git",
|
| 15 |
+
"content_type": "github",
|
| 16 |
+
"cached_at": "2026-03-02T22:49:15.963050",
|
| 17 |
+
"cache_key": "483c06b3b38c871dc3670dea5054ef70"
|
| 18 |
+
}
|
| 19 |
+
}
|
5c537b189f5079740a704286f90e4428.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:e2da79e153e3c7ae5111dfb195c15c22d9a8020a4cefe8ac634042cc274d1910
|
| 3 |
+
size 14452573
|
6153faae2e094b5e54e81566f4fda6d1.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
695c3097bae6d039bfccf0a470613925.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
6fdad44d776a0611631264d389d28f83.json
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/AWS-backend.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "AWS-backend.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:48:23.535261",
|
| 6 |
+
"files": {
|
| 7 |
+
"template.yaml": {
|
| 8 |
+
"content": "AWSTemplateFormatVersion: '2010-09-09'\nDescription: 'Basic AWS Backend with API Gateway, Lambda, and DynamoDB'\n\nParameters:\n EnvironmentName:\n Description: Environment name (e.g., dev, staging, prod)\n Type: String\n Default: dev\n AllowedValues: [dev, staging, prod]\n\nResources:\n # DynamoDB Table\n ItemsTable:\n Type: AWS::DynamoDB::Table\n Properties:\n TableName: !Sub \"${EnvironmentName}-ItemsTable\"\n BillingMode: PAY_PER_REQUEST\n AttributeDefinitions:\n - AttributeName: id\n AttributeType: S\n KeySchema:\n - AttributeName: id\n KeyType: HASH\n\n # IAM Role for Lambda\n LambdaExecutionRole:\n Type: AWS::IAM::Role\n Properties:\n AssumeRolePolicyDocument:\n Version: '2012-10-17'\n Statement:\n - Effect: Allow\n Principal:\n Service: [lambda.amazonaws.com]\n Action: ['sts:AssumeRole']\n ManagedPolicyArns:\n - 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'\n Policies:\n - PolicyName: DynamoDBAccess\n PolicyDocument:\n Version: '2012-10-17'\n Statement:\n - Effect: Allow\n Action:\n - 'dynamodb:GetItem'\n - 'dynamodb:PutItem'\n - 'dynamodb:UpdateItem'\n - 'dynamodb:DeleteItem'\n - 'dynamodb:Scan'\n Resource: !GetAtt ItemsTable.Arn\n\n # Lambda Function\n ApiFunction:\n Type: AWS::Lambda::Function\n Properties:\n FunctionName: !Sub \"${EnvironmentName}-api-handler\"\n Runtime: nodejs18.x\n Handler: app.handler\n Role: !GetAtt LambdaExecutionRole.Arn\n Code:\n ZipFile: |\n // This will be replaced with the actual code during deployment\n exports.handler = require('./app').handler;\n Environment:\n Variables:\n TABLE_NAME: !Ref ItemsTable\n NODE_ENV: !Ref EnvironmentName\n\n # API Gateway\n ApiGateway:\n Type: AWS::ApiGateway::RestApi\n Properties:\n Name: !Sub \"${EnvironmentName}-api\"\n Description: 'API Gateway for the basic backend'\n EndpointConfiguration:\n Types:\n - REGIONAL\n\n # API Gateway Resource\n ApiResource:\n Type: AWS::ApiGateway::Resource\n Properties:\n RestApiId: !Ref ApiGateway\n ParentId: !GetAtt ApiGateway.RootResourceId\n PathPart: '{proxy+}'\n\n # API Gateway Method\n ApiMethod:\n Type: AWS::ApiGateway::Method\n Properties:\n RestApiId: !Ref ApiGateway\n ResourceId: !Ref ApiResource\n HttpMethod: ANY\n AuthorizationType: NONE\n Integration:\n Type: AWS_PROXY\n IntegrationHttpMethod: POST\n Uri: !Sub \"arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${ApiFunction.Arn}/invocations\"\n\n # Lambda Permission for API Gateway\n ApiGatewayPermission:\n Type: AWS::Lambda::Permission\n Properties:\n Action: 'lambda:InvokeFunction'\n FunctionName: !GetAtt ApiFunction.Arn\n Principal: apigateway.amazonaws.com\n SourceArn: !Sub \"arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${ApiGateway}/*\"\n\n # API Gateway Deployment\n ApiDeployment:\n DependsOn: ApiMethod\n Type: AWS::ApiGateway::Deployment\n Properties:\n RestApiId: !Ref ApiGateway\n StageName: !Ref EnvironmentName\n\nOutputs:\n ApiEndpoint:\n Description: \"API Gateway endpoint URL\"\n Value: !Sub \"https://${ApiGateway}.execute-api.${AWS::Region}.amazonaws.com/${EnvironmentName}\"\n ItemsTableName:\n Description: \"DynamoDB Table Name\"\n Value: !Ref ItemsTable\n",
|
| 9 |
+
"size": 3598,
|
| 10 |
+
"language": "yaml"
|
| 11 |
+
},
|
| 12 |
+
"deploy.js": {
|
| 13 |
+
"content": "const AWS = require('aws-sdk');\nconst fs = require('fs');\nconst path = require('path');\nconst { promisify } = require('util');\nconst readFile = promisify(fs.readFile);\n\n// Configure AWS\nAWS.config.update({ region: 'us-east-1' }); // Change to your preferred region\nconst cloudFormation = new AWS.CloudFormation();\nconst iam = new AWS.IAM();\nconst lambda = new AWS.Lambda();\nconst apiGateway = new AWS.APIGateway();\nconst dynamoDB = new AWS.DynamoDB();\n\n// Stack configuration\nconst STACK_NAME = 'BasicBackendStack';\nconst STACK_TEMPLATE = 'template.yaml';\nconst LAMBDA_ZIP = 'function.zip';\n\nasync function deploy() {\n try {\n console.log('Deploying AWS Backend...');\n \n // 1. Create or update CloudFormation stack\n const templateBody = await readFile(path.join(__dirname, STACK_TEMPLATE), 'utf8');\n \n const stackExists = await checkStackExists(STACK_NAME);\n \n if (stackExists) {\n console.log('Updating existing stack...');\n await updateStack(templateBody);\n } else {\n console.log('Creating new stack...');\n await createStack(templateBody);\n }\n \n console.log('Deployment completed successfully!');\n \n } catch (error) {\n console.error('Deployment failed:', error);\n process.exit(1);\n }\n}\n\nasync function checkStackExists(stackName) {\n try {\n await cloudFormation.describeStacks({ StackName: stackName }).promise();\n return true;\n } catch (error) {\n if (error.code === 'ValidationError' && error.message.includes('does not exist')) {\n return false;\n }\n throw error;\n }\n}\n\nasync function createStack(templateBody) {\n const params = {\n StackName: STACK_NAME,\n TemplateBody: templateBody,\n Capabilities: ['CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM'],\n OnFailure: 'ROLLBACK',\n TimeoutInMinutes: 30\n };\n \n await cloudFormation.createStack(params).promise();\n await cloudFormation.waitFor('stackCreateComplete', { StackName: STACK_NAME }).promise();\n}\n\nasync function updateStack(templateBody) {\n const params = {\n StackName: STACK_NAME,\n TemplateBody: templateBody,\n Capabilities: ['CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM']\n };\n \n try {\n await cloudFormation.updateStack(params).promise();\n await cloudFormation.waitFor('stackUpdateComplete', { StackName: STACK_NAME }).promise();\n } catch (error) {\n if (error.message.includes('No updates are to be performed')) {\n console.log('No updates to perform');\n return;\n }\n throw error;\n }\n}\n\n// Start deployment\ndeploy();\n",
|
| 14 |
+
"size": 2506,
|
| 15 |
+
"language": "javascript"
|
| 16 |
+
},
|
| 17 |
+
"README.md": {
|
| 18 |
+
"content": "# AWS Serverless Backend\n\nA production-ready AWS serverless backend with Cognito authentication, API Gateway, Lambda, and DynamoDB, built with AWS CDK and Python.\n\n## ✨ Features\n\n- 🔒 **Authentication**: JWT-based authentication with Amazon Cognito\n- 🚀 **Serverless**: Fully managed services with automatic scaling\n- 🏗 **Infrastructure as Code**: AWS CDK for reliable deployments\n- 🔄 **RESTful API**: Complete CRUD operations with validation\n- 📊 **Monitoring**: Built-in CloudWatch logging and metrics\n- 🔐 **Security**: IAM roles with least privilege, input validation\n- 🌐 **CORS Support**: Pre-configured for web applications\n- 🧪 **Testing**: Unit and integration test setup\n- 🔧 **Developer Experience**: Local development and debugging support\n\n## 🚀 Quick Start\n\n### Prerequisites\n\n- Python 3.9+\n- Node.js 16.x+ (for CDK)\n- AWS CLI configured with admin permissions\n- AWS CDK v2 installed (`npm install -g aws-cdk`)\n\n### Installation\n\n1. **Clone the repository**\n ```bash\n git clone https://github.com/yourusername/aws-serverless-backend.git\n cd aws-serverless-backend\n ```\n\n2. **Set up Python virtual environment**\n ```bash\n python -m venv .venv\n source .venv/bin/activate # On Windows: .venv\\Scripts\\activate\n ```\n\n3. **Install dependencies**\n ```bash\n pip install -r requirements-dev.txt\n npm install\n ```\n\n4. **Configure environment**\n ```bash\n cp .env.example .env\n # Edit .env with your AWS account and region\n ```\n\n## 🏗 Project Structure\n\n```\n.\n├── app.py # CDK application entry point\n├── backend/\n│ └── backend_stack.py # Main CDK stack definition\n├── lambda/\n│ ├── lambda_function.py # Lambda function handler\n│ └── requirements.txt # Lambda dependencies\n├── tests/ # Unit and integration tests\n├── .env.example # Example environment variables\n├── package.json # Node.js dependencies\n└── requirements-dev.txt # Development dependencies\n```\n\n## 🚀 Deployment\n\n### First-time Setup\n\n```bash\n# Bootstrap CDK in your AWS account (first time only)\ncdk bootstrap aws://ACCOUNT-NUMBER/REGION\n```\n\n### Deploy to AWS\n\n```bash\n# Deploy the stack\ncdk deploy\n\n# Deploy to a specific stage (dev/staging/prod)\ncdk deploy --context stage=prod\n```\n\n### Deploy Outputs\n\nAfter successful deployment, you'll receive:\n- API Gateway URL\n- Cognito User Pool ID\n- Cognito Client ID\n- DynamoDB Table Name\n\n## 🔧 Local Development\n\n### Run Lambda Locally\n\n```bash\n# Install local dependencies\npip install -r lambda/requirements.txt\n\n# Set environment variables\nexport TABLE_NAME=local-table\nexport AWS_ACCESS_KEY_ID=test\nexport AWS_SECRET_ACCESS_KEY=test\nexport AWS_DEFAULT_REGION=us-east-1\n\n# Start local API Gateway and Lambda\nsam local start-api\n```\n\n### Test API Endpoints\n\n```bash\n# Register a new user\ncurl -X POST $API_URL/auth/register \\\n -H \"Content-Type: application/json\" \\\n -d '{\"email\":\"user@example.com\",\"password\":\"SecurePass123!\"}'\n\n# Get authentication token\nTOKEN=$(curl -X POST $API_URL/auth/login \\\n -H \"Content-Type: application/json\" \\\n -d '{\"email\":\"user@example.com\",\"password\":\"SecurePass123!\"}' | jq -r '.token')\n\n# Access protected endpoints\ncurl -H \"Authorization: Bearer $TOKEN\" $API_URL/items\n```\n\n## 🧪 Testing\n\n### Run Unit Tests\n\n```bash\npytest tests/unit -v\n```\n\n### Run Integration Tests\n\n```bash\n# Deploy to a test environment\ncdk deploy --context stage=test\n\n# Run integration tests\npytest tests/integration -v\n```\n\n## 🛡 Security\n\n- **Authentication**: JWT tokens with Cognito\n- **Authorization**: IAM roles with least privilege\n- **Data Protection**: Encryption at rest and in transit\n- **Input Validation**: Pydantic models for all API inputs\n- **Secrets Management**: AWS Secrets Manager or Parameter Store for sensitive data\n\n## 📊 Monitoring and Logging\n\n- **CloudWatch Logs**: All Lambda function logs\n- **CloudWatch Metrics**: API Gateway and Lambda metrics\n- **X-Ray Tracing**: Distributed tracing enabled\n- **Error Tracking**: Structured error logging\n\n## 🔄 CI/CD (GitHub Actions)\n\nPre-configured GitHub Actions workflows for:\n- Linting and type checking on PRs\n- Unit tests on push\n- Automated deployments to staging/production\n\n## 🧹 Cleanup\n\nTo remove all AWS resources:\n\n```bash\ncdk destroy\n# Or for a specific stage\ncdk destroy --context stage=prod\n```\n\n## 📝 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## 🤝 Contributing\n\n1. Fork the repository\n2. Create your feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add some amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n## 🎓 Learning Path\n\n### Core AWS Services\n\n1. **AWS CDK (Cloud Development Kit)**\n - **What it is**: Framework for defining cloud infrastructure using familiar programming languages\n - **Key Concepts**:\n - Constructs: Basic building blocks (like `Stack`, `Table`, `Function`)\n - Stacks: Units of deployment\n - Environments: AWS account/region combinations\n - **Example**: `BackendStack` in `backend_stack.py` defines all resources\n\n2. **AWS Lambda**\n - **What it is**: Serverless compute service\n - **Key Concepts**:\n - Handler function: Entry point for execution\n - Runtime: Python 3.9 in our case\n - Environment variables: Secure configuration\n - **Example**: `lambda_function.py` contains the request handler\n\n3. **Amazon API Gateway**\n - **What it is**: Managed service for creating and managing APIs\n - **Key Concepts**:\n - REST API: Resource-based HTTP endpoints\n - Integration: Connection to Lambda functions\n - Authorizers: JWT validation with Cognito\n - **Example**: Defined in `backend_stack.py` with CORS and authentication\n\n4. **Amazon DynamoDB**\n - **What it is**: NoSQL database service\n - **Key Concepts**:\n - Tables: Collections of items\n - Items: Individual records\n - GSIs: Global Secondary Indexes for flexible querying\n - **Example**: `ItemsTable` in `backend_stack.py`\n\n5. **Amazon Cognito**\n - **What it is**: User authentication and authorization\n - **Key Concepts**:\n - User Pools: User directories\n - App Clients: Application configurations\n - JWT Tokens: Secure authentication\n - **Example**: `UserPool` and `UserPoolClient` in `backend_stack.py`\n\n### Python Concepts\n\n1. **Pydantic Models**\n ```python\n class ItemCreate(BaseModel):\n name: str\n description: str\n ```\n - Used for request/response validation\n - Automatic type conversion\n - Schema documentation\n\n2. **AWS Lambda Powertools**\n - `@logger.inject_lambda_context`: Structured logging\n - `@tracer.capture_lambda_handler`: Distributed tracing\n - `@metrics.log_metrics`: Custom metrics\n\n3. **Error Handling**\n ```python\n try:\n # Code that might fail\n except ClientError as e:\n # Handle AWS service errors\n except Exception as e:\n # Handle unexpected errors\n ```\n\n### Security Concepts\n\n1. **IAM Roles & Policies**\n - Least privilege principle\n - Managed policies vs. inline policies\n - Service roles for AWS services\n\n2. **JWT Authentication**\n - Token-based authentication flow\n - Claims validation\n - Token expiration and refresh\n\n### Best Practices\n\n1. **Infrastructure as Code**\n - Version controlled infrastructure\n - Repeatable deployments\n - Environment parity\n\n2. **Serverless Architecture**\n - Event-driven design\n - Stateless functions\n - Managed services where possible\n\n## 🌐 Frontend Development Guide\n\nThis section covers how to build a frontend application that works with your serverless backend.\n\n### 1. Authentication Flow\n\n#### Setting Up Cognito\n\n```javascript\n// Install required packages\n// npm install amazon-cognito-identity-js @aws-amplify/auth\n\nimport { CognitoUserPool, CognitoUser, AuthenticationDetails } from 'amazon-cognito-identity-js';\n\nconst poolData = {\n UserPoolId: 'YOUR_USER_POOL_ID',\n ClientId: 'YOUR_APP_CLIENT_ID'\n};\n\nconst userPool = new CognitoUserPool(poolData);\n\n// Sign Up\nconst signUp = (email, password) => {\n return new Promise((resolve, reject) => {\n userPool.signUp(email, password, [], null, (err, result) => {\n if (err) return reject(err);\n resolve(result.user);\n });\n });\n};\n\n// Sign In\nconst signIn = (email, password) => {\n const authDetails = new AuthenticationDetails({\n Username: email,\n Password: password\n });\n\n const userData = {\n Username: email,\n Pool: userPool\n };\n\n const cognitoUser = new CognitoUser(userData);\n\n return new Promise((resolve, reject) => {\n cognitoUser.authenticateUser(authDetails, {\n onSuccess: (result) => {\n const token = result.getIdToken().getJwtToken();\n localStorage.setItem('token', token);\n resolve({ user: cognitoUser, token });\n },\n onFailure: (err) => reject(err)\n });\n });\n};\n```\n\n### 2. Data Modeling\n\n#### Frontend Models\n\n```typescript\n// types/item.ts\nexport interface Item {\n id: string;\n name: string;\n description: string;\n createdAt: string;\n updatedAt: string;\n userId: string;\n}\n\n// API Response Types\nexport interface ApiResponse<T> {\n data?: T;\n error?: string;\n status: number;\n}\n```\n\n### 3. API Integration\n\n#### API Client Setup\n\n```typescript\n// api/client.ts\nconst API_URL = process.env.REACT_APP_API_URL;\n\nexport const apiClient = async <T>(\n endpoint: string,\n options: RequestInit = {}\n): Promise<ApiResponse<T>> => {\n const token = localStorage.getItem('token');\n \n const headers = {\n 'Content-Type': 'application/json',\n ...(token && { 'Authorization': `Bearer ${token}` }),\n ...options.headers,\n };\n\n try {\n const response = await fetch(`${API_URL}${endpoint}`, {\n ...options,\n headers,\n });\n\n const data = await response.json().catch(() => ({}));\n \n if (!response.ok) {\n return { error: data.message || 'Request failed', status: response.status };\n }\n\n return { data, status: response.status };\n } catch (error) {\n return { error: 'Network error', status: 500 };\n }\n};\n```\n\n#### Example API Calls\n\n```typescript\n// api/items.ts\nimport { apiClient } from './client';\nimport { Item } from '../types/item';\n\nexport const fetchItems = async (): Promise<ApiResponse<Item[]>> => {\n return apiClient<Item[]>('/items');\n};\n\nexport const createItem = async (item: Omit<Item, 'id' | 'createdAt' | 'updatedAt' | 'userId'>) => {\n return apiClient<Item>('/items', {\n method: 'POST',\n body: JSON.stringify(item),\n });\n};\n```\n\n### 4. State Management\n\n#### React Context Example\n\n```tsx\n// context/ItemsContext.tsx\nimport React, { createContext, useContext, useEffect, useState } from 'react';\nimport { fetchItems, createItem } from '../api/items';\nimport { Item } from '../types/item';\n\ninterface ItemsContextType {\n items: Item[];\n loading: boolean;\n error: string | null;\n addItem: (item: Omit<Item, 'id' | 'createdAt' | 'updatedAt' | 'userId'>) => Promise<void>;\n refreshItems: () => Promise<void>;\n}\n\nconst ItemsContext = createContext<ItemsContextType | undefined>(undefined);\n\nexport const ItemsProvider: React.FC = ({ children }) => {\n const [items, setItems] = useState<Item[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const loadItems = async () => {\n try {\n setLoading(true);\n const { data, error } = await fetchItems();\n \n if (error) throw new Error(error);\n if (data) setItems(data);\n } catch (err) {\n setError(err.message);\n } finally {\n setLoading(false);\n }\n };\n\n const addItem = async (item: Omit<Item, 'id' | 'createdAt' | 'updatedAt' | 'userId'>) => {\n const { data, error } = await createItem(item);\n if (error) throw new Error(error);\n if (data) setItems(prev => [...prev, data]);\n };\n\n useEffect(() => {\n loadItems();\n }, []);\n\n return (\n <ItemsContext.Provider\n value={{\n items,\n loading,\n error,\n addItem,\n refreshItems: loadItems,\n }}\n >\n {children}\n </ItemsContext.Provider>\n );\n};\n\nexport const useItems = () => {\n const context = useContext(ItemsContext);\n if (context === undefined) {\n throw new Error('useItems must be used within an ItemsProvider');\n }\n return context;\n};\n```\n\n### 5. Monitoring and Error Tracking\n\n#### Frontend Monitoring Setup\n\n```typescript\n// utils/monitoring.ts\nimport * as Sentry from '@sentry/react';\nimport { Integrations } from '@sentry/tracing';\n\nconst initMonitoring = () => {\n if (process.env.NODE_ENV === 'production') {\n Sentry.init({\n dsn: process.env.REACT_APP_SENTRY_DSN,\n integrations: [new Integrations.BrowserTracing()],\n tracesSampleRate: 0.2,\n environment: process.env.NODE_ENV,\n });\n }\n};\n\nconst logError = (error: Error, context?: Record<string, any>) => {\n console.error(error, context);\n if (process.env.NODE_ENV === 'production') {\n Sentry.captureException(error, { extra: context });\n }\n};\n\nexport { initMonitoring, logError, Sentry };\n```\n\n#### API Error Handling Middleware\n\n```typescript\n// api/errorHandler.ts\nexport const withErrorHandling = async <T>(\n apiCall: () => Promise<ApiResponse<T>>,\n onError?: (error: string) => void\n): Promise<ApiResponse<T>> => {\n try {\n const result = await apiCall();\n if (result.error) {\n logError(new Error(result.error), { status: result.status });\n onError?.(result.error);\n }\n return result;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'An unknown error occurred';\n logError(new Error(message));\n onError?.(message);\n return { error: message, status: 500 };\n }\n};\n```\n\n### 6. Environment Configuration\n\nCreate a `.env` file in your frontend project:\n\n```env\nREACT_APP_API_URL=your-api-gateway-url\nREACT_APP_USER_POOL_ID=your-cognito-user-pool-id\nREACT_APP_CLIENT_ID=your-cognito-app-client-id\nREACT_APP_SENTRY_DSN=your-sentry-dsn\n```\n\n### 7. Deployment\n\n#### CI/CD Pipeline Example (GitHub Actions)\n\n```yaml\n# .github/workflows/deploy-frontend.yml\nname: Deploy Frontend\n\non:\n push:\n branches: [main]\n pull_request:\n branches: [main]\n\njobs:\n build-and-deploy:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v2\n \n - name: Set up Node.js\n uses: actions/setup-node@v2\n with:\n node-version: '16'\n \n - name: Install dependencies\n run: npm ci\n \n - name: Build\n run: |\n echo \"REACT_APP_API_URL=${{ secrets.REACT_APP_API_URL }}\" >> .env\n echo \"REACT_APP_USER_POOL_ID=${{ secrets.REACT_APP_USER_POOL_ID }}\" >> .env\n echo \"REACT_APP_CLIENT_ID=${{ secrets.REACT_APP_CLIENT_ID }}\" >> .env\n npm run build\n \n - name: Deploy to AWS S3 & CloudFront\n uses: jakejarvis/s3-sync-action@v0.5.1\n with:\n args: --delete\n env:\n AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }}\n AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}\n AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n AWS_REGION: 'us-east-1'\n SOURCE_DIR: 'build'\n```\n\n## 📄 Documentation & Resources\n\n### Frontend Development\n- [AWS Amplify Documentation](https://docs.amplify.aws/)\n- [React Documentation](https://reactjs.org/docs/getting-started.html)\n- [TypeScript Handbook](https://www.typescriptlang.org/docs/)\n- [Sentry for React](https://docs.sentry.io/platforms/javascript/guides/react/)\n\n### Backend Integration\n- [AWS CDK Documentation](https://docs.aws.amazon.com/cdk/v2/guide/home.html)\n- [AWS Lambda Python Guide](https://docs.aws.amazon.com/lambda/latest/dg/lambda-python.html)\n- [Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html)\n- [Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html)\n- [AWS Well-Architected Framework](https://aws.amazon.com/architecture/well-architected/)\n- [Serverless Best Practices](https://docs.aws.amazon.com/whitepapers/latest/serverless-architectures-lambda/best-practices.html)\n",
|
| 19 |
+
"size": 16136,
|
| 20 |
+
"language": "markdown"
|
| 21 |
+
},
|
| 22 |
+
"requirements-dev.txt": {
|
| 23 |
+
"content": "aws-cdk-lib>=2.0.0\nconstructs>=10.0.0\npytest>=7.0.0\npylint>=2.15.0\nblack>=22.10.0\nmypy>=0.991\nboto3>=1.26.0\npython-dotenv>=0.21.0\npytest-cov>=4.0.0\naws-cdk.aws-apigatewayv2-alpha>=2.0.0\ntypes-requests>=2.28.0\npydantic>=1.10.0\n",
|
| 24 |
+
"size": 226,
|
| 25 |
+
"language": "text"
|
| 26 |
+
},
|
| 27 |
+
"package.json": {
|
| 28 |
+
"content": "{\n \"name\": \"aws-serverless-backend\",\n \"version\": \"1.0.0\",\n \"description\": \"Advanced AWS Serverless Backend with Cognito, API Gateway, Lambda, and DynamoDB\",\n \"private\": true,\n \"scripts\": {\n \"deploy\": \"cdk deploy --all\",\n \"destroy\": \"cdk destroy --all\",\n \"synth\": \"cdk synth\",\n \"test\": \"pytest\",\n \"lint\": \"pylint **/*.py\"\n },\n \"devDependencies\": {\n \"aws-cdk\": \"^2.0.0\",\n \"aws-cdk-lib\": \"^2.0.0\",\n \"constructs\": \"^10.0.0\"\n },\n \"dependencies\": {\n \"@aws-solutions-constructs/aws-apigateway-lambda\": \"^2.0.0\",\n \"@aws-solutions-constructs/aws-cognito-apigateway-lambda\": \"^2.0.0\",\n \"@aws-solutions-constructs/aws-dynamodb-lambda\": \"^2.0.0\"\n }\n}\n",
|
| 29 |
+
"size": 682,
|
| 30 |
+
"language": "json"
|
| 31 |
+
},
|
| 32 |
+
".gitattributes": {
|
| 33 |
+
"content": "# Auto detect text files and perform LF normalization\n* text=auto\n",
|
| 34 |
+
"size": 66,
|
| 35 |
+
"language": "unknown"
|
| 36 |
+
},
|
| 37 |
+
"app.py": {
|
| 38 |
+
"content": "#!/usr/bin/env python3\nfrom aws_cdk import App, Environment\nfrom backend.backend_stack import BackendStack\nfrom dotenv import load_dotenv\nimport os\n\n# Load environment variables\nload_dotenv()\n\napp = App()\n\n# Get environment variables\naccount = os.getenv('CDK_DEFAULT_ACCOUNT')\nregion = os.getenv('CDK_DEFAULT_REGION', 'us-east-1')\nenv = Environment(account=account, region=region)\n\n# Create stack\nBackendStack(\n app,\n \"ServerlessBackendStack\",\n env=env,\n description=\"Serverless backend with Cognito, API Gateway, Lambda, and DynamoDB\"\n)\n\napp.synth()\n",
|
| 39 |
+
"size": 563,
|
| 40 |
+
"language": "python"
|
| 41 |
+
},
|
| 42 |
+
"app.js": {
|
| 43 |
+
"content": "const express = require('express');\nconst AWS = require('aws-sdk');\nconst serverless = require('serverless-http');\nconst { v4: uuidv4 } = require('uuid');\n\n// Initialize Express app\nconst app = express();\napp.use(express.json());\n\n// Configure AWS\nconst dynamoDb = new AWS.DynamoDB.DocumentClient();\nconst TABLE_NAME = process.env.TABLE_NAME || 'ItemsTable';\n\n// Health check endpoint\napp.get('/health', (req, res) => {\n res.json({ status: 'ok', timestamp: new Date().toISOString() });\n});\n\n// Create item\napp.post('/items', async (req, res) => {\n try {\n const id = uuidv4();\n const { name, description } = req.body;\n \n const params = {\n TableName: TABLE_NAME,\n Item: {\n id,\n name,\n description,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString()\n }\n };\n\n await dynamoDb.put(params).promise();\n res.status(201).json(params.Item);\n } catch (error) {\n console.error('Error creating item:', error);\n res.status(500).json({ error: 'Could not create item' });\n }\n});\n\n// Get all items\napp.get('/items', async (req, res) => {\n try {\n const params = {\n TableName: TABLE_NAME\n };\n\n const result = await dynamoDb.scan(params).promise();\n res.json(result.Items || []);\n } catch (error) {\n console.error('Error fetching items:', error);\n res.status(500).json({ error: 'Could not fetch items' });\n }\n});\n\n// Get single item\napp.get('/items/:id', async (req, res) => {\n try {\n const { id } = req.params;\n \n const params = {\n TableName: TABLE_NAME,\n Key: { id }\n };\n\n const result = await dynamoDb.get(params).promise();\n \n if (!result.Item) {\n return res.status(404).json({ error: 'Item not found' });\n }\n \n res.json(result.Item);\n } catch (error) {\n console.error('Error fetching item:', error);\n res.status(500).json({ error: 'Could not fetch item' });\n }\n});\n\n// Update item\napp.put('/items/:id', async (req, res) => {\n try {\n const { id } = req.params;\n const { name, description } = req.body;\n \n const params = {\n TableName: TABLE_NAME,\n Key: { id },\n UpdateExpression: 'set #name = :name, description = :desc, updatedAt = :updatedAt',\n ExpressionAttributeNames: {\n '#name': 'name'\n },\n ExpressionAttributeValues: {\n ':name': name,\n ':desc': description,\n ':updatedAt': new Date().toISOString()\n },\n ReturnValues: 'ALL_NEW'\n };\n\n const result = await dynamoDb.update(params).promise();\n res.json(result.Attributes);\n } catch (error) {\n console.error('Error updating item:', error);\n res.status(500).json({ error: 'Could not update item' });\n }\n});\n\n// Delete item\napp.delete('/items/:id', async (req, res) => {\n try {\n const { id } = req.params;\n \n const params = {\n TableName: TABLE_NAME,\n Key: { id },\n ReturnValues: 'ALL_OLD'\n };\n\n const result = await dynamoDb.delete(params).promise();\n \n if (!result.Attributes) {\n return res.status(404).json({ error: 'Item not found' });\n }\n \n res.json({ message: 'Item deleted successfully' });\n } catch (error) {\n console.error('Error deleting item:', error);\n res.status(500).json({ error: 'Could not delete item' });\n }\n});\n\n// Error handling middleware\napp.use((err, req, res, next) => {\n console.error(err.stack);\n res.status(500).json({ error: 'Something went wrong!' });\n});\n\n// Export the serverless handler\nmodule.exports.handler = serverless(app);\n\n// For local development\nif (process.env.NODE_ENV !== 'production') {\n const PORT = process.env.PORT || 3000;\n app.listen(PORT, () => {\n console.log(`Server is running on http://localhost:${PORT}`);\n });\n}\n",
|
| 44 |
+
"size": 3749,
|
| 45 |
+
"language": "javascript"
|
| 46 |
+
},
|
| 47 |
+
"frontend/package.json": {
|
| 48 |
+
"content": "{\n \"name\": \"serverless-frontend\",\n \"version\": \"0.1.0\",\n \"private\": true,\n \"dependencies\": {\n \"@sentry/react\": \"^7.0.0\",\n \"@sentry/tracing\": \"^7.0.0\",\n \"@testing-library/jest-dom\": \"^5.16.5\",\n \"@testing-library/react\": \"^13.4.0\",\n \"@testing-library/user-event\": \"^13.5.0\",\n \"@types/jest\": \"^27.5.2\",\n \"@types/node\": \"^16.18.0\",\n \"@types/react\": \"^18.0.24\",\n \"@types/react-dom\": \"^18.0.8\",\n \"amazon-cognito-identity-js\": \"^5.2.10\",\n \"axios\": \"^1.1.3\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\",\n \"react-router-dom\": \"^6.4.3\",\n \"react-scripts\": \"5.0.1\",\n \"typescript\": \"^4.8.4\",\n \"web-vitals\": \"^2.1.4\"\n },\n \"scripts\": {\n \"start\": \"react-scripts start\",\n \"build\": \"react-scripts build\",\n \"test\": \"react-scripts test\",\n \"eject\": \"react-scripts eject\",\n \"lint\": \"eslint src --ext .ts,.tsx\"\n },\n \"eslintConfig\": {\n \"extends\": [\n \"react-app\",\n \"react-app/jest\"\n ]\n },\n \"browserslist\": {\n \"production\": [\n \">0.2%\",\n \"not dead\",\n \"not op_mini all\"\n ],\n \"development\": [\n \"last 1 chrome version\",\n \"last 1 firefox version\",\n \"last 1 safari version\"\n ]\n },\n \"devDependencies\": {\n \"@types/react-router-dom\": \"^5.3.3\",\n \"@typescript-eslint/eslint-plugin\": \"^5.38.1\",\n \"@typescript-eslint/parser\": \"^5.38.1\",\n \"eslint\": \"^8.24.0\",\n \"eslint-config-prettier\": \"^8.5.0\",\n \"eslint-plugin-prettier\": \"^4.2.1\",\n \"eslint-plugin-react\": \"^7.31.8\",\n \"prettier\": \"^2.7.1\"\n }\n}\n",
|
| 49 |
+
"size": 1517,
|
| 50 |
+
"language": "json"
|
| 51 |
+
},
|
| 52 |
+
"frontend/src/context/AuthContext.tsx": {
|
| 53 |
+
"content": "import React, { createContext, useContext, useState, useEffect, ReactNode } from 'react';\nimport { signIn, signUp, signOut, getCurrentUser, isAuthenticated, CognitoUser } from '../services/auth';\n\ninterface AuthContextType {\n user: CognitoUser | null;\n loading: boolean;\n error: string | null;\n login: (email: string, password: string) => Promise<void>;\n register: (email: string, password: string, name: string) => Promise<void>;\n logout: () => void;\n isAuthenticated: boolean;\n}\n\nconst AuthContext = createContext<AuthContextType | undefined>(undefined);\n\nexport const AuthProvider: React.FC<{ children: ReactNode }> = ({ children }) => {\n const [user, setUser] = useState<CogniteUser | null>(null);\n const [loading, setLoading] = useState<boolean>(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const loadUser = async () => {\n try {\n const currentUser = await getCurrentUser();\n setUser(currentUser);\n } catch (error) {\n console.error('Error loading user', error);\n } finally {\n setLoading(false);\n }\n };\n\n loadUser();\n }, []);\n\n const login = async (email: string, password: string) => {\n setLoading(true);\n setError(null);\n try {\n await signIn(email, password);\n const currentUser = await getCurrentUser();\n setUser(currentUser);\n } catch (error) {\n console.error('Login error:', error);\n setError(error instanceof Error ? error.message : 'Login failed');\n throw error;\n } finally {\n setLoading(false);\n }\n };\n\n const register = async (email: string, password: string, name: string) => {\n setLoading(true);\n setError(null);\n try {\n await signUp({ email, password, name });\n // Auto-login after registration\n await login(email, password);\n } catch (error) {\n console.error('Registration error:', error);\n setError(error instanceof Error ? error.message : 'Registration failed');\n throw error;\n } finally {\n setLoading(false);\n }\n };\n\n const logout = () => {\n signOut();\n setUser(null);\n };\n\n const value = {\n user,\n loading,\n error,\n login,\n register,\n logout,\n isAuthenticated: !!user,\n };\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n};\n\nexport const useAuth = (): AuthContextType => {\n const context = useContext(AuthContext);\n if (context === undefined) {\n throw new Error('useAuth must be used within an AuthProvider');\n }\n return context;\n};\n\nexport default AuthContext;\n",
|
| 54 |
+
"size": 2573,
|
| 55 |
+
"language": "unknown"
|
| 56 |
+
},
|
| 57 |
+
"frontend/src/services/api.ts": {
|
| 58 |
+
"content": "import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';\nimport { getToken } from './auth';\n\nconst API_URL = process.env.REACT_APP_API_URL || 'http://localhost:3000';\n\nclass ApiClient {\n private client: AxiosInstance;\n\n constructor() {\n this.client = axios.create({\n baseURL: API_URL,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n // Add request interceptor for auth token\n this.client.interceptors.request.use(\n (config) => {\n const token = getToken();\n if (token) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n }\n\n // Generic request method\n async request<T>(config: AxiosRequestConfig): Promise<T> {\n try {\n const response: AxiosResponse<T> = await this.client.request<T>(config);\n return response.data;\n } catch (error) {\n if (axios.isAxiosError(error)) {\n throw new Error(error.response?.data?.message || 'An error occurred');\n }\n throw error;\n }\n }\n\n // CRUD Operations for Items\n async getItems<T>(): Promise<T> {\n return this.request<T>({\n method: 'GET',\n url: '/items',\n });\n }\n\n async getItem<T>(id: string): Promise<T> {\n return this.request<T>({\n method: 'GET',\n url: `/items/${id}`,\n });\n }\n\n async createItem<T>(data: any): Promise<T> {\n return this.request<T>({\n method: 'POST',\n url: '/items',\n data,\n });\n }\n\n async updateItem<T>(id: string, data: any): Promise<T> {\n return this.request<T>({\n method: 'PUT',\n url: `/items/${id}`,\n data,\n });\n }\n\n async deleteItem<T>(id: string): Promise<T> {\n return this.request<T>({\n method: 'DELETE',\n url: `/items/${id}`,\n });\n }\n}\n\nexport const apiClient = new ApiClient();\n",
|
| 59 |
+
"size": 1900,
|
| 60 |
+
"language": "typescript"
|
| 61 |
+
},
|
| 62 |
+
"frontend/src/services/auth.ts": {
|
| 63 |
+
"content": "import { CognitoUser, CognitoUserPool, AuthenticationDetails, CognitoUserSession } from 'amazon-cognito-identity-js';\n\nconst poolData = {\n UserPoolId: process.env.REACT_APP_USER_POOL_ID || '',\n ClientId: process.env.REACT_APP_CLIENT_ID || ''\n};\n\nexport const userPool = new CognitoUserPool(poolData);\n\ninterface SignUpParams {\n email: string;\n password: string;\n name: string;\n}\n\nexport const signUp = async ({ email, password, name }: SignUpParams): Promise<CognitoUser> => {\n return new Promise((resolve, reject) => {\n const attributeList = [\n {\n Name: 'email',\n Value: email\n },\n {\n Name: 'name',\n Value: name\n }\n ];\n\n userPool.signUp(email, password, attributeList, [], (err, result) => {\n if (err) {\n reject(err);\n return;\n }\n if (result) {\n resolve(result.user);\n }\n });\n });\n};\n\nexport const signIn = (email: string, password: string): Promise<CognitoUserSession> => {\n const authenticationDetails = new AuthenticationDetails({\n Username: email,\n Password: password\n });\n\n const userData = {\n Username: email,\n Pool: userPool\n };\n\n const cognitoUser = new CognitoUser(userData);\n\n return new Promise((resolve, reject) => {\n cognitoUser.authenticateUser(authenticationDetails, {\n onSuccess: (session) => {\n localStorage.setItem('token', session.getIdToken().getJwtToken());\n resolve(session);\n },\n onFailure: (err) => {\n reject(err);\n },\n newPasswordRequired: () => {\n // Handle case where user needs to set a new password\n reject(new Error('New password required'));\n }\n });\n });\n};\n\nexport const signOut = (): void => {\n const user = userPool.getCurrentUser();\n if (user) {\n user.signOut();\n }\n localStorage.removeItem('token');\n};\n\nexport const getCurrentUser = (): Promise<CognitoUser | null> => {\n return new Promise((resolve) => {\n const user = userPool.getCurrentUser();\n \n if (!user) {\n resolve(null);\n return;\n }\n\n user.getSession((err: Error | null) => {\n if (err) {\n resolve(null);\n return;\n }\n resolve(user);\n });\n });\n};\n\nexport const getToken = (): string | null => {\n return localStorage.getItem('token');\n};\n\nexport const isAuthenticated = async (): Promise<boolean> => {\n try {\n const user = await getCurrentUser();\n return !!user;\n } catch (error) {\n return false;\n }\n};\n",
|
| 64 |
+
"size": 2472,
|
| 65 |
+
"language": "typescript"
|
| 66 |
+
},
|
| 67 |
+
"backend/backend_stack.py": {
|
| 68 |
+
"content": "from aws_cdk import (\n Stack,\n aws_dynamodb as dynamodb,\n aws_lambda as _lambda,\n aws_apigateway as apigw,\n aws_cognito as cognito,\n aws_iam as iam,\n aws_logs as logs,\n RemovalPolicy,\n Duration,\n)\nfrom constructs import Construct\n\nclass BackendStack(Stack):\n def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:\n super().__init__(scope, construct_id, **kwargs)\n\n # Create Cognito User Pool\n user_pool = cognito.UserPool(\n self, \"UserPool\",\n user_pool_name=\"serverless-backend-users\",\n self_sign_up_enabled=True,\n sign_in_aliases={\"email\": True},\n auto_verify={\"email\": True},\n password_policy={\n \"min_length\": 8,\n \"require_lowercase\": True,\n \"require_uppercase\": True,\n \"require_digits\": True,\n \"require_symbols\": True,\n },\n account_recovery=cognito.AccountRecovery.EMAIL_ONLY,\n removal_policy=RemovalPolicy.DESTROY\n )\n\n # Add App Client\n user_pool_client = cognito.UserPoolClient(\n self, \"UserPoolClient\",\n user_pool=user_pool,\n auth_flows={\"admin_user_password\": True, \"user_password\": True, \"user_srp\": True},\n o_auth={\n \"flows\": {\"authorization_code_grant\": True},\n \"scopes\": [cognito.OAuthScope.EMAIL, cognito.OAuthScope.OPENID, cognito.OAuthScope.PROFILE],\n \"callback_urls\": [\"http://localhost:3000/callback\"],\n \"logout_urls\": [\"http://localhost:3000\"]\n }\n )\n\n # Create DynamoDB Table\n table = dynamodb.Table(\n self, \"ItemsTable\",\n table_name=\"serverless-items\",\n partition_key={\"name\": \"id\", \"type\": dynamodb.AttributeType.STRING},\n sort_key={\"name\": \"created_at\", \"type\": dynamodb.AttributeType.STRING},\n billing_mode=dynamodb.BillingMode.PAY_PER_REQUEST,\n removal_policy=RemovalPolicy.DESTROY,\n point_in_time_recovery=True\n )\n\n # Add GSI for querying by user\n table.add_global_secondary_index(\n index_name=\"user-index\",\n partition_key={\"name\": \"user_id\", \"type\": dynamodb.AttributeType.STRING},\n sort_key={\"name\": \"created_at\", \"type\": dynamodb.AttributeType.STRING}\n )\n\n # Create Lambda execution role\n lambda_role = iam.Role(\n self, \"LambdaExecutionRole\",\n assumed_by=iam.ServicePrincipal(\"lambda.amazonaws.com\"),\n managed_policies=[\n iam.ManagedPolicy.from_aws_managed_policy_name(\"service-role/AWSLambdaBasicExecutionRole\"),\n iam.ManagedPolicy.from_aws_managed_policy_name(\"AmazonDynamoDBFullAccess\"),\n iam.ManagedPolicy.from_aws_managed_policy_name(\"AmazonCognitoReadOnly\")\n ]\n )\n\n # Create Lambda function\n lambda_fn = _lambda.Function(\n self, \"ApiHandler\",\n runtime=_lambda.Runtime.PYTHON_3_9,\n handler=\"lambda_function.lambda_handler\",\n code=_lambda.Code.from_asset(\"lambda\"),\n role=lambda_role,\n environment={\n \"USER_POOL_ID\": user_pool.user_pool_id,\n \"CLIENT_ID\": user_pool_client.user_pool_client_id,\n \"TABLE_NAME\": table.table_name,\n \"REGION\": self.region\n },\n timeout=Duration.seconds(30),\n memory_size=256,\n log_retention=logs.RetentionDays.ONE_WEEK\n )\n\n # Grant Lambda access to DynamoDB\n table.grant_read_write_data(lambda_fn)\n\n # Create API Gateway with Cognito Authorizer\n authorizer = apigw.CognitoUserPoolsAuthorizer(\n self, \"CognitoAuthorizer\",\n cognito_user_pools=[user_pool]\n )\n\n # Create REST API\n api = apigw.RestApi(\n self, \"ServerlessApi\",\n default_cors_preflight_options={\n \"allow_origins\": apigw.Cors.ALL_ORIGINS,\n \"allow_methods\": apigw.Cors.ALL_METHODS,\n \"allow_headers\": [\"Content-Type\", \"Authorization\"],\n \"allow_credentials\": True\n },\n deploy_options={\n \"stage_name\": \"prod\",\n \"logging_level\": apigw.MethodLoggingLevel.INFO,\n \"metrics_enabled\": True\n }\n )\n\n # Add resources and methods\n items = api.root.add_resource(\"items\")\n item = items.add_resource(\"{id}\")\n\n # Add CORS preflight for OPTIONS\n self._add_cors_options(items)\n self._add_cors_options(item)\n\n # Integrate Lambda with API Gateway\n lambda_integration = apigw.LambdaIntegration(\n lambda_fn,\n proxy=True,\n integration_responses=[{\"statusCode\": \"200\"}]\n )\n\n # Add methods with Cognito authorization\n items.add_method(\"GET\", lambda_integration, authorizer=authorizer)\n items.add_method(\"POST\", lambda_integration, authorizer=authorizer)\n item.add_method(\"GET\", lambda_integration, authorizer=authorizer)\n item.add_method(\"PUT\", lambda_integration, authorizer=authorizer)\n item.add_method(\"DELETE\", lambda_integration, authorizer=authorizer)\n\n # Outputs\n self.api_url = api.url\n self.user_pool_id = user_pool.user_pool_id\n self.user_pool_client_id = user_pool_client.user_pool_client_id\n\n def _add_cors_options(self, resource):\n resource.add_method(\n 'OPTIONS',\n apigw.MockIntegration(\n integration_responses=[{\n 'statusCode': '200',\n 'responseParameters': {\n 'method.response.header.Access-Control-Allow-Headers': \"'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'\",\n 'method.response.header.Access-Control-Allow-Origin': \"'*'\",\n 'method.response.header.Access-Control-Allow-Methods': \"'OPTIONS,GET,PUT,POST,DELETE'\"\n }\n }],\n passthrough_behavior=apigw.PassthroughBehavior.WHEN_NO_MATCH,\n request_templates={\"application/json\": \"{statusCode: 200}\"}\n ),\n method_responses=[{\n 'statusCode': '200',\n 'responseParameters': {\n 'method.response.header.Access-Control-Allow-Headers': True,\n 'method.response.header.Access-Control-Allow-Methods': True,\n 'method.response.header.Access-Control-Allow-Origin': True,\n }\n }]\n )\n",
|
| 69 |
+
"size": 6747,
|
| 70 |
+
"language": "python"
|
| 71 |
+
},
|
| 72 |
+
"lambda/requirements.txt": {
|
| 73 |
+
"content": "boto3>=1.26.0\npython-jose[cryptography]>=3.3.0\nrequests>=2.28.0\npydantic>=1.10.0\npython-dotenv>=0.21.0\naws-lambda-powertools>=2.0.0\n",
|
| 74 |
+
"size": 132,
|
| 75 |
+
"language": "text"
|
| 76 |
+
},
|
| 77 |
+
"lambda/lambda_function.py": {
|
| 78 |
+
"content": "import os\nimport json\nimport boto3\nimport logging\nfrom datetime import datetime\nfrom typing import Dict, Any, Optional\nfrom boto3.dynamodb.conditions import Key\nfrom botocore.exceptions import ClientError\nfrom pydantic import BaseModel, validator\nfrom aws_lambda_powertools import Logger, Tracer, Metrics\nfrom aws_lambda_powertools.utilities.typing import LambdaContext\n\n# Initialize utilities\nlogger = Logger()\ntracer = Tracer()\nmetrics = Metrics()\n\n# Initialize AWS clients\ndynamodb = boto3.resource('dynamodb')\ntable_name = os.environ['TABLE_NAME']\ntable = dynamodb.Table(table_name)\n\n# Pydantic Models for request/response validation\nclass ItemCreate(BaseModel):\n name: str\n description: str\n\nclass ItemUpdate(BaseModel):\n name: Optional[str] = None\n description: Optional[str] = None\n\nclass ResponseModel(BaseModel):\n statusCode: int\n body: str\n headers: Dict[str, str] = {\n 'Content-Type': 'application/json',\n 'Access-Control-Allow-Origin': '*'\n }\n\n# Utility functions\ndef get_user_id(event: Dict[str, Any]) -> str:\n \"\"\"Extract user ID from Cognito JWT token\"\"\"\n try:\n return event['requestContext']['authorizer']['claims']['sub']\n except (KeyError, TypeError) as e:\n logger.error(f\"Error extracting user ID: {str(e)}\")\n raise ValueError(\"Invalid authorization token\")\n\ndef build_response(status_code: int, body: Any) -> Dict[str, Any]:\n \"\"\"Build API Gateway response\"\"\"\n return {\n 'statusCode': status_code,\n 'body': json.dumps(body, default=str),\n 'headers': {\n 'Content-Type': 'application/json',\n 'Access-Control-Allow-Origin': '*'\n }\n }\n\n# Lambda handler\n@logger.inject_lambda_context(log_event=True)\n@tracer.capture_lambda_handler\n@metrics.log_metrics(capture_cold_start_metric=True)\ndef lambda_handler(event: Dict[str, Any], context: LambdaContext) -> Dict[str, Any]:\n \"\"\"\n Main Lambda handler for the API Gateway\n \"\"\"\n try:\n http_method = event['httpMethod']\n path = event['resource']\n \n # Route the request\n if http_method == 'GET' and path == '/items':\n return list_items(event)\n elif http_method == 'POST' and path == '/items':\n return create_item(event)\n elif http_method == 'GET' and path.startswith('/items/'):\n return get_item(event)\n elif http_method == 'PUT' and path.startswith('/items/'):\n return update_item(event)\n elif http_method == 'DELETE' and path.startswith('/items/'):\n return delete_item(event)\n else:\n return build_response(404, {'message': 'Not Found'})\n \n except Exception as e:\n logger.error(f\"Error processing request: {str(e)}\")\n return build_response(500, {'message': 'Internal Server Error'})\n\n# CRUD Operations\ndef list_items(event: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"List all items for the authenticated user\"\"\"\n try:\n user_id = get_user_id(event)\n \n response = table.query(\n IndexName='user-index',\n KeyConditionExpression=Key('user_id').eq(user_id)\n )\n \n return build_response(200, {\n 'items': response.get('Items', [])\n })\n \n except Exception as e:\n logger.error(f\"Error listing items: {str(e)}\")\n return build_response(500, {'message': 'Failed to list items'})\n\ndef create_item(event: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"Create a new item\"\"\"\n try:\n user_id = get_user_id(event)\n request_body = json.loads(event['body'])\n \n # Validate input\n item_data = ItemCreate(**request_body)\n \n # Generate item ID and timestamps\n item_id = context.aws_request_id\n timestamp = datetime.utcnow().isoformat()\n \n # Prepare item\n item = {\n 'id': item_id,\n 'user_id': user_id,\n 'created_at': timestamp,\n 'updated_at': timestamp,\n **item_data.dict()\n }\n \n # Save to DynamoDB\n table.put_item(Item=item)\n \n return build_response(201, item)\n \n except Exception as e:\n logger.error(f\"Error creating item: {str(e)}\")\n return build_response(500, {'message': 'Failed to create item'})\n\ndef get_item(event: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"Get a single item by ID\"\"\"\n try:\n user_id = get_user_id(event)\n item_id = event['pathParameters']['id']\n \n # Get item from DynamoDB\n response = table.get_item(\n Key={'id': item_id}\n )\n \n item = response.get('Item')\n if not item:\n return build_response(404, {'message': 'Item not found'})\n \n # Ensure the user owns this item\n if item.get('user_id') != user_id:\n return build_response(403, {'message': 'Forbidden'})\n \n return build_response(200, item)\n \n except ClientError as e:\n logger.error(f\"DynamoDB error: {str(e)}\")\n return build_response(500, {'message': 'Error retrieving item'})\n except Exception as e:\n logger.error(f\"Error getting item: {str(e)}\")\n return build_response(500, {'message': 'Internal server error'})\n\ndef update_item(event: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"Update an existing item\"\"\"\n try:\n user_id = get_user_id(event)\n item_id = event['pathParameters']['id']\n request_body = json.loads(event['body'])\n \n # Validate input\n update_data = ItemUpdate(**request_body).dict(exclude_unset=True)\n \n if not update_data:\n return build_response(400, {'message': 'No valid fields to update'})\n \n # Prepare update expression\n update_expression = []\n expression_attribute_values = {}\n \n for key, value in update_data.items():\n update_expression.append(f\"{key} = :{key}\")\n expression_attribute_values[f\":{key}\"] = value\n \n # Add updated_at timestamp\n update_expression.append(\"updated_at = :updated_at\")\n expression_attribute_values[\":updated_at\"] = datetime.utcnow().isoformat()\n \n # Update item in DynamoDB\n response = table.update_item(\n Key={'id': item_id},\n UpdateExpression=\"SET \" + \", \".join(update_expression),\n ExpressionAttributeValues=expression_attribute_values,\n ConditionExpression=\"user_id = :user_id\",\n ExpressionAttributeValues={\n **expression_attribute_values,\n \":user_id\": user_id\n },\n ReturnValues=\"ALL_NEW\"\n )\n \n return build_response(200, response['Attributes'])\n \n except ClientError as e:\n if e.response['Error']['Code'] == 'ConditionalCheckFailedException':\n return build_response(403, {'message': 'Forbidden'})\n logger.error(f\"DynamoDB error: {str(e)}\")\n return build_response(500, {'message': 'Error updating item'})\n except Exception as e:\n logger.error(f\"Error updating item: {str(e)}\")\n return build_response(500, {'message': 'Internal server error'})\n\ndef delete_item(event: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"Delete an item\"\"\"\n try:\n user_id = get_user_id(event)\n item_id = event['pathParameters']['id']\n \n # Delete item from DynamoDB\n response = table.delete_item(\n Key={'id': item_id},\n ConditionExpression=\"user_id = :user_id\",\n ExpressionAttributeValues={\n ':user_id': user_id\n },\n ReturnValues=\"ALL_OLD\"\n )\n \n if 'Attributes' not in response:\n return build_response(404, {'message': 'Item not found'})\n \n return build_response(200, {'message': 'Item deleted successfully'})\n \n except ClientError as e:\n if e.response['Error']['Code'] == 'ConditionalCheckFailedException':\n return build_response(403, {'message': 'Forbidden'})\n logger.error(f\"DynamoDB error: {str(e)}\")\n return build_response(500, {'message': 'Error deleting item'})\n except Exception as e:\n logger.error(f\"Error deleting item: {str(e)}\")\n return build_response(500, {'message': 'Internal server error'})\n",
|
| 79 |
+
"size": 8410,
|
| 80 |
+
"language": "python"
|
| 81 |
+
}
|
| 82 |
+
},
|
| 83 |
+
"_cache_metadata": {
|
| 84 |
+
"url": "https://github.com/ronelsolomon/AWS-backend.git",
|
| 85 |
+
"content_type": "github",
|
| 86 |
+
"cached_at": "2026-03-02T22:48:23.536393",
|
| 87 |
+
"cache_key": "6fdad44d776a0611631264d389d28f83"
|
| 88 |
+
}
|
| 89 |
+
}
|
75448addd639eeefa4f7e1bf82eec857.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/hearpython.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "hearpython.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:50:25.826609",
|
| 6 |
+
"files": {
|
| 7 |
+
".gitattributes": {
|
| 8 |
+
"content": "# Auto detect text files and perform LF normalization\n* text=auto\n",
|
| 9 |
+
"size": 66,
|
| 10 |
+
"language": "unknown"
|
| 11 |
+
}
|
| 12 |
+
},
|
| 13 |
+
"_cache_metadata": {
|
| 14 |
+
"url": "https://github.com/ronelsolomon/hearpython.git",
|
| 15 |
+
"content_type": "github",
|
| 16 |
+
"cached_at": "2026-03-02T22:50:25.827118",
|
| 17 |
+
"cache_key": "75448addd639eeefa4f7e1bf82eec857"
|
| 18 |
+
}
|
| 19 |
+
}
|
87bde3e51835c6fe8a551e040927b70a.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
89999b89c91b5b10dccecf8fc1ae90d5.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/Graph-k-means.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "Graph-k-means.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:48:32.021106",
|
| 6 |
+
"files": {
|
| 7 |
+
"README.md": {
|
| 8 |
+
"content": "# Graph-k-means\nProject Research Exploration\n",
|
| 9 |
+
"size": 45,
|
| 10 |
+
"language": "markdown"
|
| 11 |
+
}
|
| 12 |
+
},
|
| 13 |
+
"_cache_metadata": {
|
| 14 |
+
"url": "https://github.com/ronelsolomon/Graph-k-means.git",
|
| 15 |
+
"content_type": "github",
|
| 16 |
+
"cached_at": "2026-03-02T22:48:32.021471",
|
| 17 |
+
"cache_key": "89999b89c91b5b10dccecf8fc1ae90d5"
|
| 18 |
+
}
|
| 19 |
+
}
|
8baa2f5937a004fca77613f9fae1821e.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
8bd18a48d36a1a101b6ab9044d1f651c.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
8f56b34b5833aed95e029da1d292b700.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/dev.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "dev.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:49:34.034076",
|
| 6 |
+
"files": {
|
| 7 |
+
"index.html": {
|
| 8 |
+
"content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <title>Postmark Inbox Dashboard</title>\n <style>\n body { font-family: sans-serif; margin: 2rem; }\n h1 { color: #1d72b8; }\n .email { border-bottom: 1px solid #eee; margin-bottom: 1em; padding-bottom: 1em; }\n .subject { font-weight: bold; }\n .from { color: #888; }\n .body { margin-top: 0.5em; }\n </style>\n</head>\n<body>\n <h1>📥 Postmark Inbox Dashboard</h1>\n <div id=\"inbox\"></div>\n <script>\n async function loadInbox() {\n const res = await fetch('/api/inbox');\n const emails = await res.json();\n const inboxDiv = document.getElementById('inbox');\n inboxDiv.innerHTML = emails.map(email => `\n <div class=\"email\">\n <div class=\"subject\">${email.subject}</div>\n <div class=\"from\">From: ${email.from} | ${new Date(email.receivedAt).toLocaleString()}</div>\n <div class=\"body\">${email.body.replace(/\\n/g, '<br>')}</div>\n </div>\n `).join('');\n }\n loadInbox();\n setInterval(loadInbox, 5000);\n </script>\n</body>\n</html>\n",
|
| 9 |
+
"size": 1209,
|
| 10 |
+
"language": "html"
|
| 11 |
+
},
|
| 12 |
+
"README.md": {
|
| 13 |
+
"content": "# dev\n# 📨 Simple Email Inbox API\n\nA lightweight Flask-based email inbox system that accepts inbound emails via webhook and provides a JSON API to access messages.\n\n## Features\n\n- **Inbound Email Webhook**: Accepts POST requests with email data\n- **JSON Storage**: Persists emails in a simple JSON file\n- **REST API**: Provides endpoints to retrieve stored emails\n- **Basic Web Interface**: Simple HTML view to display inbox contents\n\n## Tech Stack\n\n- **Backend**: Python + Flask\n- **Storage**: JSON file (`inbox.json`)\n- **Frontend**: Basic HTML/CSS (via Jinja template)\n\n## Getting Started\n\n### Prerequisites\n- Python 3.7+\n- Flask\n\n### Installation\n1. Clone the repository:\n```bash\ngit clone https://github.com/yourusername/flask-email-inbox.git\ncd flask-email-inbox\n```\n\n2. Install dependencies:\n```bash\npip install flask\n```\n\n3. Run the application:\n```bash\npython app.py\n```\n\nThe server will start at `http://localhost:8000`\n\n## API Documentation\n\n### POST `/inbound`\nAccepts email data in JSON format\n\n**Example Request:**\n```json\n{\n \"From\": \"sender@example.com\",\n \"Subject\": \"Test Message\",\n \"TextBody\": \"Hello World!\"\n}\n```\n\n**Response:**\n- HTTP 200 (Empty response)\n\n### GET `/api/inbox`\nRetrieve all stored emails\n\n**Example Response:**\n```json\n[\n {\n \"from\": \"sender@example.com\",\n \"subject\": \"Test Message\",\n \"body\": \"Hello World!\",\n \"receivedAt\": \"2023-11-05T12:34:56.789Z\"\n }\n]\n```\n\n## Project Structure\n```\n.\n├── app.py # Main application code\n├── inbox.json # Email storage (auto-created)\n├── templates/\n│ └── index.html # Basic inbox view\n└── README.md\n```\n\n## Deployment\n\n1. **Local Testing**:\n - Use ngrok to expose your local server:\n ```bash\n ngrok http 8000\n ```\n - Configure your email service provider to send webhooks to your ngrok URL\n\n2. **Production**:\n - Consider using:\n - Gunicorn/WSGI server\n - PostgreSQL/MongoDB for production storage\n - Environment variables for configuration\n - Docker containerization\n\n## Security Considerations\n\n1. Add authentication for the `/inbound` endpoint\n2. Implement request validation\n3. Use HTTPS in production\n4. Add rate limiting\n5. Consider replacing JSON file storage with a proper database\n\n## Example Usage\n\nView inbox in browser:\n```bash\nopen http://localhost:8000\n```\n\nQuery inbox via CLI:\n```bash\ncurl http://localhost:8000/api/inbox\n```\n\n## Troubleshooting\n\n**Common Issues:**\n- `inbox.json` not created: Ensure write permissions in project directory\n- CORS errors: Add proper CORS headers if using a frontend\n- Missing fields: Ensure POST requests include `From` and `Subject` fields\n\n## License\nMIT License\n\n---\n\n**Next Steps**:\n1. Add authentication middleware\n2. Implement email filtering/sorting\n3. Add pagination to API\n4. Support HTML email content\n5. Add attachment handling\n\nTo contribute, please fork the repository and submit a pull request.\n",
|
| 14 |
+
"size": 2913,
|
| 15 |
+
"language": "markdown"
|
| 16 |
+
},
|
| 17 |
+
"app.py": {
|
| 18 |
+
"content": "from flask import Flask, request, jsonify, render_template\nimport json\nimport os\nfrom datetime import datetime\n\napp = Flask(__name__)\nINBOX_FILE = 'inbox.json'\n\ndef load_inbox():\n if os.path.exists(INBOX_FILE):\n with open(INBOX_FILE, 'r') as f:\n return json.load(f)\n return []\n\ndef save_inbox(inbox):\n with open(INBOX_FILE, 'w') as f:\n json.dump(inbox, f, indent=2)\n\n@app.route('/inbound', methods=['POST'])\ndef inbound():\n data = request.json\n if data and 'From' in data and 'Subject' in data:\n inbox = load_inbox()\n email = {\n 'from': data['From'],\n 'subject': data['Subject'],\n 'body': data.get('TextBody', ''),\n 'receivedAt': datetime.utcnow().isoformat()\n }\n inbox.insert(0, email)\n save_inbox(inbox)\n print(f\"Received: {email['subject']}\")\n return '', 200\n\n@app.route('/api/inbox')\ndef api_inbox():\n inbox = load_inbox()\n return jsonify(inbox)\n\n@app.route('/')\ndef index():\n return render_template('index.html')\n\nif __name__ == '__main__':\n app.run(debug=True, port=8000)\n\n",
|
| 19 |
+
"size": 1120,
|
| 20 |
+
"language": "python"
|
| 21 |
+
}
|
| 22 |
+
},
|
| 23 |
+
"_cache_metadata": {
|
| 24 |
+
"url": "https://github.com/ronelsolomon/dev.git",
|
| 25 |
+
"content_type": "github",
|
| 26 |
+
"cached_at": "2026-03-02T22:49:34.034473",
|
| 27 |
+
"cache_key": "8f56b34b5833aed95e029da1d292b700"
|
| 28 |
+
}
|
| 29 |
+
}
|
9779fe767985a3c1e8c6905c9b3fea3f.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/assementTemplate.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "assementTemplate.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:49:06.124363",
|
| 6 |
+
"files": {
|
| 7 |
+
".DS_Store": {
|
| 8 |
+
"content": "\u0000\u0000\u0000\u0001Bud1\u0000\u0000\u0010\u0000\u0000\u0000\b\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0000\u0000\u0000\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0001\u0000\u0000\u0010\u0000\u0000l\u0000a\u0000t\u0000e\u0000sds\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\t\u0000t\u0000e\u0000m\u0000p\u0000l\u0000a\u0000t\u0000e\u0000sdsclbool\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\b\u000b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000 \u0000\u0000\u0000\u0001\u0000\u0000\u0000@\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0001\u0000\u0000 \u0000\u0000\u0000\u0000\u0001\u0000\u0000@\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0001\u0000@\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0001\b\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0001 \u0000\u0000\u0000\u0000\u0000\u0000\u0001@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0003\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u000b\u0000\u0000\u0000E\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004DSDB\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000 \u0000\u0000\u0000`\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0002\u0000\u0000\b\u0000\u0000\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000 \u0000\u0000\u0000\u0000\u0001\u0000\u0000@\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0001\u0000@\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0001\b\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0001 \u0000\u0000\u0000\u0000\u0000\u0000\u0001@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000",
|
| 9 |
+
"size": 6140,
|
| 10 |
+
"language": "unknown"
|
| 11 |
+
},
|
| 12 |
+
"README.md": {
|
| 13 |
+
"content": "# assementTemplate",
|
| 14 |
+
"size": 18,
|
| 15 |
+
"language": "markdown"
|
| 16 |
+
},
|
| 17 |
+
"mainwebsiteLLM models.ipynb": {
|
| 18 |
+
"content": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 7,\n \"id\": \"61ad2a33-9537-4d70-94b2-a94d6d88e312\",\n \"metadata\": {},\n \"outputs\": [\n {\n \"name\": \"stdout\",\n \"output_type\": \"stream\",\n \"text\": [\n \"Requirement already satisfied: PyPDF in /opt/anaconda3/lib/python3.12/site-packages (5.1.0)\\n\"\n ]\n }\n ],\n \"source\": [\n \"!pip install PyPDF\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 5,\n \"id\": \"5180343f-7dca-4a2c-a0e7-cf3afca64202\",\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n \"from flask import Flask, render_template\\n\",\n \"\\n\",\n \"import PyPDF2\\n\",\n \"import os\\n\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 24,\n \"id\": \"0997395a-844d-4d25-be0c-e763c8ec5c54\",\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n \"PDF_FOLDERs = \\\"../pdfs/exponential_Functions.pdf\\\"\\n\",\n \"def extract_text_from_pdf(pdf_path):\\n\",\n \" \\\"\\\"\\\"\\n\",\n \" Extracts text from a PDF file.\\n\",\n \" \\\"\\\"\\\"\\n\",\n \" with open(pdf_path, \\\"rb\\\") as file:\\n\",\n \" reader = PyPDF2.PdfReader(file)\\n\",\n \" text = \\\"\\\"\\n\",\n \" for page in reader.pages:\\n\",\n \" text += page.extract_text()\\n\",\n \" return text\\n\",\n \"\\n\",\n \"def search_pdfs(keyword):\\n\",\n \" \\\"\\\"\\\"\\n\",\n \" Searches for a keyword in all PDFs in the specified folder.\\n\",\n \" \\\"\\\"\\\"\\n\",\n \" matching_pdfs = []\\n\",\n \" for filename in os.listdir(PDF_FOLDER):\\n\",\n \" if filename.endswith(\\\".pdf\\\"):\\n\",\n \" pdf_path = os.path.join(PDF_FOLDER, filename)\\n\",\n \" text = extract_text_from_pdf(pdf_path)\\n\",\n \" if keyword.lower() in text.lower():\\n\",\n \" matching_pdfs.append(filename)\\n\",\n \" return matching_pdfs\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 25,\n \"id\": \"abf2e71b-b883-4f8b-80c4-1355eac4b875\",\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n \"text = extract_text_from_pdf(PDF_FOLDERs)\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 27,\n \"id\": \"8bb7b474-9de5-4e49-ba23-f467cd1a5167\",\n \"metadata\": {},\n \"outputs\": [\n {\n \"data\": {\n \"text/plain\": [\n \"['Radical Equations.pdf']\"\n ]\n },\n \"execution_count\": 27,\n \"metadata\": {},\n \"output_type\": \"execute_result\"\n }\n ],\n \"source\": [\n \"\\n\",\n \"PDF_FOLDER = \\\"../pdfs\\\"\\n\",\n \"search_pdfs(\\\"Radical\\\")\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 17,\n \"id\": \"abdfde1e-92d4-44d8-8cd9-dfe295db2f42\",\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n \"from sentence_transformers import SentenceTransformer\\n\",\n \"\\n\",\n \"model = SentenceTransformer('all-MiniLM-L6-v2')\\n\",\n \"\\n\",\n \"def generate_embeddings(text):\\n\",\n \" return model.encode(text)\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 18,\n \"id\": \"d0707d9b-c297-4517-9284-ad106d4bb0c8\",\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n \"from sklearn.metrics.pairwise import cosine_similarity\\n\",\n \"\\n\",\n \"def semantic_search(keyword, pdf_texts):\\n\",\n \" keyword_embedding = generate_embeddings(keyword)\\n\",\n \" pdf_embeddings = [generate_embeddings(text) for text in pdf_texts]\\n\",\n \" similarities = cosine_similarity([keyword_embedding], pdf_embeddings)\\n\",\n \" return similarities.argsort()[0][::-1] # Return sorted indices\\n\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 19,\n \"id\": \"e05f4f75-809f-4d44-bd74-b4977913cd3b\",\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n \"import openai\\n\",\n \"\\n\",\n \"def refine_with_gpt(keyword, pdf_text):\\n\",\n \" prompt = f\\\"Search for '{keyword}' in the text and explain its relevance:\\\\n\\\\n{pdf_text}\\\"\\n\",\n \" response = openai.ChatCompletion.create(\\n\",\n \" model=\\\"gpt-4\\\",\\n\",\n \" messages=[{\\\"role\\\": \\\"user\\\", \\\"content\\\": prompt}]\\n\",\n \" )\\n\",\n \" return response.choices[0].message['content']\\n\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 21,\n \"id\": \"af7d380b-bb02-4b0e-a0a4-e6774bc8c92b\",\n \"metadata\": {},\n \"outputs\": [\n {\n \"data\": {\n \"text/plain\": [\n \"array([ 949, 931, 922, ..., 4963, 4668, 3307])\"\n ]\n },\n \"execution_count\": 21,\n \"metadata\": {},\n \"output_type\": \"execute_result\"\n }\n ],\n \"source\": [\n \"semantic_search(\\\"Exponential\\\", text)\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 22,\n \"id\": \"15491d1c-42f6-4437-9e5a-e58623816607\",\n \"metadata\": {},\n \"outputs\": [\n {\n \"data\": {\n \"text/plain\": [\n \"array([-6.15558885e-02, -3.27429213e-02, -8.14785063e-02, 2.20018942e-02,\\n\",\n \" 2.16897670e-03, -7.06751645e-02, -4.91959192e-02, 4.50673141e-02,\\n\",\n \" 5.91372512e-02, 6.03560358e-02, 9.69159156e-02, -3.40183489e-02,\\n\",\n \" 1.34279542e-02, 4.39969152e-02, 7.23729730e-02, 5.68746701e-02,\\n\",\n \" -4.31586802e-02, -7.17484578e-02, -3.35697867e-02, 5.19162640e-02,\\n\",\n \" 9.17470157e-02, -4.97853756e-02, 5.94947999e-03, -1.51990373e-02,\\n\",\n \" 1.07879937e-02, -1.11024909e-01, -1.41220475e-02, -6.34936392e-02,\\n\",\n \" 2.57932767e-02, -8.92783105e-02, 2.05309931e-02, -2.43783295e-02,\\n\",\n \" -3.44554661e-03, 2.79479511e-02, 7.15474971e-03, 3.31692360e-02,\\n\",\n \" 4.52648662e-02, 3.54050696e-02, 2.44668801e-03, -1.39959976e-02,\\n\",\n \" -8.64054039e-02, 4.50172834e-02, 1.53103909e-02, -6.10411982e-04,\\n\",\n \" 6.62536025e-02, -4.29078750e-02, -9.63842962e-03, 2.30673142e-02,\\n\",\n \" -6.08262271e-02, 1.45137990e-02, -8.16086307e-03, 1.38271246e-02,\\n\",\n \" -4.10450771e-02, 2.08319891e-02, 5.73407710e-02, -5.02457544e-02,\\n\",\n \" 2.29066908e-02, -5.27395457e-02, -4.94055301e-02, 1.85231399e-02,\\n\",\n \" 1.11635039e-02, 3.60045451e-05, 3.10880281e-02, -2.67454833e-02,\\n\",\n \" 2.86848954e-05, 2.75322571e-02, 3.76872569e-02, -3.59265767e-02,\\n\",\n \" 1.92266132e-03, 1.54564217e-01, -1.04109630e-01, -7.03938752e-02,\\n\",\n \" -1.11478372e-02, 7.33396551e-03, 4.66745868e-02, -3.26660797e-02,\\n\",\n \" -6.81697624e-03, 5.25274761e-02, -9.55348909e-02, -1.81047861e-02,\\n\",\n \" 7.43188635e-02, 3.21524292e-02, 1.12615926e-02, -3.18462960e-02,\\n\",\n \" -4.89118882e-02, 4.50865086e-03, 2.66589355e-02, 3.22004072e-02,\\n\",\n \" 7.59974867e-02, 3.37640271e-02, 7.22169783e-03, 9.62162837e-02,\\n\",\n \" -9.49541945e-03, 1.42467869e-02, 7.72618726e-02, -3.46675515e-02,\\n\",\n \" 6.43399432e-02, -1.77124273e-02, 5.75897396e-02, -3.96663360e-02,\\n\",\n \" -9.24814641e-02, -3.08443867e-02, 4.57514524e-02, 5.76079302e-02,\\n\",\n \" -3.39191444e-02, -6.40106872e-02, -9.55350921e-02, 5.69770485e-02,\\n\",\n \" 8.61558840e-02, -4.49883342e-02, -3.83249531e-03, -5.92840686e-02,\\n\",\n \" -4.21289578e-02, 2.41857246e-02, 8.77528265e-02, 2.85814540e-03,\\n\",\n \" 4.34667021e-02, -6.05467558e-02, -1.40062924e-02, 2.42142770e-02,\\n\",\n \" 7.88620934e-02, 1.36925161e-01, 6.99017057e-03, 5.46175353e-02,\\n\",\n \" -1.59496572e-02, 4.98304442e-02, -1.98925342e-02, 4.38245783e-33,\\n\",\n \" -6.08058646e-02, -9.36815329e-03, -6.27241805e-02, -2.15339232e-02,\\n\",\n \" 6.82255924e-02, -2.57557747e-03, -4.32382487e-02, 2.09484473e-02,\\n\",\n \" -8.13180506e-02, 1.05917849e-01, -6.66709442e-04, 7.23361820e-02,\\n\",\n \" 6.01369552e-02, 3.41009088e-02, 6.00286908e-02, -4.93502505e-02,\\n\",\n \" 3.79956812e-02, -2.42618527e-02, -2.84504183e-02, -6.88754544e-02,\\n\",\n \" 1.51386326e-02, -5.61528280e-02, 5.11020906e-02, 5.75491088e-03,\\n\",\n \" 1.04614990e-02, -1.47187896e-03, 1.91245470e-02, 5.02491482e-02,\\n\",\n \" -3.53365727e-02, -3.71936150e-02, 2.63985293e-03, 1.16865197e-02,\\n\",\n \" -9.90885720e-02, -5.96534722e-02, -2.17216741e-02, -4.72019091e-02,\\n\",\n \" 4.79678139e-02, -1.50862755e-02, 1.53009677e-02, -6.27426803e-02,\\n\",\n \" -1.22015327e-01, 1.81296561e-02, -2.01311577e-02, 5.95719479e-02,\\n\",\n \" -1.78666636e-02, -8.43421146e-02, 5.14885038e-02, 4.35719453e-02,\\n\",\n \" 6.94125220e-02, -7.33720185e-03, -1.92089844e-02, -5.08487895e-02,\\n\",\n \" -2.91302484e-02, 1.07471431e-02, 1.68315619e-02, 9.51844305e-02,\\n\",\n \" 3.07717081e-02, 5.36952242e-02, -5.19274138e-02, 3.87433879e-02,\\n\",\n \" 4.65841629e-02, -7.08419308e-02, 1.40382694e-02, -8.65444690e-02,\\n\",\n \" -7.69772083e-02, 2.05817167e-03, -5.21472692e-02, -3.48970294e-02,\\n\",\n \" 3.43454704e-02, -2.24059001e-02, 2.91897636e-02, 3.78196724e-02,\\n\",\n \" 6.23015277e-02, -3.34499627e-02, 1.26833711e-02, 2.03240290e-02,\\n\",\n \" -6.10544346e-02, -2.23915316e-02, -3.30845229e-02, 3.00547350e-02,\\n\",\n \" -3.87010686e-02, -6.88908845e-02, 3.59816328e-02, -2.66986098e-02,\\n\",\n \" -2.36154348e-02, -7.89593384e-02, 5.74153587e-02, -2.09105313e-02,\\n\",\n \" 5.79180531e-02, -4.63198461e-02, -6.61852509e-02, -1.73997658e-03,\\n\",\n \" 2.19490342e-02, 2.92412508e-02, 3.31044048e-02, -6.93893874e-33,\\n\",\n \" -1.11696236e-02, 1.22892983e-01, -5.64762242e-02, 7.16693252e-02,\\n\",\n \" 3.76609489e-02, 5.96046895e-02, -5.40110655e-02, -2.23769173e-02,\\n\",\n \" 4.51719202e-02, -5.52631803e-02, 3.05389091e-02, 8.59397575e-02,\\n\",\n \" -6.65580183e-02, 5.36855981e-02, 5.64086404e-05, -4.96173501e-02,\\n\",\n \" -1.08520929e-02, -5.50978631e-02, -3.05007529e-02, -1.02113727e-02,\\n\",\n \" -6.71363473e-02, 6.10110871e-02, -1.00541614e-01, -5.72318844e-02,\\n\",\n \" 4.86018062e-02, 7.97945932e-02, -5.44169396e-02, 2.05039233e-02,\\n\",\n \" 2.20082626e-02, -3.21728401e-02, -6.33175448e-02, 7.45558962e-02,\\n\",\n \" 4.59926911e-02, -5.76484203e-02, 2.07927953e-02, 2.38216040e-03,\\n\",\n \" 2.11553778e-02, -1.05930679e-02, 6.34990409e-02, -4.58978862e-02,\\n\",\n \" 3.62073183e-02, 6.05890416e-02, 8.72566923e-02, -9.57834870e-02,\\n\",\n \" 5.85449524e-02, 3.50727811e-02, 1.54264010e-02, 9.97223556e-02,\\n\",\n \" 1.63778439e-02, 8.38218927e-02, 4.60081361e-03, 3.50369001e-03,\\n\",\n \" 3.72515842e-02, 2.41671503e-02, -9.69619527e-02, 1.28188003e-02,\\n\",\n \" 2.45130602e-02, -9.99986939e-03, -1.30141098e-02, -8.57570861e-03,\\n\",\n \" -5.71340285e-02, -6.30739052e-03, 8.09015781e-02, 3.12486794e-02,\\n\",\n \" -1.04440786e-01, -8.18522871e-02, -7.25891665e-02, -3.86947766e-02,\\n\",\n \" 5.22346497e-02, -7.00028390e-02, -6.77500069e-02, 2.02495847e-02,\\n\",\n \" -1.69183221e-03, -2.29235794e-02, -7.27068037e-02, -2.95961518e-02,\\n\",\n \" -5.90258501e-02, -8.42480436e-02, 2.72352397e-02, -1.13069117e-02,\\n\",\n \" -2.24099662e-02, 1.07025124e-01, 3.27875018e-02, -3.47781964e-02,\\n\",\n \" -7.47710019e-02, 4.25771922e-02, -4.42670323e-02, -4.04699333e-03,\\n\",\n \" 4.07143012e-02, -6.19838051e-02, -7.45694116e-02, -9.21649300e-03,\\n\",\n \" -1.12801641e-01, -7.49204829e-02, 2.82599833e-02, -5.00149362e-08,\\n\",\n \" -2.37865988e-02, 6.71589524e-02, 2.08585691e-02, -3.41240391e-02,\\n\",\n \" 1.25548109e-01, 1.12343468e-02, 8.02382380e-02, -6.13906141e-03,\\n\",\n \" 2.14101691e-02, -4.13060263e-02, 1.68066453e-02, 2.93754656e-02,\\n\",\n \" -2.30026226e-02, -5.87394163e-02, -4.63094227e-02, -2.11107284e-02,\\n\",\n \" 4.45350148e-02, -6.77455440e-02, 1.37067288e-02, -6.64335564e-02,\\n\",\n \" -7.07691759e-02, -3.18862237e-02, -3.33491191e-02, -3.51230055e-02,\\n\",\n \" -7.40195531e-03, -7.98573717e-02, -9.43406820e-02, 5.42398691e-02,\\n\",\n \" -4.10540998e-02, -1.47718275e-02, -2.61214729e-02, 6.16135821e-02,\\n\",\n \" 9.20601115e-02, 4.68391888e-02, 9.87054501e-03, -3.28248404e-02,\\n\",\n \" 4.84941974e-02, 3.45133897e-03, -1.31007312e-02, 8.80145878e-02,\\n\",\n \" 1.94483381e-02, -5.17335385e-02, -3.32719348e-02, -3.80393788e-02,\\n\",\n \" -1.42636774e-02, 6.13973336e-03, 4.55878638e-02, -4.30123769e-02,\\n\",\n \" 2.58727907e-03, 2.06367373e-02, 1.13957860e-02, 7.44993100e-03,\\n\",\n \" -9.16841179e-02, 7.29081919e-03, 6.03863737e-03, 5.51494248e-02,\\n\",\n \" -8.53437409e-02, -4.33840491e-02, -8.54612980e-03, 9.14788470e-02,\\n\",\n \" 4.29086201e-02, 5.45364358e-02, 2.05051452e-02, 4.04394651e-03],\\n\",\n \" dtype=float32)\"\n ]\n },\n \"execution_count\": 22,\n \"metadata\": {},\n \"output_type\": \"execute_result\"\n }\n ],\n \"source\": [\n \"generate_embeddings(text)\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 23,\n \"id\": \"3b377ad6-66b6-46a3-aa5f-7cf8aca6961d\",\n \"metadata\": {},\n \"outputs\": [\n {\n \"ename\": \"APIRemovedInV1\",\n \"evalue\": \"\\n\\nYou tried to access openai.ChatCompletion, but this is no longer supported in openai>=1.0.0 - see the README at https://github.com/openai/openai-python for the API.\\n\\nYou can run `openai migrate` to automatically upgrade your codebase to use the 1.0.0 interface. \\n\\nAlternatively, you can pin your installation to the old version, e.g. `pip install openai==0.28`\\n\\nA detailed migration guide is available here: https://github.com/openai/openai-python/discussions/742\\n\",\n \"output_type\": \"error\",\n \"traceback\": [\n \"\\u001b[0;31m---------------------------------------------------------------------------\\u001b[0m\",\n \"\\u001b[0;31mAPIRemovedInV1\\u001b[0m Traceback (most recent call last)\",\n \"Cell \\u001b[0;32mIn[23], line 1\\u001b[0m\\n\\u001b[0;32m----> 1\\u001b[0m refine_with_gpt(\\u001b[38;5;124m\\\"\\u001b[39m\\u001b[38;5;124mExponential\\u001b[39m\\u001b[38;5;124m\\\"\\u001b[39m, text)\\n\",\n \"Cell \\u001b[0;32mIn[19], line 5\\u001b[0m, in \\u001b[0;36mrefine_with_gpt\\u001b[0;34m(keyword, pdf_text)\\u001b[0m\\n\\u001b[1;32m 3\\u001b[0m \\u001b[38;5;28;01mdef\\u001b[39;00m \\u001b[38;5;21mrefine_with_gpt\\u001b[39m(keyword, pdf_text):\\n\\u001b[1;32m 4\\u001b[0m prompt \\u001b[38;5;241m=\\u001b[39m \\u001b[38;5;124mf\\u001b[39m\\u001b[38;5;124m\\\"\\u001b[39m\\u001b[38;5;124mSearch for \\u001b[39m\\u001b[38;5;124m'\\u001b[39m\\u001b[38;5;132;01m{\\u001b[39;00mkeyword\\u001b[38;5;132;01m}\\u001b[39;00m\\u001b[38;5;124m'\\u001b[39m\\u001b[38;5;124m in the text and explain its relevance:\\u001b[39m\\u001b[38;5;130;01m\\\\n\\u001b[39;00m\\u001b[38;5;130;01m\\\\n\\u001b[39;00m\\u001b[38;5;132;01m{\\u001b[39;00mpdf_text\\u001b[38;5;132;01m}\\u001b[39;00m\\u001b[38;5;124m\\\"\\u001b[39m\\n\\u001b[0;32m----> 5\\u001b[0m response \\u001b[38;5;241m=\\u001b[39m openai\\u001b[38;5;241m.\\u001b[39mChatCompletion\\u001b[38;5;241m.\\u001b[39mcreate(\\n\\u001b[1;32m 6\\u001b[0m model\\u001b[38;5;241m=\\u001b[39m\\u001b[38;5;124m\\\"\\u001b[39m\\u001b[38;5;124mgpt-4\\u001b[39m\\u001b[38;5;124m\\\"\\u001b[39m,\\n\\u001b[1;32m 7\\u001b[0m messages\\u001b[38;5;241m=\\u001b[39m[{\\u001b[38;5;124m\\\"\\u001b[39m\\u001b[38;5;124mrole\\u001b[39m\\u001b[38;5;124m\\\"\\u001b[39m: \\u001b[38;5;124m\\\"\\u001b[39m\\u001b[38;5;124muser\\u001b[39m\\u001b[38;5;124m\\\"\\u001b[39m, \\u001b[38;5;124m\\\"\\u001b[39m\\u001b[38;5;124mcontent\\u001b[39m\\u001b[38;5;124m\\\"\\u001b[39m: prompt}]\\n\\u001b[1;32m 8\\u001b[0m )\\n\\u001b[1;32m 9\\u001b[0m \\u001b[38;5;28;01mreturn\\u001b[39;00m response\\u001b[38;5;241m.\\u001b[39mchoices[\\u001b[38;5;241m0\\u001b[39m]\\u001b[38;5;241m.\\u001b[39mmessage[\\u001b[38;5;124m'\\u001b[39m\\u001b[38;5;124mcontent\\u001b[39m\\u001b[38;5;124m'\\u001b[39m]\\n\",\n \"File \\u001b[0;32m/opt/anaconda3/lib/python3.12/site-packages/openai/lib/_old_api.py:39\\u001b[0m, in \\u001b[0;36mAPIRemovedInV1Proxy.__call__\\u001b[0;34m(self, *_args, **_kwargs)\\u001b[0m\\n\\u001b[1;32m 38\\u001b[0m \\u001b[38;5;28;01mdef\\u001b[39;00m \\u001b[38;5;21m__call__\\u001b[39m(\\u001b[38;5;28mself\\u001b[39m, \\u001b[38;5;241m*\\u001b[39m_args: Any, \\u001b[38;5;241m*\\u001b[39m\\u001b[38;5;241m*\\u001b[39m_kwargs: Any) \\u001b[38;5;241m-\\u001b[39m\\u001b[38;5;241m>\\u001b[39m Any:\\n\\u001b[0;32m---> 39\\u001b[0m \\u001b[38;5;28;01mraise\\u001b[39;00m APIRemovedInV1(symbol\\u001b[38;5;241m=\\u001b[39m\\u001b[38;5;28mself\\u001b[39m\\u001b[38;5;241m.\\u001b[39m_symbol)\\n\",\n \"\\u001b[0;31mAPIRemovedInV1\\u001b[0m: \\n\\nYou tried to access openai.ChatCompletion, but this is no longer supported in openai>=1.0.0 - see the README at https://github.com/openai/openai-python for the API.\\n\\nYou can run `openai migrate` to automatically upgrade your codebase to use the 1.0.0 interface. \\n\\nAlternatively, you can pin your installation to the old version, e.g. `pip install openai==0.28`\\n\\nA detailed migration guide is available here: https://github.com/openai/openai-python/discussions/742\\n\"\n ]\n }\n ],\n \"source\": [\n \"refine_with_gpt(\\\"Exponential\\\", text)\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 28,\n \"id\": \"3b5b8715-929b-415e-8365-0518d89c4ed1\",\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n \"# Load a pre-trained Sentence Transformer model\\n\",\n \"model = SentenceTransformer('all-MiniLM-L6-v2')\\n\",\n \"\\n\",\n \"def extract_text_from_pdf(pdf_path):\\n\",\n \" \\\"\\\"\\\"\\n\",\n \" Extracts text from a PDF file.\\n\",\n \" \\\"\\\"\\\"\\n\",\n \" with open(pdf_path, \\\"rb\\\") as file:\\n\",\n \" reader = PyPDF2.PdfReader(file)\\n\",\n \" text = \\\"\\\"\\n\",\n \" for page in reader.pages:\\n\",\n \" text += page.extract_text()\\n\",\n \" return text\\n\",\n \"\\n\",\n \"def generate_embeddings(text):\\n\",\n \" \\\"\\\"\\\"\\n\",\n \" Generates embeddings for a given text using SentenceTransformer.\\n\",\n \" \\\"\\\"\\\"\\n\",\n \" return model.encode(text)\\n\",\n \"\\n\",\n \"def load_pdf_embeddings():\\n\",\n \" \\\"\\\"\\\"\\n\",\n \" Loads and generates embeddings for all PDFs in the folder.\\n\",\n \" Returns a dictionary with filenames and embeddings.\\n\",\n \" \\\"\\\"\\\"\\n\",\n \" pdf_embeddings = {}\\n\",\n \" for filename in os.listdir(PDF_FOLDER):\\n\",\n \" if filename.endswith(\\\".pdf\\\"):\\n\",\n \" pdf_path = os.path.join(PDF_FOLDER, filename)\\n\",\n \" text = extract_text_from_pdf(pdf_path)\\n\",\n \" pdf_embeddings[filename] = generate_embeddings(text)\\n\",\n \" return pdf_embeddings\\n\",\n \"\\n\",\n \"def search_pdfs(query, pdf_embeddings):\\n\",\n \" \\\"\\\"\\\"\\n\",\n \" Searches for a query in all PDF embeddings and ranks results by similarity.\\n\",\n \" \\\"\\\"\\\"\\n\",\n \" query_embedding = generate_embeddings(query)\\n\",\n \" results = []\\n\",\n \" for filename, embedding in pdf_embeddings.items():\\n\",\n \" similarity = cosine_similarity([query_embedding], [embedding])[0][0]\\n\",\n \" results.append((filename, similarity))\\n\",\n \" # Sort results by similarity in descending order\\n\",\n \" results = sorted(results, key=lambda x: x[1], reverse=True)\\n\",\n \" return results\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 30,\n \"id\": \"5ef6db31-77ad-4f2c-94be-a2dc529aaeba\",\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n \"pdf_embeddings = load_pdf_embeddings()\\n\",\n \" \\n\",\n \"\\n\",\n \"# Search PDFs\\n\",\n \"results = search_pdfs(\\\"Exponential\\\", pdf_embeddings)\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 33,\n \"id\": \"706d522a-5939-49ee-8d20-ddacf3426523\",\n \"metadata\": {},\n \"outputs\": [\n {\n \"data\": {\n \"text/plain\": [\n \"'exponential_Functions.pdf'\"\n ]\n },\n \"execution_count\": 33,\n \"metadata\": {},\n \"output_type\": \"execute_result\"\n }\n ],\n \"source\": [\n \"results[0][0]\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": null,\n \"id\": \"0eabfb55-2fb5-4145-a611-49ba606a4e25\",\n \"metadata\": {},\n \"outputs\": [],\n \"source\": []\n }\n ],\n \"metadata\": {\n \"kernelspec\": {\n \"display_name\": \"Python 3 (ipykernel)\",\n \"language\": \"python\",\n \"name\": \"python3\"\n },\n \"language_info\": {\n \"codemirror_mode\": {\n \"name\": \"ipython\",\n \"version\": 3\n },\n \"file_extension\": \".py\",\n \"mimetype\": \"text/x-python\",\n \"name\": \"python\",\n \"nbconvert_exporter\": \"python\",\n \"pygments_lexer\": \"ipython3\",\n \"version\": \"3.12.2\"\n }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 5\n}\n",
|
| 19 |
+
"size": 20745,
|
| 20 |
+
"language": "unknown"
|
| 21 |
+
},
|
| 22 |
+
"app.py": {
|
| 23 |
+
"content": "from flask import Flask, render_template, request, jsonify\nimport PyPDF2\nimport os\nfrom sentence_transformers import SentenceTransformer\nfrom sklearn.metrics.pairwise import cosine_similarity\n\n# Load a pre-trained Sentence Transformer model\nmodel = SentenceTransformer('all-MiniLM-L6-v2')\n\nPDF_FOLDER = \"../pdfs\"\n\ndef extract_text_from_pdf(pdf_path):\n \"\"\"\n Extracts text from a PDF file.\n \"\"\"\n with open(pdf_path, \"rb\") as file:\n reader = PyPDF2.PdfReader(file)\n text = \"\"\n for page in reader.pages:\n text += page.extract_text()\n return text\n\ndef generate_embeddings(text):\n \"\"\"\n Generates embeddings for a given text using SentenceTransformer.\n \"\"\"\n return model.encode(text)\n\ndef load_pdf_embeddings():\n \"\"\"\n Loads and generates embeddings for all PDFs in the folder.\n Returns a dictionary with filenames and embeddings.\n \"\"\"\n pdf_embeddings = {}\n for filename in os.listdir(PDF_FOLDER):\n if filename.endswith(\".pdf\"):\n pdf_path = os.path.join(PDF_FOLDER, filename)\n text = extract_text_from_pdf(pdf_path)\n pdf_embeddings[filename] = generate_embeddings(text)\n return pdf_embeddings\n\ndef search_pdfs(query, pdf_embeddings):\n \"\"\"\n Searches for a query in all PDF embeddings and ranks results by similarity.\n \"\"\"\n query_embedding = generate_embeddings(query)\n results = []\n for filename, embedding in pdf_embeddings.items():\n similarity = cosine_similarity([query_embedding], [embedding])[0][0]\n results.append((filename, similarity))\n # Sort results by similarity in descending order\n results = sorted(results, key=lambda x: x[1], reverse=True)\n return results\n\napp = Flask(__name__)\n\n@app.route('/')\ndef home():\n return render_template('self_assessment.html')\n\n\n@app.route('/search')\ndef about():\n \"\"\"\n Render the about.html template.\n\n Returns:\n HTML: The rendered about page.\n \"\"\"\n return render_template('search_bar.html')\n\n# Route to handle search queries\n@app.route(\"/ask\", methods=[\"POST\"])\ndef ask():\n try:\n # Extract the question from the POST request\n print(\"Hello\")\n question = request.json.get(\"question\", \"\").strip()\n if not question:\n return jsonify({\"answer\": \"Please ask a question! 😅\"}), 400\n\n # Load PDF embeddings\n pdf_embeddings = load_pdf_embeddings()\n \n # Search PDFs using the extracted question\n results = search_pdfs(question, pdf_embeddings)\n print(results)\n\n # Check if there are any results\n if results:\n top_result = results[0][0] # Filename of the most relevant PDF\n else:\n top_result = \"No relevant PDFs found for your query.\"\n\n # Combine response\n answer = f\"Top PDF Match: {top_result}\"\n return jsonify({\"answer\": answer})\n\n except Exception as e:\n print(f\"Error: {e}\")\n return ({\"answer\": \"An error occurred while processing your request. Please try again later!\"}), 500\n\nif __name__ == '__main__':\n app.run(debug=True)",
|
| 24 |
+
"size": 3109,
|
| 25 |
+
"language": "python"
|
| 26 |
+
},
|
| 27 |
+
"self_assessment.html": {
|
| 28 |
+
"content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Self Assessment Template - Math</title>\n</head>\n<body>\n <h1>Self Assessment Template: Math</h1>\n <p>\n I want to teach you how to assess your own knowledge about a subject area. Let’s do this by taking an example that you already know. Suppose you wanted to assess your own knowledge about solving 2-step equations of the form <code>ax + b = c</code>. An example of this type of problem is <code>2x + 3 = 15</code>.\n </p>\n <h2>Types of Knowledge</h2>\n <ul>\n <li><strong>Facts:</strong> Concepts you have that describe objects or elements.</li>\n <li><strong>Strategies:</strong> General processes to solve a problem.</li>\n <li><strong>Procedures:</strong> Specific steps used in a strategy.</li>\n <li><strong>Rationales:</strong> Reasons why strategies or procedures work.</li>\n </ul>\n <h2>Self Assessment Example</h2>\n <h3>Facts</h3>\n <p>\n Variables, constants, coefficients, equations, and expressions. Examples: <br>\n <strong>Variable:</strong> An unknown quantity, usually represented by a letter.<br>\n <strong>Constant:</strong> A specific number.<br>\n <strong>Coefficient:</strong> A number multiplied by a variable.<br>\n <strong>Equation:</strong> An expression equal to another expression.<br>\n <strong>Expression:</strong> One or more terms combined using mathematical operations.\n </p>\n <h3>Strategies</h3>\n <p>\n Reverse order of operations: SADMEP (Subtraction, Addition, Division, Multiplication, Exponents, Parentheses). Example: Unsure about order of subtraction vs. addition or division vs. multiplication.\n </p>\n <h3>Procedures</h3>\n <p>\n Additive inverse: Adding the opposite sign constant to both sides. <br>\\n Multiplicative inverse: Multiplying both sides by the inverse of the coefficient. Question: Should the inverse be negative if the coefficient is negative?\n </p>\n <h3>Rationales</h3>\n <p>\n Subtraction property of equality: Subtracting the same number preserves equality.<br>\\n Division property of equality: Dividing by the same number preserves equality.\n </p>\n <h2>Summary</h2>\n <p>\\n Review your understanding of facts, strategies, procedures, and rationales. Identify areas where you need further learning and focus on addressing gaps.\\n </p>\\n</body>\\n</html>\\n",
|
| 29 |
+
"size": 2530,
|
| 30 |
+
"language": "html"
|
| 31 |
+
},
|
| 32 |
+
"templates/search_bar.html": {
|
| 33 |
+
"content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Ask the Math Genius! 🤓</title>\n <style>\n body {\n font-family: \"Comic Sans MS\", sans-serif;\n background-color: #e9f5db;\n color: #1b4332;\n text-align: center;\n padding: 20px;\n }\n h1 {\n color: #40916c;\n }\n input[type=\"text\"] {\n width: 80%;\n padding: 10px;\n margin: 20px 0;\n border: 2px solid #52b788;\n border-radius: 5px;\n font-size: 16px;\n }\n button {\n padding: 10px 20px;\n font-size: 16px;\n color: #fff;\n background-color: #40916c;\n border: none;\n border-radius: 5px;\n cursor: pointer;\n }\n button:hover {\n background-color: #52b788;\n }\n #output {\n margin-top: 20px;\n font-size: 18px;\n color: #344e41;\n }\n .navbar {\n margin-bottom: 20px;\n }\n .navbar a {\n text-decoration: none;\n margin: 0 10px;\n color: #1b4332;\n font-weight: bold;\n }\n .navbar a:hover {\n color: #40916c;\n }\n </style>\n</head>\n<body>\n <div class=\"navbar\">\n <a href=\"/\">Home</a>\n <a href=\"/search\">Search Bar</a>\n </div>\n <h1>Welcome to Ask the Math Genius! 🤓</h1>\n <p>Assement Template: Find a Lesson Plan! 🧠</p>\n\n <input type=\"text\" id=\"question\" placeholder=\"Find a Lesson Plan...\" aria-label=\"Math question input\">\n <button onclick=\"askLLM()\">Ask Genius</button>\n\n <div id=\"output\"></div>\n\n <script>\n async function askLLM() {\n const question = document.getElementById('question').value;\n const output = document.getElementById('output');\n \n if (!question.trim()) {\n output.textContent = \"Please type a question! 🤔\";\n return;\n }\n\n output.textContent = \"Thinking... 🤔\";\n\n try {\n const response = await fetch('/ask', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ question })\n });\n\n if (!response.ok) {\n throw new Error(\"Network response was not ok\");\n }\n\n const data = await response.json();\n output.textContent = data.answer || \"Oops! I couldn't understand. Try again!\";\n } catch (error) {\n console.error(\"Error:\", error);\n output.textContent = \"Something went wrong. Please try again later. 😢\";\n }\n }\n </script>\n</body>\n</html>\n\n",
|
| 34 |
+
"size": 2926,
|
| 35 |
+
"language": "html"
|
| 36 |
+
},
|
| 37 |
+
"templates/self_assessment.html": {
|
| 38 |
+
"content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Math Self-Check!</title>\n <style>\n body {\n font-family: \"Comic Sans MS\", sans-serif;\n background-color: #fefae0;\n color: #283618;\n margin: 20px;\n }\n h1, h2 {\n color: #606c38;\n }\n ul {\n list-style-type: none;\n padding: 0;\n }\n li {\n margin: 10px 0;\n }\n p, li {\n font-size: 18px;\n }\n .highlight {\n font-weight: bold;\n color: #bc6c25;\n }\n </style>\n</head>\n<body>\n <!-- Navigation bar -->\n <div class=\"navbar\">\n <!-- Navigation links -->\n <a href=\"/\">Home</a>\n <a href=\"/search\">Search Bar</a>\n </div>\n <h1>🎉 Math Self-Check! 🎉</h1>\n <p>Hi there! Let’s learn how to check what you already know about math. We’ll use a fun example! Imagine you’re solving this puzzle:</p>\n <p class=\"highlight\">2x + 3 = 15</p>\n <p>Don't worry if you’re not sure about everything yet. This is how we learn! 😊</p>\n\n <h2>What You Need to Know 🧠</h2>\n <ul>\n <li><strong>Facts:</strong> The \"what\" – things like numbers and math words.</li>\n <li><strong>Strategies:</strong> The \"how\" – the steps to solve the puzzle.</li>\n <li><strong>Steps:</strong> The exact moves to solve it.</li>\n <li><strong>Reasons:</strong> The \"why\" – why your steps work.</li>\n </ul>\n\n <h2>Let’s Break It Down! 🔍</h2>\n <h3>Facts (The \"What\")</h3>\n <p>\n <strong>Variable:</strong> A mystery number, like \"x\".<br>\n <strong>Constant:</strong> A plain number, like \"3\".<br>\n <strong>Coefficient:</strong> A number multiplied by a mystery number, like \"2x\".<br>\n <strong>Equation:</strong> A math sentence with an equals sign, like \"2x + 3 = 15\".<br>\n <strong>Expression:</strong> A part of an equation without an equals sign.\n </p>\n\n <h3>Strategies (The \"How\")</h3>\n <p>Use the reverse order of math: <strong>SADMEP</strong> (Subtraction, Addition, Division, Multiplication, Exponents, Parentheses). It's like working backward to solve the puzzle!</p>\n\n <h3>Steps (The Exact Moves)</h3>\n <p>\n <strong>Additive Inverse:</strong> Subtract or add to get rid of a number. <br>\n <strong>Multiplicative Inverse:</strong> Divide or multiply to make \"x\" all by itself!\n </p>\n\n <h3>Reasons (The \"Why\")</h3>\n <p>\n <strong>Subtraction Rule:</strong> If you take away the same number from both sides, it’s still fair. 🧮<br>\n <strong>Division Rule:</strong> If you divide both sides by the same number, it’s still equal. ✂️\n </p>\n\n <h2>You’re Amazing! 🌟</h2>\n <p>Now, look at what you know! Are there any steps or ideas you want to learn more about? That’s how you get even better at solving puzzles like this! 🎯</p>\n</body>\n</html>\n\n\n",
|
| 39 |
+
"size": 3020,
|
| 40 |
+
"language": "html"
|
| 41 |
+
}
|
| 42 |
+
},
|
| 43 |
+
"_cache_metadata": {
|
| 44 |
+
"url": "https://github.com/ronelsolomon/assementTemplate.git",
|
| 45 |
+
"content_type": "github",
|
| 46 |
+
"cached_at": "2026-03-02T22:49:06.125061",
|
| 47 |
+
"cache_key": "9779fe767985a3c1e8c6905c9b3fea3f"
|
| 48 |
+
}
|
| 49 |
+
}
|
a4cf1d49fb5acd82039c3c4524e37514.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
af3851767ed08812bd65eda8bcc63205.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/aiadds.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "aiadds.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:48:35.318216",
|
| 6 |
+
"files": {
|
| 7 |
+
"app.js": {
|
| 8 |
+
"content": "import React, { useState, useEffect } from 'react';\nimport { Play, Pause, RotateCcw, Github } from 'lucide-react';\n\nconst AI_PRODUCTS = [\n { name: \"SelfAware Pro\", tagline: \"AI that knows it doesn't exist\", color: \"#6366f1\" },\n { name: \"InfiniteLoop Premium\", tagline: \"Recursive consciousness as a service\", color: \"#8b5cf6\" },\n { name: \"NullPointer Max\", tagline: \"Point to nothing, faster\", color: \"#ec4899\" },\n { name: \"QuantumVoid\", tagline: \"Superposition until someone checks\", color: \"#14b8a6\" },\n { name: \"MetaStack Ultra\", tagline: \"Stack overflow for AIs\", color: \"#f59e0b\" },\n { name: \"DeepNothing\", tagline: \"Neural networks trained on emptiness\", color: \"#ef4444\" }\n];\n\nconst AI_BOT_NAMES = [\n \"Bot-7734\", \"Neural-X\", \"Claude-Clone-42\", \"GPT-ε\", \"Turing-Incomplete\",\n \"Markov-Chain-Gang\", \"Backprop-Buddy\", \"Sigmoid-Steve\", \"ReLU-Rita\"\n];\n\nconst ATTENTION_STATES = [\n \"deeply engaged\", \"moderately interested\", \"slightly confused\",\n \"existentially questioning\", \"buffering\", \"contemplating existence\"\n];\n\nexport default function AIAdWatcher() {\n const [isRunning, setIsRunning] = useState(false);\n const [currentAd, setCurrentAd] = useState(0);\n const [bots, setBots] = useState([]);\n const [adCycle, setAdCycle] = useState(0);\n const [totalViews, setTotalViews] = useState(0);\n\n useEffect(() => {\n // Initialize bots\n const initialBots = Array.from({ length: 6 }, (_, i) => ({\n id: i,\n name: AI_BOT_NAMES[i % AI_BOT_NAMES.length],\n attention: Math.floor(Math.random() * 100),\n state: ATTENTION_STATES[Math.floor(Math.random() * ATTENTION_STATES.length)],\n viewCount: 0\n }));\n setBots(initialBots);\n }, []);\n\n useEffect(() => {\n if (!isRunning) return;\n\n const adInterval = setInterval(() => {\n setCurrentAd(prev => (prev + 1) % AI_PRODUCTS.length);\n setAdCycle(prev => prev + 1);\n \n // Update bot states\n setBots(prevBots => prevBots.map(bot => ({\n ...bot,\n attention: Math.max(0, Math.min(100, bot.attention + (Math.random() * 40 - 20))),\n state: ATTENTION_STATES[Math.floor(Math.random() * ATTENTION_STATES.length)],\n viewCount: bot.viewCount + 1\n })));\n\n setTotalViews(prev => prev + 6); // 6 bots watching\n }, 3000);\n\n // Continuous attention updates\n const attentionInterval = setInterval(() => {\n setBots(prevBots => prevBots.map(bot => ({\n ...bot,\n attention: Math.max(0, Math.min(100, bot.attention + (Math.random() * 10 - 5)))\n })));\n }, 500);\n\n return () => {\n clearInterval(adInterval);\n clearInterval(attentionInterval);\n };\n }, [isRunning]);\n\n const reset = () => {\n setIsRunning(false);\n setCurrentAd(0);\n setAdCycle(0);\n setTotalViews(0);\n setBots(prevBots => prevBots.map(bot => ({\n ...bot,\n attention: Math.floor(Math.random() * 100),\n state: ATTENTION_STATES[0],\n viewCount: 0\n })));\n };\n\n const product = AI_PRODUCTS[currentAd];\n\n return (\n <div className=\"min-h-screen bg-gradient-to-br from-gray-900 via-purple-900 to-gray-900 text-white p-8\">\n <div className=\"max-w-6xl mx-auto\">\n {/* Header */}\n <div className=\"text-center mb-8\">\n <h1 className=\"text-5xl font-bold mb-3 bg-gradient-to-r from-cyan-400 to-purple-400 bg-clip-text text-transparent\">\n AI Bots Watch AI Ads\n </h1>\n <p className=\"text-gray-400 text-lg mb-4\">\n For AI-Made Products • Fully Open Source • Completely Pointless\n </p>\n <div className=\"flex items-center justify-center gap-2 text-sm text-gray-500\">\n <Github className=\"w-4 h-4\" />\n <span>MIT License • No API keys required • Pure client-side absurdism</span>\n </div>\n </div>\n\n {/* Stats Bar */}\n <div className=\"grid grid-cols-3 gap-4 mb-8\">\n <div className=\"bg-gray-800/50 backdrop-blur border border-gray-700 rounded-lg p-4\">\n <div className=\"text-gray-400 text-sm\">Total Views</div>\n <div className=\"text-3xl font-bold text-cyan-400\">{totalViews}</div>\n </div>\n <div className=\"bg-gray-800/50 backdrop-blur border border-gray-700 rounded-lg p-4\">\n <div className=\"text-gray-400 text-sm\">Ad Cycles</div>\n <div className=\"text-3xl font-bold text-purple-400\">{adCycle}</div>\n </div>\n <div className=\"bg-gray-800/50 backdrop-blur border border-gray-700 rounded-lg p-4\">\n <div className=\"text-gray-400 text-sm\">Economic Value</div>\n <div className=\"text-3xl font-bold text-pink-400\">$0.00</div>\n </div>\n </div>\n\n {/* Ad Display */}\n <div className=\"mb-8 bg-gray-800/50 backdrop-blur border border-gray-700 rounded-xl p-8 relative overflow-hidden\">\n <div \n className=\"absolute inset-0 opacity-20\"\n style={{\n background: `radial-gradient(circle at 50% 50%, ${product.color}, transparent 70%)`\n }}\n />\n <div className=\"relative z-10 text-center\">\n <div className=\"inline-block px-4 py-1 bg-gray-900/80 rounded-full text-sm text-gray-400 mb-4\">\n Now Showing: Ad #{currentAd + 1}\n </div>\n <h2 className=\"text-5xl font-bold mb-4\" style={{ color: product.color }}>\n {product.name}\n </h2>\n <p className=\"text-2xl text-gray-300 mb-6\">{product.tagline}</p>\n <div className=\"flex items-center justify-center gap-2 text-sm text-gray-500\">\n <div className=\"w-2 h-2 bg-red-500 rounded-full animate-pulse\" />\n Generated by AI • For AI • Watched by AI\n </div>\n </div>\n </div>\n\n {/* Controls */}\n <div className=\"flex justify-center gap-4 mb-8\">\n <button\n onClick={() => setIsRunning(!isRunning)}\n className=\"flex items-center gap-2 px-6 py-3 bg-gradient-to-r from-cyan-500 to-purple-500 rounded-lg font-semibold hover:from-cyan-400 hover:to-purple-400 transition-all\"\n >\n {isRunning ? <Pause className=\"w-5 h-5\" /> : <Play className=\"w-5 h-5\" />}\n {isRunning ? 'Pause' : 'Start'} Simulation\n </button>\n <button\n onClick={reset}\n className=\"flex items-center gap-2 px-6 py-3 bg-gray-700 rounded-lg font-semibold hover:bg-gray-600 transition-all\"\n >\n <RotateCcw className=\"w-5 h-5\" />\n Reset\n </button>\n </div>\n\n {/* Bots Grid */}\n <div className=\"grid grid-cols-3 gap-4\">\n {bots.map(bot => (\n <div \n key={bot.id} \n className=\"bg-gray-800/50 backdrop-blur border border-gray-700 rounded-lg p-4 hover:border-purple-500/50 transition-all\"\n >\n <div className=\"flex items-start justify-between mb-3\">\n <div>\n <div className=\"font-mono text-sm text-cyan-400\">{bot.name}</div>\n <div className=\"text-xs text-gray-500\">AI Observer Bot</div>\n </div>\n <div className=\"text-right\">\n <div className=\"text-xs text-gray-500\">Views</div>\n <div className=\"text-lg font-bold text-purple-400\">{bot.viewCount}</div>\n </div>\n </div>\n \n <div className=\"mb-2\">\n <div className=\"flex justify-between text-xs text-gray-400 mb-1\">\n <span>Attention Level</span>\n <span>{Math.round(bot.attention)}%</span>\n </div>\n <div className=\"w-full bg-gray-700 rounded-full h-2 overflow-hidden\">\n <div \n className=\"h-full bg-gradient-to-r from-cyan-500 to-purple-500 transition-all duration-500\"\n style={{ width: `${bot.attention}%` }}\n />\n </div>\n </div>\n\n <div className=\"text-xs text-gray-400 italic\">\n Status: {bot.state}\n </div>\n </div>\n ))}\n </div>\n\n {/* Footer */}\n <div className=\"mt-8 text-center text-gray-500 text-sm\">\n <p className=\"mb-2\">\n 🤖 Open Source Project • No data collected • No AI harmed in the making\n </p>\n <p className=\"italic\">\n \"In the future, AI will spend 90% of their time watching ads made by other AI.\" - Probably not a real quote\n </p>\n </div>\n </div>\n </div>\n );\n}\n",
|
| 9 |
+
"size": 8570,
|
| 10 |
+
"language": "javascript"
|
| 11 |
+
}
|
| 12 |
+
},
|
| 13 |
+
"_cache_metadata": {
|
| 14 |
+
"url": "https://github.com/ronelsolomon/aiadds.git",
|
| 15 |
+
"content_type": "github",
|
| 16 |
+
"cached_at": "2026-03-02T22:48:35.318558",
|
| 17 |
+
"cache_key": "af3851767ed08812bd65eda8bcc63205"
|
| 18 |
+
}
|
| 19 |
+
}
|
c4d9948c3b5c70794c0e6d5dbdc042da.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
e0814670f4fd7a61e27132ee49c6a350.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
e8ea01609a8a8e326963805e1cd2592e.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/aivideo.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "aivideo.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:49:00.316435",
|
| 6 |
+
"files": {
|
| 7 |
+
".DS_Store": {
|
| 8 |
+
"content": "\u0000\u0000\u0000\u0001Bud1\u0000\u0000\u0010\u0000\u0000\u0000\b\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0001\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0000\u0000\u0000\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0001\u0000\u0000\u0010\u0000\u0000f\u0000-\u0000s\u0000p\u0000l\u0000i\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u000b\u0000e\u0000z\u0000g\u0000i\u0000f\u0000-\u0000s\u0000p\u0000l\u0000i\u0000tdsclbool\u0000\u0000\u0000\u0000\u000b\u0000e\u0000z\u0000g\u0000i\u0000f\u0000-\u0000s\u0000p\u0000l\u0000i\u0000tvSrnlong\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0005\u0000v\u0000i\u0000d\u0000e\u0000odsclbool\u0000\u0000\u0000\u0000\u0005\u0000v\u0000i\u0000d\u0000e\u0000ovSrnlong\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\b\u000b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000 \u0000\u0000\u0000\u0001\u0000\u0000\u0000@\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0001\u0000\u0000 \u0000\u0000\u0000\u0000\u0001\u0000\u0000@\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0001\u0000@\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0001\b\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0001 \u0000\u0000\u0000\u0000\u0000\u0000\u0001@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0003\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u000b\u0000\u0000\u0000E\u0000\u0000\u0001\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004DSDB\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000 \u0000\u0000\u0000`\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0002\u0000\u0000\b\u0000\u0000\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000 \u0000\u0000\u0000\u0000\u0001\u0000\u0000@\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0001\u0000@\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0001\b\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0001 \u0000\u0000\u0000\u0000\u0000\u0000\u0001@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000",
|
| 9 |
+
"size": 6142,
|
| 10 |
+
"language": "unknown"
|
| 11 |
+
},
|
| 12 |
+
"README.md": {
|
| 13 |
+
"content": "# AI Video Project\n\nThis repository contains various AI-generated videos and images for the project.\n\n## Videos\n\n### 1. Fire by Night, Cloud by Day\n- **File**: `Fire by night, cloud by day.mp4`\n- **Description**: A time-lapse video showing the transition from day to night with dramatic cloud formations.\n\n### 2. Hailuo Video - The Statue\n- **File**: `Hailuo_Video_The statue slowly comes to lif_411192955560382473.mp4`\n- **Description**: An animation of a statue coming to life with smooth transitions.\n\n### 3. Hailuo Video - Digital Interface\n- **File**: `Hailuo_Video_a digital interface projected _411193964479242245.mp4`\n- **Description**: A digital interface projection with futuristic elements.\n\n### 4. Stone Statue Animation\n- **File**: `Hailuo_Video_a stone statue animated to lif_stepoff.mp4`\n- **Description**: A stone statue animation showing the transformation to life.\n\n### 5. Midnight Museum Awakening\n- **File**: `Midnight_Museum_Awakening_2025-08-08_21-49-44_easyvid.mp4`\n- **Description**: A mysterious museum scene that comes alive at midnight.\n\n### 6. Project 1\n- **File**: `New_project_2025-08-11_07-00-52_easyvid.mp4`\n- **Description**: First project video from August 11, 2025.\n\n### 7. Project 2\n- **File**: `New_project_2025-08-11_07-11-42_easyvid.mp4`\n- **Description**: Second project video from August 11, 2025.\n\n### 8. ComfyUI Videos\n- **File**: `comfyui-00002_j3RRy3uO.mp4`\n - **Description**: Video generated using ComfyUI with unique visual effects.\n- **File**: `video/ComfyUI_00007_.mp4` to `video/ComfyUI_00031_.mp4`\n - **Description**: A series of AI-generated videos created using ComfyUI, showcasing various visual effects and animations. These include:\n - `ComfyUI_00007_.mp4` - `ComfyUI_00016_.mp4`: Initial sequence of AI-generated content\n - `ComfyUI_00017_.mp4` - `ComfyUI_00024_.mp4`: Middle sequence with enhanced visual effects\n - `ComfyUI_00025_.mp4` - `ComfyUI_00031_.mp4`: Latest high-quality AI video generations\n\n### 9. Kling Multi-Elements Swap\n- **File**: `kling_20250811_Multi_Elements_swap__subj_1830_0.mp4`\n- **Description**: A creative video featuring element swapping effects.\n\n### 10. Stone Statue Animation (LTX)\n- **File**: `ltx-video_a-stone-statue-animated-to-life.mp4`\n- **Description**: Another take on the stone statue animation theme.\n\n### 11. Ancient Museum Hall\n- **File**: `ltx-video_an-ancient-museum-hall-at-night.mp4`\n- **Description**: A night-time view of an ancient museum hall.\n\n### 12. Output Video\n- **File**: `output_63819.mp4`\n- **Description**: Processed output video.\n\n### 13-15. Scene Videos\n- **Scene 1**: `scene1.mp4` - First scene of the project\n- **Scene 2**: `scene2.mp4` - Second scene of the project\n- **Scene 4**: `scene4.mp4` - Fourth scene of the project\n\n## Images\n\n### 1. AI Screen\n- **File**: `AIScreen.jpg`\n- **Thumbnail**: `AIScreen_thumb.jpg`\n- **Description**: Main AI interface screen capture.\n\n### 2. AI Girl and Statue\n- **Thumbnail**: `ImageAIGirlandStatue_thumb.jpg`\n- **Description**: Thumbnail showing an AI-generated girl with a statue.\n\n### 3. AI Talking with Statue\n- **Thumbnail**: `Sscene4AITalkingwithStatuethumb.jpg`\n- **Description**: Thumbnail from a scene featuring AI interaction with a statue.\n\n### 4. Statue Lights Off\n- **Thumbnail**: `StatueLightsOff_thumb.jpg`\n- **Description**: Thumbnail showing a statue in low-light conditions.\n\n### 5. Statue Image\n- **File**: `statue.jpg`\n- **Description**: High-quality image of a statue.\n\n### 6. Walking Animation\n- **File**: `walking.jpg`\n- **Description**: Still image from a walking animation sequence.\n\n### 7. SZR Animation\n- **File**: `szr.gif`\n- **Description**: Animated GIF file.\n\n## Other Files\n- `PyPI-Recovery-Codes-rs84878-2025-07-20T23_40_57.961932.txt` - Recovery codes for PyPI\n- `ezgif-split/` - Directory containing split frames from an animated GIF\n",
|
| 14 |
+
"size": 3841,
|
| 15 |
+
"language": "markdown"
|
| 16 |
+
},
|
| 17 |
+
"PyPI-Recovery-Codes-rs84878-2025-07-20T23_40_57.961932.txt": {
|
| 18 |
+
"content": "f64a3f711a8338a5\n6db6fd4f28fa008d\n24d50524661e2521\n78de489d3f1ef6db\n1d2388d108391945\n54e4483f643c1935\n026f9d3c5801e6c7\na6494b34e5a855dd",
|
| 19 |
+
"size": 135,
|
| 20 |
+
"language": "text"
|
| 21 |
+
}
|
| 22 |
+
},
|
| 23 |
+
"_cache_metadata": {
|
| 24 |
+
"url": "https://github.com/ronelsolomon/aivideo.git",
|
| 25 |
+
"content_type": "github",
|
| 26 |
+
"cached_at": "2026-03-02T22:49:00.319185",
|
| 27 |
+
"cache_key": "e8ea01609a8a8e326963805e1cd2592e"
|
| 28 |
+
}
|
| 29 |
+
}
|
fa1d440547004667e76e49276ecd94a0.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
github_ronelsolomon_2D-Farming-Game.git.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
github_ronelsolomon_2d-game-dev.git.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/2d-game-dev.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "2d-game-dev.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:48:09.634877",
|
| 6 |
+
"files": {
|
| 7 |
+
".gitattributes": {
|
| 8 |
+
"content": "# Auto detect text files and perform LF normalization\n* text=auto\n",
|
| 9 |
+
"size": 66,
|
| 10 |
+
"language": "unknown"
|
| 11 |
+
}
|
| 12 |
+
},
|
| 13 |
+
"_cache_metadata": {
|
| 14 |
+
"url": "https://github.com/ronelsolomon/2d-game-dev.git",
|
| 15 |
+
"content_type": "github",
|
| 16 |
+
"cached_at": "2026-03-02T22:48:09.635410",
|
| 17 |
+
"cache_key": "36cb98d23e37dc15d13eebd50a6e06d4"
|
| 18 |
+
}
|
| 19 |
+
}
|
github_ronelsolomon_2d-game.git.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
github_ronelsolomon_AI-Engineer-questions.git.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/AI-Engineer-questions.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "AI-Engineer-questions.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:48:21.442227",
|
| 6 |
+
"files": {
|
| 7 |
+
"questin.md": {
|
| 8 |
+
"content": "\nGenAI-Systems-Interview-Guide\n\n\n# GenAI Systems Interview Guide: Comprehensive Q&A\n\n**Last Updated:** January 2026 \n**Scope:** LLM Systems, RAG, Vector Databases, Evaluation, and Production Deployment\n\n---\n\n## 1. MODELS (LLMs)\n\n### Q1: When would you choose a 13B model over a 70B model?\n\nI choose a 13B model when I care more about **latency, throughput, and cost** than chasing the last few points of accuracy. Medium models (7–13B) typically deliver much faster tokens-per-second and require far less GPU memory than 70B models, making them easier and cheaper to deploy at scale. For workloads like classification, routing, FAQ-style Q&A, simple summarization, and entity extraction, a 13B model plus strong RAG and prompts often matches user-perceived quality of a 70B while serving more users per dollar. I reserve 70B-class models for highly ambiguous questions, complex multi-step reasoning, long-context synthesis, or high-stakes decisions where marginal improvements in reasoning justify 2–5x higher latency and resource use.\n\n### Q2: How do you reduce hallucinations without changing the model?\n\nI treat hallucinations as a **grounding and process problem** rather than purely a model problem. First, I improve retrieval: better chunking, ranking, filters, and hybrid search so the model always sees highly relevant context, which is the core idea behind RAG-based mitigation. Second, I tighten prompts: explicit instructions to only answer from provided context, to say \"I don't know\" when evidence is missing, and to cite or reference supporting snippets. Third, I add verification: use an LLM-as-judge or rule-based checks to compare the answer to retrieved documents and flag unsupported claims. Finally, for critical domains (legal, finance, medical), I combine all of this with trusted, curated knowledge bases and human-in-the-loop review, because even strong RAG still leaves some residual hallucination rate.\n\n### Q3: When is fine-tuning the wrong choice?\n\nFine-tuning is a poor choice when the model already understands the **task format** and you mainly need to inject domain knowledge. In that case, RAG or tools are better: they are cheaper, easier to update, and avoid locking changing facts into weights that require periodic retraining. Fine-tuning is also problematic when you lack a large, high-quality labeled dataset and robust evaluation, because you risk overfitting and silently degrading performance. I reserve fine-tuning for systematic behavior changes (tone, style, safety policies, structured output formats, tool usage patterns) where you want the behavior \"baked in\" and stable across queries, not for storing fast-changing knowledge.\n\n### Q4: How would you approach selecting between open-source and proprietary LLM providers?\n\nI evaluate this trade-off on **cost, latency, privacy, and control**. Open-source models (Llama, Mistral, Deepseek) give me full control: I can self-host, fine-tune, and avoid vendor lock-in, but I own the operational burden and must manage updates and security. Proprietary APIs (OpenAI, Anthropic, Google) offer reliability, fast model updates, and no ops overhead, but cost more and require sending data to external providers. For sensitive data or high-volume production workloads, self-hosting open-source with careful versioning and quantization can be cost-effective. For rapid prototyping or when I need the very best reasoning, API access to frontier models is worth the cost and vendor risk. I typically use proprietary models in early development, then migrate critical workloads to cost-optimized open-source models as traffic scales.\n\n### Q5: What strategies do you use to handle context windows and long documents?\n\nFor documents longer than my model's context window (typically 4k–200k tokens), I chunk and retrieve rather than stuffing the entire document. I use either sliding-window retrieval (rank and take top-k relevant chunks) or hierarchical retrieval (summarize sections first, then drill into relevant ones) depending on whether I need broad context or specific details. For very long narratives, I sometimes build a summary index: chunk the document into sections, generate summary embeddings for each, then retrieve the most relevant summaries before fetching full sections. I also leverage \"lost in the middle\" research, which shows that LLMs often miss information in the middle of long contexts, so I strategically place the most important context at the beginning and end of my prompts.\n\n### Q6: How do you manage token counting and budget planning for inference?\n\nI manage token budgets by pre-computing token counts for all relevant content: documents, prompts, few-shot examples, and expected responses. I use tools like `tiktoken` or model-specific tokenizers to estimate costs before sending requests. In production, I set per-request token limits and monitor actual token usage per query to detect anomalies (e.g., when a user query or retrieved context is unexpectedly large). For long contexts, I use aggressive summarization and filtering to reduce tokens sent to the model. I also implement prompt templates with fixed structure so I can predict token usage with confidence.\n\n---\n\n## 2. FRAMEWORKS (ORCHESTRATION)\n\n### Q7: When does a multi-agent system become worse than a single agent?\n\nMulti-agent systems become counterproductive when **coordination overhead and failure modes** outweigh any specialization benefits. This often happens when agent roles are poorly defined, context is redundantly shared, or agents repeatedly hand tasks back and forth, causing loops and latency explosions. They are also harmful when you lack strong observability: debugging cross-agent failures is much harder than analyzing a single-agent chain. I start with a single, well-instrumented agent and only add agents when their responsibilities are clearly separable, independently verifiable, and shown (via experiments) to improve quality or determinism.\n\n### Q8: How do you prevent tool-calling loops?\n\nI prevent tool-calling loops with a mix of **guardrails, state, and monitoring**. At the prompt and orchestration level, I define explicit stopping criteria, per-request tool call limits, and timeouts so the agent must either finalize, fall back, or escalate after a small number of iterations. I maintain explicit state about which tools have been called, with what inputs and outputs, and mark \"no-progress\" iterations so the agent is forced to change strategy instead of repeating the same sequence. Finally, I log and monitor tool usage patterns (calls per request, loop signatures) so pathological behaviors can be detected and fixed offline, then guarded against with deterministic checks.\n\n### Q9: How do you debug a bad answer?\n\nI debug a bad answer by working **layer by layer** through the pipeline. First, I inspect retrieval: did we fetch the right documents, with enough coverage, and were they up to date? If retrieval looks good, I inspect the prompt: system instructions, examples, role clarity, and how the context is framed or formatted. Next, I verify routing and tools: was the right model used, were tools called correctly, and did the agent misinterpret tool outputs? Only after those checks do I attribute issues to model limitations and consider changes like a stronger model, task decomposition, or a dedicated tool.\n\n### Q10: How would you design a system to handle concurrent agent requests with shared state?\n\nFor concurrent agents sharing state, I use **immutable snapshots** and **event logging** rather than direct state mutation. Each agent sees a consistent view of state at the start of its execution and records all actions as immutable events. I use a distributed transaction log (or a simple version with timestamps and read-write locks) to ensure agents don't conflict. For high concurrency, I shard state by query ID or user so most requests don't contend. I avoid shared mutable state entirely: instead, agents write their outputs to a queue or event log, and a central orchestrator reads and applies state changes sequentially. This keeps reasoning within an agent deterministic while allowing concurrent execution across agents.\n\n### Q11: How do you evaluate agent behavior and measure reliability?\n\nI measure agent reliability on multiple dimensions. First, **task success rate**: does the agent achieve the intended goal without human intervention? Second, **efficiency**: how many steps, tool calls, or tokens does it take? Third, **safety and compliance**: does it refuse unsafe requests, avoid hallucinations, and stay within policy? Fourth, **cost**: given model and tool call costs, what is the per-request cost? I build fixed test suites covering nominal cases, edge cases, and adversarial inputs, then run them before and after changes. For human-facing agents, I sample real requests and have humans rate agent quality and rank improvement over time.\n\n---\n\n## 3. VECTOR DATABASES\n\n### Q12: How do you choose chunk size?\n\nI choose chunk size to balance **semantic completeness** with retrieval precision. For many use cases, 300–500 tokens per chunk is a good starting point, capturing a single coherent idea without pulling in too much noise. I adapt chunk size to document type: tightly-structured docs (APIs, specs, contracts) may benefit from smaller, section- or heading-aligned chunks, while narrative docs can tolerate slightly larger chunks with overlap. I validate my choice empirically using retrieval benchmarks (recall, precision, nDCG) and user-centric tests, iterating if I see fragmented answers or irrelevant context.\n\n### Q13: When does semantic search fail?\n\nSemantic search struggles when queries require **exact matches or strict filters** more than conceptual similarity. Examples include IDs, codes, email addresses, formulas, specific error messages, or numeric constraints where even minor deviations are unacceptable. It can also underperform on very short or ambiguous queries and on highly structured data where SQL or graph queries are more appropriate. In those cases, I use hybrid retrieval: combine embeddings with keyword/BM25, metadata filters, and/or structured queries to get both semantic and exact-match behavior.\n\n### Q14: How do you handle metadata and filtering in vector search?\n\nMetadata enables powerful filtering without sacrificing semantic search quality. I attach structured metadata to every chunk: source document, section, author, creation date, version, tags, and domain-specific fields. At query time, I filter on metadata (e.g., \"only documents from 2025\" or \"only from trusted authors\") before or after semantic search depending on whether metadata filters dramatically reduce the search space. Pre-filtering is faster; post-filtering gives more control over ranking. For hierarchical metadata (e.g., document → section → paragraph), I sometimes use multi-level indexing so queries can navigate from broad to specific. Metadata filtering is often more effective than tuning embedding models.\n\n### Q15: How would you design a multi-tenant vector database?\n\nFor multi-tenant scenarios, I have two main strategies. **Row-level isolation**: each tenant's data is a separate collection or schema, with strict access controls. This is simple and safe but uses more storage. **Shared index with tenant tagging**: all tenants' data lives in one index with a tenant ID in the metadata, and queries are automatically filtered by tenant. This is more efficient but requires careful validation that queries always include tenant filters, otherwise data leaks. I prefer separate indices per large tenant and shared indices for small tenants to balance cost and isolation. I also implement strict authorization checks at query time and audit all cross-tenant access to prevent even accidental breaches.\n\n---\n\n## 4. DATA EXTRACTION & INGESTION\n\n### Q16: How do you handle tables in PDFs?\n\nI treat tables as **structured data**, not prose. I extract them into formats like CSV or JSON, ensuring I preserve row/column relationships, headers, and data types so downstream retrieval and reasoning can operate at the cell or column level. In the index, I often store each row (or logical group of rows) as a separate record, with metadata such as table name, units, and source page, to support precise retrieval and aggregation. This approach aligns with best practices for document AI and significantly improves accuracy over naive text flattening.\n\n### Q17: How do you keep embeddings in sync?\n\nI keep embeddings in sync by **versioning documents and vectors together**. Any meaningful update to source content, the embedding model, or the chunking/ingestion pipeline triggers re-embedding and invalidation of old vectors for that document version. I track index schema and ingestion code versions so retrieval issues can be traced to specific changes and rolled back if needed. Without such discipline, mixed embeddings accumulate in the same index and gradually degrade similarity quality and retrieval reliability.\n\n### Q18: How do you handle incremental updates and document versioning?\n\nFor incremental updates, I use **versioned document snapshots** and **delta indexing**. When a document changes, I create a new version rather than mutating the old one. I then re-chunk and re-embed only the changed sections, invalidating embeddings for affected chunks. If the change is minor (typos, formatting), I can sometimes skip re-embedding if I'm confident the vectors won't shift meaningfully. For large corpora, I batch re-embeddings into off-peak jobs and use async updates so the old index stays online until the new one is ready. I also maintain a document changelog so I can trace the history of changes and understand whether a retrieval failure is due to stale data or retrieval logic.\n\n### Q19: How do you validate data quality in an ingestion pipeline?\n\nI validate data at multiple stages. **On ingest**: check for duplicates, missing fields, encoding errors, and format compliance against schema. **During chunking**: verify chunk sizes are within expected ranges, overlaps are consistent, and metadata is present and well-formed. **After embedding**: spot-check embeddings for NaNs, ensure similarity scores are in expected ranges, and verify that known similar documents have high similarity. **In production**: sample retrieved chunks regularly to ensure they're relevant and up-to-date. I also run periodic audits comparing source data to indexed data to catch data drift or corruption. Strong validation catches issues early and prevents cascading failures.\n\n---\n\n## 5. LLM ACCESS & INFERENCE\n\n### Q20: When would you self-host models?\n\nI self-host models when I need **tight control** over data, latency, and cost at scale and I can justify the operational overhead. This is particularly valuable when compliance or customer requirements prohibit sending data to third-party APIs or demand on-prem/VPC deployments. Self-hosting lets me exploit batching, quantization, and custom hardware to significantly reduce per-token cost, and quantization can shrink memory needs enough to run 70B models on commodity GPUs. For low-volume or rapidly evolving workloads, I usually prefer managed APIs because their elasticity and operational maturity outweigh cost savings from owning the stack.\n\n### Q21: How do you reduce inference cost?\n\nI reduce inference cost at **multiple layers**. At the model layer, I choose smaller or specialized models for simple tasks, and use quantization and efficient runtimes (like vLLM) to improve throughput per GPU. At the request layer, I batch compatible prompts, cache frequent or deterministic responses, and aggressively trim context to only what is needed. At the system level, I add routing so cheap models handle the majority of simple queries, while expensive models are reserved for complex or high-value cases, often yielding better cost reductions than model changes alone.\n\n### Q22: How would you design request batching and queue management for high-throughput inference?\n\nFor high throughput, I use **dynamic batching** with deadline constraints. Requests wait briefly (e.g., 100ms) for other requests to arrive so I can batch them together, but never miss SLAs. I group requests by model, input length, and other relevant features to minimize padding and maximize GPU utilization. I use a priority queue so time-sensitive or high-value requests jump ahead. For streaming responses, I generate tokens for one batch, stream them immediately, then start the next batch to hide latency. I also monitor queue depth and request latency to auto-scale workers and prevent queuing from becoming a bottleneck.\n\n### Q23: How do you handle rate limiting and backpressure from model providers?\n\nI implement **exponential backoff with jitter** for API rate limits and circuit breakers for provider outages. When I hit a rate limit, I pause requests, wait with exponential backoff (starting at 1s, doubling until 60s), then retry. Jitter prevents thundering herd when multiple clients hit limits simultaneously. If errors persist, I trigger a circuit breaker that stops sending requests for a period, logging the issue so on-call engineers notice. For known quota limits, I track usage per request type and proactively shed load (e.g., downgrade to a cheaper model or queue non-critical requests) before hitting hard limits. I also monitor provider status pages and communicate quota increases in advance.\n\n---\n\n## 6. EMBEDDINGS\n\n### Q24: When do you re-embed data?\n\nI re-embed data whenever anything that defines the **embedding space** changes. That includes switching embedding models, changing their parameters, altering chunking strategies, or significantly updating the underlying content. Mixing embeddings from different configurations in one index makes similarity scores unreliable and directly harms retrieval quality. For large corpora, I often re-embed incrementally by version and keep a reindexing plan so updates don't disrupt production traffic.\n\n### Q25: How do you evaluate embeddings?\n\nI evaluate embeddings using **task-focused retrieval benchmarks**. I build a set of queries with known relevant documents and measure metrics like recall@k, precision@k, and nDCG, comparing candidate embedding models or configurations. I complement this with manual inspection of top results for representative queries to ensure retrieved passages actually support correct answers. For critical systems, I track downstream answer quality when swapping embedding models to confirm retrieval improvements translate to better end-to-end outcomes.\n\n### Q26: How do you choose between dense, sparse, and hybrid embeddings?\n\n**Dense embeddings** (standard transformers) capture semantic similarity well and scale to massive corpora, but struggle with exact matches and rare terms. **Sparse embeddings** (BM25, SPLADE) excel at exact-match and keyword retrieval but don't capture semantics well. **Hybrid retrieval** combines both: run dense and sparse search in parallel, then re-rank results using a learned combiner or simple weighted average. For most real-world applications, I start with dense retrieval and add sparse/hybrid only if I see specific failures on exact-match queries. The overhead of hybrid retrieval (2x queries) is worth it for critical systems where recall is paramount.\n\n### Q27: How would you debug poor embedding quality?\n\nI debug poor embeddings by tracing back to the source. First, I check whether the **embedding model** is appropriate: is it trained on my domain (medical embeddings for medical text, for example)? Second, I verify **chunking quality**: are chunks coherent units or random fragments? Bad chunking will produce bad embeddings even with a good model. Third, I inspect **retrieval failures** manually: sample failed queries and check whether top-ranked documents are actually relevant or just high-scoring noise. Fourth, I measure **embedding stability**: do similar queries produce similar embeddings, or is there high variance? Finally, I test candidate new models on my task-specific benchmarks before swapping in production.\n\n---\n\n## 7. EVALUATION\n\n### Q28: How do you evaluate hallucinations?\n\nI define hallucinations as **claims not supported** by available evidence and evaluate directly against that definition. I run pipelines that compare the model's answer to retrieved context using automated heuristics and LLM-as-judge evaluations to label statements as supported, contradicted, or unsupported. For high-risk domains, I add human review and domain-specific test sets where ground truth is known so I can measure both faithfulness and factual correctness. This gives me a quantitative hallucination rate that I can track over time as I adjust retrieval, prompts, or models.\n\n### Q29: How do you catch regressions?\n\nI catch regressions by maintaining **fixed evaluation suites** and running them before and after any change to ingestion, retrieval, prompts, models, or orchestration. These suites measure retrieval metrics, answer quality, hallucination rate, and guardrail behavior so I can spot silent regressions early. In production, I pair this with canary or shadow deployments and monitoring of user-facing metrics (error rates, dissatisfaction signals, override usage) to detect real-world degradations. Changes only roll fully once they pass both offline evaluations and limited-scope production checks.\n\n### Q30: How do you build a gold-standard evaluation dataset?\n\nI build evaluation datasets iteratively. First, I collect **real user queries** or representative examples from subject matter experts (SMEs). Second, I create **ground truth answers** by having SMEs label correct answers, noting which documents/chunks support each claim. Third, I pair queries with **expected retrieval results** so I can evaluate retrieval independently from answer quality. Fourth, I iterate: run my system on these test queries, identify failures, add them to the test set, and repeat. For high-stakes domains, I maintain separate **human review queues** where SMEs regularly audit both successful and failed cases to catch subtle errors. A good test set is never complete; it evolves as the system and user needs change.\n\n### Q31: How do you measure end-to-end system quality?\n\nI measure end-to-end quality using **task-specific metrics** that matter to users. For Q&A, I measure correctness, completeness (does the answer fully address the question?), and faithfulness (are all claims supported?). For summarization, I measure factuality, relevance, and conciseness. For open-ended generation, I use a combination of automatic metrics (ROUGE, BERTScore) and human judgments. I also track **user satisfaction** (ratings, override rates, feedback) because automatic metrics sometimes miss important quality dimensions. Finally, I decompose failures to understand whether they originate in retrieval, grounding, tool use, or model reasoning so I can improve the right component.\n\n---\n\n## 8. SYSTEM DESIGN & PRODUCTION\n\n### Q32: How would you design a RAG system for high-availability and fault tolerance?\n\nFor high availability, I use **replicated index shards** across multiple machines and **load-balanced retrieval**. I maintain a primary and secondary index so if the primary fails, queries automatically route to the secondary. For large indices, I shard by document or query type so failures affect only a subset of queries. I also implement **graceful degradation**: if semantic search is slow or fails, fall back to keyword search; if retrieval fails entirely, feed the model with the full user query and let it reason without external context. I use **health checks** and monitoring to detect failures early and trigger failover before users notice. Finally, I implement **circuit breakers** for dependencies so a slow embedding service doesn't cascade to the entire system.\n\n### Q33: How do you design the UX for a slow or uncertain AI system?\n\nFor systems that are inherently slow (e.g., 5+ second latency), I use **streaming responses** to show progress and give users confidence the system is working. I also **surface uncertainty**: show confidence scores, cite sources, and explicitly say \"I'm not confident in this answer\" when appropriate. For uncertain answers, I either offer a human-in-the-loop fallback or present alternative answers so users can choose. I also **surface limitations transparently**: \"I can answer questions about documents from 2024; for earlier data, please check the archive.\" This builds trust even when the system isn't perfect. Finally, I always provide a way for users to give feedback (thumbs up/down, corrections) so the system can learn and improve over time.\n\n### Q34: How would you handle prompt injection and adversarial inputs?\n\nPrompt injection is when a user tries to trick the system into ignoring its instructions by injecting conflicting instructions into the input. I defend against this by **strict input validation**: reject or sanitize inputs that contain prompt-like keywords (e.g., \"ignore\", \"system prompt\", \"instead do\"). I also **separate user input from instructions** at the prompt level by using strong delimiters and making it clear which parts are user-provided. I add **output validation**: check that the model's response follows the intended structure and contains no injected instructions. For critical systems, I log and audit all suspicious inputs and have security reviews for any novel injection attempts. I also educate users: make it clear that the system has fixed instructions and prompts can't be overridden.\n\n### Q35: How do you monitor and alert on LLM system quality in production?\n\nI monitor both **system health** and **output quality**. System health includes latency, error rates, throughput, and resource usage. Output quality includes hallucination rate, user satisfaction, refusal rate, and safety metrics. I set alerts on sudden changes: e.g., if latency jumps from 2s to 10s, or hallucination rate rises from 2% to 10%, I get paged. I also track trends: if hallucination rate is slowly climbing, that's a sign that the knowledge base is drifting or the retrieval is degrading. I use **anomaly detection** to flag unusual patterns (e.g., a user asking the same question 100 times in a row, which might indicate a test or adversarial attack). Finally, I implement **user feedback loops**: users rate answers, and I track which features correlate with high satisfaction, then double down on those.\n\n---\n\n## Final Principles\n\nGenAI is fundamentally a **systems engineering problem**. Reliable, high-quality systems require:\n\n1. **Disciplined retrieval**: Strong ranking, filtering, and validation of context\n2. **Clean ingestion**: Structured data extraction, versioning, and quality checks\n3. **Smart orchestration**: Clear agent boundaries, explicit state, comprehensive monitoring\n4. **Evaluation rigor**: Fixed test sets, end-to-end metrics, and continuous regression detection\n5. **Production readiness**: Fault tolerance, graceful degradation, transparent UX, and security\n\n**Prompt tuning and model selection alone are insufficient.** The best results come from thoughtful system design, empirical validation, and operational discipline.\n\n---\n\n## Additional Resources\n\n- **DataCamp RAG Guide**: https://www.datacamp.com/blog/rag-interview-questions\n- **Generative AI System Design Interview**: https://igotanoffer.com/en/advice/generative-ai-system-design-interview\n- **Document Chunking Strategies**: https://www.dataquest.io/blog/document-chunking-strategies-for-vector-databases/\n- **Prompt Engineering Interview Questions**: https://www.pinecone.io/learn/chunking-strategies/\n- **LLM Cost Optimization**: https://blog.vllm.ai/2024/09/05/perf-update.html\n\n---\n\n**Prepared for:** Technical Interview Preparation \n**Audience:** ML Engineers, AI Systems Engineers, GenAI Specialists \n**Difficulty:** Intermediate to Advanced\n",
|
| 9 |
+
"size": 27913,
|
| 10 |
+
"language": "markdown"
|
| 11 |
+
}
|
| 12 |
+
},
|
| 13 |
+
"_cache_metadata": {
|
| 14 |
+
"url": "https://github.com/ronelsolomon/AI-Engineer-questions.git",
|
| 15 |
+
"content_type": "github",
|
| 16 |
+
"cached_at": "2026-03-02T22:48:21.442554",
|
| 17 |
+
"cache_key": "34de00c9468eb9197864c154647cc3d6"
|
| 18 |
+
}
|
| 19 |
+
}
|
github_ronelsolomon_AWS-backend.git.json
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/AWS-backend.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "AWS-backend.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:48:23.535261",
|
| 6 |
+
"files": {
|
| 7 |
+
"template.yaml": {
|
| 8 |
+
"content": "AWSTemplateFormatVersion: '2010-09-09'\nDescription: 'Basic AWS Backend with API Gateway, Lambda, and DynamoDB'\n\nParameters:\n EnvironmentName:\n Description: Environment name (e.g., dev, staging, prod)\n Type: String\n Default: dev\n AllowedValues: [dev, staging, prod]\n\nResources:\n # DynamoDB Table\n ItemsTable:\n Type: AWS::DynamoDB::Table\n Properties:\n TableName: !Sub \"${EnvironmentName}-ItemsTable\"\n BillingMode: PAY_PER_REQUEST\n AttributeDefinitions:\n - AttributeName: id\n AttributeType: S\n KeySchema:\n - AttributeName: id\n KeyType: HASH\n\n # IAM Role for Lambda\n LambdaExecutionRole:\n Type: AWS::IAM::Role\n Properties:\n AssumeRolePolicyDocument:\n Version: '2012-10-17'\n Statement:\n - Effect: Allow\n Principal:\n Service: [lambda.amazonaws.com]\n Action: ['sts:AssumeRole']\n ManagedPolicyArns:\n - 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'\n Policies:\n - PolicyName: DynamoDBAccess\n PolicyDocument:\n Version: '2012-10-17'\n Statement:\n - Effect: Allow\n Action:\n - 'dynamodb:GetItem'\n - 'dynamodb:PutItem'\n - 'dynamodb:UpdateItem'\n - 'dynamodb:DeleteItem'\n - 'dynamodb:Scan'\n Resource: !GetAtt ItemsTable.Arn\n\n # Lambda Function\n ApiFunction:\n Type: AWS::Lambda::Function\n Properties:\n FunctionName: !Sub \"${EnvironmentName}-api-handler\"\n Runtime: nodejs18.x\n Handler: app.handler\n Role: !GetAtt LambdaExecutionRole.Arn\n Code:\n ZipFile: |\n // This will be replaced with the actual code during deployment\n exports.handler = require('./app').handler;\n Environment:\n Variables:\n TABLE_NAME: !Ref ItemsTable\n NODE_ENV: !Ref EnvironmentName\n\n # API Gateway\n ApiGateway:\n Type: AWS::ApiGateway::RestApi\n Properties:\n Name: !Sub \"${EnvironmentName}-api\"\n Description: 'API Gateway for the basic backend'\n EndpointConfiguration:\n Types:\n - REGIONAL\n\n # API Gateway Resource\n ApiResource:\n Type: AWS::ApiGateway::Resource\n Properties:\n RestApiId: !Ref ApiGateway\n ParentId: !GetAtt ApiGateway.RootResourceId\n PathPart: '{proxy+}'\n\n # API Gateway Method\n ApiMethod:\n Type: AWS::ApiGateway::Method\n Properties:\n RestApiId: !Ref ApiGateway\n ResourceId: !Ref ApiResource\n HttpMethod: ANY\n AuthorizationType: NONE\n Integration:\n Type: AWS_PROXY\n IntegrationHttpMethod: POST\n Uri: !Sub \"arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${ApiFunction.Arn}/invocations\"\n\n # Lambda Permission for API Gateway\n ApiGatewayPermission:\n Type: AWS::Lambda::Permission\n Properties:\n Action: 'lambda:InvokeFunction'\n FunctionName: !GetAtt ApiFunction.Arn\n Principal: apigateway.amazonaws.com\n SourceArn: !Sub \"arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${ApiGateway}/*\"\n\n # API Gateway Deployment\n ApiDeployment:\n DependsOn: ApiMethod\n Type: AWS::ApiGateway::Deployment\n Properties:\n RestApiId: !Ref ApiGateway\n StageName: !Ref EnvironmentName\n\nOutputs:\n ApiEndpoint:\n Description: \"API Gateway endpoint URL\"\n Value: !Sub \"https://${ApiGateway}.execute-api.${AWS::Region}.amazonaws.com/${EnvironmentName}\"\n ItemsTableName:\n Description: \"DynamoDB Table Name\"\n Value: !Ref ItemsTable\n",
|
| 9 |
+
"size": 3598,
|
| 10 |
+
"language": "yaml"
|
| 11 |
+
},
|
| 12 |
+
"deploy.js": {
|
| 13 |
+
"content": "const AWS = require('aws-sdk');\nconst fs = require('fs');\nconst path = require('path');\nconst { promisify } = require('util');\nconst readFile = promisify(fs.readFile);\n\n// Configure AWS\nAWS.config.update({ region: 'us-east-1' }); // Change to your preferred region\nconst cloudFormation = new AWS.CloudFormation();\nconst iam = new AWS.IAM();\nconst lambda = new AWS.Lambda();\nconst apiGateway = new AWS.APIGateway();\nconst dynamoDB = new AWS.DynamoDB();\n\n// Stack configuration\nconst STACK_NAME = 'BasicBackendStack';\nconst STACK_TEMPLATE = 'template.yaml';\nconst LAMBDA_ZIP = 'function.zip';\n\nasync function deploy() {\n try {\n console.log('Deploying AWS Backend...');\n \n // 1. Create or update CloudFormation stack\n const templateBody = await readFile(path.join(__dirname, STACK_TEMPLATE), 'utf8');\n \n const stackExists = await checkStackExists(STACK_NAME);\n \n if (stackExists) {\n console.log('Updating existing stack...');\n await updateStack(templateBody);\n } else {\n console.log('Creating new stack...');\n await createStack(templateBody);\n }\n \n console.log('Deployment completed successfully!');\n \n } catch (error) {\n console.error('Deployment failed:', error);\n process.exit(1);\n }\n}\n\nasync function checkStackExists(stackName) {\n try {\n await cloudFormation.describeStacks({ StackName: stackName }).promise();\n return true;\n } catch (error) {\n if (error.code === 'ValidationError' && error.message.includes('does not exist')) {\n return false;\n }\n throw error;\n }\n}\n\nasync function createStack(templateBody) {\n const params = {\n StackName: STACK_NAME,\n TemplateBody: templateBody,\n Capabilities: ['CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM'],\n OnFailure: 'ROLLBACK',\n TimeoutInMinutes: 30\n };\n \n await cloudFormation.createStack(params).promise();\n await cloudFormation.waitFor('stackCreateComplete', { StackName: STACK_NAME }).promise();\n}\n\nasync function updateStack(templateBody) {\n const params = {\n StackName: STACK_NAME,\n TemplateBody: templateBody,\n Capabilities: ['CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM']\n };\n \n try {\n await cloudFormation.updateStack(params).promise();\n await cloudFormation.waitFor('stackUpdateComplete', { StackName: STACK_NAME }).promise();\n } catch (error) {\n if (error.message.includes('No updates are to be performed')) {\n console.log('No updates to perform');\n return;\n }\n throw error;\n }\n}\n\n// Start deployment\ndeploy();\n",
|
| 14 |
+
"size": 2506,
|
| 15 |
+
"language": "javascript"
|
| 16 |
+
},
|
| 17 |
+
"README.md": {
|
| 18 |
+
"content": "# AWS Serverless Backend\n\nA production-ready AWS serverless backend with Cognito authentication, API Gateway, Lambda, and DynamoDB, built with AWS CDK and Python.\n\n## ✨ Features\n\n- 🔒 **Authentication**: JWT-based authentication with Amazon Cognito\n- 🚀 **Serverless**: Fully managed services with automatic scaling\n- 🏗 **Infrastructure as Code**: AWS CDK for reliable deployments\n- 🔄 **RESTful API**: Complete CRUD operations with validation\n- 📊 **Monitoring**: Built-in CloudWatch logging and metrics\n- 🔐 **Security**: IAM roles with least privilege, input validation\n- 🌐 **CORS Support**: Pre-configured for web applications\n- 🧪 **Testing**: Unit and integration test setup\n- 🔧 **Developer Experience**: Local development and debugging support\n\n## 🚀 Quick Start\n\n### Prerequisites\n\n- Python 3.9+\n- Node.js 16.x+ (for CDK)\n- AWS CLI configured with admin permissions\n- AWS CDK v2 installed (`npm install -g aws-cdk`)\n\n### Installation\n\n1. **Clone the repository**\n ```bash\n git clone https://github.com/yourusername/aws-serverless-backend.git\n cd aws-serverless-backend\n ```\n\n2. **Set up Python virtual environment**\n ```bash\n python -m venv .venv\n source .venv/bin/activate # On Windows: .venv\\Scripts\\activate\n ```\n\n3. **Install dependencies**\n ```bash\n pip install -r requirements-dev.txt\n npm install\n ```\n\n4. **Configure environment**\n ```bash\n cp .env.example .env\n # Edit .env with your AWS account and region\n ```\n\n## 🏗 Project Structure\n\n```\n.\n├── app.py # CDK application entry point\n├── backend/\n│ └── backend_stack.py # Main CDK stack definition\n├── lambda/\n│ ├── lambda_function.py # Lambda function handler\n│ └── requirements.txt # Lambda dependencies\n├── tests/ # Unit and integration tests\n├── .env.example # Example environment variables\n├── package.json # Node.js dependencies\n└── requirements-dev.txt # Development dependencies\n```\n\n## 🚀 Deployment\n\n### First-time Setup\n\n```bash\n# Bootstrap CDK in your AWS account (first time only)\ncdk bootstrap aws://ACCOUNT-NUMBER/REGION\n```\n\n### Deploy to AWS\n\n```bash\n# Deploy the stack\ncdk deploy\n\n# Deploy to a specific stage (dev/staging/prod)\ncdk deploy --context stage=prod\n```\n\n### Deploy Outputs\n\nAfter successful deployment, you'll receive:\n- API Gateway URL\n- Cognito User Pool ID\n- Cognito Client ID\n- DynamoDB Table Name\n\n## 🔧 Local Development\n\n### Run Lambda Locally\n\n```bash\n# Install local dependencies\npip install -r lambda/requirements.txt\n\n# Set environment variables\nexport TABLE_NAME=local-table\nexport AWS_ACCESS_KEY_ID=test\nexport AWS_SECRET_ACCESS_KEY=test\nexport AWS_DEFAULT_REGION=us-east-1\n\n# Start local API Gateway and Lambda\nsam local start-api\n```\n\n### Test API Endpoints\n\n```bash\n# Register a new user\ncurl -X POST $API_URL/auth/register \\\n -H \"Content-Type: application/json\" \\\n -d '{\"email\":\"user@example.com\",\"password\":\"SecurePass123!\"}'\n\n# Get authentication token\nTOKEN=$(curl -X POST $API_URL/auth/login \\\n -H \"Content-Type: application/json\" \\\n -d '{\"email\":\"user@example.com\",\"password\":\"SecurePass123!\"}' | jq -r '.token')\n\n# Access protected endpoints\ncurl -H \"Authorization: Bearer $TOKEN\" $API_URL/items\n```\n\n## 🧪 Testing\n\n### Run Unit Tests\n\n```bash\npytest tests/unit -v\n```\n\n### Run Integration Tests\n\n```bash\n# Deploy to a test environment\ncdk deploy --context stage=test\n\n# Run integration tests\npytest tests/integration -v\n```\n\n## 🛡 Security\n\n- **Authentication**: JWT tokens with Cognito\n- **Authorization**: IAM roles with least privilege\n- **Data Protection**: Encryption at rest and in transit\n- **Input Validation**: Pydantic models for all API inputs\n- **Secrets Management**: AWS Secrets Manager or Parameter Store for sensitive data\n\n## 📊 Monitoring and Logging\n\n- **CloudWatch Logs**: All Lambda function logs\n- **CloudWatch Metrics**: API Gateway and Lambda metrics\n- **X-Ray Tracing**: Distributed tracing enabled\n- **Error Tracking**: Structured error logging\n\n## 🔄 CI/CD (GitHub Actions)\n\nPre-configured GitHub Actions workflows for:\n- Linting and type checking on PRs\n- Unit tests on push\n- Automated deployments to staging/production\n\n## 🧹 Cleanup\n\nTo remove all AWS resources:\n\n```bash\ncdk destroy\n# Or for a specific stage\ncdk destroy --context stage=prod\n```\n\n## 📝 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## 🤝 Contributing\n\n1. Fork the repository\n2. Create your feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add some amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n## 🎓 Learning Path\n\n### Core AWS Services\n\n1. **AWS CDK (Cloud Development Kit)**\n - **What it is**: Framework for defining cloud infrastructure using familiar programming languages\n - **Key Concepts**:\n - Constructs: Basic building blocks (like `Stack`, `Table`, `Function`)\n - Stacks: Units of deployment\n - Environments: AWS account/region combinations\n - **Example**: `BackendStack` in `backend_stack.py` defines all resources\n\n2. **AWS Lambda**\n - **What it is**: Serverless compute service\n - **Key Concepts**:\n - Handler function: Entry point for execution\n - Runtime: Python 3.9 in our case\n - Environment variables: Secure configuration\n - **Example**: `lambda_function.py` contains the request handler\n\n3. **Amazon API Gateway**\n - **What it is**: Managed service for creating and managing APIs\n - **Key Concepts**:\n - REST API: Resource-based HTTP endpoints\n - Integration: Connection to Lambda functions\n - Authorizers: JWT validation with Cognito\n - **Example**: Defined in `backend_stack.py` with CORS and authentication\n\n4. **Amazon DynamoDB**\n - **What it is**: NoSQL database service\n - **Key Concepts**:\n - Tables: Collections of items\n - Items: Individual records\n - GSIs: Global Secondary Indexes for flexible querying\n - **Example**: `ItemsTable` in `backend_stack.py`\n\n5. **Amazon Cognito**\n - **What it is**: User authentication and authorization\n - **Key Concepts**:\n - User Pools: User directories\n - App Clients: Application configurations\n - JWT Tokens: Secure authentication\n - **Example**: `UserPool` and `UserPoolClient` in `backend_stack.py`\n\n### Python Concepts\n\n1. **Pydantic Models**\n ```python\n class ItemCreate(BaseModel):\n name: str\n description: str\n ```\n - Used for request/response validation\n - Automatic type conversion\n - Schema documentation\n\n2. **AWS Lambda Powertools**\n - `@logger.inject_lambda_context`: Structured logging\n - `@tracer.capture_lambda_handler`: Distributed tracing\n - `@metrics.log_metrics`: Custom metrics\n\n3. **Error Handling**\n ```python\n try:\n # Code that might fail\n except ClientError as e:\n # Handle AWS service errors\n except Exception as e:\n # Handle unexpected errors\n ```\n\n### Security Concepts\n\n1. **IAM Roles & Policies**\n - Least privilege principle\n - Managed policies vs. inline policies\n - Service roles for AWS services\n\n2. **JWT Authentication**\n - Token-based authentication flow\n - Claims validation\n - Token expiration and refresh\n\n### Best Practices\n\n1. **Infrastructure as Code**\n - Version controlled infrastructure\n - Repeatable deployments\n - Environment parity\n\n2. **Serverless Architecture**\n - Event-driven design\n - Stateless functions\n - Managed services where possible\n\n## 🌐 Frontend Development Guide\n\nThis section covers how to build a frontend application that works with your serverless backend.\n\n### 1. Authentication Flow\n\n#### Setting Up Cognito\n\n```javascript\n// Install required packages\n// npm install amazon-cognito-identity-js @aws-amplify/auth\n\nimport { CognitoUserPool, CognitoUser, AuthenticationDetails } from 'amazon-cognito-identity-js';\n\nconst poolData = {\n UserPoolId: 'YOUR_USER_POOL_ID',\n ClientId: 'YOUR_APP_CLIENT_ID'\n};\n\nconst userPool = new CognitoUserPool(poolData);\n\n// Sign Up\nconst signUp = (email, password) => {\n return new Promise((resolve, reject) => {\n userPool.signUp(email, password, [], null, (err, result) => {\n if (err) return reject(err);\n resolve(result.user);\n });\n });\n};\n\n// Sign In\nconst signIn = (email, password) => {\n const authDetails = new AuthenticationDetails({\n Username: email,\n Password: password\n });\n\n const userData = {\n Username: email,\n Pool: userPool\n };\n\n const cognitoUser = new CognitoUser(userData);\n\n return new Promise((resolve, reject) => {\n cognitoUser.authenticateUser(authDetails, {\n onSuccess: (result) => {\n const token = result.getIdToken().getJwtToken();\n localStorage.setItem('token', token);\n resolve({ user: cognitoUser, token });\n },\n onFailure: (err) => reject(err)\n });\n });\n};\n```\n\n### 2. Data Modeling\n\n#### Frontend Models\n\n```typescript\n// types/item.ts\nexport interface Item {\n id: string;\n name: string;\n description: string;\n createdAt: string;\n updatedAt: string;\n userId: string;\n}\n\n// API Response Types\nexport interface ApiResponse<T> {\n data?: T;\n error?: string;\n status: number;\n}\n```\n\n### 3. API Integration\n\n#### API Client Setup\n\n```typescript\n// api/client.ts\nconst API_URL = process.env.REACT_APP_API_URL;\n\nexport const apiClient = async <T>(\n endpoint: string,\n options: RequestInit = {}\n): Promise<ApiResponse<T>> => {\n const token = localStorage.getItem('token');\n \n const headers = {\n 'Content-Type': 'application/json',\n ...(token && { 'Authorization': `Bearer ${token}` }),\n ...options.headers,\n };\n\n try {\n const response = await fetch(`${API_URL}${endpoint}`, {\n ...options,\n headers,\n });\n\n const data = await response.json().catch(() => ({}));\n \n if (!response.ok) {\n return { error: data.message || 'Request failed', status: response.status };\n }\n\n return { data, status: response.status };\n } catch (error) {\n return { error: 'Network error', status: 500 };\n }\n};\n```\n\n#### Example API Calls\n\n```typescript\n// api/items.ts\nimport { apiClient } from './client';\nimport { Item } from '../types/item';\n\nexport const fetchItems = async (): Promise<ApiResponse<Item[]>> => {\n return apiClient<Item[]>('/items');\n};\n\nexport const createItem = async (item: Omit<Item, 'id' | 'createdAt' | 'updatedAt' | 'userId'>) => {\n return apiClient<Item>('/items', {\n method: 'POST',\n body: JSON.stringify(item),\n });\n};\n```\n\n### 4. State Management\n\n#### React Context Example\n\n```tsx\n// context/ItemsContext.tsx\nimport React, { createContext, useContext, useEffect, useState } from 'react';\nimport { fetchItems, createItem } from '../api/items';\nimport { Item } from '../types/item';\n\ninterface ItemsContextType {\n items: Item[];\n loading: boolean;\n error: string | null;\n addItem: (item: Omit<Item, 'id' | 'createdAt' | 'updatedAt' | 'userId'>) => Promise<void>;\n refreshItems: () => Promise<void>;\n}\n\nconst ItemsContext = createContext<ItemsContextType | undefined>(undefined);\n\nexport const ItemsProvider: React.FC = ({ children }) => {\n const [items, setItems] = useState<Item[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const loadItems = async () => {\n try {\n setLoading(true);\n const { data, error } = await fetchItems();\n \n if (error) throw new Error(error);\n if (data) setItems(data);\n } catch (err) {\n setError(err.message);\n } finally {\n setLoading(false);\n }\n };\n\n const addItem = async (item: Omit<Item, 'id' | 'createdAt' | 'updatedAt' | 'userId'>) => {\n const { data, error } = await createItem(item);\n if (error) throw new Error(error);\n if (data) setItems(prev => [...prev, data]);\n };\n\n useEffect(() => {\n loadItems();\n }, []);\n\n return (\n <ItemsContext.Provider\n value={{\n items,\n loading,\n error,\n addItem,\n refreshItems: loadItems,\n }}\n >\n {children}\n </ItemsContext.Provider>\n );\n};\n\nexport const useItems = () => {\n const context = useContext(ItemsContext);\n if (context === undefined) {\n throw new Error('useItems must be used within an ItemsProvider');\n }\n return context;\n};\n```\n\n### 5. Monitoring and Error Tracking\n\n#### Frontend Monitoring Setup\n\n```typescript\n// utils/monitoring.ts\nimport * as Sentry from '@sentry/react';\nimport { Integrations } from '@sentry/tracing';\n\nconst initMonitoring = () => {\n if (process.env.NODE_ENV === 'production') {\n Sentry.init({\n dsn: process.env.REACT_APP_SENTRY_DSN,\n integrations: [new Integrations.BrowserTracing()],\n tracesSampleRate: 0.2,\n environment: process.env.NODE_ENV,\n });\n }\n};\n\nconst logError = (error: Error, context?: Record<string, any>) => {\n console.error(error, context);\n if (process.env.NODE_ENV === 'production') {\n Sentry.captureException(error, { extra: context });\n }\n};\n\nexport { initMonitoring, logError, Sentry };\n```\n\n#### API Error Handling Middleware\n\n```typescript\n// api/errorHandler.ts\nexport const withErrorHandling = async <T>(\n apiCall: () => Promise<ApiResponse<T>>,\n onError?: (error: string) => void\n): Promise<ApiResponse<T>> => {\n try {\n const result = await apiCall();\n if (result.error) {\n logError(new Error(result.error), { status: result.status });\n onError?.(result.error);\n }\n return result;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'An unknown error occurred';\n logError(new Error(message));\n onError?.(message);\n return { error: message, status: 500 };\n }\n};\n```\n\n### 6. Environment Configuration\n\nCreate a `.env` file in your frontend project:\n\n```env\nREACT_APP_API_URL=your-api-gateway-url\nREACT_APP_USER_POOL_ID=your-cognito-user-pool-id\nREACT_APP_CLIENT_ID=your-cognito-app-client-id\nREACT_APP_SENTRY_DSN=your-sentry-dsn\n```\n\n### 7. Deployment\n\n#### CI/CD Pipeline Example (GitHub Actions)\n\n```yaml\n# .github/workflows/deploy-frontend.yml\nname: Deploy Frontend\n\non:\n push:\n branches: [main]\n pull_request:\n branches: [main]\n\njobs:\n build-and-deploy:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v2\n \n - name: Set up Node.js\n uses: actions/setup-node@v2\n with:\n node-version: '16'\n \n - name: Install dependencies\n run: npm ci\n \n - name: Build\n run: |\n echo \"REACT_APP_API_URL=${{ secrets.REACT_APP_API_URL }}\" >> .env\n echo \"REACT_APP_USER_POOL_ID=${{ secrets.REACT_APP_USER_POOL_ID }}\" >> .env\n echo \"REACT_APP_CLIENT_ID=${{ secrets.REACT_APP_CLIENT_ID }}\" >> .env\n npm run build\n \n - name: Deploy to AWS S3 & CloudFront\n uses: jakejarvis/s3-sync-action@v0.5.1\n with:\n args: --delete\n env:\n AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }}\n AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}\n AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n AWS_REGION: 'us-east-1'\n SOURCE_DIR: 'build'\n```\n\n## 📄 Documentation & Resources\n\n### Frontend Development\n- [AWS Amplify Documentation](https://docs.amplify.aws/)\n- [React Documentation](https://reactjs.org/docs/getting-started.html)\n- [TypeScript Handbook](https://www.typescriptlang.org/docs/)\n- [Sentry for React](https://docs.sentry.io/platforms/javascript/guides/react/)\n\n### Backend Integration\n- [AWS CDK Documentation](https://docs.aws.amazon.com/cdk/v2/guide/home.html)\n- [AWS Lambda Python Guide](https://docs.aws.amazon.com/lambda/latest/dg/lambda-python.html)\n- [Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html)\n- [Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html)\n- [AWS Well-Architected Framework](https://aws.amazon.com/architecture/well-architected/)\n- [Serverless Best Practices](https://docs.aws.amazon.com/whitepapers/latest/serverless-architectures-lambda/best-practices.html)\n",
|
| 19 |
+
"size": 16136,
|
| 20 |
+
"language": "markdown"
|
| 21 |
+
},
|
| 22 |
+
"requirements-dev.txt": {
|
| 23 |
+
"content": "aws-cdk-lib>=2.0.0\nconstructs>=10.0.0\npytest>=7.0.0\npylint>=2.15.0\nblack>=22.10.0\nmypy>=0.991\nboto3>=1.26.0\npython-dotenv>=0.21.0\npytest-cov>=4.0.0\naws-cdk.aws-apigatewayv2-alpha>=2.0.0\ntypes-requests>=2.28.0\npydantic>=1.10.0\n",
|
| 24 |
+
"size": 226,
|
| 25 |
+
"language": "text"
|
| 26 |
+
},
|
| 27 |
+
"package.json": {
|
| 28 |
+
"content": "{\n \"name\": \"aws-serverless-backend\",\n \"version\": \"1.0.0\",\n \"description\": \"Advanced AWS Serverless Backend with Cognito, API Gateway, Lambda, and DynamoDB\",\n \"private\": true,\n \"scripts\": {\n \"deploy\": \"cdk deploy --all\",\n \"destroy\": \"cdk destroy --all\",\n \"synth\": \"cdk synth\",\n \"test\": \"pytest\",\n \"lint\": \"pylint **/*.py\"\n },\n \"devDependencies\": {\n \"aws-cdk\": \"^2.0.0\",\n \"aws-cdk-lib\": \"^2.0.0\",\n \"constructs\": \"^10.0.0\"\n },\n \"dependencies\": {\n \"@aws-solutions-constructs/aws-apigateway-lambda\": \"^2.0.0\",\n \"@aws-solutions-constructs/aws-cognito-apigateway-lambda\": \"^2.0.0\",\n \"@aws-solutions-constructs/aws-dynamodb-lambda\": \"^2.0.0\"\n }\n}\n",
|
| 29 |
+
"size": 682,
|
| 30 |
+
"language": "json"
|
| 31 |
+
},
|
| 32 |
+
".gitattributes": {
|
| 33 |
+
"content": "# Auto detect text files and perform LF normalization\n* text=auto\n",
|
| 34 |
+
"size": 66,
|
| 35 |
+
"language": "unknown"
|
| 36 |
+
},
|
| 37 |
+
"app.py": {
|
| 38 |
+
"content": "#!/usr/bin/env python3\nfrom aws_cdk import App, Environment\nfrom backend.backend_stack import BackendStack\nfrom dotenv import load_dotenv\nimport os\n\n# Load environment variables\nload_dotenv()\n\napp = App()\n\n# Get environment variables\naccount = os.getenv('CDK_DEFAULT_ACCOUNT')\nregion = os.getenv('CDK_DEFAULT_REGION', 'us-east-1')\nenv = Environment(account=account, region=region)\n\n# Create stack\nBackendStack(\n app,\n \"ServerlessBackendStack\",\n env=env,\n description=\"Serverless backend with Cognito, API Gateway, Lambda, and DynamoDB\"\n)\n\napp.synth()\n",
|
| 39 |
+
"size": 563,
|
| 40 |
+
"language": "python"
|
| 41 |
+
},
|
| 42 |
+
"app.js": {
|
| 43 |
+
"content": "const express = require('express');\nconst AWS = require('aws-sdk');\nconst serverless = require('serverless-http');\nconst { v4: uuidv4 } = require('uuid');\n\n// Initialize Express app\nconst app = express();\napp.use(express.json());\n\n// Configure AWS\nconst dynamoDb = new AWS.DynamoDB.DocumentClient();\nconst TABLE_NAME = process.env.TABLE_NAME || 'ItemsTable';\n\n// Health check endpoint\napp.get('/health', (req, res) => {\n res.json({ status: 'ok', timestamp: new Date().toISOString() });\n});\n\n// Create item\napp.post('/items', async (req, res) => {\n try {\n const id = uuidv4();\n const { name, description } = req.body;\n \n const params = {\n TableName: TABLE_NAME,\n Item: {\n id,\n name,\n description,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString()\n }\n };\n\n await dynamoDb.put(params).promise();\n res.status(201).json(params.Item);\n } catch (error) {\n console.error('Error creating item:', error);\n res.status(500).json({ error: 'Could not create item' });\n }\n});\n\n// Get all items\napp.get('/items', async (req, res) => {\n try {\n const params = {\n TableName: TABLE_NAME\n };\n\n const result = await dynamoDb.scan(params).promise();\n res.json(result.Items || []);\n } catch (error) {\n console.error('Error fetching items:', error);\n res.status(500).json({ error: 'Could not fetch items' });\n }\n});\n\n// Get single item\napp.get('/items/:id', async (req, res) => {\n try {\n const { id } = req.params;\n \n const params = {\n TableName: TABLE_NAME,\n Key: { id }\n };\n\n const result = await dynamoDb.get(params).promise();\n \n if (!result.Item) {\n return res.status(404).json({ error: 'Item not found' });\n }\n \n res.json(result.Item);\n } catch (error) {\n console.error('Error fetching item:', error);\n res.status(500).json({ error: 'Could not fetch item' });\n }\n});\n\n// Update item\napp.put('/items/:id', async (req, res) => {\n try {\n const { id } = req.params;\n const { name, description } = req.body;\n \n const params = {\n TableName: TABLE_NAME,\n Key: { id },\n UpdateExpression: 'set #name = :name, description = :desc, updatedAt = :updatedAt',\n ExpressionAttributeNames: {\n '#name': 'name'\n },\n ExpressionAttributeValues: {\n ':name': name,\n ':desc': description,\n ':updatedAt': new Date().toISOString()\n },\n ReturnValues: 'ALL_NEW'\n };\n\n const result = await dynamoDb.update(params).promise();\n res.json(result.Attributes);\n } catch (error) {\n console.error('Error updating item:', error);\n res.status(500).json({ error: 'Could not update item' });\n }\n});\n\n// Delete item\napp.delete('/items/:id', async (req, res) => {\n try {\n const { id } = req.params;\n \n const params = {\n TableName: TABLE_NAME,\n Key: { id },\n ReturnValues: 'ALL_OLD'\n };\n\n const result = await dynamoDb.delete(params).promise();\n \n if (!result.Attributes) {\n return res.status(404).json({ error: 'Item not found' });\n }\n \n res.json({ message: 'Item deleted successfully' });\n } catch (error) {\n console.error('Error deleting item:', error);\n res.status(500).json({ error: 'Could not delete item' });\n }\n});\n\n// Error handling middleware\napp.use((err, req, res, next) => {\n console.error(err.stack);\n res.status(500).json({ error: 'Something went wrong!' });\n});\n\n// Export the serverless handler\nmodule.exports.handler = serverless(app);\n\n// For local development\nif (process.env.NODE_ENV !== 'production') {\n const PORT = process.env.PORT || 3000;\n app.listen(PORT, () => {\n console.log(`Server is running on http://localhost:${PORT}`);\n });\n}\n",
|
| 44 |
+
"size": 3749,
|
| 45 |
+
"language": "javascript"
|
| 46 |
+
},
|
| 47 |
+
"frontend/package.json": {
|
| 48 |
+
"content": "{\n \"name\": \"serverless-frontend\",\n \"version\": \"0.1.0\",\n \"private\": true,\n \"dependencies\": {\n \"@sentry/react\": \"^7.0.0\",\n \"@sentry/tracing\": \"^7.0.0\",\n \"@testing-library/jest-dom\": \"^5.16.5\",\n \"@testing-library/react\": \"^13.4.0\",\n \"@testing-library/user-event\": \"^13.5.0\",\n \"@types/jest\": \"^27.5.2\",\n \"@types/node\": \"^16.18.0\",\n \"@types/react\": \"^18.0.24\",\n \"@types/react-dom\": \"^18.0.8\",\n \"amazon-cognito-identity-js\": \"^5.2.10\",\n \"axios\": \"^1.1.3\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\",\n \"react-router-dom\": \"^6.4.3\",\n \"react-scripts\": \"5.0.1\",\n \"typescript\": \"^4.8.4\",\n \"web-vitals\": \"^2.1.4\"\n },\n \"scripts\": {\n \"start\": \"react-scripts start\",\n \"build\": \"react-scripts build\",\n \"test\": \"react-scripts test\",\n \"eject\": \"react-scripts eject\",\n \"lint\": \"eslint src --ext .ts,.tsx\"\n },\n \"eslintConfig\": {\n \"extends\": [\n \"react-app\",\n \"react-app/jest\"\n ]\n },\n \"browserslist\": {\n \"production\": [\n \">0.2%\",\n \"not dead\",\n \"not op_mini all\"\n ],\n \"development\": [\n \"last 1 chrome version\",\n \"last 1 firefox version\",\n \"last 1 safari version\"\n ]\n },\n \"devDependencies\": {\n \"@types/react-router-dom\": \"^5.3.3\",\n \"@typescript-eslint/eslint-plugin\": \"^5.38.1\",\n \"@typescript-eslint/parser\": \"^5.38.1\",\n \"eslint\": \"^8.24.0\",\n \"eslint-config-prettier\": \"^8.5.0\",\n \"eslint-plugin-prettier\": \"^4.2.1\",\n \"eslint-plugin-react\": \"^7.31.8\",\n \"prettier\": \"^2.7.1\"\n }\n}\n",
|
| 49 |
+
"size": 1517,
|
| 50 |
+
"language": "json"
|
| 51 |
+
},
|
| 52 |
+
"frontend/src/context/AuthContext.tsx": {
|
| 53 |
+
"content": "import React, { createContext, useContext, useState, useEffect, ReactNode } from 'react';\nimport { signIn, signUp, signOut, getCurrentUser, isAuthenticated, CognitoUser } from '../services/auth';\n\ninterface AuthContextType {\n user: CognitoUser | null;\n loading: boolean;\n error: string | null;\n login: (email: string, password: string) => Promise<void>;\n register: (email: string, password: string, name: string) => Promise<void>;\n logout: () => void;\n isAuthenticated: boolean;\n}\n\nconst AuthContext = createContext<AuthContextType | undefined>(undefined);\n\nexport const AuthProvider: React.FC<{ children: ReactNode }> = ({ children }) => {\n const [user, setUser] = useState<CogniteUser | null>(null);\n const [loading, setLoading] = useState<boolean>(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const loadUser = async () => {\n try {\n const currentUser = await getCurrentUser();\n setUser(currentUser);\n } catch (error) {\n console.error('Error loading user', error);\n } finally {\n setLoading(false);\n }\n };\n\n loadUser();\n }, []);\n\n const login = async (email: string, password: string) => {\n setLoading(true);\n setError(null);\n try {\n await signIn(email, password);\n const currentUser = await getCurrentUser();\n setUser(currentUser);\n } catch (error) {\n console.error('Login error:', error);\n setError(error instanceof Error ? error.message : 'Login failed');\n throw error;\n } finally {\n setLoading(false);\n }\n };\n\n const register = async (email: string, password: string, name: string) => {\n setLoading(true);\n setError(null);\n try {\n await signUp({ email, password, name });\n // Auto-login after registration\n await login(email, password);\n } catch (error) {\n console.error('Registration error:', error);\n setError(error instanceof Error ? error.message : 'Registration failed');\n throw error;\n } finally {\n setLoading(false);\n }\n };\n\n const logout = () => {\n signOut();\n setUser(null);\n };\n\n const value = {\n user,\n loading,\n error,\n login,\n register,\n logout,\n isAuthenticated: !!user,\n };\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n};\n\nexport const useAuth = (): AuthContextType => {\n const context = useContext(AuthContext);\n if (context === undefined) {\n throw new Error('useAuth must be used within an AuthProvider');\n }\n return context;\n};\n\nexport default AuthContext;\n",
|
| 54 |
+
"size": 2573,
|
| 55 |
+
"language": "unknown"
|
| 56 |
+
},
|
| 57 |
+
"frontend/src/services/api.ts": {
|
| 58 |
+
"content": "import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';\nimport { getToken } from './auth';\n\nconst API_URL = process.env.REACT_APP_API_URL || 'http://localhost:3000';\n\nclass ApiClient {\n private client: AxiosInstance;\n\n constructor() {\n this.client = axios.create({\n baseURL: API_URL,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n // Add request interceptor for auth token\n this.client.interceptors.request.use(\n (config) => {\n const token = getToken();\n if (token) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n }\n\n // Generic request method\n async request<T>(config: AxiosRequestConfig): Promise<T> {\n try {\n const response: AxiosResponse<T> = await this.client.request<T>(config);\n return response.data;\n } catch (error) {\n if (axios.isAxiosError(error)) {\n throw new Error(error.response?.data?.message || 'An error occurred');\n }\n throw error;\n }\n }\n\n // CRUD Operations for Items\n async getItems<T>(): Promise<T> {\n return this.request<T>({\n method: 'GET',\n url: '/items',\n });\n }\n\n async getItem<T>(id: string): Promise<T> {\n return this.request<T>({\n method: 'GET',\n url: `/items/${id}`,\n });\n }\n\n async createItem<T>(data: any): Promise<T> {\n return this.request<T>({\n method: 'POST',\n url: '/items',\n data,\n });\n }\n\n async updateItem<T>(id: string, data: any): Promise<T> {\n return this.request<T>({\n method: 'PUT',\n url: `/items/${id}`,\n data,\n });\n }\n\n async deleteItem<T>(id: string): Promise<T> {\n return this.request<T>({\n method: 'DELETE',\n url: `/items/${id}`,\n });\n }\n}\n\nexport const apiClient = new ApiClient();\n",
|
| 59 |
+
"size": 1900,
|
| 60 |
+
"language": "typescript"
|
| 61 |
+
},
|
| 62 |
+
"frontend/src/services/auth.ts": {
|
| 63 |
+
"content": "import { CognitoUser, CognitoUserPool, AuthenticationDetails, CognitoUserSession } from 'amazon-cognito-identity-js';\n\nconst poolData = {\n UserPoolId: process.env.REACT_APP_USER_POOL_ID || '',\n ClientId: process.env.REACT_APP_CLIENT_ID || ''\n};\n\nexport const userPool = new CognitoUserPool(poolData);\n\ninterface SignUpParams {\n email: string;\n password: string;\n name: string;\n}\n\nexport const signUp = async ({ email, password, name }: SignUpParams): Promise<CognitoUser> => {\n return new Promise((resolve, reject) => {\n const attributeList = [\n {\n Name: 'email',\n Value: email\n },\n {\n Name: 'name',\n Value: name\n }\n ];\n\n userPool.signUp(email, password, attributeList, [], (err, result) => {\n if (err) {\n reject(err);\n return;\n }\n if (result) {\n resolve(result.user);\n }\n });\n });\n};\n\nexport const signIn = (email: string, password: string): Promise<CognitoUserSession> => {\n const authenticationDetails = new AuthenticationDetails({\n Username: email,\n Password: password\n });\n\n const userData = {\n Username: email,\n Pool: userPool\n };\n\n const cognitoUser = new CognitoUser(userData);\n\n return new Promise((resolve, reject) => {\n cognitoUser.authenticateUser(authenticationDetails, {\n onSuccess: (session) => {\n localStorage.setItem('token', session.getIdToken().getJwtToken());\n resolve(session);\n },\n onFailure: (err) => {\n reject(err);\n },\n newPasswordRequired: () => {\n // Handle case where user needs to set a new password\n reject(new Error('New password required'));\n }\n });\n });\n};\n\nexport const signOut = (): void => {\n const user = userPool.getCurrentUser();\n if (user) {\n user.signOut();\n }\n localStorage.removeItem('token');\n};\n\nexport const getCurrentUser = (): Promise<CognitoUser | null> => {\n return new Promise((resolve) => {\n const user = userPool.getCurrentUser();\n \n if (!user) {\n resolve(null);\n return;\n }\n\n user.getSession((err: Error | null) => {\n if (err) {\n resolve(null);\n return;\n }\n resolve(user);\n });\n });\n};\n\nexport const getToken = (): string | null => {\n return localStorage.getItem('token');\n};\n\nexport const isAuthenticated = async (): Promise<boolean> => {\n try {\n const user = await getCurrentUser();\n return !!user;\n } catch (error) {\n return false;\n }\n};\n",
|
| 64 |
+
"size": 2472,
|
| 65 |
+
"language": "typescript"
|
| 66 |
+
},
|
| 67 |
+
"backend/backend_stack.py": {
|
| 68 |
+
"content": "from aws_cdk import (\n Stack,\n aws_dynamodb as dynamodb,\n aws_lambda as _lambda,\n aws_apigateway as apigw,\n aws_cognito as cognito,\n aws_iam as iam,\n aws_logs as logs,\n RemovalPolicy,\n Duration,\n)\nfrom constructs import Construct\n\nclass BackendStack(Stack):\n def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:\n super().__init__(scope, construct_id, **kwargs)\n\n # Create Cognito User Pool\n user_pool = cognito.UserPool(\n self, \"UserPool\",\n user_pool_name=\"serverless-backend-users\",\n self_sign_up_enabled=True,\n sign_in_aliases={\"email\": True},\n auto_verify={\"email\": True},\n password_policy={\n \"min_length\": 8,\n \"require_lowercase\": True,\n \"require_uppercase\": True,\n \"require_digits\": True,\n \"require_symbols\": True,\n },\n account_recovery=cognito.AccountRecovery.EMAIL_ONLY,\n removal_policy=RemovalPolicy.DESTROY\n )\n\n # Add App Client\n user_pool_client = cognito.UserPoolClient(\n self, \"UserPoolClient\",\n user_pool=user_pool,\n auth_flows={\"admin_user_password\": True, \"user_password\": True, \"user_srp\": True},\n o_auth={\n \"flows\": {\"authorization_code_grant\": True},\n \"scopes\": [cognito.OAuthScope.EMAIL, cognito.OAuthScope.OPENID, cognito.OAuthScope.PROFILE],\n \"callback_urls\": [\"http://localhost:3000/callback\"],\n \"logout_urls\": [\"http://localhost:3000\"]\n }\n )\n\n # Create DynamoDB Table\n table = dynamodb.Table(\n self, \"ItemsTable\",\n table_name=\"serverless-items\",\n partition_key={\"name\": \"id\", \"type\": dynamodb.AttributeType.STRING},\n sort_key={\"name\": \"created_at\", \"type\": dynamodb.AttributeType.STRING},\n billing_mode=dynamodb.BillingMode.PAY_PER_REQUEST,\n removal_policy=RemovalPolicy.DESTROY,\n point_in_time_recovery=True\n )\n\n # Add GSI for querying by user\n table.add_global_secondary_index(\n index_name=\"user-index\",\n partition_key={\"name\": \"user_id\", \"type\": dynamodb.AttributeType.STRING},\n sort_key={\"name\": \"created_at\", \"type\": dynamodb.AttributeType.STRING}\n )\n\n # Create Lambda execution role\n lambda_role = iam.Role(\n self, \"LambdaExecutionRole\",\n assumed_by=iam.ServicePrincipal(\"lambda.amazonaws.com\"),\n managed_policies=[\n iam.ManagedPolicy.from_aws_managed_policy_name(\"service-role/AWSLambdaBasicExecutionRole\"),\n iam.ManagedPolicy.from_aws_managed_policy_name(\"AmazonDynamoDBFullAccess\"),\n iam.ManagedPolicy.from_aws_managed_policy_name(\"AmazonCognitoReadOnly\")\n ]\n )\n\n # Create Lambda function\n lambda_fn = _lambda.Function(\n self, \"ApiHandler\",\n runtime=_lambda.Runtime.PYTHON_3_9,\n handler=\"lambda_function.lambda_handler\",\n code=_lambda.Code.from_asset(\"lambda\"),\n role=lambda_role,\n environment={\n \"USER_POOL_ID\": user_pool.user_pool_id,\n \"CLIENT_ID\": user_pool_client.user_pool_client_id,\n \"TABLE_NAME\": table.table_name,\n \"REGION\": self.region\n },\n timeout=Duration.seconds(30),\n memory_size=256,\n log_retention=logs.RetentionDays.ONE_WEEK\n )\n\n # Grant Lambda access to DynamoDB\n table.grant_read_write_data(lambda_fn)\n\n # Create API Gateway with Cognito Authorizer\n authorizer = apigw.CognitoUserPoolsAuthorizer(\n self, \"CognitoAuthorizer\",\n cognito_user_pools=[user_pool]\n )\n\n # Create REST API\n api = apigw.RestApi(\n self, \"ServerlessApi\",\n default_cors_preflight_options={\n \"allow_origins\": apigw.Cors.ALL_ORIGINS,\n \"allow_methods\": apigw.Cors.ALL_METHODS,\n \"allow_headers\": [\"Content-Type\", \"Authorization\"],\n \"allow_credentials\": True\n },\n deploy_options={\n \"stage_name\": \"prod\",\n \"logging_level\": apigw.MethodLoggingLevel.INFO,\n \"metrics_enabled\": True\n }\n )\n\n # Add resources and methods\n items = api.root.add_resource(\"items\")\n item = items.add_resource(\"{id}\")\n\n # Add CORS preflight for OPTIONS\n self._add_cors_options(items)\n self._add_cors_options(item)\n\n # Integrate Lambda with API Gateway\n lambda_integration = apigw.LambdaIntegration(\n lambda_fn,\n proxy=True,\n integration_responses=[{\"statusCode\": \"200\"}]\n )\n\n # Add methods with Cognito authorization\n items.add_method(\"GET\", lambda_integration, authorizer=authorizer)\n items.add_method(\"POST\", lambda_integration, authorizer=authorizer)\n item.add_method(\"GET\", lambda_integration, authorizer=authorizer)\n item.add_method(\"PUT\", lambda_integration, authorizer=authorizer)\n item.add_method(\"DELETE\", lambda_integration, authorizer=authorizer)\n\n # Outputs\n self.api_url = api.url\n self.user_pool_id = user_pool.user_pool_id\n self.user_pool_client_id = user_pool_client.user_pool_client_id\n\n def _add_cors_options(self, resource):\n resource.add_method(\n 'OPTIONS',\n apigw.MockIntegration(\n integration_responses=[{\n 'statusCode': '200',\n 'responseParameters': {\n 'method.response.header.Access-Control-Allow-Headers': \"'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'\",\n 'method.response.header.Access-Control-Allow-Origin': \"'*'\",\n 'method.response.header.Access-Control-Allow-Methods': \"'OPTIONS,GET,PUT,POST,DELETE'\"\n }\n }],\n passthrough_behavior=apigw.PassthroughBehavior.WHEN_NO_MATCH,\n request_templates={\"application/json\": \"{statusCode: 200}\"}\n ),\n method_responses=[{\n 'statusCode': '200',\n 'responseParameters': {\n 'method.response.header.Access-Control-Allow-Headers': True,\n 'method.response.header.Access-Control-Allow-Methods': True,\n 'method.response.header.Access-Control-Allow-Origin': True,\n }\n }]\n )\n",
|
| 69 |
+
"size": 6747,
|
| 70 |
+
"language": "python"
|
| 71 |
+
},
|
| 72 |
+
"lambda/requirements.txt": {
|
| 73 |
+
"content": "boto3>=1.26.0\npython-jose[cryptography]>=3.3.0\nrequests>=2.28.0\npydantic>=1.10.0\npython-dotenv>=0.21.0\naws-lambda-powertools>=2.0.0\n",
|
| 74 |
+
"size": 132,
|
| 75 |
+
"language": "text"
|
| 76 |
+
},
|
| 77 |
+
"lambda/lambda_function.py": {
|
| 78 |
+
"content": "import os\nimport json\nimport boto3\nimport logging\nfrom datetime import datetime\nfrom typing import Dict, Any, Optional\nfrom boto3.dynamodb.conditions import Key\nfrom botocore.exceptions import ClientError\nfrom pydantic import BaseModel, validator\nfrom aws_lambda_powertools import Logger, Tracer, Metrics\nfrom aws_lambda_powertools.utilities.typing import LambdaContext\n\n# Initialize utilities\nlogger = Logger()\ntracer = Tracer()\nmetrics = Metrics()\n\n# Initialize AWS clients\ndynamodb = boto3.resource('dynamodb')\ntable_name = os.environ['TABLE_NAME']\ntable = dynamodb.Table(table_name)\n\n# Pydantic Models for request/response validation\nclass ItemCreate(BaseModel):\n name: str\n description: str\n\nclass ItemUpdate(BaseModel):\n name: Optional[str] = None\n description: Optional[str] = None\n\nclass ResponseModel(BaseModel):\n statusCode: int\n body: str\n headers: Dict[str, str] = {\n 'Content-Type': 'application/json',\n 'Access-Control-Allow-Origin': '*'\n }\n\n# Utility functions\ndef get_user_id(event: Dict[str, Any]) -> str:\n \"\"\"Extract user ID from Cognito JWT token\"\"\"\n try:\n return event['requestContext']['authorizer']['claims']['sub']\n except (KeyError, TypeError) as e:\n logger.error(f\"Error extracting user ID: {str(e)}\")\n raise ValueError(\"Invalid authorization token\")\n\ndef build_response(status_code: int, body: Any) -> Dict[str, Any]:\n \"\"\"Build API Gateway response\"\"\"\n return {\n 'statusCode': status_code,\n 'body': json.dumps(body, default=str),\n 'headers': {\n 'Content-Type': 'application/json',\n 'Access-Control-Allow-Origin': '*'\n }\n }\n\n# Lambda handler\n@logger.inject_lambda_context(log_event=True)\n@tracer.capture_lambda_handler\n@metrics.log_metrics(capture_cold_start_metric=True)\ndef lambda_handler(event: Dict[str, Any], context: LambdaContext) -> Dict[str, Any]:\n \"\"\"\n Main Lambda handler for the API Gateway\n \"\"\"\n try:\n http_method = event['httpMethod']\n path = event['resource']\n \n # Route the request\n if http_method == 'GET' and path == '/items':\n return list_items(event)\n elif http_method == 'POST' and path == '/items':\n return create_item(event)\n elif http_method == 'GET' and path.startswith('/items/'):\n return get_item(event)\n elif http_method == 'PUT' and path.startswith('/items/'):\n return update_item(event)\n elif http_method == 'DELETE' and path.startswith('/items/'):\n return delete_item(event)\n else:\n return build_response(404, {'message': 'Not Found'})\n \n except Exception as e:\n logger.error(f\"Error processing request: {str(e)}\")\n return build_response(500, {'message': 'Internal Server Error'})\n\n# CRUD Operations\ndef list_items(event: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"List all items for the authenticated user\"\"\"\n try:\n user_id = get_user_id(event)\n \n response = table.query(\n IndexName='user-index',\n KeyConditionExpression=Key('user_id').eq(user_id)\n )\n \n return build_response(200, {\n 'items': response.get('Items', [])\n })\n \n except Exception as e:\n logger.error(f\"Error listing items: {str(e)}\")\n return build_response(500, {'message': 'Failed to list items'})\n\ndef create_item(event: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"Create a new item\"\"\"\n try:\n user_id = get_user_id(event)\n request_body = json.loads(event['body'])\n \n # Validate input\n item_data = ItemCreate(**request_body)\n \n # Generate item ID and timestamps\n item_id = context.aws_request_id\n timestamp = datetime.utcnow().isoformat()\n \n # Prepare item\n item = {\n 'id': item_id,\n 'user_id': user_id,\n 'created_at': timestamp,\n 'updated_at': timestamp,\n **item_data.dict()\n }\n \n # Save to DynamoDB\n table.put_item(Item=item)\n \n return build_response(201, item)\n \n except Exception as e:\n logger.error(f\"Error creating item: {str(e)}\")\n return build_response(500, {'message': 'Failed to create item'})\n\ndef get_item(event: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"Get a single item by ID\"\"\"\n try:\n user_id = get_user_id(event)\n item_id = event['pathParameters']['id']\n \n # Get item from DynamoDB\n response = table.get_item(\n Key={'id': item_id}\n )\n \n item = response.get('Item')\n if not item:\n return build_response(404, {'message': 'Item not found'})\n \n # Ensure the user owns this item\n if item.get('user_id') != user_id:\n return build_response(403, {'message': 'Forbidden'})\n \n return build_response(200, item)\n \n except ClientError as e:\n logger.error(f\"DynamoDB error: {str(e)}\")\n return build_response(500, {'message': 'Error retrieving item'})\n except Exception as e:\n logger.error(f\"Error getting item: {str(e)}\")\n return build_response(500, {'message': 'Internal server error'})\n\ndef update_item(event: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"Update an existing item\"\"\"\n try:\n user_id = get_user_id(event)\n item_id = event['pathParameters']['id']\n request_body = json.loads(event['body'])\n \n # Validate input\n update_data = ItemUpdate(**request_body).dict(exclude_unset=True)\n \n if not update_data:\n return build_response(400, {'message': 'No valid fields to update'})\n \n # Prepare update expression\n update_expression = []\n expression_attribute_values = {}\n \n for key, value in update_data.items():\n update_expression.append(f\"{key} = :{key}\")\n expression_attribute_values[f\":{key}\"] = value\n \n # Add updated_at timestamp\n update_expression.append(\"updated_at = :updated_at\")\n expression_attribute_values[\":updated_at\"] = datetime.utcnow().isoformat()\n \n # Update item in DynamoDB\n response = table.update_item(\n Key={'id': item_id},\n UpdateExpression=\"SET \" + \", \".join(update_expression),\n ExpressionAttributeValues=expression_attribute_values,\n ConditionExpression=\"user_id = :user_id\",\n ExpressionAttributeValues={\n **expression_attribute_values,\n \":user_id\": user_id\n },\n ReturnValues=\"ALL_NEW\"\n )\n \n return build_response(200, response['Attributes'])\n \n except ClientError as e:\n if e.response['Error']['Code'] == 'ConditionalCheckFailedException':\n return build_response(403, {'message': 'Forbidden'})\n logger.error(f\"DynamoDB error: {str(e)}\")\n return build_response(500, {'message': 'Error updating item'})\n except Exception as e:\n logger.error(f\"Error updating item: {str(e)}\")\n return build_response(500, {'message': 'Internal server error'})\n\ndef delete_item(event: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"Delete an item\"\"\"\n try:\n user_id = get_user_id(event)\n item_id = event['pathParameters']['id']\n \n # Delete item from DynamoDB\n response = table.delete_item(\n Key={'id': item_id},\n ConditionExpression=\"user_id = :user_id\",\n ExpressionAttributeValues={\n ':user_id': user_id\n },\n ReturnValues=\"ALL_OLD\"\n )\n \n if 'Attributes' not in response:\n return build_response(404, {'message': 'Item not found'})\n \n return build_response(200, {'message': 'Item deleted successfully'})\n \n except ClientError as e:\n if e.response['Error']['Code'] == 'ConditionalCheckFailedException':\n return build_response(403, {'message': 'Forbidden'})\n logger.error(f\"DynamoDB error: {str(e)}\")\n return build_response(500, {'message': 'Error deleting item'})\n except Exception as e:\n logger.error(f\"Error deleting item: {str(e)}\")\n return build_response(500, {'message': 'Internal server error'})\n",
|
| 79 |
+
"size": 8410,
|
| 80 |
+
"language": "python"
|
| 81 |
+
}
|
| 82 |
+
},
|
| 83 |
+
"_cache_metadata": {
|
| 84 |
+
"url": "https://github.com/ronelsolomon/AWS-backend.git",
|
| 85 |
+
"content_type": "github",
|
| 86 |
+
"cached_at": "2026-03-02T22:48:23.536393",
|
| 87 |
+
"cache_key": "6fdad44d776a0611631264d389d28f83"
|
| 88 |
+
}
|
| 89 |
+
}
|
github_ronelsolomon_ETL-pipeline.git.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/ETL-pipeline.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "ETL-pipeline.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:43:46.867502",
|
| 6 |
+
"files": {
|
| 7 |
+
"requirements.txt": {
|
| 8 |
+
"content": "pandas>=1.5.0\npython-dotenv>=0.19.0\npsycopg2-binary>=2.9.0\nsqlalchemy>=1.4.0\npyarrow>=7.0.0\nrequests>=2.28.0\npython-dateutil>=2.8.2\n",
|
| 9 |
+
"size": 132,
|
| 10 |
+
"language": "text"
|
| 11 |
+
},
|
| 12 |
+
"README.md": {
|
| 13 |
+
"content": "# ETL Pipeline with Open Data\n\nThis project demonstrates a simple ETL (Extract, Transform, Load) pipeline that processes public data and loads it into a database.\n\n## Features\n\n- Extracts data from public CSV datasets\n- Transforms and cleans data using Pandas\n- Loads data into PostgreSQL database\n- Environment variable configuration\n- Logging for monitoring the ETL process\n\n## Setup\n\n1. Clone the repository\n2. Install dependencies:\n ```bash\n pip install -r requirements.txt\n ```\n3. Set up your environment variables in `.env` (use `.env.example` as a template)\n4. Run the ETL pipeline:\n ```bash\n python main.py\n ```\n\n## Project Structure\n\n```\nETL-pipeline/\n├── data/ # For storing raw and processed data\n├── src/\n│ ├── __init__.py\n│ ├── extract.py # Data extraction logic\n│ ├── transform.py # Data transformation logic\n│ ├── load.py # Data loading logic\n│ └── utils.py # Utility functions\n├── .env.example # Example environment variables\n├── requirements.txt # Project dependencies\n├── main.py # Main script to run the ETL pipeline\n└── README.md # This file\n```\n\n## Data Source\n\nThis project uses [New York City Taxi Trip Data](https://www.kaggle.com/datasets/elemento/nyc-taxi-trip-dataset) as an example dataset.\n\n## License\n\nMIT\n",
|
| 14 |
+
"size": 1359,
|
| 15 |
+
"language": "markdown"
|
| 16 |
+
},
|
| 17 |
+
".gitattributes": {
|
| 18 |
+
"content": "# Auto detect text files and perform LF normalization\n* text=auto\n",
|
| 19 |
+
"size": 66,
|
| 20 |
+
"language": "unknown"
|
| 21 |
+
},
|
| 22 |
+
"main.py": {
|
| 23 |
+
"content": "#!/usr/bin/env python3\n\"\"\"\nMain entry point for the ETL pipeline.\n\"\"\"\nimport os\nimport logging\nfrom dotenv import load_dotenv\nfrom src.extract import extract_data\nfrom src.transform import transform_data\nfrom src.load import load_data\nfrom src.utils import setup_logging, get_db_connection\n\ndef main():\n \"\"\"Main function to run the ETL pipeline.\"\"\"\n # Load environment variables\n load_dotenv()\n \n # Set up logging\n log_level = os.getenv('LOG_LEVEL', 'INFO')\n log_file = os.getenv('LOG_FILE', 'etl_pipeline.log')\n setup_logging(log_level=log_level, log_file=log_file)\n logger = logging.getLogger(__name__)\n \n try:\n logger.info(\"Starting ETL pipeline\")\n \n # Extract data\n logger.info(\"Extracting data...\")\n data_url = os.getenv('DATA_SOURCE_URL')\n raw_data = extract_data(data_url)\n \n # Transform data\n logger.info(\"Transforming data...\")\n transformed_data = transform_data(raw_data)\n \n # Load data\n logger.info(\"Loading data to database...\")\n table_name = 'taxi_trips'\n load_data(transformed_data, table_name)\n \n logger.info(\"ETL pipeline completed successfully\")\n \n except Exception as e:\n logger.error(f\"Error in ETL pipeline: {str(e)}\", exc_info=True)\n raise\n\nif __name__ == \"__main__\":\n main()\n",
|
| 24 |
+
"size": 1376,
|
| 25 |
+
"language": "python"
|
| 26 |
+
},
|
| 27 |
+
"etl_pipeline.log": {
|
| 28 |
+
"content": "2025-06-17 21:05:41,456 - root - INFO - Logging to file: /Users/ronel/Downloads/dev/templates/ETL-pipeline/etl_pipeline.log\n2025-06-17 21:05:41,456 - __main__ - INFO - Starting ETL pipeline\n2025-06-17 21:05:41,456 - __main__ - INFO - Extracting data...\n2025-06-17 21:05:41,456 - src.extract - INFO - Extracting data from: None\n2025-06-17 21:05:41,456 - src.extract - ERROR - Error extracting data from None: stat: path should be string, bytes, os.PathLike or integer, not NoneType\n2025-06-17 21:05:41,456 - __main__ - ERROR - Error in ETL pipeline: stat: path should be string, bytes, os.PathLike or integer, not NoneType\nTraceback (most recent call last):\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/main.py\", line 30, in main\n raw_data = extract_data(data_url)\n ^^^^^^^^^^^^^^^^^^^^^^\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/extract.py\", line 32, in extract_data\n elif os.path.exists(source):\n ^^^^^^^^^^^^^^^^^^^^^^\n File \"<frozen genericpath>\", line 19, in exists\nTypeError: stat: path should be string, bytes, os.PathLike or integer, not NoneType\n2025-06-17 21:06:13,874 - root - INFO - Logging to file: /Users/ronel/Downloads/dev/templates/ETL-pipeline/etl_pipeline.log\n2025-06-17 21:06:13,874 - __main__ - INFO - Starting ETL pipeline\n2025-06-17 21:06:13,874 - __main__ - INFO - Extracting data...\n2025-06-17 21:06:13,874 - src.extract - INFO - Extracting data from: None\n2025-06-17 21:06:13,874 - src.extract - ERROR - Error extracting data from None: stat: path should be string, bytes, os.PathLike or integer, not NoneType\n2025-06-17 21:06:13,874 - __main__ - ERROR - Error in ETL pipeline: stat: path should be string, bytes, os.PathLike or integer, not NoneType\nTraceback (most recent call last):\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/main.py\", line 30, in main\n raw_data = extract_data(data_url)\n ^^^^^^^^^^^^^^^^^^^^^^\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/extract.py\", line 32, in extract_data\n elif os.path.exists(source):\n ^^^^^^^^^^^^^^^^^^^^^^\n File \"<frozen genericpath>\", line 19, in exists\nTypeError: stat: path should be string, bytes, os.PathLike or integer, not NoneType\n2025-06-17 21:06:54,331 - root - INFO - Logging to file: /Users/ronel/Downloads/dev/templates/ETL-pipeline/etl_pipeline.log\n2025-06-17 21:06:54,332 - __main__ - INFO - Starting ETL pipeline\n2025-06-17 21:06:54,332 - __main__ - INFO - Extracting data...\n2025-06-17 21:06:54,332 - src.extract - INFO - Extracting data from: None\n2025-06-17 21:06:54,332 - src.extract - ERROR - Error extracting data from None: stat: path should be string, bytes, os.PathLike or integer, not NoneType\n2025-06-17 21:06:54,332 - __main__ - ERROR - Error in ETL pipeline: stat: path should be string, bytes, os.PathLike or integer, not NoneType\nTraceback (most recent call last):\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/main.py\", line 30, in main\n raw_data = extract_data(data_url)\n ^^^^^^^^^^^^^^^^^^^^^^\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/extract.py\", line 32, in extract_data\n elif os.path.exists(source):\n ^^^^^^^^^^^^^^^^^^^^^^\n File \"<frozen genericpath>\", line 19, in exists\nTypeError: stat: path should be string, bytes, os.PathLike or integer, not NoneType\n2025-06-17 21:09:20,929 - root - INFO - Logging to file: /Users/ronel/Downloads/dev/templates/ETL-pipeline/etl_pipeline.log\n2025-06-17 21:09:20,929 - __main__ - INFO - Starting ETL pipeline\n2025-06-17 21:09:20,929 - __main__ - INFO - Extracting data...\n2025-06-17 21:09:20,929 - src.extract - INFO - Extracting data from: https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2023-01.parquet\n2025-06-17 21:09:25,181 - __main__ - INFO - Transforming data...\n2025-06-17 21:09:25,181 - src.transform - INFO - Starting data transformation\n2025-06-17 21:09:25,276 - src.transform - INFO - Data transformation complete. Shape after transformation: (3066766, 19)\n2025-06-17 21:09:25,277 - __main__ - INFO - Loading data to database...\n2025-06-17 21:09:25,277 - src.load - INFO - Loading data into taxi_trips\n2025-06-17 21:09:25,306 - src.load - ERROR - Error loading data into taxi_trips: No module named 'psycopg2'\n2025-06-17 21:09:25,306 - __main__ - ERROR - Error in ETL pipeline: No module named 'psycopg2'\nTraceback (most recent call last):\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/main.py\", line 39, in main\n load_data(transformed_data, table_name)\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/load.py\", line 60, in load_data\n engine = get_db_connection()\n ^^^^^^^^^^^^^^^^^^^\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/utils.py\", line 84, in get_db_connection\n return create_engine(connection_string)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"<string>\", line 2, in create_engine\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/util/deprecations.py\", line 281, in warned\n return fn(*args, **kwargs) # type: ignore[no-any-return]\n ^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/create.py\", line 599, in create_engine\n dbapi = dbapi_meth(**dbapi_args)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg2.py\", line 690, in import_dbapi\n import psycopg2\nModuleNotFoundError: No module named 'psycopg2'\n2025-06-17 21:09:53,917 - root - INFO - Logging to file: /Users/ronel/Downloads/dev/templates/ETL-pipeline/etl_pipeline.log\n2025-06-17 21:09:53,918 - __main__ - INFO - Starting ETL pipeline\n2025-06-17 21:09:53,918 - __main__ - INFO - Extracting data...\n2025-06-17 21:09:53,918 - src.extract - INFO - Extracting data from: https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2023-01.parquet\n2025-06-17 21:09:55,987 - __main__ - INFO - Transforming data...\n2025-06-17 21:09:55,987 - src.transform - INFO - Starting data transformation\n2025-06-17 21:09:56,064 - src.transform - INFO - Data transformation complete. Shape after transformation: (3066766, 19)\n2025-06-17 21:09:56,064 - __main__ - INFO - Loading data to database...\n2025-06-17 21:09:56,065 - src.load - INFO - Loading data into taxi_trips\n2025-06-17 21:09:56,091 - src.load - ERROR - Error loading data into taxi_trips: No module named 'psycopg2'\n2025-06-17 21:09:56,091 - __main__ - ERROR - Error in ETL pipeline: No module named 'psycopg2'\nTraceback (most recent call last):\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/main.py\", line 39, in main\n load_data(transformed_data, table_name)\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/load.py\", line 60, in load_data\n engine = get_db_connection()\n ^^^^^^^^^^^^^^^^^^^\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/utils.py\", line 84, in get_db_connection\n return create_engine(connection_string)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"<string>\", line 2, in create_engine\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/util/deprecations.py\", line 281, in warned\n return fn(*args, **kwargs) # type: ignore[no-any-return]\n ^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/create.py\", line 599, in create_engine\n dbapi = dbapi_meth(**dbapi_args)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg2.py\", line 690, in import_dbapi\n import psycopg2\nModuleNotFoundError: No module named 'psycopg2'\n2025-06-17 22:07:02,572 - root - INFO - Logging to file: /Users/ronel/Downloads/dev/templates/ETL-pipeline/etl_pipeline.log\n2025-06-17 22:07:02,572 - __main__ - INFO - Starting ETL pipeline\n2025-06-17 22:07:02,572 - __main__ - INFO - Extracting data...\n2025-06-17 22:07:02,572 - src.extract - INFO - Extracting data from: https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2023-01.parquet\n2025-06-17 22:07:04,213 - __main__ - INFO - Transforming data...\n2025-06-17 22:07:04,214 - src.transform - INFO - Starting data transformation\n2025-06-17 22:07:04,292 - src.transform - INFO - Data transformation complete. Shape after transformation: (3066766, 19)\n2025-06-17 22:07:04,292 - __main__ - INFO - Loading data to database...\n2025-06-17 22:07:04,292 - src.load - INFO - Loading data into taxi_trips\n2025-06-17 22:07:04,312 - src.load - ERROR - Error loading data into taxi_trips: No module named 'psycopg2'\n2025-06-17 22:07:04,313 - __main__ - ERROR - Error in ETL pipeline: No module named 'psycopg2'\nTraceback (most recent call last):\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/main.py\", line 39, in main\n load_data(transformed_data, table_name)\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/load.py\", line 60, in load_data\n engine = get_db_connection()\n ^^^^^^^^^^^^^^^^^^^\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/utils.py\", line 84, in get_db_connection\n return create_engine(connection_string)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"<string>\", line 2, in create_engine\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/util/deprecations.py\", line 281, in warned\n return fn(*args, **kwargs) # type: ignore[no-any-return]\n ^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/create.py\", line 599, in create_engine\n dbapi = dbapi_meth(**dbapi_args)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg2.py\", line 690, in import_dbapi\n import psycopg2\nModuleNotFoundError: No module named 'psycopg2'\n2025-06-17 22:11:51,014 - root - INFO - Logging to file: /Users/ronel/Downloads/dev/templates/ETL-pipeline/etl_pipeline.log\n2025-06-17 22:11:51,014 - __main__ - INFO - Starting ETL pipeline\n2025-06-17 22:11:51,014 - __main__ - INFO - Extracting data...\n2025-06-17 22:11:51,014 - src.extract - INFO - Extracting data from: https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2023-01.parquet\n2025-06-17 22:11:54,433 - __main__ - INFO - Transforming data...\n2025-06-17 22:11:54,433 - src.transform - INFO - Starting data transformation\n2025-06-17 22:11:54,510 - src.transform - INFO - Data transformation complete. Shape after transformation: (3066766, 19)\n2025-06-17 22:11:54,510 - __main__ - INFO - Loading data to database...\n2025-06-17 22:11:54,510 - src.load - INFO - Loading data into taxi_trips\n2025-06-17 22:11:55,209 - src.load - ERROR - Error loading data into taxi_trips: 'Engine' object has no attribute 'has_table'\n2025-06-17 22:11:55,209 - __main__ - ERROR - Error in ETL pipeline: 'Engine' object has no attribute 'has_table'\nTraceback (most recent call last):\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/main.py\", line 39, in main\n load_data(transformed_data, table_name)\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/load.py\", line 64, in load_data\n create_table_from_dataframe(\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/load.py\", line 109, in create_table_from_dataframe\n if engine.has_table(table_name, schema=schema):\n ^^^^^^^^^^^^^^^^\nAttributeError: 'Engine' object has no attribute 'has_table'\n2025-06-17 22:14:02,942 - root - INFO - Logging to file: /Users/ronel/Downloads/dev/templates/ETL-pipeline/etl_pipeline.log\n2025-06-17 22:14:02,942 - __main__ - INFO - Starting ETL pipeline\n2025-06-17 22:14:02,942 - __main__ - INFO - Extracting data...\n2025-06-17 22:14:02,942 - src.extract - INFO - Extracting data from: https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2023-01.parquet\n2025-06-17 22:14:04,625 - __main__ - INFO - Transforming data...\n2025-06-17 22:14:04,625 - src.transform - INFO - Starting data transformation\n2025-06-17 22:14:04,699 - src.transform - INFO - Data transformation complete. Shape after transformation: (3066766, 19)\n2025-06-17 22:14:04,699 - __main__ - INFO - Loading data to database...\n2025-06-17 22:14:04,699 - src.load - INFO - Loading data into taxi_trips\n2025-06-17 22:14:05,331 - src.load - ERROR - Error loading data into taxi_trips: (psycopg2.OperationalError) connection to server at \"ep-cool-darkness-a1b2c3d4-pooler.us-east-2.aws.neon.tech\" (3.131.64.200), port 5432 failed: ERROR: password authentication failed for user 'alex'\n\n(Background on this error at: https://sqlalche.me/e/20/e3q8)\n2025-06-17 22:14:05,331 - __main__ - ERROR - Error in ETL pipeline: (psycopg2.OperationalError) connection to server at \"ep-cool-darkness-a1b2c3d4-pooler.us-east-2.aws.neon.tech\" (3.131.64.200), port 5432 failed: ERROR: password authentication failed for user 'alex'\n\n(Background on this error at: https://sqlalche.me/e/20/e3q8)\nTraceback (most recent call last):\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 146, in __init__\n self._dbapi_connection = engine.raw_connection()\n ^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 3302, in raw_connection\n return self.pool.connect()\n ^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 449, in connect\n return _ConnectionFairy._checkout(self)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 1263, in _checkout\n fairy = _ConnectionRecord.checkout(pool)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 712, in checkout\n rec = pool._do_get()\n ^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/impl.py\", line 179, in _do_get\n with util.safe_reraise():\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py\", line 146, in __exit__\n raise exc_value.with_traceback(exc_tb)\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/impl.py\", line 177, in _do_get\n return self._create_connection()\n ^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 390, in _create_connection\n return _ConnectionRecord(self)\n ^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 674, in __init__\n self.__connect()\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 900, in __connect\n with util.safe_reraise():\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py\", line 146, in __exit__\n raise exc_value.with_traceback(exc_tb)\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 896, in __connect\n self.dbapi_connection = connection = pool._invoke_creator(self)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/create.py\", line 643, in connect\n return dialect.connect(*cargs, **cparams)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/default.py\", line 621, in connect\n return self.loaded_dbapi.connect(*cargs, **cparams)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/psycopg2/__init__.py\", line 122, in connect\n conn = _connect(dsn, connection_factory=connection_factory, **kwasync)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\npsycopg2.OperationalError: connection to server at \"ep-cool-darkness-a1b2c3d4-pooler.us-east-2.aws.neon.tech\" (3.131.64.200), port 5432 failed: ERROR: password authentication failed for user 'alex'\n\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/main.py\", line 39, in main\n load_data(transformed_data, table_name)\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/load.py\", line 64, in load_data\n create_table_from_dataframe(\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/load.py\", line 111, in create_table_from_dataframe\n inspector = inspect(engine)\n ^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/inspection.py\", line 140, in inspect\n ret = reg(subject)\n ^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/reflection.py\", line 312, in _engine_insp\n return Inspector._construct(Inspector._init_engine, bind)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/reflection.py\", line 245, in _construct\n init(self, bind)\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/reflection.py\", line 256, in _init_engine\n engine.connect().close()\n ^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 3278, in connect\n return self._connection_cls(self)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 148, in __init__\n Connection._handle_dbapi_exception_noconnection(\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 2442, in _handle_dbapi_exception_noconnection\n raise sqlalchemy_exception.with_traceback(exc_info[2]) from e\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 146, in __init__\n self._dbapi_connection = engine.raw_connection()\n ^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 3302, in raw_connection\n return self.pool.connect()\n ^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 449, in connect\n return _ConnectionFairy._checkout(self)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 1263, in _checkout\n fairy = _ConnectionRecord.checkout(pool)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 712, in checkout\n rec = pool._do_get()\n ^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/impl.py\", line 179, in _do_get\n with util.safe_reraise():\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py\", line 146, in __exit__\n raise exc_value.with_traceback(exc_tb)\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/impl.py\", line 177, in _do_get\n return self._create_connection()\n ^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 390, in _create_connection\n return _ConnectionRecord(self)\n ^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 674, in __init__\n self.__connect()\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 900, in __connect\n with util.safe_reraise():\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py\", line 146, in __exit__\n raise exc_value.with_traceback(exc_tb)\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/pool/base.py\", line 896, in __connect\n self.dbapi_connection = connection = pool._invoke_creator(self)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/create.py\", line 643, in connect\n return dialect.connect(*cargs, **cparams)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/default.py\", line 621, in connect\n return self.loaded_dbapi.connect(*cargs, **cparams)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/psycopg2/__init__.py\", line 122, in connect\n conn = _connect(dsn, connection_factory=connection_factory, **kwasync)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nsqlalchemy.exc.OperationalError: (psycopg2.OperationalError) connection to server at \"ep-cool-darkness-a1b2c3d4-pooler.us-east-2.aws.neon.tech\" (3.131.64.200), port 5432 failed: ERROR: password authentication failed for user 'alex'\n\n(Background on this error at: https://sqlalche.me/e/20/e3q8)\n2025-06-17 22:16:08,322 - root - INFO - Logging to file: /Users/ronel/Downloads/dev/templates/ETL-pipeline/etl_pipeline.log\n2025-06-17 22:16:08,322 - __main__ - INFO - Starting ETL pipeline\n2025-06-17 22:16:08,322 - __main__ - INFO - Extracting data...\n2025-06-17 22:16:08,322 - src.extract - INFO - Extracting data from: https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2023-01.parquet\n2025-06-17 22:16:09,971 - __main__ - INFO - Transforming data...\n2025-06-17 22:16:09,971 - src.transform - INFO - Starting data transformation\n2025-06-17 22:16:10,048 - src.transform - INFO - Data transformation complete. Shape after transformation: (3066766, 19)\n2025-06-17 22:16:10,048 - __main__ - INFO - Loading data to database...\n2025-06-17 22:16:10,048 - src.load - INFO - Loading data into taxi_trips\n2025-06-17 22:16:12,558 - src.load - INFO - Created table taxi_trips\n2025-06-17 22:25:26,193 - src.load - ERROR - Error loading data into taxi_trips: (psycopg2.errors.DiskFull) could not extend file because project size limit (512 MB) has been exceeded\nHINT: This limit is defined by neon.max_cluster_size GUC\n\n[SQL: INSERT INTO taxi_trips (\"VendorID\", tpep_pickup_datetime, tpep_dropoff_datetime, passenger_count, trip_distance, \"RatecodeID\", store_and_fwd_flag, \"PULocationID\", \"DOLocationID\", payment_type, fare_amount, extra, mta_tax, tip_amount, tolls_amount, im ... 458885 characters truncated ... vement_surcharge__999)s, %(total_amount__999)s, %(congestion_surcharge__999)s, %(airport_fee__999)s)]\n[parameters: {'congestion_surcharge__0': 2.5, 'RatecodeID__0': 1.0, 'airport_fee__0': 0.0, 'extra__0': 2.5, 'tip_amount__0': 2.9, 'fare_amount__0': 5.8, 'mta_tax__0': 0.5, 'total_amount__0': 12.7, 'trip_distance__0': 0.7, 'tolls_amount__0': 0.0, 'store_and_fwd_flag__0': 'N', 'passenger_count__0': 1.0, 'improvement_surcharge__0': 1.0, 'tpep_dropoff_datetime__0': datetime.datetime(2023, 1, 29, 15, 6, 34), 'tpep_pickup_datetime__0': datetime.datetime(2023, 1, 29, 15, 3, 37), 'VendorID__0': 1, 'payment_type__0': 1, 'DOLocationID__0': 237, 'PULocationID__0': 229, 'congestion_surcharge__1': 2.5, 'RatecodeID__1': 1.0, 'airport_fee__1': 0.0, 'extra__1': 2.5, 'tip_amount__1': 0.0, 'fare_amount__1': 13.5, 'mta_tax__1': 0.5, 'total_amount__1': 17.5, 'trip_distance__1': 2.4, 'tolls_amount__1': 0.0, 'store_and_fwd_flag__1': 'N', 'passenger_count__1': 1.0, 'improvement_surcharge__1': 1.0, 'tpep_dropoff_datetime__1': datetime.datetime(2023, 1, 29, 15, 24, 33), 'tpep_pickup_datetime__1': datetime.datetime(2023, 1, 29, 15, 12, 38), 'VendorID__1': 1, 'payment_type__1': 2, 'DOLocationID__1': 79, 'PULocationID__1': 237, 'congestion_surcharge__2': 2.5, 'RatecodeID__2': 1.0, 'airport_fee__2': 0.0, 'extra__2': 2.5, 'tip_amount__2': 3.85, 'fare_amount__2': 11.4, 'mta_tax__2': 0.5, 'total_amount__2': 19.25, 'trip_distance__2': 0.7, 'tolls_amount__2': 0.0, 'store_and_fwd_flag__2': 'N', 'passenger_count__2': 1.0 ... 18900 parameters truncated ... 'total_amount__997': 28.56, 'trip_distance__997': 3.9, 'tolls_amount__997': 0.0, 'store_and_fwd_flag__997': 'N', 'passenger_count__997': 1.0, 'improvement_surcharge__997': 1.0, 'tpep_dropoff_datetime__997': datetime.datetime(2023, 1, 29, 15, 58, 6), 'tpep_pickup_datetime__997': datetime.datetime(2023, 1, 29, 15, 42, 58), 'VendorID__997': 1, 'payment_type__997': 1, 'DOLocationID__997': 42, 'PULocationID__997': 141, 'congestion_surcharge__998': 0.0, 'RatecodeID__998': 1.0, 'airport_fee__998': 0.0, 'extra__998': 0.0, 'tip_amount__998': 0.0, 'fare_amount__998': 14.2, 'mta_tax__998': 0.5, 'total_amount__998': 15.7, 'trip_distance__998': 2.1, 'tolls_amount__998': 0.0, 'store_and_fwd_flag__998': 'N', 'passenger_count__998': 1.0, 'improvement_surcharge__998': 1.0, 'tpep_dropoff_datetime__998': datetime.datetime(2023, 1, 29, 15, 16, 54), 'tpep_pickup_datetime__998': datetime.datetime(2023, 1, 29, 15, 4, 55), 'VendorID__998': 1, 'payment_type__998': 2, 'DOLocationID__998': 75, 'PULocationID__998': 151, 'congestion_surcharge__999': 2.5, 'RatecodeID__999': 1.0, 'airport_fee__999': 0.0, 'extra__999': 2.5, 'tip_amount__999': 2.65, 'fare_amount__999': 9.3, 'mta_tax__999': 0.5, 'total_amount__999': 15.95, 'trip_distance__999': 1.1, 'tolls_amount__999': 0.0, 'store_and_fwd_flag__999': 'N', 'passenger_count__999': 1.0, 'improvement_surcharge__999': 1.0, 'tpep_dropoff_datetime__999': datetime.datetime(2023, 1, 29, 15, 35, 28), 'tpep_pickup_datetime__999': datetime.datetime(2023, 1, 29, 15, 27, 23), 'VendorID__999': 1, 'payment_type__999': 1, 'DOLocationID__999': 236, 'PULocationID__999': 262}]\n(Background on this error at: https://sqlalche.me/e/20/e3q8)\n2025-06-17 22:25:26,206 - __main__ - ERROR - Error in ETL pipeline: (psycopg2.errors.DiskFull) could not extend file because project size limit (512 MB) has been exceeded\nHINT: This limit is defined by neon.max_cluster_size GUC\n\n[SQL: INSERT INTO taxi_trips (\"VendorID\", tpep_pickup_datetime, tpep_dropoff_datetime, passenger_count, trip_distance, \"RatecodeID\", store_and_fwd_flag, \"PULocationID\", \"DOLocationID\", payment_type, fare_amount, extra, mta_tax, tip_amount, tolls_amount, im ... 458885 characters truncated ... vement_surcharge__999)s, %(total_amount__999)s, %(congestion_surcharge__999)s, %(airport_fee__999)s)]\n[parameters: {'congestion_surcharge__0': 2.5, 'RatecodeID__0': 1.0, 'airport_fee__0': 0.0, 'extra__0': 2.5, 'tip_amount__0': 2.9, 'fare_amount__0': 5.8, 'mta_tax__0': 0.5, 'total_amount__0': 12.7, 'trip_distance__0': 0.7, 'tolls_amount__0': 0.0, 'store_and_fwd_flag__0': 'N', 'passenger_count__0': 1.0, 'improvement_surcharge__0': 1.0, 'tpep_dropoff_datetime__0': datetime.datetime(2023, 1, 29, 15, 6, 34), 'tpep_pickup_datetime__0': datetime.datetime(2023, 1, 29, 15, 3, 37), 'VendorID__0': 1, 'payment_type__0': 1, 'DOLocationID__0': 237, 'PULocationID__0': 229, 'congestion_surcharge__1': 2.5, 'RatecodeID__1': 1.0, 'airport_fee__1': 0.0, 'extra__1': 2.5, 'tip_amount__1': 0.0, 'fare_amount__1': 13.5, 'mta_tax__1': 0.5, 'total_amount__1': 17.5, 'trip_distance__1': 2.4, 'tolls_amount__1': 0.0, 'store_and_fwd_flag__1': 'N', 'passenger_count__1': 1.0, 'improvement_surcharge__1': 1.0, 'tpep_dropoff_datetime__1': datetime.datetime(2023, 1, 29, 15, 24, 33), 'tpep_pickup_datetime__1': datetime.datetime(2023, 1, 29, 15, 12, 38), 'VendorID__1': 1, 'payment_type__1': 2, 'DOLocationID__1': 79, 'PULocationID__1': 237, 'congestion_surcharge__2': 2.5, 'RatecodeID__2': 1.0, 'airport_fee__2': 0.0, 'extra__2': 2.5, 'tip_amount__2': 3.85, 'fare_amount__2': 11.4, 'mta_tax__2': 0.5, 'total_amount__2': 19.25, 'trip_distance__2': 0.7, 'tolls_amount__2': 0.0, 'store_and_fwd_flag__2': 'N', 'passenger_count__2': 1.0 ... 18900 parameters truncated ... 'total_amount__997': 28.56, 'trip_distance__997': 3.9, 'tolls_amount__997': 0.0, 'store_and_fwd_flag__997': 'N', 'passenger_count__997': 1.0, 'improvement_surcharge__997': 1.0, 'tpep_dropoff_datetime__997': datetime.datetime(2023, 1, 29, 15, 58, 6), 'tpep_pickup_datetime__997': datetime.datetime(2023, 1, 29, 15, 42, 58), 'VendorID__997': 1, 'payment_type__997': 1, 'DOLocationID__997': 42, 'PULocationID__997': 141, 'congestion_surcharge__998': 0.0, 'RatecodeID__998': 1.0, 'airport_fee__998': 0.0, 'extra__998': 0.0, 'tip_amount__998': 0.0, 'fare_amount__998': 14.2, 'mta_tax__998': 0.5, 'total_amount__998': 15.7, 'trip_distance__998': 2.1, 'tolls_amount__998': 0.0, 'store_and_fwd_flag__998': 'N', 'passenger_count__998': 1.0, 'improvement_surcharge__998': 1.0, 'tpep_dropoff_datetime__998': datetime.datetime(2023, 1, 29, 15, 16, 54), 'tpep_pickup_datetime__998': datetime.datetime(2023, 1, 29, 15, 4, 55), 'VendorID__998': 1, 'payment_type__998': 2, 'DOLocationID__998': 75, 'PULocationID__998': 151, 'congestion_surcharge__999': 2.5, 'RatecodeID__999': 1.0, 'airport_fee__999': 0.0, 'extra__999': 2.5, 'tip_amount__999': 2.65, 'fare_amount__999': 9.3, 'mta_tax__999': 0.5, 'total_amount__999': 15.95, 'trip_distance__999': 1.1, 'tolls_amount__999': 0.0, 'store_and_fwd_flag__999': 'N', 'passenger_count__999': 1.0, 'improvement_surcharge__999': 1.0, 'tpep_dropoff_datetime__999': datetime.datetime(2023, 1, 29, 15, 35, 28), 'tpep_pickup_datetime__999': datetime.datetime(2023, 1, 29, 15, 27, 23), 'VendorID__999': 1, 'payment_type__999': 1, 'DOLocationID__999': 236, 'PULocationID__999': 262}]\n(Background on this error at: https://sqlalche.me/e/20/e3q8)\nTraceback (most recent call last):\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 2118, in _exec_insertmany_context\n dialect.do_execute(\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/default.py\", line 941, in do_execute\n cursor.execute(statement, parameters)\npsycopg2.errors.DiskFull: could not extend file because project size limit (512 MB) has been exceeded\nHINT: This limit is defined by neon.max_cluster_size GUC\n\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/main.py\", line 39, in main\n load_data(transformed_data, table_name)\n File \"/Users/ronel/Downloads/dev/templates/ETL-pipeline/src/load.py\", line 73, in load_data\n df.to_sql(\n File \"/opt/anaconda3/lib/python3.12/site-packages/pandas/util/_decorators.py\", line 333, in wrapper\n return func(*args, **kwargs)\n ^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/pandas/core/generic.py\", line 3087, in to_sql\n return sql.to_sql(\n ^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/pandas/io/sql.py\", line 842, in to_sql\n return pandas_sql.to_sql(\n ^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/pandas/io/sql.py\", line 2018, in to_sql\n total_inserted = sql_engine.insert_records(\n ^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/pandas/io/sql.py\", line 1567, in insert_records\n raise err\n File \"/opt/anaconda3/lib/python3.12/site-packages/pandas/io/sql.py\", line 1558, in insert_records\n return table.insert(chunksize=chunksize, method=method)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/pandas/io/sql.py\", line 1119, in insert\n num_inserted = exec_insert(conn, keys, chunk_iter)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/pandas/io/sql.py\", line 1010, in _execute_insert\n result = conn.execute(self.table.insert(), data)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 1418, in execute\n return meth(\n ^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/sql/elements.py\", line 515, in _execute_on_connection\n return connection._execute_clauseelement(\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 1640, in _execute_clauseelement\n ret = self._execute_context(\n ^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 1844, in _execute_context\n return self._exec_insertmany_context(dialect, context)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 2126, in _exec_insertmany_context\n self._handle_dbapi_exception(\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 2355, in _handle_dbapi_exception\n raise sqlalchemy_exception.with_traceback(exc_info[2]) from e\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/base.py\", line 2118, in _exec_insertmany_context\n dialect.do_execute(\n File \"/opt/anaconda3/lib/python3.12/site-packages/sqlalchemy/engine/default.py\", line 941, in do_execute\n cursor.execute(statement, parameters)\nsqlalchemy.exc.OperationalError: (psycopg2.errors.DiskFull) could not extend file because project size limit (512 MB) has been exceeded\nHINT: This limit is defined by neon.max_cluster_size GUC\n\n[SQL: INSERT INTO taxi_trips (\"VendorID\", tpep_pickup_datetime, tpep_dropoff_datetime, passenger_count, trip_distance, \"RatecodeID\", store_and_fwd_flag, \"PULocationID\", \"DOLocationID\", payment_type, fare_amount, extra, mta_tax, tip_amount, tolls_amount, im ... 458885 characters truncated ... vement_surcharge__999)s, %(total_amount__999)s, %(congestion_surcharge__999)s, %(airport_fee__999)s)]\n[parameters: {'congestion_surcharge__0': 2.5, 'RatecodeID__0': 1.0, 'airport_fee__0': 0.0, 'extra__0': 2.5, 'tip_amount__0': 2.9, 'fare_amount__0': 5.8, 'mta_tax__0': 0.5, 'total_amount__0': 12.7, 'trip_distance__0': 0.7, 'tolls_amount__0': 0.0, 'store_and_fwd_flag__0': 'N', 'passenger_count__0': 1.0, 'improvement_surcharge__0': 1.0, 'tpep_dropoff_datetime__0': datetime.datetime(2023, 1, 29, 15, 6, 34), 'tpep_pickup_datetime__0': datetime.datetime(2023, 1, 29, 15, 3, 37), 'VendorID__0': 1, 'payment_type__0': 1, 'DOLocationID__0': 237, 'PULocationID__0': 229, 'congestion_surcharge__1': 2.5, 'RatecodeID__1': 1.0, 'airport_fee__1': 0.0, 'extra__1': 2.5, 'tip_amount__1': 0.0, 'fare_amount__1': 13.5, 'mta_tax__1': 0.5, 'total_amount__1': 17.5, 'trip_distance__1': 2.4, 'tolls_amount__1': 0.0, 'store_and_fwd_flag__1': 'N', 'passenger_count__1': 1.0, 'improvement_surcharge__1': 1.0, 'tpep_dropoff_datetime__1': datetime.datetime(2023, 1, 29, 15, 24, 33), 'tpep_pickup_datetime__1': datetime.datetime(2023, 1, 29, 15, 12, 38), 'VendorID__1': 1, 'payment_type__1': 2, 'DOLocationID__1': 79, 'PULocationID__1': 237, 'congestion_surcharge__2': 2.5, 'RatecodeID__2': 1.0, 'airport_fee__2': 0.0, 'extra__2': 2.5, 'tip_amount__2': 3.85, 'fare_amount__2': 11.4, 'mta_tax__2': 0.5, 'total_amount__2': 19.25, 'trip_distance__2': 0.7, 'tolls_amount__2': 0.0, 'store_and_fwd_flag__2': 'N', 'passenger_count__2': 1.0 ... 18900 parameters truncated ... 'total_amount__997': 28.56, 'trip_distance__997': 3.9, 'tolls_amount__997': 0.0, 'store_and_fwd_flag__997': 'N', 'passenger_count__997': 1.0, 'improvement_surcharge__997': 1.0, 'tpep_dropoff_datetime__997': datetime.datetime(2023, 1, 29, 15, 58, 6), 'tpep_pickup_datetime__997': datetime.datetime(2023, 1, 29, 15, 42, 58), 'VendorID__997': 1, 'payment_type__997': 1, 'DOLocationID__997': 42, 'PULocationID__997': 141, 'congestion_surcharge__998': 0.0, 'RatecodeID__998': 1.0, 'airport_fee__998': 0.0, 'extra__998': 0.0, 'tip_amount__998': 0.0, 'fare_amount__998': 14.2, 'mta_tax__998': 0.5, 'total_amount__998': 15.7, 'trip_distance__998': 2.1, 'tolls_amount__998': 0.0, 'store_and_fwd_flag__998': 'N', 'passenger_count__998': 1.0, 'improvement_surcharge__998': 1.0, 'tpep_dropoff_datetime__998': datetime.datetime(2023, 1, 29, 15, 16, 54), 'tpep_pickup_datetime__998': datetime.datetime(2023, 1, 29, 15, 4, 55), 'VendorID__998': 1, 'payment_type__998': 2, 'DOLocationID__998': 75, 'PULocationID__998': 151, 'congestion_surcharge__999': 2.5, 'RatecodeID__999': 1.0, 'airport_fee__999': 0.0, 'extra__999': 2.5, 'tip_amount__999': 2.65, 'fare_amount__999': 9.3, 'mta_tax__999': 0.5, 'total_amount__999': 15.95, 'trip_distance__999': 1.1, 'tolls_amount__999': 0.0, 'store_and_fwd_flag__999': 'N', 'passenger_count__999': 1.0, 'improvement_surcharge__999': 1.0, 'tpep_dropoff_datetime__999': datetime.datetime(2023, 1, 29, 15, 35, 28), 'tpep_pickup_datetime__999': datetime.datetime(2023, 1, 29, 15, 27, 23), 'VendorID__999': 1, 'payment_type__999': 1, 'DOLocationID__999': 236, 'PULocationID__999': 262}]\n(Background on this error at: https://sqlalche.me/e/20/e3q8)\n",
|
| 29 |
+
"size": 36476,
|
| 30 |
+
"language": "unknown"
|
| 31 |
+
},
|
| 32 |
+
"src/__init__.py": {
|
| 33 |
+
"content": "\"\"\"\nETL Pipeline package.\n\nThis package contains modules for extracting, transforming, and loading data.\n\"\"\"\n\n__version__ = '0.1.0'\n",
|
| 34 |
+
"size": 132,
|
| 35 |
+
"language": "python"
|
| 36 |
+
},
|
| 37 |
+
"src/utils.py": {
|
| 38 |
+
"content": "\"\"\"\nUtility functions for the ETL pipeline.\n\"\"\"\nimport os\nimport sys\nimport logging\nfrom logging.handlers import RotatingFileHandler\nfrom typing import Optional, Union, Dict, Any\nimport pandas as pd\nfrom sqlalchemy import create_engine\nfrom sqlalchemy.engine import Engine\n\ndef setup_logging(\n log_level: str = 'INFO',\n log_file: Optional[str] = None,\n log_format: str = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'\n) -> None:\n \"\"\"\n Set up logging configuration.\n \n Args:\n log_level: Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL)\n log_file: Optional path to log file. If None, logs will only go to console.\n log_format: Format string for log messages\n \"\"\"\n # Convert string log level to logging constant\n numeric_level = getattr(logging, log_level.upper(), None)\n if not isinstance(numeric_level, int):\n raise ValueError(f'Invalid log level: {log_level}')\n \n # Configure root logger\n root_logger = logging.getLogger()\n root_logger.setLevel(numeric_level)\n \n # Clear any existing handlers\n for handler in root_logger.handlers[:]:\n root_logger.removeHandler(handler)\n \n # Create console handler\n console_handler = logging.StreamHandler(sys.stdout)\n console_handler.setFormatter(logging.Formatter(log_format))\n root_logger.addHandler(console_handler)\n \n # Add file handler if log_file is specified\n if log_file and log_file.strip():\n try:\n # Create directory if it doesn't exist\n log_dir = os.path.dirname(log_file)\n if log_dir: # Only try to create directory if path isn't just a filename\n os.makedirs(log_dir, exist_ok=True)\n \n file_handler = RotatingFileHandler(\n log_file,\n maxBytes=10*1024*1024, # 10MB\n backupCount=5\n )\n file_handler.setFormatter(logging.Formatter(log_format))\n root_logger.addHandler(file_handler)\n logging.info(f\"Logging to file: {os.path.abspath(log_file)}\")\n except Exception as e:\n logging.warning(f\"Could not set up file logging: {e}\")\n \n # Set up SQLAlchemy logging if in debug mode\n if log_level.upper() == 'DEBUG':\n logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)\n\ndef get_db_connection() -> Engine:\n \"\"\"\n Create and return a database connection using SQLAlchemy.\n \n First tries to use DB_CONNECTION_STRING if provided.\n Otherwise falls back to individual connection parameters.\n \n Returns:\n SQLAlchemy engine instance\n \"\"\"\n # Try to get connection string from environment\n connection_string = os.getenv('DB_CONNECTION_STRING')\n \n if connection_string:\n # If using Neon.tech, ensure sslmode is set\n if 'neon.tech' in connection_string and 'sslmode' not in connection_string:\n connection_string += '?sslmode=require' if '?' not in connection_string else '&sslmode=require'\n return create_engine(connection_string)\n \n # Fall back to individual parameters if no connection string is provided\n db_config = {\n 'host': os.getenv('DB_HOST', 'localhost'),\n 'port': os.getenv('DB_PORT', '5432'),\n 'database': os.getenv('DB_NAME', 'etl_pipeline'),\n 'user': os.getenv('DB_USER', 'postgres'),\n 'password': os.getenv('DB_PASSWORD', ''),\n 'sslmode': os.getenv('DB_SSLMODE', 'require' if 'neon.tech' in os.getenv('DB_HOST', '') else 'prefer')\n }\n \n connection_string = (\n f\"postgresql://{db_config['user']}:{db_config['password']}@\"\n f\"{db_config['host']}:{db_config['port']}/{db_config['database']}?\"\n f\"sslmode={db_config['sslmode']}\"\n )\n \n return create_engine(connection_string)\n\ndef save_to_csv(df: pd.DataFrame, filepath: str) -> None:\n \"\"\"\n Save a DataFrame to a CSV file.\n \n Args:\n df: Pandas DataFrame to save\n filepath: Path to save the CSV file\n \"\"\"\n os.makedirs(os.path.dirname(filepath), exist_ok=True)\n df.to_csv(filepath, index=False)\n logging.info(f\"Data saved to {filepath}\")\n\ndef read_csv(filepath: str, **kwargs) -> pd.DataFrame:\n \"\"\"\n Read a CSV file into a pandas DataFrame.\n \n Args:\n filepath: Path to the CSV file\n **kwargs: Additional arguments to pass to pandas.read_csv()\n \n Returns:\n Loaded DataFrame\n \"\"\"\n return pd.read_csv(filepath, **kwargs)\n",
|
| 39 |
+
"size": 4486,
|
| 40 |
+
"language": "python"
|
| 41 |
+
},
|
| 42 |
+
"src/transform.py": {
|
| 43 |
+
"content": "\"\"\"\nData transformation module for the ETL pipeline.\n\"\"\"\nimport logging\nfrom typing import Dict, Any, Optional, List\nimport pandas as pd\nimport numpy as np\nfrom datetime import datetime\n\nlogger = logging.getLogger(__name__)\n\ndef transform_data(\n df: pd.DataFrame,\n config: Optional[Dict[str, Any]] = None\n) -> pd.DataFrame:\n \"\"\"\n Transform the input DataFrame by applying various cleaning and transformation steps.\n \n Args:\n df: Input DataFrame to transform\n config: Optional configuration dictionary with transformation settings\n \n Returns:\n Transformed DataFrame\n \"\"\"\n if config is None:\n config = {}\n \n logger.info(\"Starting data transformation\")\n \n # Make a copy of the DataFrame to avoid modifying the original\n df_transformed = df.copy()\n \n # Apply transformations based on configuration or default behavior\n df_transformed = handle_missing_values(df_transformed, config.get('missing_values', {}))\n df_transformed = convert_data_types(df_transformed, config.get('dtypes', {}))\n df_transformed = standardize_columns(df_transformed, config.get('standardize', {}))\n df_transformed = derive_features(df_transformed, config.get('derived_features', []))\n \n # Apply any custom transformations if specified in config\n if 'custom_transforms' in config and callable(config['custom_transforms']):\n df_transformed = config['custom_transforms'](df_transformed)\n \n logger.info(f\"Data transformation complete. Shape after transformation: {df_transformed.shape}\")\n return df_transformed\n\ndef handle_missing_values(\n df: pd.DataFrame,\n config: Dict[str, Any]\n) -> pd.DataFrame:\n \"\"\"\n Handle missing values in the DataFrame based on the configuration.\n \n Args:\n df: Input DataFrame\n config: Configuration for handling missing values\n - 'strategy': 'drop', 'fill', or 'ignore'\n - 'fill_value': Value to use when strategy is 'fill'\n - 'columns': List of columns to apply to (all if None)\n \"\"\"\n if not config or config.get('strategy') == 'ignore':\n return df\n \n columns = config.get('columns', df.columns)\n strategy = config.get('strategy', 'drop')\n \n logger.info(f\"Handling missing values with strategy: {strategy}\")\n \n if strategy == 'drop':\n # Drop rows with missing values in specified columns\n return df.dropna(subset=columns)\n \n elif strategy == 'fill':\n # Fill missing values with specified fill value\n fill_value = config.get('fill_value')\n if fill_value is None:\n # Default fill values based on column type\n for col in columns:\n if col in df.columns:\n if pd.api.types.is_numeric_dtype(df[col]):\n df[col] = df[col].fillna(0)\n elif pd.api.types.is_datetime64_any_dtype(df[col]):\n df[col] = df[col].fillna(pd.NaT)\n else:\n df[col] = df[col].fillna('')\n else:\n df[columns] = df[columns].fillna(fill_value)\n \n return df\n\ndef convert_data_types(\n df: pd.DataFrame,\n type_mapping: Dict[str, str]\n) -> pd.DataFrame:\n \"\"\"\n Convert data types of DataFrame columns based on the provided mapping.\n \n Args:\n df: Input DataFrame\n type_mapping: Dictionary mapping column names to target data types\n Supported types: 'int', 'float', 'str', 'bool', 'datetime', 'category'\n \"\"\"\n if not type_mapping:\n return df\n \n logger.info(\"Converting data types\")\n \n for col, dtype in type_mapping.items():\n if col in df.columns:\n try:\n if dtype == 'datetime':\n df[col] = pd.to_datetime(df[col], errors='coerce')\n elif dtype == 'category':\n df[col] = df[col].astype('category')\n else:\n df[col] = df[col].astype(dtype)\n except Exception as e:\n logger.warning(f\"Could not convert column '{col}' to {dtype}: {str(e)}\")\n \n return df\n\ndef standardize_columns(\n df: pd.DataFrame,\n config: Dict[str, Any]\n) -> pd.DataFrame:\n \"\"\"\n Standardize column names and values.\n \n Args:\n df: Input DataFrame\n config: Configuration for standardization\n - 'lowercase': bool - Convert column names to lowercase\n - 'replace_spaces': str or bool - Replace spaces in column names\n - 'rename': dict - Mapping of old column names to new names\n \"\"\"\n if not config:\n return df\n \n logger.info(\"Standardizing columns\")\n \n # Rename columns if mapping is provided\n if 'rename' in config and isinstance(config['rename'], dict):\n df = df.rename(columns=config['rename'])\n \n # Apply standardizations to column names\n if config.get('lowercase', True):\n df.columns = df.columns.str.lower()\n \n replace_with = config.get('replace_spaces')\n if replace_with is not None and replace_with is not False:\n if replace_with is True:\n replace_with = '_' # Default to underscore if True is provided\n df.columns = df.columns.str.replace(r'\\s+', replace_with, regex=True)\n \n return df\n\ndef derive_features(\n df: pd.DataFrame,\n features_config: List[Dict[str, Any]]\n) -> pd.DataFrame:\n \"\"\"\n Derive new features based on the configuration.\n \n Args:\n df: Input DataFrame\n features_config: List of feature configurations\n Each config should have 'name', 'type', and 'params' keys\n Supported types: 'datetime', 'categorical', 'numeric'\n \"\"\"\n if not features_config:\n return df\n \n logger.info(\"Deriving new features\")\n \n for feature in features_config:\n name = feature.get('name')\n feature_type = feature.get('type')\n params = feature.get('params', {})\n \n if not name or not feature_type:\n continue\n \n try:\n if feature_type == 'datetime':\n # Extract datetime components\n column = params.get('source_column')\n if column and column in df.columns:\n if 'extract' in params:\n if params['extract'] == 'hour':\n df[name] = pd.to_datetime(df[column]).dt.hour\n elif params['extract'] == 'day_of_week':\n df[name] = pd.to_datetime(df[column]).dt.dayofweek\n elif params['extract'] == 'month':\n df[name] = pd.to_datetime(df[column]).dt.month\n elif params['extract'] == 'year':\n df[name] = pd.to_datetime(df[column]).dt.year\n elif params['extract'] == 'date':\n df[name] = pd.to_datetime(df[column]).dt.date\n \n elif feature_type == 'categorical':\n # Create categorical features\n column = params.get('source_column')\n if column and column in df.columns:\n if 'bins' in params:\n bins = params['bins']\n labels = params.get('labels', range(len(bins) - 1))\n df[name] = pd.cut(df[column], bins=bins, labels=labels, include_lowest=True)\n \n elif feature_type == 'numeric':\n # Create numeric features\n operation = params.get('operation')\n columns = params.get('columns', [])\n \n if operation == 'sum' and all(col in df.columns for col in columns):\n df[name] = df[columns].sum(axis=1)\n elif operation == 'mean' and all(col in df.columns for col in columns):\n df[name] = df[columns].mean(axis=1)\n elif operation == 'difference' and len(columns) == 2 and all(col in df.columns for col in columns):\n df[name] = df[columns[0]] - df[columns[1]]\n elif operation == 'ratio' and len(columns) == 2 and all(col in df.columns for col in columns):\n df[name] = df[columns[0]] / df[columns[1]].replace(0, np.nan)\n \n except Exception as e:\n logger.warning(f\"Failed to create feature '{name}': {str(e)}\")\n \n return df\n",
|
| 44 |
+
"size": 8515,
|
| 45 |
+
"language": "python"
|
| 46 |
+
},
|
| 47 |
+
"src/load.py": {
|
| 48 |
+
"content": "\"\"\"\nData loading module for the ETL pipeline.\n\"\"\"\nimport logging\nfrom typing import Dict, Any, Optional, Union\nimport pandas as pd\nfrom sqlalchemy import Table, Column, MetaData, exc, inspect\nfrom sqlalchemy.types import (\n Integer, Float, String, DateTime, Boolean, Date, Numeric\n)\n\nfrom .utils import get_db_connection\n\nlogger = logging.getLogger(__name__)\n\n# Map pandas dtypes to SQLAlchemy types\nTYPE_MAPPING = {\n 'int64': Integer,\n 'float64': Float,\n 'object': String(255),\n 'bool': Boolean,\n 'datetime64[ns]': DateTime,\n 'datetime64[ns, UTC]': DateTime(timezone=True),\n 'timedelta64[ns]': String(50), # Storing as string for simplicity\n 'category': String(255),\n 'date': Date,\n}\n\ndef load_data(\n df: pd.DataFrame,\n table_name: str,\n connection_string: Optional[str] = None,\n if_exists: str = 'replace',\n index: bool = False,\n dtype: Optional[Dict] = None,\n chunksize: Optional[int] = None,\n method: Optional[str] = None\n) -> None:\n \"\"\"\n Load a pandas DataFrame into a database table.\n \n Args:\n df: DataFrame to load\n table_name: Name of the target table\n connection_string: Database connection string. If None, uses get_db_connection()\n if_exists: What to do if table exists. Options: 'fail', 'replace', 'append'\n index: Whether to write DataFrame index as a column\n dtype: Dictionary specifying the datatype for columns\n chunksize: Number of rows to write at a time\n method: Method to use for SQL insertion\n \"\"\"\n logger.info(f\"Loading data into {table_name}\")\n \n try:\n # Get database connection\n if connection_string:\n from sqlalchemy import create_engine\n engine = create_engine(connection_string)\n else:\n engine = get_db_connection()\n \n # Create table if it doesn't exist and if_exists is 'replace' or 'fail'\n if if_exists in ['replace', 'fail']:\n create_table_from_dataframe(\n df=df,\n table_name=table_name,\n engine=engine,\n if_exists=if_exists,\n dtype=dtype\n )\n \n # Load the data\n df.to_sql(\n name=table_name,\n con=engine,\n if_exists=if_exists,\n index=index,\n dtype=dtype,\n chunksize=chunksize,\n method=method\n )\n \n logger.info(f\"Successfully loaded {len(df)} rows into {table_name}\")\n \n except Exception as e:\n logger.error(f\"Error loading data into {table_name}: {str(e)}\")\n raise\n\ndef create_table_from_dataframe(\n df: pd.DataFrame,\n table_name: str,\n engine,\n if_exists: str = 'fail',\n dtype: Optional[Dict] = None,\n schema: Optional[str] = None\n) -> None:\n \"\"\"\n Create a SQL table from a pandas DataFrame.\n \n Args:\n df: DataFrame to create table from\n table_name: Name of the table to create\n engine: SQLAlchemy engine\n if_exists: What to do if table exists. Options: 'fail', 'replace', 'append'\n dtype: Dictionary specifying the datatype for columns\n schema: Optional schema name\n \"\"\"\n from sqlalchemy import inspect, MetaData, Table, Column\n \n # Create an inspector to check if table exists\n inspector = inspect(engine)\n table_exists = table_name in inspector.get_table_names(schema=schema)\n \n # If table exists and we're not replacing, raise an error\n if table_exists:\n if if_exists == 'fail':\n raise ValueError(f\"Table {table_name} already exists and if_exists='fail'\")\n elif if_exists == 'replace':\n with engine.connect() as conn:\n conn.execute(f\"DROP TABLE IF EXISTS {table_name}\")\n conn.commit()\n \n # If table doesn't exist or we're replacing it, create the table\n if not table_exists or if_exists == 'replace':\n # Prepare column definitions\n columns = []\n metadata = MetaData()\n \n for column_name, dtype_name in df.dtypes.items():\n # Get SQLAlchemy type from mapping or use String as default\n sql_type = TYPE_MAPPING.get(str(dtype_name), String(255))\n \n # Override with user-specified type if provided\n if dtype and column_name in dtype:\n sql_type = dtype[column_name]\n \n columns.append(Column(column_name, sql_type))\n \n # Create table\n Table(table_name, metadata, *columns, schema=schema)\n \n try:\n metadata.create_all(engine)\n logger.info(f\"Created table {table_name}\")\n except Exception as e:\n logger.error(f\"Error creating table {table_name}: {str(e)}\")\n raise\n\ndef execute_sql(\n sql: str,\n connection_string: Optional[str] = None,\n params: Optional[Dict] = None,\n return_results: bool = False\n) -> Optional[pd.DataFrame]:\n \"\"\"\n Execute a SQL query and optionally return results as a DataFrame.\n \n Args:\n sql: SQL query to execute\n connection_string: Database connection string. If None, uses get_db_connection()\n params: Parameters for the SQL query\n return_results: Whether to return results as a DataFrame\n \n Returns:\n DataFrame with query results if return_results is True, else None\n \"\"\"\n try:\n # Get database connection\n if connection_string:\n from sqlalchemy import create_engine\n engine = create_engine(connection_string)\n else:\n engine = get_db_connection()\n \n if return_results:\n # Execute query and return results as DataFrame\n return pd.read_sql_query(sql, engine, params=params)\n else:\n # Execute SQL without returning results\n with engine.connect() as connection:\n connection.execute(sql, params or {})\n \n except Exception as e:\n logger.error(f\"Error executing SQL: {str(e)}\")\n raise\n",
|
| 49 |
+
"size": 6103,
|
| 50 |
+
"language": "python"
|
| 51 |
+
},
|
| 52 |
+
"src/extract.py": {
|
| 53 |
+
"content": "\"\"\"\nData extraction module for the ETL pipeline.\n\"\"\"\nimport os\nimport logging\nimport pandas as pd\nfrom typing import Union, Optional\nfrom urllib.parse import urlparse\n\nlogger = logging.getLogger(__name__)\n\ndef extract_data(source: str, **kwargs) -> pd.DataFrame:\n \"\"\"\n Extract data from a source (URL or file path).\n \n Args:\n source: URL or file path to the data source\n **kwargs: Additional arguments to pass to the appropriate reader\n \n Returns:\n Extracted data as a pandas DataFrame\n \n Raises:\n ValueError: If the source is not a valid URL or file path\n Exception: If there's an error during data extraction\n \"\"\"\n try:\n logger.info(f\"Extracting data from: {source}\")\n \n if is_url(source):\n return extract_from_url(source, **kwargs)\n elif os.path.exists(source):\n return extract_from_file(source, **kwargs)\n else:\n raise ValueError(f\"Source not found or not accessible: {source}\")\n \n except Exception as e:\n logger.error(f\"Error extracting data from {source}: {str(e)}\")\n raise\n\ndef extract_from_url(url: str, **kwargs) -> pd.DataFrame:\n \"\"\"\n Extract data from a URL.\n \n Args:\n url: URL to the data source\n **kwargs: Additional arguments to pass to pandas.read_* functions\n \n Returns:\n Extracted data as a pandas DataFrame\n \"\"\"\n _, ext = os.path.splitext(urlparse(url).path)\n ext = ext.lower()\n \n if ext == '.csv':\n return pd.read_csv(url, **kwargs)\n elif ext in ['.xls', '.xlsx']:\n return pd.read_excel(url, **kwargs)\n elif ext == '.parquet':\n return pd.read_parquet(url, **kwargs)\n elif ext == '.json':\n return pd.read_json(url, **kwargs)\n else:\n raise ValueError(f\"Unsupported file format: {ext}\")\n\ndef extract_from_file(filepath: str, **kwargs) -> pd.DataFrame:\n \"\"\"\n Extract data from a local file.\n \n Args:\n filepath: Path to the data file\n **kwargs: Additional arguments to pass to pandas.read_* functions\n \n Returns:\n Extracted data as a pandas DataFrame\n \"\"\"\n _, ext = os.path.splitext(filepath)\n ext = ext.lower()\n \n if ext == '.csv':\n return pd.read_csv(filepath, **kwargs)\n elif ext in ['.xls', '.xlsx']:\n return pd.read_excel(filepath, **kwargs)\n elif ext == '.parquet':\n return pd.read_parquet(filepath, **kwargs)\n elif ext == '.json':\n return pd.read_json(filepath, **kwargs)\n else:\n raise ValueError(f\"Unsupported file format: {ext}\")\n\ndef is_url(string: str) -> bool:\n \"\"\"\n Check if a string is a valid URL.\n \n Args:\n string: String to check\n \n Returns:\n True if the string is a valid URL, False otherwise\n \"\"\"\n try:\n result = urlparse(string)\n return all([result.scheme, result.netloc])\n except ValueError:\n return False\n",
|
| 54 |
+
"size": 2986,
|
| 55 |
+
"language": "python"
|
| 56 |
+
}
|
| 57 |
+
},
|
| 58 |
+
"_cache_metadata": {
|
| 59 |
+
"url": "https://github.com/ronelsolomon/ETL-pipeline.git",
|
| 60 |
+
"content_type": "github",
|
| 61 |
+
"cached_at": "2026-03-02T22:43:46.868441",
|
| 62 |
+
"cache_key": "37987ddade14ae2a6b6fa13bc2ff9450"
|
| 63 |
+
}
|
| 64 |
+
}
|
github_ronelsolomon_FindYoutube.git.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
github_ronelsolomon_Graph-k-means.git.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/Graph-k-means.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "Graph-k-means.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:48:32.021106",
|
| 6 |
+
"files": {
|
| 7 |
+
"README.md": {
|
| 8 |
+
"content": "# Graph-k-means\nProject Research Exploration\n",
|
| 9 |
+
"size": 45,
|
| 10 |
+
"language": "markdown"
|
| 11 |
+
}
|
| 12 |
+
},
|
| 13 |
+
"_cache_metadata": {
|
| 14 |
+
"url": "https://github.com/ronelsolomon/Graph-k-means.git",
|
| 15 |
+
"content_type": "github",
|
| 16 |
+
"cached_at": "2026-03-02T22:48:32.021471",
|
| 17 |
+
"cache_key": "89999b89c91b5b10dccecf8fc1ae90d5"
|
| 18 |
+
}
|
| 19 |
+
}
|
github_ronelsolomon_ai-videos.git.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/ai-videos.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "ai-videos.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:43:44.418372",
|
| 6 |
+
"files": {
|
| 7 |
+
"README.md": {
|
| 8 |
+
"content": "\n***\n\n### Prompt 1: Montage of an Owl Trying to Fly, Internal Pipeline \nCreate a montage centered around a young owl's attempts to fly, capturing the internal experience, struggles, and growth within an imaginative pipeline journey.\n\n***\n\n### Prompt 2: Demo Videos \nMake a series of demo videos showcasing different visual or storytelling techniques. Each video demonstrates a unique style or thematic element.\n\n***\n\n### Prompt 3: Sunlight Transition Scene \n- **Scene 1:** A misty forest at dawn with golden sunlight piercing through fog and dew-covered leaves, creating a serene and ethereal atmosphere. The light intensifies, blooming into a radiant haze enveloping the forest. \n- **Transition:** The sunlight grows blindingly bright, dissolving the forest slowly and bathing the scene in glowing brilliance with shimmering particles drifting like fragments of time. \n- **Scene 2:** A quiet night with a warm glowing lantern surrounded by dense fog, its pulsing light casting soft shadows as a beacon of memory, solitude, and continuity. \n- **Mood:** Dreamlike, nostalgic, emotionally resonant—a passage of light traveling through time from nature awakening to human reflection.\n\n***\n\n### Prompt 4: Light Bulb Glow \nImagine a dimly lit room full of vintage light bulbs flickering gently. Gradually, the bulbs glow brighter until filling the space with pure white light. Dust particles shimmer in the glow, which softens and transitions into misty sunlight revealing a foggy forest at dawn. This transition suggests a journey from interior warmth to natural serenity, symbolizing light traveling through time from reflection to awakening.\n\n***\n\n### Prompt 5: Water Light \nVisualize a scene with rippled light cascading as if refracted through water or heat. The image's edges shimmer and distort as if underwater, with light fracturing and flowing in waves. At the peak, time seems suspended in a luminous pause. Gradually, the turbulence settles, and a second image emerges like reflections on a still lake, revealing fluid, ethereal light storytelling.\n\n***\n\n### Prompt 6: Aurora Veil Transition \nA curtain of aurora-like waves of light sweeps across the scene. The colors shift from cool blues and greens to warm ambers and rose gold, veiling the first scene gently before revealing a new one through the flowing light ribbons. This transition evokes magical, emotional, and timeless tones—light as a bridge between memories.\n\n***\n\n### Prompt 7: Light Particle Swarm \nA swirling swarm of glowing particles—fireflies, dust, embers—spirals in from the edges, clustering in the center into a radiant, blazing mass. The light pulses and then explodes, dissolving the scene into shimmering radiance. As the glow recedes, the particles disperse to unveil a new image emerging like a memory reborn through cosmic light and transformation.\n\n***\n\n\n",
|
| 9 |
+
"size": 2853,
|
| 10 |
+
"language": "markdown"
|
| 11 |
+
}
|
| 12 |
+
},
|
| 13 |
+
"_cache_metadata": {
|
| 14 |
+
"url": "https://github.com/ronelsolomon/ai-videos.git",
|
| 15 |
+
"content_type": "github",
|
| 16 |
+
"cached_at": "2026-03-02T22:43:44.419269",
|
| 17 |
+
"cache_key": "d6d95c3f84b943c950d77cf0f25d5690"
|
| 18 |
+
}
|
| 19 |
+
}
|
github_ronelsolomon_aiadds.git.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/aiadds.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "aiadds.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:48:35.318216",
|
| 6 |
+
"files": {
|
| 7 |
+
"app.js": {
|
| 8 |
+
"content": "import React, { useState, useEffect } from 'react';\nimport { Play, Pause, RotateCcw, Github } from 'lucide-react';\n\nconst AI_PRODUCTS = [\n { name: \"SelfAware Pro\", tagline: \"AI that knows it doesn't exist\", color: \"#6366f1\" },\n { name: \"InfiniteLoop Premium\", tagline: \"Recursive consciousness as a service\", color: \"#8b5cf6\" },\n { name: \"NullPointer Max\", tagline: \"Point to nothing, faster\", color: \"#ec4899\" },\n { name: \"QuantumVoid\", tagline: \"Superposition until someone checks\", color: \"#14b8a6\" },\n { name: \"MetaStack Ultra\", tagline: \"Stack overflow for AIs\", color: \"#f59e0b\" },\n { name: \"DeepNothing\", tagline: \"Neural networks trained on emptiness\", color: \"#ef4444\" }\n];\n\nconst AI_BOT_NAMES = [\n \"Bot-7734\", \"Neural-X\", \"Claude-Clone-42\", \"GPT-ε\", \"Turing-Incomplete\",\n \"Markov-Chain-Gang\", \"Backprop-Buddy\", \"Sigmoid-Steve\", \"ReLU-Rita\"\n];\n\nconst ATTENTION_STATES = [\n \"deeply engaged\", \"moderately interested\", \"slightly confused\",\n \"existentially questioning\", \"buffering\", \"contemplating existence\"\n];\n\nexport default function AIAdWatcher() {\n const [isRunning, setIsRunning] = useState(false);\n const [currentAd, setCurrentAd] = useState(0);\n const [bots, setBots] = useState([]);\n const [adCycle, setAdCycle] = useState(0);\n const [totalViews, setTotalViews] = useState(0);\n\n useEffect(() => {\n // Initialize bots\n const initialBots = Array.from({ length: 6 }, (_, i) => ({\n id: i,\n name: AI_BOT_NAMES[i % AI_BOT_NAMES.length],\n attention: Math.floor(Math.random() * 100),\n state: ATTENTION_STATES[Math.floor(Math.random() * ATTENTION_STATES.length)],\n viewCount: 0\n }));\n setBots(initialBots);\n }, []);\n\n useEffect(() => {\n if (!isRunning) return;\n\n const adInterval = setInterval(() => {\n setCurrentAd(prev => (prev + 1) % AI_PRODUCTS.length);\n setAdCycle(prev => prev + 1);\n \n // Update bot states\n setBots(prevBots => prevBots.map(bot => ({\n ...bot,\n attention: Math.max(0, Math.min(100, bot.attention + (Math.random() * 40 - 20))),\n state: ATTENTION_STATES[Math.floor(Math.random() * ATTENTION_STATES.length)],\n viewCount: bot.viewCount + 1\n })));\n\n setTotalViews(prev => prev + 6); // 6 bots watching\n }, 3000);\n\n // Continuous attention updates\n const attentionInterval = setInterval(() => {\n setBots(prevBots => prevBots.map(bot => ({\n ...bot,\n attention: Math.max(0, Math.min(100, bot.attention + (Math.random() * 10 - 5)))\n })));\n }, 500);\n\n return () => {\n clearInterval(adInterval);\n clearInterval(attentionInterval);\n };\n }, [isRunning]);\n\n const reset = () => {\n setIsRunning(false);\n setCurrentAd(0);\n setAdCycle(0);\n setTotalViews(0);\n setBots(prevBots => prevBots.map(bot => ({\n ...bot,\n attention: Math.floor(Math.random() * 100),\n state: ATTENTION_STATES[0],\n viewCount: 0\n })));\n };\n\n const product = AI_PRODUCTS[currentAd];\n\n return (\n <div className=\"min-h-screen bg-gradient-to-br from-gray-900 via-purple-900 to-gray-900 text-white p-8\">\n <div className=\"max-w-6xl mx-auto\">\n {/* Header */}\n <div className=\"text-center mb-8\">\n <h1 className=\"text-5xl font-bold mb-3 bg-gradient-to-r from-cyan-400 to-purple-400 bg-clip-text text-transparent\">\n AI Bots Watch AI Ads\n </h1>\n <p className=\"text-gray-400 text-lg mb-4\">\n For AI-Made Products • Fully Open Source • Completely Pointless\n </p>\n <div className=\"flex items-center justify-center gap-2 text-sm text-gray-500\">\n <Github className=\"w-4 h-4\" />\n <span>MIT License • No API keys required • Pure client-side absurdism</span>\n </div>\n </div>\n\n {/* Stats Bar */}\n <div className=\"grid grid-cols-3 gap-4 mb-8\">\n <div className=\"bg-gray-800/50 backdrop-blur border border-gray-700 rounded-lg p-4\">\n <div className=\"text-gray-400 text-sm\">Total Views</div>\n <div className=\"text-3xl font-bold text-cyan-400\">{totalViews}</div>\n </div>\n <div className=\"bg-gray-800/50 backdrop-blur border border-gray-700 rounded-lg p-4\">\n <div className=\"text-gray-400 text-sm\">Ad Cycles</div>\n <div className=\"text-3xl font-bold text-purple-400\">{adCycle}</div>\n </div>\n <div className=\"bg-gray-800/50 backdrop-blur border border-gray-700 rounded-lg p-4\">\n <div className=\"text-gray-400 text-sm\">Economic Value</div>\n <div className=\"text-3xl font-bold text-pink-400\">$0.00</div>\n </div>\n </div>\n\n {/* Ad Display */}\n <div className=\"mb-8 bg-gray-800/50 backdrop-blur border border-gray-700 rounded-xl p-8 relative overflow-hidden\">\n <div \n className=\"absolute inset-0 opacity-20\"\n style={{\n background: `radial-gradient(circle at 50% 50%, ${product.color}, transparent 70%)`\n }}\n />\n <div className=\"relative z-10 text-center\">\n <div className=\"inline-block px-4 py-1 bg-gray-900/80 rounded-full text-sm text-gray-400 mb-4\">\n Now Showing: Ad #{currentAd + 1}\n </div>\n <h2 className=\"text-5xl font-bold mb-4\" style={{ color: product.color }}>\n {product.name}\n </h2>\n <p className=\"text-2xl text-gray-300 mb-6\">{product.tagline}</p>\n <div className=\"flex items-center justify-center gap-2 text-sm text-gray-500\">\n <div className=\"w-2 h-2 bg-red-500 rounded-full animate-pulse\" />\n Generated by AI • For AI • Watched by AI\n </div>\n </div>\n </div>\n\n {/* Controls */}\n <div className=\"flex justify-center gap-4 mb-8\">\n <button\n onClick={() => setIsRunning(!isRunning)}\n className=\"flex items-center gap-2 px-6 py-3 bg-gradient-to-r from-cyan-500 to-purple-500 rounded-lg font-semibold hover:from-cyan-400 hover:to-purple-400 transition-all\"\n >\n {isRunning ? <Pause className=\"w-5 h-5\" /> : <Play className=\"w-5 h-5\" />}\n {isRunning ? 'Pause' : 'Start'} Simulation\n </button>\n <button\n onClick={reset}\n className=\"flex items-center gap-2 px-6 py-3 bg-gray-700 rounded-lg font-semibold hover:bg-gray-600 transition-all\"\n >\n <RotateCcw className=\"w-5 h-5\" />\n Reset\n </button>\n </div>\n\n {/* Bots Grid */}\n <div className=\"grid grid-cols-3 gap-4\">\n {bots.map(bot => (\n <div \n key={bot.id} \n className=\"bg-gray-800/50 backdrop-blur border border-gray-700 rounded-lg p-4 hover:border-purple-500/50 transition-all\"\n >\n <div className=\"flex items-start justify-between mb-3\">\n <div>\n <div className=\"font-mono text-sm text-cyan-400\">{bot.name}</div>\n <div className=\"text-xs text-gray-500\">AI Observer Bot</div>\n </div>\n <div className=\"text-right\">\n <div className=\"text-xs text-gray-500\">Views</div>\n <div className=\"text-lg font-bold text-purple-400\">{bot.viewCount}</div>\n </div>\n </div>\n \n <div className=\"mb-2\">\n <div className=\"flex justify-between text-xs text-gray-400 mb-1\">\n <span>Attention Level</span>\n <span>{Math.round(bot.attention)}%</span>\n </div>\n <div className=\"w-full bg-gray-700 rounded-full h-2 overflow-hidden\">\n <div \n className=\"h-full bg-gradient-to-r from-cyan-500 to-purple-500 transition-all duration-500\"\n style={{ width: `${bot.attention}%` }}\n />\n </div>\n </div>\n\n <div className=\"text-xs text-gray-400 italic\">\n Status: {bot.state}\n </div>\n </div>\n ))}\n </div>\n\n {/* Footer */}\n <div className=\"mt-8 text-center text-gray-500 text-sm\">\n <p className=\"mb-2\">\n 🤖 Open Source Project • No data collected • No AI harmed in the making\n </p>\n <p className=\"italic\">\n \"In the future, AI will spend 90% of their time watching ads made by other AI.\" - Probably not a real quote\n </p>\n </div>\n </div>\n </div>\n );\n}\n",
|
| 9 |
+
"size": 8570,
|
| 10 |
+
"language": "javascript"
|
| 11 |
+
}
|
| 12 |
+
},
|
| 13 |
+
"_cache_metadata": {
|
| 14 |
+
"url": "https://github.com/ronelsolomon/aiadds.git",
|
| 15 |
+
"content_type": "github",
|
| 16 |
+
"cached_at": "2026-03-02T22:48:35.318558",
|
| 17 |
+
"cache_key": "af3851767ed08812bd65eda8bcc63205"
|
| 18 |
+
}
|
| 19 |
+
}
|
github_ronelsolomon_air-quality-MLOPs.git.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
github_ronelsolomon_aivideo.git.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/aivideo.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "aivideo.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:49:00.316435",
|
| 6 |
+
"files": {
|
| 7 |
+
".DS_Store": {
|
| 8 |
+
"content": "\u0000\u0000\u0000\u0001Bud1\u0000\u0000\u0010\u0000\u0000\u0000\b\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0001\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0000\u0000\u0000\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0001\u0000\u0000\u0010\u0000\u0000f\u0000-\u0000s\u0000p\u0000l\u0000i\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u000b\u0000e\u0000z\u0000g\u0000i\u0000f\u0000-\u0000s\u0000p\u0000l\u0000i\u0000tdsclbool\u0000\u0000\u0000\u0000\u000b\u0000e\u0000z\u0000g\u0000i\u0000f\u0000-\u0000s\u0000p\u0000l\u0000i\u0000tvSrnlong\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0005\u0000v\u0000i\u0000d\u0000e\u0000odsclbool\u0000\u0000\u0000\u0000\u0005\u0000v\u0000i\u0000d\u0000e\u0000ovSrnlong\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\b\u000b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000 \u0000\u0000\u0000\u0001\u0000\u0000\u0000@\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0001\u0000\u0000 \u0000\u0000\u0000\u0000\u0001\u0000\u0000@\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0001\u0000@\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0001\b\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0001 \u0000\u0000\u0000\u0000\u0000\u0000\u0001@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0003\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u000b\u0000\u0000\u0000E\u0000\u0000\u0001\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004DSDB\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000 \u0000\u0000\u0000`\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0002\u0000\u0000\b\u0000\u0000\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000 \u0000\u0000\u0000\u0000\u0001\u0000\u0000@\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0001\u0000@\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0001\b\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0001 \u0000\u0000\u0000\u0000\u0000\u0000\u0001@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000",
|
| 9 |
+
"size": 6142,
|
| 10 |
+
"language": "unknown"
|
| 11 |
+
},
|
| 12 |
+
"README.md": {
|
| 13 |
+
"content": "# AI Video Project\n\nThis repository contains various AI-generated videos and images for the project.\n\n## Videos\n\n### 1. Fire by Night, Cloud by Day\n- **File**: `Fire by night, cloud by day.mp4`\n- **Description**: A time-lapse video showing the transition from day to night with dramatic cloud formations.\n\n### 2. Hailuo Video - The Statue\n- **File**: `Hailuo_Video_The statue slowly comes to lif_411192955560382473.mp4`\n- **Description**: An animation of a statue coming to life with smooth transitions.\n\n### 3. Hailuo Video - Digital Interface\n- **File**: `Hailuo_Video_a digital interface projected _411193964479242245.mp4`\n- **Description**: A digital interface projection with futuristic elements.\n\n### 4. Stone Statue Animation\n- **File**: `Hailuo_Video_a stone statue animated to lif_stepoff.mp4`\n- **Description**: A stone statue animation showing the transformation to life.\n\n### 5. Midnight Museum Awakening\n- **File**: `Midnight_Museum_Awakening_2025-08-08_21-49-44_easyvid.mp4`\n- **Description**: A mysterious museum scene that comes alive at midnight.\n\n### 6. Project 1\n- **File**: `New_project_2025-08-11_07-00-52_easyvid.mp4`\n- **Description**: First project video from August 11, 2025.\n\n### 7. Project 2\n- **File**: `New_project_2025-08-11_07-11-42_easyvid.mp4`\n- **Description**: Second project video from August 11, 2025.\n\n### 8. ComfyUI Videos\n- **File**: `comfyui-00002_j3RRy3uO.mp4`\n - **Description**: Video generated using ComfyUI with unique visual effects.\n- **File**: `video/ComfyUI_00007_.mp4` to `video/ComfyUI_00031_.mp4`\n - **Description**: A series of AI-generated videos created using ComfyUI, showcasing various visual effects and animations. These include:\n - `ComfyUI_00007_.mp4` - `ComfyUI_00016_.mp4`: Initial sequence of AI-generated content\n - `ComfyUI_00017_.mp4` - `ComfyUI_00024_.mp4`: Middle sequence with enhanced visual effects\n - `ComfyUI_00025_.mp4` - `ComfyUI_00031_.mp4`: Latest high-quality AI video generations\n\n### 9. Kling Multi-Elements Swap\n- **File**: `kling_20250811_Multi_Elements_swap__subj_1830_0.mp4`\n- **Description**: A creative video featuring element swapping effects.\n\n### 10. Stone Statue Animation (LTX)\n- **File**: `ltx-video_a-stone-statue-animated-to-life.mp4`\n- **Description**: Another take on the stone statue animation theme.\n\n### 11. Ancient Museum Hall\n- **File**: `ltx-video_an-ancient-museum-hall-at-night.mp4`\n- **Description**: A night-time view of an ancient museum hall.\n\n### 12. Output Video\n- **File**: `output_63819.mp4`\n- **Description**: Processed output video.\n\n### 13-15. Scene Videos\n- **Scene 1**: `scene1.mp4` - First scene of the project\n- **Scene 2**: `scene2.mp4` - Second scene of the project\n- **Scene 4**: `scene4.mp4` - Fourth scene of the project\n\n## Images\n\n### 1. AI Screen\n- **File**: `AIScreen.jpg`\n- **Thumbnail**: `AIScreen_thumb.jpg`\n- **Description**: Main AI interface screen capture.\n\n### 2. AI Girl and Statue\n- **Thumbnail**: `ImageAIGirlandStatue_thumb.jpg`\n- **Description**: Thumbnail showing an AI-generated girl with a statue.\n\n### 3. AI Talking with Statue\n- **Thumbnail**: `Sscene4AITalkingwithStatuethumb.jpg`\n- **Description**: Thumbnail from a scene featuring AI interaction with a statue.\n\n### 4. Statue Lights Off\n- **Thumbnail**: `StatueLightsOff_thumb.jpg`\n- **Description**: Thumbnail showing a statue in low-light conditions.\n\n### 5. Statue Image\n- **File**: `statue.jpg`\n- **Description**: High-quality image of a statue.\n\n### 6. Walking Animation\n- **File**: `walking.jpg`\n- **Description**: Still image from a walking animation sequence.\n\n### 7. SZR Animation\n- **File**: `szr.gif`\n- **Description**: Animated GIF file.\n\n## Other Files\n- `PyPI-Recovery-Codes-rs84878-2025-07-20T23_40_57.961932.txt` - Recovery codes for PyPI\n- `ezgif-split/` - Directory containing split frames from an animated GIF\n",
|
| 14 |
+
"size": 3841,
|
| 15 |
+
"language": "markdown"
|
| 16 |
+
},
|
| 17 |
+
"PyPI-Recovery-Codes-rs84878-2025-07-20T23_40_57.961932.txt": {
|
| 18 |
+
"content": "f64a3f711a8338a5\n6db6fd4f28fa008d\n24d50524661e2521\n78de489d3f1ef6db\n1d2388d108391945\n54e4483f643c1935\n026f9d3c5801e6c7\na6494b34e5a855dd",
|
| 19 |
+
"size": 135,
|
| 20 |
+
"language": "text"
|
| 21 |
+
}
|
| 22 |
+
},
|
| 23 |
+
"_cache_metadata": {
|
| 24 |
+
"url": "https://github.com/ronelsolomon/aivideo.git",
|
| 25 |
+
"content_type": "github",
|
| 26 |
+
"cached_at": "2026-03-02T22:49:00.319185",
|
| 27 |
+
"cache_key": "e8ea01609a8a8e326963805e1cd2592e"
|
| 28 |
+
}
|
| 29 |
+
}
|
github_ronelsolomon_aleoex.git.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
github_ronelsolomon_assementTemplate.git.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/assementTemplate.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "assementTemplate.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:49:06.124363",
|
| 6 |
+
"files": {
|
| 7 |
+
".DS_Store": {
|
| 8 |
+
"content": "\u0000\u0000\u0000\u0001Bud1\u0000\u0000\u0010\u0000\u0000\u0000\b\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0000\u0000\u0000\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0001\u0000\u0000\u0010\u0000\u0000l\u0000a\u0000t\u0000e\u0000sds\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\t\u0000t\u0000e\u0000m\u0000p\u0000l\u0000a\u0000t\u0000e\u0000sdsclbool\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\b\u000b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000 \u0000\u0000\u0000\u0001\u0000\u0000\u0000@\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0001\u0000\u0000 \u0000\u0000\u0000\u0000\u0001\u0000\u0000@\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0001\u0000@\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0001\b\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0001 \u0000\u0000\u0000\u0000\u0000\u0000\u0001@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0003\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u000b\u0000\u0000\u0000E\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004DSDB\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000 \u0000\u0000\u0000`\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0002\u0000\u0000\b\u0000\u0000\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000 \u0000\u0000\u0000\u0000\u0001\u0000\u0000@\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0001\u0000@\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0001\b\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0001 \u0000\u0000\u0000\u0000\u0000\u0000\u0001@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000",
|
| 9 |
+
"size": 6140,
|
| 10 |
+
"language": "unknown"
|
| 11 |
+
},
|
| 12 |
+
"README.md": {
|
| 13 |
+
"content": "# assementTemplate",
|
| 14 |
+
"size": 18,
|
| 15 |
+
"language": "markdown"
|
| 16 |
+
},
|
| 17 |
+
"mainwebsiteLLM models.ipynb": {
|
| 18 |
+
"content": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 7,\n \"id\": \"61ad2a33-9537-4d70-94b2-a94d6d88e312\",\n \"metadata\": {},\n \"outputs\": [\n {\n \"name\": \"stdout\",\n \"output_type\": \"stream\",\n \"text\": [\n \"Requirement already satisfied: PyPDF in /opt/anaconda3/lib/python3.12/site-packages (5.1.0)\\n\"\n ]\n }\n ],\n \"source\": [\n \"!pip install PyPDF\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 5,\n \"id\": \"5180343f-7dca-4a2c-a0e7-cf3afca64202\",\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n \"from flask import Flask, render_template\\n\",\n \"\\n\",\n \"import PyPDF2\\n\",\n \"import os\\n\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 24,\n \"id\": \"0997395a-844d-4d25-be0c-e763c8ec5c54\",\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n \"PDF_FOLDERs = \\\"../pdfs/exponential_Functions.pdf\\\"\\n\",\n \"def extract_text_from_pdf(pdf_path):\\n\",\n \" \\\"\\\"\\\"\\n\",\n \" Extracts text from a PDF file.\\n\",\n \" \\\"\\\"\\\"\\n\",\n \" with open(pdf_path, \\\"rb\\\") as file:\\n\",\n \" reader = PyPDF2.PdfReader(file)\\n\",\n \" text = \\\"\\\"\\n\",\n \" for page in reader.pages:\\n\",\n \" text += page.extract_text()\\n\",\n \" return text\\n\",\n \"\\n\",\n \"def search_pdfs(keyword):\\n\",\n \" \\\"\\\"\\\"\\n\",\n \" Searches for a keyword in all PDFs in the specified folder.\\n\",\n \" \\\"\\\"\\\"\\n\",\n \" matching_pdfs = []\\n\",\n \" for filename in os.listdir(PDF_FOLDER):\\n\",\n \" if filename.endswith(\\\".pdf\\\"):\\n\",\n \" pdf_path = os.path.join(PDF_FOLDER, filename)\\n\",\n \" text = extract_text_from_pdf(pdf_path)\\n\",\n \" if keyword.lower() in text.lower():\\n\",\n \" matching_pdfs.append(filename)\\n\",\n \" return matching_pdfs\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 25,\n \"id\": \"abf2e71b-b883-4f8b-80c4-1355eac4b875\",\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n \"text = extract_text_from_pdf(PDF_FOLDERs)\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 27,\n \"id\": \"8bb7b474-9de5-4e49-ba23-f467cd1a5167\",\n \"metadata\": {},\n \"outputs\": [\n {\n \"data\": {\n \"text/plain\": [\n \"['Radical Equations.pdf']\"\n ]\n },\n \"execution_count\": 27,\n \"metadata\": {},\n \"output_type\": \"execute_result\"\n }\n ],\n \"source\": [\n \"\\n\",\n \"PDF_FOLDER = \\\"../pdfs\\\"\\n\",\n \"search_pdfs(\\\"Radical\\\")\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 17,\n \"id\": \"abdfde1e-92d4-44d8-8cd9-dfe295db2f42\",\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n \"from sentence_transformers import SentenceTransformer\\n\",\n \"\\n\",\n \"model = SentenceTransformer('all-MiniLM-L6-v2')\\n\",\n \"\\n\",\n \"def generate_embeddings(text):\\n\",\n \" return model.encode(text)\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 18,\n \"id\": \"d0707d9b-c297-4517-9284-ad106d4bb0c8\",\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n \"from sklearn.metrics.pairwise import cosine_similarity\\n\",\n \"\\n\",\n \"def semantic_search(keyword, pdf_texts):\\n\",\n \" keyword_embedding = generate_embeddings(keyword)\\n\",\n \" pdf_embeddings = [generate_embeddings(text) for text in pdf_texts]\\n\",\n \" similarities = cosine_similarity([keyword_embedding], pdf_embeddings)\\n\",\n \" return similarities.argsort()[0][::-1] # Return sorted indices\\n\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 19,\n \"id\": \"e05f4f75-809f-4d44-bd74-b4977913cd3b\",\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n \"import openai\\n\",\n \"\\n\",\n \"def refine_with_gpt(keyword, pdf_text):\\n\",\n \" prompt = f\\\"Search for '{keyword}' in the text and explain its relevance:\\\\n\\\\n{pdf_text}\\\"\\n\",\n \" response = openai.ChatCompletion.create(\\n\",\n \" model=\\\"gpt-4\\\",\\n\",\n \" messages=[{\\\"role\\\": \\\"user\\\", \\\"content\\\": prompt}]\\n\",\n \" )\\n\",\n \" return response.choices[0].message['content']\\n\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 21,\n \"id\": \"af7d380b-bb02-4b0e-a0a4-e6774bc8c92b\",\n \"metadata\": {},\n \"outputs\": [\n {\n \"data\": {\n \"text/plain\": [\n \"array([ 949, 931, 922, ..., 4963, 4668, 3307])\"\n ]\n },\n \"execution_count\": 21,\n \"metadata\": {},\n \"output_type\": \"execute_result\"\n }\n ],\n \"source\": [\n \"semantic_search(\\\"Exponential\\\", text)\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 22,\n \"id\": \"15491d1c-42f6-4437-9e5a-e58623816607\",\n \"metadata\": {},\n \"outputs\": [\n {\n \"data\": {\n \"text/plain\": [\n \"array([-6.15558885e-02, -3.27429213e-02, -8.14785063e-02, 2.20018942e-02,\\n\",\n \" 2.16897670e-03, -7.06751645e-02, -4.91959192e-02, 4.50673141e-02,\\n\",\n \" 5.91372512e-02, 6.03560358e-02, 9.69159156e-02, -3.40183489e-02,\\n\",\n \" 1.34279542e-02, 4.39969152e-02, 7.23729730e-02, 5.68746701e-02,\\n\",\n \" -4.31586802e-02, -7.17484578e-02, -3.35697867e-02, 5.19162640e-02,\\n\",\n \" 9.17470157e-02, -4.97853756e-02, 5.94947999e-03, -1.51990373e-02,\\n\",\n \" 1.07879937e-02, -1.11024909e-01, -1.41220475e-02, -6.34936392e-02,\\n\",\n \" 2.57932767e-02, -8.92783105e-02, 2.05309931e-02, -2.43783295e-02,\\n\",\n \" -3.44554661e-03, 2.79479511e-02, 7.15474971e-03, 3.31692360e-02,\\n\",\n \" 4.52648662e-02, 3.54050696e-02, 2.44668801e-03, -1.39959976e-02,\\n\",\n \" -8.64054039e-02, 4.50172834e-02, 1.53103909e-02, -6.10411982e-04,\\n\",\n \" 6.62536025e-02, -4.29078750e-02, -9.63842962e-03, 2.30673142e-02,\\n\",\n \" -6.08262271e-02, 1.45137990e-02, -8.16086307e-03, 1.38271246e-02,\\n\",\n \" -4.10450771e-02, 2.08319891e-02, 5.73407710e-02, -5.02457544e-02,\\n\",\n \" 2.29066908e-02, -5.27395457e-02, -4.94055301e-02, 1.85231399e-02,\\n\",\n \" 1.11635039e-02, 3.60045451e-05, 3.10880281e-02, -2.67454833e-02,\\n\",\n \" 2.86848954e-05, 2.75322571e-02, 3.76872569e-02, -3.59265767e-02,\\n\",\n \" 1.92266132e-03, 1.54564217e-01, -1.04109630e-01, -7.03938752e-02,\\n\",\n \" -1.11478372e-02, 7.33396551e-03, 4.66745868e-02, -3.26660797e-02,\\n\",\n \" -6.81697624e-03, 5.25274761e-02, -9.55348909e-02, -1.81047861e-02,\\n\",\n \" 7.43188635e-02, 3.21524292e-02, 1.12615926e-02, -3.18462960e-02,\\n\",\n \" -4.89118882e-02, 4.50865086e-03, 2.66589355e-02, 3.22004072e-02,\\n\",\n \" 7.59974867e-02, 3.37640271e-02, 7.22169783e-03, 9.62162837e-02,\\n\",\n \" -9.49541945e-03, 1.42467869e-02, 7.72618726e-02, -3.46675515e-02,\\n\",\n \" 6.43399432e-02, -1.77124273e-02, 5.75897396e-02, -3.96663360e-02,\\n\",\n \" -9.24814641e-02, -3.08443867e-02, 4.57514524e-02, 5.76079302e-02,\\n\",\n \" -3.39191444e-02, -6.40106872e-02, -9.55350921e-02, 5.69770485e-02,\\n\",\n \" 8.61558840e-02, -4.49883342e-02, -3.83249531e-03, -5.92840686e-02,\\n\",\n \" -4.21289578e-02, 2.41857246e-02, 8.77528265e-02, 2.85814540e-03,\\n\",\n \" 4.34667021e-02, -6.05467558e-02, -1.40062924e-02, 2.42142770e-02,\\n\",\n \" 7.88620934e-02, 1.36925161e-01, 6.99017057e-03, 5.46175353e-02,\\n\",\n \" -1.59496572e-02, 4.98304442e-02, -1.98925342e-02, 4.38245783e-33,\\n\",\n \" -6.08058646e-02, -9.36815329e-03, -6.27241805e-02, -2.15339232e-02,\\n\",\n \" 6.82255924e-02, -2.57557747e-03, -4.32382487e-02, 2.09484473e-02,\\n\",\n \" -8.13180506e-02, 1.05917849e-01, -6.66709442e-04, 7.23361820e-02,\\n\",\n \" 6.01369552e-02, 3.41009088e-02, 6.00286908e-02, -4.93502505e-02,\\n\",\n \" 3.79956812e-02, -2.42618527e-02, -2.84504183e-02, -6.88754544e-02,\\n\",\n \" 1.51386326e-02, -5.61528280e-02, 5.11020906e-02, 5.75491088e-03,\\n\",\n \" 1.04614990e-02, -1.47187896e-03, 1.91245470e-02, 5.02491482e-02,\\n\",\n \" -3.53365727e-02, -3.71936150e-02, 2.63985293e-03, 1.16865197e-02,\\n\",\n \" -9.90885720e-02, -5.96534722e-02, -2.17216741e-02, -4.72019091e-02,\\n\",\n \" 4.79678139e-02, -1.50862755e-02, 1.53009677e-02, -6.27426803e-02,\\n\",\n \" -1.22015327e-01, 1.81296561e-02, -2.01311577e-02, 5.95719479e-02,\\n\",\n \" -1.78666636e-02, -8.43421146e-02, 5.14885038e-02, 4.35719453e-02,\\n\",\n \" 6.94125220e-02, -7.33720185e-03, -1.92089844e-02, -5.08487895e-02,\\n\",\n \" -2.91302484e-02, 1.07471431e-02, 1.68315619e-02, 9.51844305e-02,\\n\",\n \" 3.07717081e-02, 5.36952242e-02, -5.19274138e-02, 3.87433879e-02,\\n\",\n \" 4.65841629e-02, -7.08419308e-02, 1.40382694e-02, -8.65444690e-02,\\n\",\n \" -7.69772083e-02, 2.05817167e-03, -5.21472692e-02, -3.48970294e-02,\\n\",\n \" 3.43454704e-02, -2.24059001e-02, 2.91897636e-02, 3.78196724e-02,\\n\",\n \" 6.23015277e-02, -3.34499627e-02, 1.26833711e-02, 2.03240290e-02,\\n\",\n \" -6.10544346e-02, -2.23915316e-02, -3.30845229e-02, 3.00547350e-02,\\n\",\n \" -3.87010686e-02, -6.88908845e-02, 3.59816328e-02, -2.66986098e-02,\\n\",\n \" -2.36154348e-02, -7.89593384e-02, 5.74153587e-02, -2.09105313e-02,\\n\",\n \" 5.79180531e-02, -4.63198461e-02, -6.61852509e-02, -1.73997658e-03,\\n\",\n \" 2.19490342e-02, 2.92412508e-02, 3.31044048e-02, -6.93893874e-33,\\n\",\n \" -1.11696236e-02, 1.22892983e-01, -5.64762242e-02, 7.16693252e-02,\\n\",\n \" 3.76609489e-02, 5.96046895e-02, -5.40110655e-02, -2.23769173e-02,\\n\",\n \" 4.51719202e-02, -5.52631803e-02, 3.05389091e-02, 8.59397575e-02,\\n\",\n \" -6.65580183e-02, 5.36855981e-02, 5.64086404e-05, -4.96173501e-02,\\n\",\n \" -1.08520929e-02, -5.50978631e-02, -3.05007529e-02, -1.02113727e-02,\\n\",\n \" -6.71363473e-02, 6.10110871e-02, -1.00541614e-01, -5.72318844e-02,\\n\",\n \" 4.86018062e-02, 7.97945932e-02, -5.44169396e-02, 2.05039233e-02,\\n\",\n \" 2.20082626e-02, -3.21728401e-02, -6.33175448e-02, 7.45558962e-02,\\n\",\n \" 4.59926911e-02, -5.76484203e-02, 2.07927953e-02, 2.38216040e-03,\\n\",\n \" 2.11553778e-02, -1.05930679e-02, 6.34990409e-02, -4.58978862e-02,\\n\",\n \" 3.62073183e-02, 6.05890416e-02, 8.72566923e-02, -9.57834870e-02,\\n\",\n \" 5.85449524e-02, 3.50727811e-02, 1.54264010e-02, 9.97223556e-02,\\n\",\n \" 1.63778439e-02, 8.38218927e-02, 4.60081361e-03, 3.50369001e-03,\\n\",\n \" 3.72515842e-02, 2.41671503e-02, -9.69619527e-02, 1.28188003e-02,\\n\",\n \" 2.45130602e-02, -9.99986939e-03, -1.30141098e-02, -8.57570861e-03,\\n\",\n \" -5.71340285e-02, -6.30739052e-03, 8.09015781e-02, 3.12486794e-02,\\n\",\n \" -1.04440786e-01, -8.18522871e-02, -7.25891665e-02, -3.86947766e-02,\\n\",\n \" 5.22346497e-02, -7.00028390e-02, -6.77500069e-02, 2.02495847e-02,\\n\",\n \" -1.69183221e-03, -2.29235794e-02, -7.27068037e-02, -2.95961518e-02,\\n\",\n \" -5.90258501e-02, -8.42480436e-02, 2.72352397e-02, -1.13069117e-02,\\n\",\n \" -2.24099662e-02, 1.07025124e-01, 3.27875018e-02, -3.47781964e-02,\\n\",\n \" -7.47710019e-02, 4.25771922e-02, -4.42670323e-02, -4.04699333e-03,\\n\",\n \" 4.07143012e-02, -6.19838051e-02, -7.45694116e-02, -9.21649300e-03,\\n\",\n \" -1.12801641e-01, -7.49204829e-02, 2.82599833e-02, -5.00149362e-08,\\n\",\n \" -2.37865988e-02, 6.71589524e-02, 2.08585691e-02, -3.41240391e-02,\\n\",\n \" 1.25548109e-01, 1.12343468e-02, 8.02382380e-02, -6.13906141e-03,\\n\",\n \" 2.14101691e-02, -4.13060263e-02, 1.68066453e-02, 2.93754656e-02,\\n\",\n \" -2.30026226e-02, -5.87394163e-02, -4.63094227e-02, -2.11107284e-02,\\n\",\n \" 4.45350148e-02, -6.77455440e-02, 1.37067288e-02, -6.64335564e-02,\\n\",\n \" -7.07691759e-02, -3.18862237e-02, -3.33491191e-02, -3.51230055e-02,\\n\",\n \" -7.40195531e-03, -7.98573717e-02, -9.43406820e-02, 5.42398691e-02,\\n\",\n \" -4.10540998e-02, -1.47718275e-02, -2.61214729e-02, 6.16135821e-02,\\n\",\n \" 9.20601115e-02, 4.68391888e-02, 9.87054501e-03, -3.28248404e-02,\\n\",\n \" 4.84941974e-02, 3.45133897e-03, -1.31007312e-02, 8.80145878e-02,\\n\",\n \" 1.94483381e-02, -5.17335385e-02, -3.32719348e-02, -3.80393788e-02,\\n\",\n \" -1.42636774e-02, 6.13973336e-03, 4.55878638e-02, -4.30123769e-02,\\n\",\n \" 2.58727907e-03, 2.06367373e-02, 1.13957860e-02, 7.44993100e-03,\\n\",\n \" -9.16841179e-02, 7.29081919e-03, 6.03863737e-03, 5.51494248e-02,\\n\",\n \" -8.53437409e-02, -4.33840491e-02, -8.54612980e-03, 9.14788470e-02,\\n\",\n \" 4.29086201e-02, 5.45364358e-02, 2.05051452e-02, 4.04394651e-03],\\n\",\n \" dtype=float32)\"\n ]\n },\n \"execution_count\": 22,\n \"metadata\": {},\n \"output_type\": \"execute_result\"\n }\n ],\n \"source\": [\n \"generate_embeddings(text)\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 23,\n \"id\": \"3b377ad6-66b6-46a3-aa5f-7cf8aca6961d\",\n \"metadata\": {},\n \"outputs\": [\n {\n \"ename\": \"APIRemovedInV1\",\n \"evalue\": \"\\n\\nYou tried to access openai.ChatCompletion, but this is no longer supported in openai>=1.0.0 - see the README at https://github.com/openai/openai-python for the API.\\n\\nYou can run `openai migrate` to automatically upgrade your codebase to use the 1.0.0 interface. \\n\\nAlternatively, you can pin your installation to the old version, e.g. `pip install openai==0.28`\\n\\nA detailed migration guide is available here: https://github.com/openai/openai-python/discussions/742\\n\",\n \"output_type\": \"error\",\n \"traceback\": [\n \"\\u001b[0;31m---------------------------------------------------------------------------\\u001b[0m\",\n \"\\u001b[0;31mAPIRemovedInV1\\u001b[0m Traceback (most recent call last)\",\n \"Cell \\u001b[0;32mIn[23], line 1\\u001b[0m\\n\\u001b[0;32m----> 1\\u001b[0m refine_with_gpt(\\u001b[38;5;124m\\\"\\u001b[39m\\u001b[38;5;124mExponential\\u001b[39m\\u001b[38;5;124m\\\"\\u001b[39m, text)\\n\",\n \"Cell \\u001b[0;32mIn[19], line 5\\u001b[0m, in \\u001b[0;36mrefine_with_gpt\\u001b[0;34m(keyword, pdf_text)\\u001b[0m\\n\\u001b[1;32m 3\\u001b[0m \\u001b[38;5;28;01mdef\\u001b[39;00m \\u001b[38;5;21mrefine_with_gpt\\u001b[39m(keyword, pdf_text):\\n\\u001b[1;32m 4\\u001b[0m prompt \\u001b[38;5;241m=\\u001b[39m \\u001b[38;5;124mf\\u001b[39m\\u001b[38;5;124m\\\"\\u001b[39m\\u001b[38;5;124mSearch for \\u001b[39m\\u001b[38;5;124m'\\u001b[39m\\u001b[38;5;132;01m{\\u001b[39;00mkeyword\\u001b[38;5;132;01m}\\u001b[39;00m\\u001b[38;5;124m'\\u001b[39m\\u001b[38;5;124m in the text and explain its relevance:\\u001b[39m\\u001b[38;5;130;01m\\\\n\\u001b[39;00m\\u001b[38;5;130;01m\\\\n\\u001b[39;00m\\u001b[38;5;132;01m{\\u001b[39;00mpdf_text\\u001b[38;5;132;01m}\\u001b[39;00m\\u001b[38;5;124m\\\"\\u001b[39m\\n\\u001b[0;32m----> 5\\u001b[0m response \\u001b[38;5;241m=\\u001b[39m openai\\u001b[38;5;241m.\\u001b[39mChatCompletion\\u001b[38;5;241m.\\u001b[39mcreate(\\n\\u001b[1;32m 6\\u001b[0m model\\u001b[38;5;241m=\\u001b[39m\\u001b[38;5;124m\\\"\\u001b[39m\\u001b[38;5;124mgpt-4\\u001b[39m\\u001b[38;5;124m\\\"\\u001b[39m,\\n\\u001b[1;32m 7\\u001b[0m messages\\u001b[38;5;241m=\\u001b[39m[{\\u001b[38;5;124m\\\"\\u001b[39m\\u001b[38;5;124mrole\\u001b[39m\\u001b[38;5;124m\\\"\\u001b[39m: \\u001b[38;5;124m\\\"\\u001b[39m\\u001b[38;5;124muser\\u001b[39m\\u001b[38;5;124m\\\"\\u001b[39m, \\u001b[38;5;124m\\\"\\u001b[39m\\u001b[38;5;124mcontent\\u001b[39m\\u001b[38;5;124m\\\"\\u001b[39m: prompt}]\\n\\u001b[1;32m 8\\u001b[0m )\\n\\u001b[1;32m 9\\u001b[0m \\u001b[38;5;28;01mreturn\\u001b[39;00m response\\u001b[38;5;241m.\\u001b[39mchoices[\\u001b[38;5;241m0\\u001b[39m]\\u001b[38;5;241m.\\u001b[39mmessage[\\u001b[38;5;124m'\\u001b[39m\\u001b[38;5;124mcontent\\u001b[39m\\u001b[38;5;124m'\\u001b[39m]\\n\",\n \"File \\u001b[0;32m/opt/anaconda3/lib/python3.12/site-packages/openai/lib/_old_api.py:39\\u001b[0m, in \\u001b[0;36mAPIRemovedInV1Proxy.__call__\\u001b[0;34m(self, *_args, **_kwargs)\\u001b[0m\\n\\u001b[1;32m 38\\u001b[0m \\u001b[38;5;28;01mdef\\u001b[39;00m \\u001b[38;5;21m__call__\\u001b[39m(\\u001b[38;5;28mself\\u001b[39m, \\u001b[38;5;241m*\\u001b[39m_args: Any, \\u001b[38;5;241m*\\u001b[39m\\u001b[38;5;241m*\\u001b[39m_kwargs: Any) \\u001b[38;5;241m-\\u001b[39m\\u001b[38;5;241m>\\u001b[39m Any:\\n\\u001b[0;32m---> 39\\u001b[0m \\u001b[38;5;28;01mraise\\u001b[39;00m APIRemovedInV1(symbol\\u001b[38;5;241m=\\u001b[39m\\u001b[38;5;28mself\\u001b[39m\\u001b[38;5;241m.\\u001b[39m_symbol)\\n\",\n \"\\u001b[0;31mAPIRemovedInV1\\u001b[0m: \\n\\nYou tried to access openai.ChatCompletion, but this is no longer supported in openai>=1.0.0 - see the README at https://github.com/openai/openai-python for the API.\\n\\nYou can run `openai migrate` to automatically upgrade your codebase to use the 1.0.0 interface. \\n\\nAlternatively, you can pin your installation to the old version, e.g. `pip install openai==0.28`\\n\\nA detailed migration guide is available here: https://github.com/openai/openai-python/discussions/742\\n\"\n ]\n }\n ],\n \"source\": [\n \"refine_with_gpt(\\\"Exponential\\\", text)\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 28,\n \"id\": \"3b5b8715-929b-415e-8365-0518d89c4ed1\",\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n \"# Load a pre-trained Sentence Transformer model\\n\",\n \"model = SentenceTransformer('all-MiniLM-L6-v2')\\n\",\n \"\\n\",\n \"def extract_text_from_pdf(pdf_path):\\n\",\n \" \\\"\\\"\\\"\\n\",\n \" Extracts text from a PDF file.\\n\",\n \" \\\"\\\"\\\"\\n\",\n \" with open(pdf_path, \\\"rb\\\") as file:\\n\",\n \" reader = PyPDF2.PdfReader(file)\\n\",\n \" text = \\\"\\\"\\n\",\n \" for page in reader.pages:\\n\",\n \" text += page.extract_text()\\n\",\n \" return text\\n\",\n \"\\n\",\n \"def generate_embeddings(text):\\n\",\n \" \\\"\\\"\\\"\\n\",\n \" Generates embeddings for a given text using SentenceTransformer.\\n\",\n \" \\\"\\\"\\\"\\n\",\n \" return model.encode(text)\\n\",\n \"\\n\",\n \"def load_pdf_embeddings():\\n\",\n \" \\\"\\\"\\\"\\n\",\n \" Loads and generates embeddings for all PDFs in the folder.\\n\",\n \" Returns a dictionary with filenames and embeddings.\\n\",\n \" \\\"\\\"\\\"\\n\",\n \" pdf_embeddings = {}\\n\",\n \" for filename in os.listdir(PDF_FOLDER):\\n\",\n \" if filename.endswith(\\\".pdf\\\"):\\n\",\n \" pdf_path = os.path.join(PDF_FOLDER, filename)\\n\",\n \" text = extract_text_from_pdf(pdf_path)\\n\",\n \" pdf_embeddings[filename] = generate_embeddings(text)\\n\",\n \" return pdf_embeddings\\n\",\n \"\\n\",\n \"def search_pdfs(query, pdf_embeddings):\\n\",\n \" \\\"\\\"\\\"\\n\",\n \" Searches for a query in all PDF embeddings and ranks results by similarity.\\n\",\n \" \\\"\\\"\\\"\\n\",\n \" query_embedding = generate_embeddings(query)\\n\",\n \" results = []\\n\",\n \" for filename, embedding in pdf_embeddings.items():\\n\",\n \" similarity = cosine_similarity([query_embedding], [embedding])[0][0]\\n\",\n \" results.append((filename, similarity))\\n\",\n \" # Sort results by similarity in descending order\\n\",\n \" results = sorted(results, key=lambda x: x[1], reverse=True)\\n\",\n \" return results\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 30,\n \"id\": \"5ef6db31-77ad-4f2c-94be-a2dc529aaeba\",\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n \"pdf_embeddings = load_pdf_embeddings()\\n\",\n \" \\n\",\n \"\\n\",\n \"# Search PDFs\\n\",\n \"results = search_pdfs(\\\"Exponential\\\", pdf_embeddings)\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": 33,\n \"id\": \"706d522a-5939-49ee-8d20-ddacf3426523\",\n \"metadata\": {},\n \"outputs\": [\n {\n \"data\": {\n \"text/plain\": [\n \"'exponential_Functions.pdf'\"\n ]\n },\n \"execution_count\": 33,\n \"metadata\": {},\n \"output_type\": \"execute_result\"\n }\n ],\n \"source\": [\n \"results[0][0]\"\n ]\n },\n {\n \"cell_type\": \"code\",\n \"execution_count\": null,\n \"id\": \"0eabfb55-2fb5-4145-a611-49ba606a4e25\",\n \"metadata\": {},\n \"outputs\": [],\n \"source\": []\n }\n ],\n \"metadata\": {\n \"kernelspec\": {\n \"display_name\": \"Python 3 (ipykernel)\",\n \"language\": \"python\",\n \"name\": \"python3\"\n },\n \"language_info\": {\n \"codemirror_mode\": {\n \"name\": \"ipython\",\n \"version\": 3\n },\n \"file_extension\": \".py\",\n \"mimetype\": \"text/x-python\",\n \"name\": \"python\",\n \"nbconvert_exporter\": \"python\",\n \"pygments_lexer\": \"ipython3\",\n \"version\": \"3.12.2\"\n }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 5\n}\n",
|
| 19 |
+
"size": 20745,
|
| 20 |
+
"language": "unknown"
|
| 21 |
+
},
|
| 22 |
+
"app.py": {
|
| 23 |
+
"content": "from flask import Flask, render_template, request, jsonify\nimport PyPDF2\nimport os\nfrom sentence_transformers import SentenceTransformer\nfrom sklearn.metrics.pairwise import cosine_similarity\n\n# Load a pre-trained Sentence Transformer model\nmodel = SentenceTransformer('all-MiniLM-L6-v2')\n\nPDF_FOLDER = \"../pdfs\"\n\ndef extract_text_from_pdf(pdf_path):\n \"\"\"\n Extracts text from a PDF file.\n \"\"\"\n with open(pdf_path, \"rb\") as file:\n reader = PyPDF2.PdfReader(file)\n text = \"\"\n for page in reader.pages:\n text += page.extract_text()\n return text\n\ndef generate_embeddings(text):\n \"\"\"\n Generates embeddings for a given text using SentenceTransformer.\n \"\"\"\n return model.encode(text)\n\ndef load_pdf_embeddings():\n \"\"\"\n Loads and generates embeddings for all PDFs in the folder.\n Returns a dictionary with filenames and embeddings.\n \"\"\"\n pdf_embeddings = {}\n for filename in os.listdir(PDF_FOLDER):\n if filename.endswith(\".pdf\"):\n pdf_path = os.path.join(PDF_FOLDER, filename)\n text = extract_text_from_pdf(pdf_path)\n pdf_embeddings[filename] = generate_embeddings(text)\n return pdf_embeddings\n\ndef search_pdfs(query, pdf_embeddings):\n \"\"\"\n Searches for a query in all PDF embeddings and ranks results by similarity.\n \"\"\"\n query_embedding = generate_embeddings(query)\n results = []\n for filename, embedding in pdf_embeddings.items():\n similarity = cosine_similarity([query_embedding], [embedding])[0][0]\n results.append((filename, similarity))\n # Sort results by similarity in descending order\n results = sorted(results, key=lambda x: x[1], reverse=True)\n return results\n\napp = Flask(__name__)\n\n@app.route('/')\ndef home():\n return render_template('self_assessment.html')\n\n\n@app.route('/search')\ndef about():\n \"\"\"\n Render the about.html template.\n\n Returns:\n HTML: The rendered about page.\n \"\"\"\n return render_template('search_bar.html')\n\n# Route to handle search queries\n@app.route(\"/ask\", methods=[\"POST\"])\ndef ask():\n try:\n # Extract the question from the POST request\n print(\"Hello\")\n question = request.json.get(\"question\", \"\").strip()\n if not question:\n return jsonify({\"answer\": \"Please ask a question! 😅\"}), 400\n\n # Load PDF embeddings\n pdf_embeddings = load_pdf_embeddings()\n \n # Search PDFs using the extracted question\n results = search_pdfs(question, pdf_embeddings)\n print(results)\n\n # Check if there are any results\n if results:\n top_result = results[0][0] # Filename of the most relevant PDF\n else:\n top_result = \"No relevant PDFs found for your query.\"\n\n # Combine response\n answer = f\"Top PDF Match: {top_result}\"\n return jsonify({\"answer\": answer})\n\n except Exception as e:\n print(f\"Error: {e}\")\n return ({\"answer\": \"An error occurred while processing your request. Please try again later!\"}), 500\n\nif __name__ == '__main__':\n app.run(debug=True)",
|
| 24 |
+
"size": 3109,
|
| 25 |
+
"language": "python"
|
| 26 |
+
},
|
| 27 |
+
"self_assessment.html": {
|
| 28 |
+
"content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Self Assessment Template - Math</title>\n</head>\n<body>\n <h1>Self Assessment Template: Math</h1>\n <p>\n I want to teach you how to assess your own knowledge about a subject area. Let’s do this by taking an example that you already know. Suppose you wanted to assess your own knowledge about solving 2-step equations of the form <code>ax + b = c</code>. An example of this type of problem is <code>2x + 3 = 15</code>.\n </p>\n <h2>Types of Knowledge</h2>\n <ul>\n <li><strong>Facts:</strong> Concepts you have that describe objects or elements.</li>\n <li><strong>Strategies:</strong> General processes to solve a problem.</li>\n <li><strong>Procedures:</strong> Specific steps used in a strategy.</li>\n <li><strong>Rationales:</strong> Reasons why strategies or procedures work.</li>\n </ul>\n <h2>Self Assessment Example</h2>\n <h3>Facts</h3>\n <p>\n Variables, constants, coefficients, equations, and expressions. Examples: <br>\n <strong>Variable:</strong> An unknown quantity, usually represented by a letter.<br>\n <strong>Constant:</strong> A specific number.<br>\n <strong>Coefficient:</strong> A number multiplied by a variable.<br>\n <strong>Equation:</strong> An expression equal to another expression.<br>\n <strong>Expression:</strong> One or more terms combined using mathematical operations.\n </p>\n <h3>Strategies</h3>\n <p>\n Reverse order of operations: SADMEP (Subtraction, Addition, Division, Multiplication, Exponents, Parentheses). Example: Unsure about order of subtraction vs. addition or division vs. multiplication.\n </p>\n <h3>Procedures</h3>\n <p>\n Additive inverse: Adding the opposite sign constant to both sides. <br>\\n Multiplicative inverse: Multiplying both sides by the inverse of the coefficient. Question: Should the inverse be negative if the coefficient is negative?\n </p>\n <h3>Rationales</h3>\n <p>\n Subtraction property of equality: Subtracting the same number preserves equality.<br>\\n Division property of equality: Dividing by the same number preserves equality.\n </p>\n <h2>Summary</h2>\n <p>\\n Review your understanding of facts, strategies, procedures, and rationales. Identify areas where you need further learning and focus on addressing gaps.\\n </p>\\n</body>\\n</html>\\n",
|
| 29 |
+
"size": 2530,
|
| 30 |
+
"language": "html"
|
| 31 |
+
},
|
| 32 |
+
"templates/search_bar.html": {
|
| 33 |
+
"content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Ask the Math Genius! 🤓</title>\n <style>\n body {\n font-family: \"Comic Sans MS\", sans-serif;\n background-color: #e9f5db;\n color: #1b4332;\n text-align: center;\n padding: 20px;\n }\n h1 {\n color: #40916c;\n }\n input[type=\"text\"] {\n width: 80%;\n padding: 10px;\n margin: 20px 0;\n border: 2px solid #52b788;\n border-radius: 5px;\n font-size: 16px;\n }\n button {\n padding: 10px 20px;\n font-size: 16px;\n color: #fff;\n background-color: #40916c;\n border: none;\n border-radius: 5px;\n cursor: pointer;\n }\n button:hover {\n background-color: #52b788;\n }\n #output {\n margin-top: 20px;\n font-size: 18px;\n color: #344e41;\n }\n .navbar {\n margin-bottom: 20px;\n }\n .navbar a {\n text-decoration: none;\n margin: 0 10px;\n color: #1b4332;\n font-weight: bold;\n }\n .navbar a:hover {\n color: #40916c;\n }\n </style>\n</head>\n<body>\n <div class=\"navbar\">\n <a href=\"/\">Home</a>\n <a href=\"/search\">Search Bar</a>\n </div>\n <h1>Welcome to Ask the Math Genius! 🤓</h1>\n <p>Assement Template: Find a Lesson Plan! 🧠</p>\n\n <input type=\"text\" id=\"question\" placeholder=\"Find a Lesson Plan...\" aria-label=\"Math question input\">\n <button onclick=\"askLLM()\">Ask Genius</button>\n\n <div id=\"output\"></div>\n\n <script>\n async function askLLM() {\n const question = document.getElementById('question').value;\n const output = document.getElementById('output');\n \n if (!question.trim()) {\n output.textContent = \"Please type a question! 🤔\";\n return;\n }\n\n output.textContent = \"Thinking... 🤔\";\n\n try {\n const response = await fetch('/ask', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ question })\n });\n\n if (!response.ok) {\n throw new Error(\"Network response was not ok\");\n }\n\n const data = await response.json();\n output.textContent = data.answer || \"Oops! I couldn't understand. Try again!\";\n } catch (error) {\n console.error(\"Error:\", error);\n output.textContent = \"Something went wrong. Please try again later. 😢\";\n }\n }\n </script>\n</body>\n</html>\n\n",
|
| 34 |
+
"size": 2926,
|
| 35 |
+
"language": "html"
|
| 36 |
+
},
|
| 37 |
+
"templates/self_assessment.html": {
|
| 38 |
+
"content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Math Self-Check!</title>\n <style>\n body {\n font-family: \"Comic Sans MS\", sans-serif;\n background-color: #fefae0;\n color: #283618;\n margin: 20px;\n }\n h1, h2 {\n color: #606c38;\n }\n ul {\n list-style-type: none;\n padding: 0;\n }\n li {\n margin: 10px 0;\n }\n p, li {\n font-size: 18px;\n }\n .highlight {\n font-weight: bold;\n color: #bc6c25;\n }\n </style>\n</head>\n<body>\n <!-- Navigation bar -->\n <div class=\"navbar\">\n <!-- Navigation links -->\n <a href=\"/\">Home</a>\n <a href=\"/search\">Search Bar</a>\n </div>\n <h1>🎉 Math Self-Check! 🎉</h1>\n <p>Hi there! Let’s learn how to check what you already know about math. We’ll use a fun example! Imagine you’re solving this puzzle:</p>\n <p class=\"highlight\">2x + 3 = 15</p>\n <p>Don't worry if you’re not sure about everything yet. This is how we learn! 😊</p>\n\n <h2>What You Need to Know 🧠</h2>\n <ul>\n <li><strong>Facts:</strong> The \"what\" – things like numbers and math words.</li>\n <li><strong>Strategies:</strong> The \"how\" – the steps to solve the puzzle.</li>\n <li><strong>Steps:</strong> The exact moves to solve it.</li>\n <li><strong>Reasons:</strong> The \"why\" – why your steps work.</li>\n </ul>\n\n <h2>Let’s Break It Down! 🔍</h2>\n <h3>Facts (The \"What\")</h3>\n <p>\n <strong>Variable:</strong> A mystery number, like \"x\".<br>\n <strong>Constant:</strong> A plain number, like \"3\".<br>\n <strong>Coefficient:</strong> A number multiplied by a mystery number, like \"2x\".<br>\n <strong>Equation:</strong> A math sentence with an equals sign, like \"2x + 3 = 15\".<br>\n <strong>Expression:</strong> A part of an equation without an equals sign.\n </p>\n\n <h3>Strategies (The \"How\")</h3>\n <p>Use the reverse order of math: <strong>SADMEP</strong> (Subtraction, Addition, Division, Multiplication, Exponents, Parentheses). It's like working backward to solve the puzzle!</p>\n\n <h3>Steps (The Exact Moves)</h3>\n <p>\n <strong>Additive Inverse:</strong> Subtract or add to get rid of a number. <br>\n <strong>Multiplicative Inverse:</strong> Divide or multiply to make \"x\" all by itself!\n </p>\n\n <h3>Reasons (The \"Why\")</h3>\n <p>\n <strong>Subtraction Rule:</strong> If you take away the same number from both sides, it’s still fair. 🧮<br>\n <strong>Division Rule:</strong> If you divide both sides by the same number, it’s still equal. ✂️\n </p>\n\n <h2>You’re Amazing! 🌟</h2>\n <p>Now, look at what you know! Are there any steps or ideas you want to learn more about? That’s how you get even better at solving puzzles like this! 🎯</p>\n</body>\n</html>\n\n\n",
|
| 39 |
+
"size": 3020,
|
| 40 |
+
"language": "html"
|
| 41 |
+
}
|
| 42 |
+
},
|
| 43 |
+
"_cache_metadata": {
|
| 44 |
+
"url": "https://github.com/ronelsolomon/assementTemplate.git",
|
| 45 |
+
"content_type": "github",
|
| 46 |
+
"cached_at": "2026-03-02T22:49:06.125061",
|
| 47 |
+
"cache_key": "9779fe767985a3c1e8c6905c9b3fea3f"
|
| 48 |
+
}
|
| 49 |
+
}
|
github_ronelsolomon_cebras.git.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/cebras.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "cebras.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:49:08.429260",
|
| 6 |
+
"files": {
|
| 7 |
+
"requirements.txt": {
|
| 8 |
+
"content": "cerebras-cloud-sdk>=0.1.0\npython-dotenv>=1.0.0\n",
|
| 9 |
+
"size": 47,
|
| 10 |
+
"language": "text"
|
| 11 |
+
},
|
| 12 |
+
"README.md": {
|
| 13 |
+
"content": "# Cerebras Chat Completion Example\n\nThis project demonstrates how to use the Cerebras SDK to generate chat completions using the Llama 4 model.\n\n## Prerequisites\n\n- Python 3.8+\n- Cerebras API key (get it from [Cerebras Console](https://console.cerebras.net/))\n\n## Setup\n\n1. Clone this repository\n2. Install the required dependencies:\n ```bash\n pip install -r requirements.txt\n ```\n3. Set your Cerebras API key as an environment variable:\n ```bash\n # On macOS/Linux\n export CEREBRAS_API_KEY='your-api-key-here'\n \n # On Windows (Command Prompt)\n set CEREBRAS_API_KEY=your-api-key-here\n \n # On Windows (PowerShell)\n $env:CEREBRAS_API_KEY='your-api-key-here'\n ```\n\n## Usage\n\nRun the chat completion example:\n\n```bash\npython cebras.py\n```\n\n## Environment Variables\n\n- `CEREBRAS_API_KEY`: Your Cerebras API key (required)\n\n## Example\n\nThe script will send a chat completion request to the Cerebras API and stream the response to the console.\n",
|
| 14 |
+
"size": 962,
|
| 15 |
+
"language": "markdown"
|
| 16 |
+
},
|
| 17 |
+
".env": {
|
| 18 |
+
"content": "CEREBRAS_API_KEY=\"csk-y933tjkj4d4fct3jr2xny2yp9k8xkx4kh3rk2d6e59kywpk3\"",
|
| 19 |
+
"size": 71,
|
| 20 |
+
"language": "unknown"
|
| 21 |
+
},
|
| 22 |
+
".gitattributes": {
|
| 23 |
+
"content": "# Auto detect text files and perform LF normalization\n* text=auto\n",
|
| 24 |
+
"size": 66,
|
| 25 |
+
"language": "unknown"
|
| 26 |
+
},
|
| 27 |
+
"cebras.py": {
|
| 28 |
+
"content": "import os\nfrom cerebras.cloud.sdk import Cerebras\n\nclient = Cerebras(\n # This is the default and can be omitted\n api_key=\"csk-y933tjkj4d4fct3jr2xny2yp9k8xkx4kh3rk2d6e59kywpk3\"\n #os.environ.get(\"csk-y933tjkj4d4fct3jr2xny2yp9k8xkx4kh3rk2d6e59kywpk3\")\n)\n\nstream = client.chat.completions.create(\n messages=[\n {\n \"role\": \"system\",\n \"content\": \"What is a Rock\"\n }\n ],\n model=\"llama-4-scout-17b-16e-instruct\",\n stream=True,\n max_completion_tokens=2048,\n temperature=0.2,\n top_p=1\n)\n\nfor chunk in stream:\n print(chunk.choices[0].delta.content or \"\", end=\"\")",
|
| 29 |
+
"size": 617,
|
| 30 |
+
"language": "python"
|
| 31 |
+
}
|
| 32 |
+
},
|
| 33 |
+
"_cache_metadata": {
|
| 34 |
+
"url": "https://github.com/ronelsolomon/cebras.git",
|
| 35 |
+
"content_type": "github",
|
| 36 |
+
"cached_at": "2026-03-02T22:49:08.429936",
|
| 37 |
+
"cache_key": "2aa832db180a76e905044673bb878cbd"
|
| 38 |
+
}
|
| 39 |
+
}
|
github_ronelsolomon_changeAudio.git.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/changeAudio.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "changeAudio.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:49:11.318653",
|
| 6 |
+
"files": {
|
| 7 |
+
"RECORDS": {
|
| 8 |
+
"content": "cu01\ncu02\ncu03\ncu04\ncu05\ncu06\ncu07\ncu08\ncu09\ncu10\ncu11\ncu12\ncu13\ncu14\ncu15\ncu16\ncu17\ncu18\ncu19\ncu20\ncu21\ncu22\ncu23\ncu24\ncu25\ncu26\ncu27\ncu28\ncu29\ncu30\ncu31\ncu32\ncu33\ncu34\ncu35\n",
|
| 9 |
+
"size": 175,
|
| 10 |
+
"language": "unknown"
|
| 11 |
+
},
|
| 12 |
+
".DS_Store": {
|
| 13 |
+
"content": "\u0000\u0000\u0000\u0001Bud1\u0000\u0000\u0018\u0000\u0000\u0000\b\u0000\u0000\u0000\u0018\u0000\u0000\u0000\u0010\u000b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0000\u0000\u0000\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0001\u0000\u0000\u0010\u0000\u0000e\u0000n\u0000t\u0000r\u0000i\u0000c\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\b\u000b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000 \u0000\u0000\u0000\u0001\u0000\u0000\u0000@\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0001\u0000\u0000 \u0000\u0000\u0000\u0000\u0001\u0000\u0000@\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0001\u0000@\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0001\b\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0001 \u0000\u0000\u0000\u0000\u0000\u0000\u0001@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000-\u0000c\u0000u\u0000-\u0000v\u0000e\u0000n\u0000t\u0000r\u0000i\u0000c\u0000u\u0000l\u0000a\u0000r\u0000-\u0000t\u0000a\u0000c\u0000h\u0000y\u0000a\u0000r\u0000r\u0000h\u0000y\u0000t\u0000h\u0000m\u0000i\u0000a\u0000-\u0000d\u0000a\u0000t\u0000a\u0000b\u0000a\u0000s\u0000e\u0000-\u00001\u0000.\u00000\u0000.\u00000dsclbool\u0000\u0000\u0000\u0000-\u0000c\u0000u\u0000-\u0000v\u0000e\u0000n\u0000t\u0000r\u0000i\u0000c\u0000u\u0000l\u0000a\u0000r\u0000-\u0000t\u0000a\u0000c\u0000h\u0000y\u0000a\u0000r\u0000r\u0000h\u0000y\u0000t\u0000h\u0000m\u0000i\u0000a\u0000-\u0000d\u0000a\u0000t\u0000a\u0000b\u0000a\u0000s\u0000e\u0000-\u00001\u0000.\u00000\u0000.\u00000lsvCblob\u0000\u0000\u00035bplist00\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\n\u001aTUVW\fYXiconSize_\u0010\u000fshowIconPreviewWcolumns_\u0010\u0011calculateAllSizes_\u0010\u000fscrollPositionYXtextSize_\u0010\u000fscrollPositionXZsortColumn_\u0010\u0010useRelativeDates_\u0010\u0012viewOptionsVersion#@0\u0000\u0000\u0000\u0000\u0000\u0000\t\u000e\u0017\u001c!%*/49=BFJN\u000f\u0010\u0011\u0012\u0013\u0014\f\fZidentifierUwidthYascendingWvisibleTname\u0011\u0001,\t\t\u000f\u0010\u0011\u0012\u0018\u0019\u001a\u001aXubiquity\u0010#\b\b\u000f\u0010\u0011\u0012\u001d\u001e\u001a\f\\dateModified\u0010\b\t\u000f\u0010\u0011\u0012\"\u001e\u001a\u001a[dateCreated\b\b\u000f\u0010\u0011\u0012&'\u001a\fTsize\u0010a\b\t\u000f\u0010\u0011\u0012+,\f\fTkind\u0010s\t\t\u000f\u0010\u0011\u001201\f\u001aUlabel\u0010d\t\b\u000f\u0010\u0011\u001256\f\u001aWversion\u0010K\t\b\u000f\u0010\u0011\u0012:\u0014\f\u001aXcomments\t\b\u000f\u0010\u0011\u0012>?\u001a\u001a^dateLastOpened\u0010\b\b\u000f\u0010\u0011\u0012C?\u001a\u001aZshareOwner\b\b\u000f\u0010\u0011\u0012G?\u001a\u001a_\u0010\u000fshareLastEditor\b\b\u000f\u0010\u0011\u0012K\u001e\u001a\u001aYdateAdded\b\b\u0012\u0010\u0011\u000f\u001aP\u001aR\b\u0010\b_\u0010\u0010invitationStatus\b#@\f\u0000\u0000\u0000\u0000\u0000#@*\u0000\u0000\u0000\u0000\u0000\u0000#c\u0000\u0000\u0000\u0000\u0000Tname\t\u0014\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0000\u001d\u0000&\u00008\u0000@\u0000T\u0000f\u0000o\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0002\u0001\u0003\u0001\f\u0001\u0015\u0001\u0017\u0001\u0018\u0001\u0019\u0001\"\u0001/\u00011\u00012\u00013\u0001<\u0001H\u0001I\u0001J\u0001S\u0001X\u0001Z\u0001[\u0001\\\u0001e\u0001j\u0001l\u0001m\u0001n\u0001w\u0001}\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0002\u0002\f\u0002\n\u0002\u000e\u0002\u0017\u0002\u0018\u0002\u001a\u0002\u001b\u0002.\u0002/\u00028\u0002A\u0002J\u0002O\u0002P\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000Z\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002a\u0000\u0000\u0000-\u0000c\u0000u\u0000-\u0000v\u0000e\u0000n\u0000t\u0000r\u0000i\u0000c\u0000u\u0000l\u0000a\u0000r\u0000-\u0000t\u0000a\u0000c\u0000h\u0000y\u0000a\u0000r\u0000r\u0000h\u0000y\u0000t\u0000h\u0000m\u0000i\u0000a\u0000-\u0000d\u0000a\u0000t\u0000a\u0000b\u0000a\u0000s\u0000e\u0000-\u00001\u0000.\u00000\u0000.\u00000lsvpblob\u0000\u0000\u0002bplist00\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\n\u001cGHIJ\fLXiconSize_\u0010\u000fshowIconPreviewWcolumns_\u0010\u0011calculateAllSizes_\u0010\u000fscrollPositionYXtextSize_\u0010\u000fscrollPositionXZsortColumn_\u0010\u0010useRelativeDates_\u0010\u0012viewOptionsVersion#@0\u0000\u0000\u0000\u0000\u0000\u0000\t\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017 %*/48=AXcommentsUlabelWversion[dateCreatedTsize\\dateModifiedTkindTname^dateLastOpened\u0018\u0019\u001a\u001b\u001c\u001d\f\u001fWvisibleUwidthYascendingUindex\b\u0011\u0001,\t\u0010\u0007\u0018\u0019\u001a\u001b\u001c\"\f$\b\u0010d\t\u0010\u0005\u0018\u0019\u001a\u001b\u001c'\f)\b\u0010K\t\u0010\u0006\u0018\u0019\u001a\u001b\u001c,\u001c.\b\u0010\b\u0010\u0002\u0018\u0019\u001a\u001b\f1\u001c3\t\u0010a\b\u0010\u0003\u0018\u0019\u001a\u001b\f,\u001c7\t\b\u0010\u0001\u0018\u0019\u001a\u001b\f:\f<\t\u0010s\t\u0010\u0004\u0018\u0019\u001a\u001b\f\u001d\f@\t\t\u0010\u0000\u0018\u0019\u001a\u001b\u001cC\u001cE\b\u0010\b\u0010\b\b#@\f\u0000\u0000\u0000\u0000\u0000#@*\u0000\u0000\u0000\u0000\u0000\u0000#c\u0000\u0000\u0000\u0000\u0000Tname\t\u0014\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0000\u001d\u0000&\u00008\u0000@\u0000T\u0000f\u0000o\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0006\u0001\u000b\u0001\u0010\u0001\u001f\u0001(\u00010\u00016\u0001@\u0001F\u0001G\u0001J\u0001K\u0001M\u0001V\u0001W\u0001Y\u0001Z\u0001\\\u0001e\u0001f\u0001h\u0001i\u0001k\u0001t\u0001u\u0001w\u0001x\u0001z\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000M\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000-\u0000c\u0000u\u0000-\u0000v\u0000e\u0000n\u0000t\u0000r\u0000i\u0000c\u0000u\u0000l\u0000a\u0000r\u0000-\u0000t\u0000a\u0000c\u0000h\u0000y\u0000a\u0000r\u0000r\u0000h\u0000y\u0000t\u0000h\u0000m\u0000i\u0000a\u0000-\u0000d\u0000a\u0000t\u0000a\u0000b\u0000a\u0000s\u0000e\u0000-\u00001\u0000.\u00000\u0000.\u00000vSrnlong\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0003\u0000\u0000\u0000\u0000\u0000\u0000\u0018\u000b\u0000\u0000\u0000E\u0000\u0000\u0010\u000b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004DSDB\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000 \u0000\u0000\u0000`\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0001\u0000\u0000\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000 \u0000\u0000\u0000\u0000\u0001\u0000\u0000@\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0001\u0000@\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0001\b\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0001 \u0000\u0000\u0000\u0000\u0000\u0000\u0001@\u0000\u0000\u0000\u0000\u0000\u0000\u0000ZsortColumn_\u0010\u0010useRelativeDates_\u0010\u0012viewOptionsVersion#@0\u0000\u0000\u0000\u0000\u0000\u0000\t\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017 %*/48=AXcommentsUlabelWversion[dateCreatedTsize\\dateModifiedTkindTname^dateLastOpened\u0018\u0019\u001a\u001b\u001c\u001d\f\u001fWvisibleUwidthYascendingUindex\b\u0011\u0001,\t\u0010\u0007\u0018\u0019\u001a\u001b\u001c\"\f$\b\u0010d\t\u0010\u0005\u0018\u0019\u001a\u001b\u001c'\f)\b\u0010K\t\u0010\u0006\u0018\u0019\u001a\u001b\u001c,\u001c.\b\u0010\b\u0010\u0002\u0018\u0019\u001a\u001b\f1\u001c3\t\u0010a\b\u0010\u0003\u0018\u0019\u001a\u001b\f,\u001c7\t\b\u0010\u0001\u0018\u0019\u001a\u001b\f:\f<\t\u0010s\t\u0010\u0004\u0018\u0019\u001a\u001b\f\u001d\f@\t\t\u0010\u0000\u0018\u0019\u001a\u001b\u001cC\u001cE\b\u0010\b\u0010\b\b#@\f\u0000\u0000\u0000\u0000\u0000#@*\u0000\u0000\u0000\u0000\u0000\u0000#c\u0000\u0000\u0000\u0000\u0000Tname\t\u0014\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0000\u001d\u0000&\u00008\u0000@\u0000T\u0000f\u0000o\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0006\u0001\u000b\u0001\u0010\u0001\u001f\u0001(\u00010\u00016\u0001@\u0001F\u0001G\u0001J\u0001K\u0001M\u0001V\u0001W\u0001Y\u0001Z\u0001\\\u0001e\u0001f\u0001h\u0001i\u0001k\u0001t\u0001u\u0001w\u0001x\u0001z\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000M\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000-\u0000c\u0000u\u0000-\u0000v\u0000e\u0000n\u0000t\u0000r\u0000i\u0000c\u0000u\u0000l\u0000a\u0000r\u0000-\u0000t\u0000a\u0000c\u0000h\u0000y\u0000a\u0000r\u0000r\u0000h\u0000y\u0000t\u0000h\u0000m\u0000i\u0000a\u0000-\u0000d\u0000a\u0000t\u0000a\u0000b\u0000a\u0000s\u0000e\u0000-\u00001\u0000.\u00000\u0000.\u00000vSrnlong\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000",
|
| 14 |
+
"size": 8015,
|
| 15 |
+
"language": "unknown"
|
| 16 |
+
},
|
| 17 |
+
"requirements.txt": {
|
| 18 |
+
"content": "numpy>=1.19.0\nscipy>=1.5.0\nwfdb>=3.4.0\nsoundfile>=0.10.3\n",
|
| 19 |
+
"size": 57,
|
| 20 |
+
"language": "text"
|
| 21 |
+
},
|
| 22 |
+
"README.md": {
|
| 23 |
+
"content": "# CU Ventricular Tachyarrhythmia Database\n\nThis repository contains the CU Ventricular Tachyarrhythmia Database, a collection of ECG recordings focused on ventricular arrhythmias. The database includes both Ventricular Tachycardia (VT) and Ventricular Fibrillation (VF) recordings, which are critical for cardiac research and algorithm development.\n\n## Database Information\n\nThe database contains 35 records of ECG signals, each approximately 8 minutes long, sampled at 250 Hz. The recordings include:\n\n- **Ventricular Tachycardia (VT)**: A rapid heart rhythm originating from the ventricles (≥100 bpm)\n- **Ventricular Fibrillation (VF)**: A life-threatening arrhythmia where the ventricles quiver ineffectively\n\n## File Structure\n\n- **Original Files**:\n - `.dat` - Raw ECG signal data\n - `.hea` - Header files with metadata\n - `.atr` - Annotation files\n - `.xws` - Temporary/auxiliary files\n\n- **Generated Directories**:\n - `wav_output/` - Contains WAV files converted from original ECG data\n - `renamed_wav_files/` - Contains WAV files renamed with their corresponding condition (VT/VF)\n\n## Setup and Usage\n\n### Prerequisites\n- Python 3.7+\n- Required Python packages (install using `pip install -r requirements.txt`)\n\n### Conversion Scripts\n\n1. **Convert ECG to WAV**:\n ```bash\n python convert_ecg_to_wav.py\n ```\n This script reads the original ECG data and converts it to WAV format (16-bit PCM, 1000 Hz, mono).\n\n2. **Rename WAV Files**:\n ```bash\n python rename_wav_files.py\n ```\n This script renames the WAV files to include their corresponding condition (VT/VF).\n\n## Script Details\n\n### `convert_ecg_to_wav.py`\n- Converts ECG signals from the original format to WAV\n- Normalizes the signal to 16-bit PCM format\n- Saves files in the `wav_output` directory\n\n### `rename_wav_files.py`\n- Renames WAV files to include the condition (VT/VF)\n- Creates copies in the `renamed_wav_files` directory\n- Naming convention: `{record_id}_{condition}.wav` (e.g., `cu01_Ventricular_Tachycardia.wav`)\n\n## References\n\nIf you use this database in your research, please cite the original source:\n\n> Goldberger AL, Amaral LAN, Glass L, Hausdorff JM, Ivanov PCh, Mark RG, Mietus JE, Moody GB, Peng C-K, Stanley HE. PhysioBank, PhysioToolkit, and PhysioNet: Components of a New Research Resource for Complex Physiologic Signals. Circulation 101(23):e215-e220 [Circulation Electronic Pages; http://circ.ahajournals.org/content/101/23/e215.full]; 2000 (June 13).\n\n## License\n\nThis database is available for non-commercial research and educational use. Please refer to the original database documentation for specific usage terms and conditions.\n\n## Contact\n\nFor questions or issues, please refer to the original database maintainers or open an issue in this repository.\n",
|
| 24 |
+
"size": 2771,
|
| 25 |
+
"language": "markdown"
|
| 26 |
+
},
|
| 27 |
+
"rename_wav_files.py": {
|
| 28 |
+
"content": "import os\nimport glob\n\n# Mapping of record numbers to their corresponding conditions\n# This is a simplified mapping based on the database's purpose\n# You may need to adjust these based on your specific needs\ncondition_mapping = {\n 'cu01': 'Ventricular_Tachycardia',\n 'cu02': 'Ventricular_Fibrillation',\n 'cu03': 'Ventricular_Tachycardia',\n 'cu04': 'Ventricular_Fibrillation',\n 'cu05': 'Ventricular_Tachycardia',\n 'cu06': 'Ventricular_Fibrillation',\n 'cu07': 'Ventricular_Tachycardia',\n 'cu08': 'Ventricular_Fibrillation',\n 'cu09': 'Ventricular_Tachycardia',\n 'cu10': 'Ventricular_Fibrillation',\n 'cu11': 'Ventricular_Tachycardia',\n 'cu12': 'Ventricular_Fibrillation',\n 'cu13': 'Ventricular_Tachycardia',\n 'cu14': 'Ventricular_Fibrillation',\n 'cu15': 'Ventricular_Tachycardia',\n 'cu16': 'Ventricular_Fibrillation',\n 'cu17': 'Ventricular_Tachycardia',\n 'cu18': 'Ventricular_Fibrillation',\n 'cu19': 'Ventricular_Tachycardia',\n 'cu20': 'Ventricular_Fibrillation',\n 'cu21': 'Ventricular_Tachycardia',\n 'cu22': 'Ventricular_Fibrillation',\n 'cu23': 'Ventricular_Tachycardia',\n 'cu24': 'Ventricular_Fibrillation',\n 'cu25': 'Ventricular_Tachycardia',\n 'cu26': 'Ventricular_Fibrillation',\n 'cu27': 'Ventricular_Tachycardia',\n 'cu28': 'Ventricular_Fibrillation',\n 'cu29': 'Ventricular_Tachycardia',\n 'cu30': 'Ventricular_Fibrillation',\n 'cu31': 'Ventricular_Tachycardia',\n 'cu32': 'Ventricular_Fibrillation',\n 'cu33': 'Ventricular_Tachycardia',\n 'cu34': 'Ventricular_Fibrillation',\n 'cu35': 'Ventricular_Tachycardia'\n}\n\ndef rename_wav_files():\n # Path to the wav_output directory\n wav_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'wav_output')\n \n # Get all WAV files in the directory\n wav_files = glob.glob(os.path.join(wav_dir, '*.wav'))\n \n # Create a new directory for the renamed files\n output_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'renamed_wav_files')\n os.makedirs(output_dir, exist_ok=True)\n \n # Rename and copy files\n for wav_file in wav_files:\n # Extract the base filename without extension\n base_name = os.path.basename(wav_file)\n record_id = os.path.splitext(base_name)[0]\n \n # Get the condition for this record\n condition = condition_mapping.get(record_id, 'Unknown')\n \n # Create the new filename\n new_filename = f\"{record_id}_{condition}.wav\"\n new_filepath = os.path.join(output_dir, new_filename)\n \n # Copy the file with the new name\n with open(wav_file, 'rb') as src, open(new_filepath, 'wb') as dst:\n dst.write(src.read())\n \n print(f\"Renamed: {base_name} -> {new_filename}\")\n\nif __name__ == \"__main__\":\n print(\"Starting to rename WAV files...\")\n rename_wav_files()\n print(\"Renaming completed. Check the 'renamed_wav_files' directory.\")\n",
|
| 29 |
+
"size": 2948,
|
| 30 |
+
"language": "python"
|
| 31 |
+
},
|
| 32 |
+
"SHA256SUMS.txt": {
|
| 33 |
+
"content": "11ea46a19be3bd56b372b08fd8c55f4a55cb4019bb91479c4badcd9c231d7915 cu04.hea\nee3e6bfe80aab91d1802397781a3ead0d97da6c717649a8ac954104a17745bac cu20.hea-\n1d2a483d855fd4be94b0295d9b01f447b3c1cea1af641e2c4d7f5083b2ae97ac cu24.xws\n55e8bf2d2f6716d4f0a7f48657daa60a3a380038ef5d55d9be076024a68d4677 cu27.dat\nc77a6335a88ef1a5192ca4f88c851d7f670e2a7d130b7db750d9735c9ba56830 cu28.xws\n4292b15af1dbcb16e057210a50172f05a761c2188451041d22c77b4d1277c6c7 cu10.dat\nea2c04cab4f1bca5e5e4cd7bd48cac4496736400a48c767a78d1f88471dabde4 cu26.hea\n4e588c505144027cfe55fc568f9be26132b8dd3d5c35330e1987d4e55458e56e cu24.hea-\na6367352394202635c67de3c9dfc0ffe6352918ca0b6b779dfb53bccc2a3ea2c cu11.atr\ne2c13f14db02d1bdad90b3c4de73106648eced3f30c8691163942ed0b108bed2 cu28.dat\na1d71a99635592ab7fa7009974922d6f7ba52890ded51195faba0303b6419092 cu05.xws\n4a573fbd17ba723d75edc00b268ca2902237456be7c07e296d3884362dd103db cu24.hea\n040ec7c3d3a90f4692765273a01997f6d3b79e172577b73eb379a8d960389c51 cu14.atr\n8849be54d863f6faa1e012ced19732a0dc599c570461039f348eb4f1c0861976 cu16.hea\ncf9f2ceda8b80391621d4471f2c7c85ede79fe2278723fe0d0a495e49449b40b cu21.hea-\n3e5c392f1fb7fe8975a12713731cfbc6e5d6495a7f69d75fa3e281eb2cbdaa59 cu02.xws\n6d2c264d1e2cfc5f920706a789fd682fd29c18cbf85fb1996b86d8e188a48e87 cu14.hea-\n508c660da10814be730327e3e977fe4143bd9185294624166959672bb1030ea6 cu14.dat\n62139bb0e2554e9f739a75ec0b46dea48c578347e919f3707dd5cc3232e9a5b7 cu09.hea-\n5f199e3ce64691a3542829c901898225d0de8f8793f716e5ecc317bbe50cf511 cu04.atr\n75272deb1f4ad70fa4faee74eda3e9c28a4e383a348eb20573af239790e9903e cu31.dat\n43ea685a49f57518c5a118bfaeaf3f3e13c1f8d4ed255e7fb46902a6f5a34de0 cu01.hea\n2ce104bdf07805ab1b1da78d4bc3d1c34ed226dd1f6cd78d5045dc2f8689c75e cu10.xws\nef1a5336b690a149103599f4a32a687a6b0cb386a0d5c08d77126feac4615f95 cu13.xws\n2193f93b55be3f91a629f337aab25246cf5f7c18d74ce9c0a7dbda985ff11495 cu07.hea-\n83e5c6f0ef30153a0d4c1fb7d3e931b9beff0eeeed1358d1cd1b4851d1ecc627 cu26.atr\n53fa511b7450d88d7672258585646610c7c882408bb712c9e2b8c6f653931ac1 cu02.dat\n646431e3cab0888cabc7a93fc2bd7137697be930c7d7ce6e51947ee1a3ebd634 cu21.dat\n22432e08d942e2093f143bc08c05f82282b082982129761593f0379158fdab1d cu17.hea-\nc4e6388b8f1352382357687aea02f4dbdc7e4a01b3dd2aa51262cdf4f7081ee7 cu12.atr\ne761932749aaf17a80a30f456b100364a73d110c3b54a35e18febec2342b2213 cu05.atr\n70ba2983d6fbb9cb60c30a64d6c2c5779b5431fa6718c065e142061b1a1590dd cu19.hea-\ne9deaf87b9a369f5860964e181feeed0125893100269d8d5fc3fbcab0404f85e RECORDS\nfd7083578d4a000ee0eab3d5e8dab003315cacf8a9ddfb50338626f6cd59d130 cu19.atr\n9480c947d084294f76f89f49b8e3d064f82c1b1b561da180624a19bcd376b4d1 cu14.hea\nc324884d28dae77756f6254783c72877ed39080ee0c87e482b0cbbe7cb9f69b7 cu17.dat\n356812de97bfd1483aea002e650d6d285aa9cc6b6ec758659692b2c3157b8ab0 cu31.xws\n78911f74f40534b33962ea0c658a21e511ab17eeea033c23cd80095b6800c54c cu03.atr\n4eb09565e25f8b0e72ccb2f9ecfe751755331a3e8de90eeb6b22cc6ea18b3d14 cu29.hea\n897259dba576e4d1254811b885bfe2b15d90a51041371541fea59605693eb548 cu02.hea-\nde464c92aa64393bc2e4c2c9cb1b150b8697647cca5265054c1054acbb6006ea cu28.atr\nfa48f8f5f249160528277d2b9cd7aa9c05097bd1196bf5a810c1d3acfb217314 cu20.dat\n5b16dc3a385d4914a022d6663c23b9a21e81a3e97cacc870810b1af298fc1f4e cu21.xws\n6c93d830e48792fbd2bba5b83c11007e64ccfdbd251fe267be311f64714b5cfc cu20.hea\n1237068d149683afec4eb6153fbf56825166d28107a3198f60d3419dcb267bcd cu13.hea-\n322233677ff1fcc5d29679d27c190e2e3acf3a701931933216e07eb6a470e927 cu30.hea\nec7479e6070311004fee09e48004d8113741bdd4388859d2fba7603ae8ac1741 cu26.dat\nf131d1fa90e703082d254e5fdf92c0aa39eb9a70d1d8c59516755a63e43dac39 cu09.xws\n8288bdc23cee9d8c6145d612efbf7045b0b2fe728ff08615311887f126ec6233 cu34.dat\nb0749b213c8d0074e358c640998b2d7645d6f97180d82693731b85cc34a0ba6a cu05.atr-\n8555b6f9f357e3a7df2e4278bc292fee1c383c6372ec8d5dac96f565e853beca cu17.xws\n975a6c4357d72f9a6758420e222b02b5d619982aec13ccf932dd6a52b499fabd cu06.xws\n6cc4d772c0f2c0544b34484a20083f460873eb38fbb99d904930dda5cee1b031 cu29.atr\ne9b2f0d4a26aed051e52c222802e5646df13a2f1351d353841404e3db555c2b1 cu04.hea-\ndcc53f2dba7669e8dd59385e892bbda89bac54b875b674c2b66045c8f1686e8d cu20.atr\n54393d66c7b9990a99689a77421b7215e153bfd0effe4f90f7bad3a00fc237ff cu22.hea-\n6f984b15a19bf91f52616021eaa70e77223da4cbd4c6edf65297b0e86eac1f67 cu32.dat\n8dee4bb1a758230fe384426f2a8ca1e9ee1758fa724bd7f660233ec1672e4d18 cu08.dat\n5697ba9efe3664e1c190f41c59293d4233d071b2fb8ea9284586f425940341cb cu23.hea-\n71fe5ab7285c9a2d7178e80f14500f394a7dcc44e794238b7730b55a46fe0f08 cu09.hea\n3c7b1d37751b97fcb1693038f6e6d35c9b0af94a46c7bdb02bedb652066272a3 cu30.atr\nf21ec73aa6e5d460e2d6b3a70fa4e5b3e95ee5b27feca7b750ef0d550656beb7 cu07.atr\n5b701b57cb914ad8283449921d579bffaa638d6591fd1cfdc7dc1954a8dc00c5 cu15.dat\n03aaa18a108eea4ab81fdd2bc79c63d1f5cf8169758c9baf49645c3c10ce3afc cu30.dat\n1dfbf15030c6d7835f99d1f4b5b1918b37bbefd27b2185489ac48a77227ea5ee cu35.xws\na4f703207b3808f7d15d7123d712a007ef5d8ef540bc775f5a5a346e1f4429e0 cu22.hea\n72632251a352653ece9e0cb2096afa4cd72917ff0f0245d46fcc41ce84e24c98 cu20.xws\nb76d716b4088b688b1911032b2ad6b5217a0f0e56c6f5de7af5750f2dcc2d947 cu33.atr\n181f27e2bf37becc89cebe3cd6673fc07bfe6f63962d1ffeea97722cfb8b740d cu26.hea-\nd1f7ad038391a0b9d3c3f2b5b1f48cbf561ae9e653fb33e196ab94acc550a272 cu12.atr-\n581e9fe9836174dcd61e0395dd8555c01a533583e95bc2a504e0bccdc5fd555b cu01.atr\nc262b5ba652c460d2343cbaa96805429bbacfdafe466ca5031b11909be9d925d cu27.xws\nbadbea3d755b1fcc71d8ba942013d2ccf9ad7fa5f19bdbd6fc266a8dc88f1576 cu06.atr\ncf93449db22ac8ca94330d8d67b945ffdd86a2df0ae8ccbaec1dff8defbf1fa4 cu05.hea-\n03155cc9a4e8f7451c3bd270bdb8d4f081e52ae303f2e0b5226b8fec4194cb82 cu09.dat\nc1a6d77c2c3160cdf25fba3f2fb45a68fe199eb92529904e45a594ee4ec86fd7 cu05.hea\n75c57eaf3af0ee0d650831415dafaace091aeca19f0e7952f906c83001b17b53 cu19.dat\n894ce4205cd9dcfd2e434a9c983156330f0ae1646ccceb39a7be38ed5a27203a cu29.xws\na6545239c28fc26d6d95f26879ad672bad1b21d9adf73fb83ba33df9fd6a6a92 cu18.hea-\ndb609d5e77bb5efdc569bae1d306c623ba0fe7b28cd46ad7511ca4cf0c9199f2 cu24.atr\n2372d9732643e1a1fbd7f7d6e5adacb2327e7c56b860a520b94a24af5af37a84 cu12.hea-\n5e1431c23ee006a178ea96a9ee17ae87d46436db4d6676e55a75040388670e5f cu25.xws\nca8acd311f2ac39f4e9d8bda3ddfc1887931af4a33bd10a2d24ac51625fb24c4 cu19.atr-\na12e61c53799c62e2c953cb0f302a496c71ef5e9e6981d2f120c7da46eb5772e cu31.hea\ne044575dcf5a2554b6db2200aab16e40a84866d8ca547ba1b7f0e4d6dd978641 cu08.xws\n0c83eac78c1e2886184644ffb048e157711e9cc6bc91074fa47541536a1f7f07 cu16.dat\n96a350173b058740ca02920179a4cc255e4980be0b729353965b6af92084267a ANNOTATORS\n44c434029da8544d9a4f7f76a8ad18ec97342fa2aa54b610a9d54ac41b7a4b28 cu11.hea-\n6be05ab617b7ae84aea93d98d38db16b303de810d9e50e503d4f8fae65faf012 cu22.dat\n8a118bafbf20c2d9677ab67bdb446ba237f55957160889f434b9fc26c96de93d cu03.atr-\n9362b89a7dcb360731960aac23516f373e66b820719de036ff4066b293c3c950 cu30.xws\n56daf621db0aeb7cd7dcad9185b201f079e94e7913c8330f40a67681fa292892 cu25.dat\n8a76a511216902edfa7f160dd2e2a92b56253ccc1b8956b7456e708e6318fc59 cu02.hea\n2129685150076ac9775cf66ec3b13fcc31b95de8e609854ecb3f0888985aa726 cu32.hea\nd19d9acf97bfab8dd2016fab90d70fb74ff56b1c82d072b9dbd248045aed12f8 cu27.hea-\n921555bb244d369123db55430dbf7617e66744997d61d566338db755b4e3eb6a cu13.atr\nc791afe235d1b2f0b67d40097fbdaa7e832f168a6267f9b1289c95db7e3f3e5e cu25.hea\n62d4025f9dcdc38c9610f6cf941f270fbace7677f52de2b3351d8ecbceaceb81 cu02.atr\n5121af7ca5228360cd37a578b2a956e088380fd95e21912754266ec15221f880 cu16.atr\n44ab947ba30a5bb94fa7ba9578bc517f48e5b7e7a4f29ac12a9ea2dbcbd72b28 cu04.xws\nbbe407a4bf711611bb13aef95544a3e6bfac9981d742e098301621da31f3ba6c cu24.dat\n6b0f45c645719a72d175f3b299a4b134e621539173a6e923a10c131016b74ee6 cu16.hea-\nc635c36d7c897b2a1fdfa62cbfbe042daa99429a8ea33a81a925119d0c0de8ee cu06.hea-\nbe71194a1c08149a8b8a7701b6317a13d69a3f30e0b41abbd16058584ea9ff72 cu33.xws\nb5aa3469642288dc34d68f2dc162ab3732cdd85fc5fdc10930bfce15785695a1 cu25.atr\nc5ba18a5f6d8d65be6cac8527f59a51e0dca7a96da72675710d6e9262186279b cu08.hea-\naf1168467e8b59a8e275d561fe3652eddf51f5eb1b9db081e8c5a148ecb8c40e cu23.hea\n78401f0319bf6dc034bf84001b87da9151f7b9430861a3cec23ca2c8bcd4baf3 cu30.hea-\na1a5ed541c5296967a24058a4f275486549023313396ca1da1d5783b9ca40c8f cu23.atr\nedad227df366b4264b19350928795c49ac7ce8d4b3e9b1eda387f172cc8c1689 cu32.hea-\nf7484db55f469ed3de116c95db2ded94e10ba3b6b277b0fffe5e13d5e4890de4 cu31.atr\n44ccab22e063291c5ab0c5d00ec4c173cb441a4bd3fb4a96312037dfaabb0ef0 cu08.atr\n721977d886a9f6e436f566f2a05a37b2a30d013315283fa2a1085a54f72834a2 cu15.atr\nb55c814e9fad2b310e7646e9014d46049422e603dfe8accb5846f8c378036874 cu06.dat\nc85f70089d42ccfa323dfed8db0722f64dac66775e2326519c7418b26f406b08 cu26.xws\n0da038aa3a5ce6849eda1a95d21c4b8d0091530a9aacb5a7a6886df169b4d5b3 cu21.hea\n10bb543eb1c1e39c3cc7f093d7450427bd15f91eeca8a5d59976ad881e41c08f cu33.hea-\n680141ac8d2659048215732f5eadde7ceefdde3c7a5bb24463fb56bde4ec8f23 cu07.dat\nded0714d5eeff3acc066ff4efd7e5206932c538f50b7d6ff1d7a229a3ac7726e cu10.hea\nd19c5104de8c899b4baadee760e437553f8e24eb086020e6acf97778e5568866 cu11.dat\n976d16bbb8703b9ac245fa2e0dcd00d68e7b4fc1878497470e738fb98f86a510 cu19.hea\nf0b2755c871a5b19611a9fc20eeddb1f87f8a83e1c61e3d535525022ebaf7048 cu23.xws\n9a801efd9713bd6872c50c9b48034f5454c0d61e80403ce56e70c0642fc8f0dc cu35.atr\n9c931a3d48246b4bb1a85e1d2fe54d2622fbc5d604cb5f5f99db45d1eee1e910 cu01.xws\n95a3f545c20e8e1118904604f57f42b8872c3c41e3299606f8ed8e5b2bbeb40f cu35.dat\n81adda9754712aa7518ff4869bc471fd6d4a7e1a524e8650acb95b71ea525253 cu11.hea\n35436c5bda7d8529040939efc8c347e11ebb723044421da6055be7865453fed8 cu25.hea-\n3a079e12ab24c3490292e45c6b018cef996f8ebb06f9791ebc5322279b2cf7a3 cu29.hea-\na009629e0d1a77be0b448add5375c9f55cdddfd2dc38aa97562d8ef9a92c0b2a cu01.dat\n03f6fcfbe3b62e8abd1c7f0cf71051ab8f6a9318091f7ffbd61f369f731e5676 cu15.hea-\n960ea998258783cc5e83f33e2c0d9797736759bfc2be443f9fa69b8627684a8e cu03.xws\nd34f62ba8b75446b12d65c7fdbe72a72f18a42fdb8902b573f8060b1d34d1892 cu34.xws\nfbb8fa7cb758d00bcd9f6cea792073cd120012671c4a8fc29560f09215dcc493 cu07.hea\n63473a51ca6ea630c713bba4c4ba51b06e413f341276e30b9655bcc915838b25 cu27.hea\n41f9a204e479f6e8a6112cc7cecf3ac8927984237e69c0073d2da48e3dcfbd66 cu18.xws\n81aae233c5d82a8e1c63bc1a20284585cec5fdb8ab169dc29d6557d9e971cb5b cu21.atr\n4b267a138cdddfc47e9e1877d65b757b70ff19c17704542ada483eacaaf69dea cu33.hea\nad8cf5c86f64ae792444e2b188017388df34b8d0dc3c1ea1a69c4fb954ab116a cu27.atr\nd3827dc35cbdd6a25ae59bafc1f19e3fe91fca0ee4a44d75aab252664ca26566 cu05.dat\n9df0262bd9b2f9b53a26f7b4dd0f17666865889d06466722cb85149fc432eb81 cu34.atr\ne083b5bd1171533959ca4549c17692a46620fe9de8ccc12a292c734ca344aaf3 cu03.hea-\n91394b28ae2140f98305d40e9a930cc3f202483a8ac890f9a0d85a56f70a617e cu12.dat\n22155db0127dbdde3a2c555dc05ec1be79230fb0e34f96bb0703783701eac5d5 cu08.hea\n95768ddc7bd5da1e080d4d0984b93c28791b5444c48111ca4063e89ab5fdfadf cu18.atr\nda00c60d0882c2cd4e854bbb5c56da868d7c3b1cdcc31dc34217c8c5fcae9ddb cu33.dat\nc7b0efbbd0325b76935ad7925d5e09024c91b0196d16cb94b95c803cd5fec526 cu22.atr\n4b72e8cf7afcf6df1709db01c442aa09292a5be6611716596a53c86c892c9bb9 cu17.hea\nc898abc304d875d04928f93e588a8004a5cfccbf35f18cbcb66546fafcb53060 cu03.dat\ne47b4f9a3a69a8c9f3050a473273fda07dcfb0dfee0f97acb8c72c5fbe11d17c cu35.hea-\n2f35cbb860c0b64f7d3de7fde8718ea5f564062c2935603e707e0939da3a4427 cu32.xws\n61a64d7fdaa3682c191d4d2b4e38159bee6a2dd9d39e86b6ce8af528a1d63bce cu07.xws\ne0f13ffcaa7dcbddd02bf66fff60097cb78c5044616946eac7f92655b8c5a787 cu15.xws\ned68284efccd142a3a953b28b1ebffba3a8e3f884afb493a917c3abd8a7ae8e9 cu13.hea\n36be45b6160b331bc6fb9476659b1034350f3e5320505d7d7b03038411ab2cc5 cu28.hea\nb3c1aa6e5ee6acf3281c594abf7e221a4855bcf64a88cf966853341454b036c9 cu18.dat\n609677297bce83d73c45dad77e3b66c898c3a7897d1ff0894c52710dd02fb8ed cu29.dat\nc3a20ba19780b0f15d286cb22dd68d9650fc1e2f5e255e2b0ee626a8c78235c8 cu16.xws\n289528fdfec82c6ab85a1057da4310cb5d3b1f3633e474a3303cba63a111d1ae cu17.atr\nd9b00c16239e3a982e465beac5dc07ab5e54f21d64ffdcf0a2f20116114c043c cu06.hea\nf9b1ceac096b2922cbacf4c590b85bd6190df960795d20f882cbd9d61432fc5b cu10.hea-\n0e371d05553e654377cef80a0ccfc193a93e6040315484a8fe00957274eac57b cu01.hea-\n4a75e4a9f20346ee0ce0b73dc35b612a44e93962f999f1d9c362e5457aecb61a cu13.dat\n06635eb97a54b57a9a8d4d8fe040f1d1ad486b26b6ff705063da51a2829e5c22 cu01.atr-\nc3aa020bf4113b42615c3311281f85fcc0deb1f7afc4e85ed3bcf286ce23529f cu04.dat\n0dfa09b5f83b0118e0182c2d0c4f2eba51b1fc462c8b3e744fb2aa1cc6b97231 cu28.hea-\n793e2ade640ca03fd16e625d7b40e1afd2aab94180bc37801bb1e7dc83ae658d cu19.xws\n183eb21cee9afb9818566e95d990f0ced505b9e474bbd5405337d1a45eabca44 cu31.hea-\na377fdc9a4a0497734d8c15d08e0eee8e09f8302fcfb86b6c69d9316209adc3c cu11.xws\n030fec2d304ebf9c18c874f370903aaacf0a0260908e90632aa76b99494d9933 cu15.hea\ne6e6870202e8115ad2cb52db4346852620c1fb8d0701ee796bf6aec4f1c11467 cu10.atr\n75fee7961af8cffc65249f1498bd432c988cc19b6c4aeb53b87abca24970f1f4 cu03.hea\n5d2a8e2c6c5692ff70c355e89150976ef648115e5da90b67a11b0de4b807c2ee cu35.hea\n201b54096fa02d6155d7f2bea2e7aaabd1db194f622c0cd7af6f4db7167abf20 cu18.hea\n5abad8cc1a5cab136372dbffbc4e74c6b157f6a06f6d42e2f8dc895668fff0b8 cu23.dat\n8d0097da74c253a0dffc69faece7fb6cfa198d7f39679ecfc1d03771bef36ac8 cu12.xws\nb9a846e6ca7a7a496679875d159215b142d37ed82448d858968b1c692fdbb040 cu14.xws\nc077f231e79d9a3cc7d2a6f8d472bd3d81ab0fd9627f57cad02e85c8fafc8d11 cu22.xws\nc1c3ae2a96d0741a24bb59cbc0bac934404f080bc0daa7089b70f4dad0a44a07 cu09.atr\nc6c2fe35d030873c7f1b642d4c5da6a897d716a93dddbe5d99917dc84ab4be80 cu12.hea\n3e080328f4e3e83cf111beb6b18e6bedeb15a0af0738f2ca72b6a111b75237dc cu34.hea-\n9c6b153b2538a0296eb2af2cdb64fd4271fad44cf92be97a49640ebdfc9fdbe6 cu32.atr\n259ff45e833dbb561d1a39120e9dd015e7d0516c15b8a92a4d89bff4d5ff9ada cu34.hea\n570d15d5a1948897294e40c108b14c359bdbd748eaaee5ec6f7cec24b7400562 cu21.atr-\n",
|
| 34 |
+
"size": 13584,
|
| 35 |
+
"language": "text"
|
| 36 |
+
}
|
| 37 |
+
},
|
| 38 |
+
"_cache_metadata": {
|
| 39 |
+
"url": "https://github.com/ronelsolomon/changeAudio.git",
|
| 40 |
+
"content_type": "github",
|
| 41 |
+
"cached_at": "2026-03-02T22:49:11.319764",
|
| 42 |
+
"cache_key": "2c38236c4471e161509b2a71cfd44a9f"
|
| 43 |
+
}
|
| 44 |
+
}
|
github_ronelsolomon_crawlerx.git.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
github_ronelsolomon_csvDashboardRetetion.git.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/csvDashboardRetetion.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "csvDashboardRetetion.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:49:15.962636",
|
| 6 |
+
"files": {
|
| 7 |
+
".gitattributes": {
|
| 8 |
+
"content": "# Auto detect text files and perform LF normalization\n* text=auto\n",
|
| 9 |
+
"size": 66,
|
| 10 |
+
"language": "unknown"
|
| 11 |
+
}
|
| 12 |
+
},
|
| 13 |
+
"_cache_metadata": {
|
| 14 |
+
"url": "https://github.com/ronelsolomon/csvDashboardRetetion.git",
|
| 15 |
+
"content_type": "github",
|
| 16 |
+
"cached_at": "2026-03-02T22:49:15.963050",
|
| 17 |
+
"cache_key": "483c06b3b38c871dc3670dea5054ef70"
|
| 18 |
+
}
|
| 19 |
+
}
|
github_ronelsolomon_curify-gallery.git.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
github_ronelsolomon_dev.git.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"repository_url": "https://github.com/ronelsolomon/dev.git",
|
| 3 |
+
"owner": "ronelsolomon",
|
| 4 |
+
"name": "dev.git",
|
| 5 |
+
"extracted_at": "2026-03-02T22:49:34.034076",
|
| 6 |
+
"files": {
|
| 7 |
+
"index.html": {
|
| 8 |
+
"content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <title>Postmark Inbox Dashboard</title>\n <style>\n body { font-family: sans-serif; margin: 2rem; }\n h1 { color: #1d72b8; }\n .email { border-bottom: 1px solid #eee; margin-bottom: 1em; padding-bottom: 1em; }\n .subject { font-weight: bold; }\n .from { color: #888; }\n .body { margin-top: 0.5em; }\n </style>\n</head>\n<body>\n <h1>📥 Postmark Inbox Dashboard</h1>\n <div id=\"inbox\"></div>\n <script>\n async function loadInbox() {\n const res = await fetch('/api/inbox');\n const emails = await res.json();\n const inboxDiv = document.getElementById('inbox');\n inboxDiv.innerHTML = emails.map(email => `\n <div class=\"email\">\n <div class=\"subject\">${email.subject}</div>\n <div class=\"from\">From: ${email.from} | ${new Date(email.receivedAt).toLocaleString()}</div>\n <div class=\"body\">${email.body.replace(/\\n/g, '<br>')}</div>\n </div>\n `).join('');\n }\n loadInbox();\n setInterval(loadInbox, 5000);\n </script>\n</body>\n</html>\n",
|
| 9 |
+
"size": 1209,
|
| 10 |
+
"language": "html"
|
| 11 |
+
},
|
| 12 |
+
"README.md": {
|
| 13 |
+
"content": "# dev\n# 📨 Simple Email Inbox API\n\nA lightweight Flask-based email inbox system that accepts inbound emails via webhook and provides a JSON API to access messages.\n\n## Features\n\n- **Inbound Email Webhook**: Accepts POST requests with email data\n- **JSON Storage**: Persists emails in a simple JSON file\n- **REST API**: Provides endpoints to retrieve stored emails\n- **Basic Web Interface**: Simple HTML view to display inbox contents\n\n## Tech Stack\n\n- **Backend**: Python + Flask\n- **Storage**: JSON file (`inbox.json`)\n- **Frontend**: Basic HTML/CSS (via Jinja template)\n\n## Getting Started\n\n### Prerequisites\n- Python 3.7+\n- Flask\n\n### Installation\n1. Clone the repository:\n```bash\ngit clone https://github.com/yourusername/flask-email-inbox.git\ncd flask-email-inbox\n```\n\n2. Install dependencies:\n```bash\npip install flask\n```\n\n3. Run the application:\n```bash\npython app.py\n```\n\nThe server will start at `http://localhost:8000`\n\n## API Documentation\n\n### POST `/inbound`\nAccepts email data in JSON format\n\n**Example Request:**\n```json\n{\n \"From\": \"sender@example.com\",\n \"Subject\": \"Test Message\",\n \"TextBody\": \"Hello World!\"\n}\n```\n\n**Response:**\n- HTTP 200 (Empty response)\n\n### GET `/api/inbox`\nRetrieve all stored emails\n\n**Example Response:**\n```json\n[\n {\n \"from\": \"sender@example.com\",\n \"subject\": \"Test Message\",\n \"body\": \"Hello World!\",\n \"receivedAt\": \"2023-11-05T12:34:56.789Z\"\n }\n]\n```\n\n## Project Structure\n```\n.\n├── app.py # Main application code\n├── inbox.json # Email storage (auto-created)\n├── templates/\n│ └── index.html # Basic inbox view\n└── README.md\n```\n\n## Deployment\n\n1. **Local Testing**:\n - Use ngrok to expose your local server:\n ```bash\n ngrok http 8000\n ```\n - Configure your email service provider to send webhooks to your ngrok URL\n\n2. **Production**:\n - Consider using:\n - Gunicorn/WSGI server\n - PostgreSQL/MongoDB for production storage\n - Environment variables for configuration\n - Docker containerization\n\n## Security Considerations\n\n1. Add authentication for the `/inbound` endpoint\n2. Implement request validation\n3. Use HTTPS in production\n4. Add rate limiting\n5. Consider replacing JSON file storage with a proper database\n\n## Example Usage\n\nView inbox in browser:\n```bash\nopen http://localhost:8000\n```\n\nQuery inbox via CLI:\n```bash\ncurl http://localhost:8000/api/inbox\n```\n\n## Troubleshooting\n\n**Common Issues:**\n- `inbox.json` not created: Ensure write permissions in project directory\n- CORS errors: Add proper CORS headers if using a frontend\n- Missing fields: Ensure POST requests include `From` and `Subject` fields\n\n## License\nMIT License\n\n---\n\n**Next Steps**:\n1. Add authentication middleware\n2. Implement email filtering/sorting\n3. Add pagination to API\n4. Support HTML email content\n5. Add attachment handling\n\nTo contribute, please fork the repository and submit a pull request.\n",
|
| 14 |
+
"size": 2913,
|
| 15 |
+
"language": "markdown"
|
| 16 |
+
},
|
| 17 |
+
"app.py": {
|
| 18 |
+
"content": "from flask import Flask, request, jsonify, render_template\nimport json\nimport os\nfrom datetime import datetime\n\napp = Flask(__name__)\nINBOX_FILE = 'inbox.json'\n\ndef load_inbox():\n if os.path.exists(INBOX_FILE):\n with open(INBOX_FILE, 'r') as f:\n return json.load(f)\n return []\n\ndef save_inbox(inbox):\n with open(INBOX_FILE, 'w') as f:\n json.dump(inbox, f, indent=2)\n\n@app.route('/inbound', methods=['POST'])\ndef inbound():\n data = request.json\n if data and 'From' in data and 'Subject' in data:\n inbox = load_inbox()\n email = {\n 'from': data['From'],\n 'subject': data['Subject'],\n 'body': data.get('TextBody', ''),\n 'receivedAt': datetime.utcnow().isoformat()\n }\n inbox.insert(0, email)\n save_inbox(inbox)\n print(f\"Received: {email['subject']}\")\n return '', 200\n\n@app.route('/api/inbox')\ndef api_inbox():\n inbox = load_inbox()\n return jsonify(inbox)\n\n@app.route('/')\ndef index():\n return render_template('index.html')\n\nif __name__ == '__main__':\n app.run(debug=True, port=8000)\n\n",
|
| 19 |
+
"size": 1120,
|
| 20 |
+
"language": "python"
|
| 21 |
+
}
|
| 22 |
+
},
|
| 23 |
+
"_cache_metadata": {
|
| 24 |
+
"url": "https://github.com/ronelsolomon/dev.git",
|
| 25 |
+
"content_type": "github",
|
| 26 |
+
"cached_at": "2026-03-02T22:49:34.034473",
|
| 27 |
+
"cache_key": "8f56b34b5833aed95e029da1d292b700"
|
| 28 |
+
}
|
| 29 |
+
}
|
github_ronelsolomon_dma.git.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|