Kuberwastaken commited on
Commit
24aa2f9
Β·
1 Parent(s): 91d285a
app.py ADDED
@@ -0,0 +1,339 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import json
3
+ import torch
4
+ from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
5
+ import logging
6
+ from pathlib import Path
7
+ import tempfile
8
+ import time
9
+
10
+ # Setup logging
11
+ logging.basicConfig(level=logging.INFO)
12
+ logger = logging.getLogger(__name__)
13
+
14
+ class SyllabusFormatter:
15
+ def __init__(self, model_name="microsoft/Phi-3-mini-4k-instruct"):
16
+ self.model_name = model_name
17
+ self.tokenizer = None
18
+ self.model = None
19
+ self.pipe = None
20
+ self.processed_count = 0
21
+ self.total_count = 0
22
+
23
+ def setup_model(self):
24
+ """Download and setup the Phi model"""
25
+ try:
26
+ # Load tokenizer
27
+ self.tokenizer = AutoTokenizer.from_pretrained(
28
+ self.model_name,
29
+ trust_remote_code=True
30
+ )
31
+
32
+ # Load model with 8-bit quantization for efficiency
33
+ self.model = AutoModelForCausalLM.from_pretrained(
34
+ self.model_name,
35
+ torch_dtype=torch.float16,
36
+ device_map="auto",
37
+ trust_remote_code=True,
38
+ load_in_8bit=True
39
+ )
40
+
41
+ # Create pipeline
42
+ self.pipe = pipeline(
43
+ "text-generation",
44
+ model=self.model,
45
+ tokenizer=self.tokenizer,
46
+ max_new_tokens=2048,
47
+ temperature=0.1,
48
+ do_sample=True,
49
+ top_p=0.9,
50
+ repetition_penalty=1.1
51
+ )
52
+
53
+ logger.info("Model setup complete!")
54
+ return True
55
+
56
+ except Exception as e:
57
+ logger.error(f"Error setting up model: {str(e)}")
58
+ return False
59
+
60
+ def create_formatting_prompt(self, unit_content: str, unit_name: str, subject_name: str = "") -> str:
61
+ """Create a very clear, focused prompt for formatting syllabus content"""
62
+ prompt = f"""<|system|>You are a professional academic syllabus formatter. Your ONLY job is to take badly formatted syllabus content and make it beautifully organized and readable.
63
+
64
+ RULES:
65
+ 1. PRESERVE every single word, topic, and concept from the original
66
+ 2. NEVER add explanations, examples, or new content
67
+ 3. ONLY restructure and format the existing text
68
+ 4. Use clear headings, bullet points, and logical grouping
69
+ 5. Separate different topics with proper spacing
70
+ 6. Make it scannable and easy to read
71
+
72
+ FORMAT STYLE:
73
+ - Use main topic headings with proper capitalization
74
+ - Group related subtopics under main topics
75
+ - Use bullet points (β€’) for lists of concepts
76
+ - Use sub-bullets (β—¦) for details under main bullets
77
+ - Separate major sections with line breaks
78
+ - Keep technical terms exactly as written<|end|>
79
+
80
+ <|user|>Subject: {subject_name}
81
+ Unit: {unit_name}
82
+
83
+ Original content (poorly formatted):
84
+ {unit_content}
85
+
86
+ Task: Reformat this content to be beautifully organized and readable. Do NOT add any new information - only restructure what's already there. Make it professional and easy to scan.<|end|>
87
+
88
+ <|assistant|>"""
89
+ return prompt
90
+
91
+ def format_unit_content(self, unit_content: str, unit_name: str, subject_name: str = "", progress=None) -> str:
92
+ """Format a single unit's content using the AI model"""
93
+ try:
94
+ # Create prompt
95
+ prompt = self.create_formatting_prompt(unit_content, unit_name, subject_name)
96
+
97
+ # Generate formatted content
98
+ response = self.pipe(prompt)
99
+
100
+ # Extract formatted content
101
+ generated_text = response[0]['generated_text']
102
+ assistant_start = generated_text.find("<|assistant|>")
103
+ if assistant_start != -1:
104
+ formatted_content = generated_text[assistant_start + len("<|assistant|>"):].strip()
105
+ else:
106
+ formatted_content = generated_text.strip()
107
+
108
+ # Clean up and validate
109
+ formatted_content = self.clean_generated_content(formatted_content)
110
+ if not self.validate_formatted_content(unit_content, formatted_content):
111
+ return unit_content
112
+
113
+ return formatted_content
114
+
115
+ except Exception as e:
116
+ logger.error(f"Error formatting content: {str(e)}")
117
+ return unit_content
118
+
119
+ def validate_formatted_content(self, original: str, formatted: str) -> bool:
120
+ """Validate that formatted content preserves all important information"""
121
+ # Basic validation
122
+ if len(formatted) < len(original) * 0.4:
123
+ return False
124
+ return True
125
+
126
+ def clean_generated_content(self, content: str) -> str:
127
+ """Clean up generated content"""
128
+ # Remove special tokens
129
+ for token in ["<|system|>", "<|user|>", "<|assistant|>"]:
130
+ content = content.replace(token, "")
131
+
132
+ # Clean up extra whitespace
133
+ content = "\n".join(line.strip() for line in content.split("\n") if line.strip())
134
+
135
+ return content
136
+
137
+ def process_syllabus_file(self, syllabus_data: dict, progress=gr.Progress()) -> dict:
138
+ """Process the entire syllabus file with progress updates"""
139
+ try:
140
+ # Count total units
141
+ total_units = 0
142
+ processed = 0
143
+
144
+ def count_units(data):
145
+ count = 0
146
+ if isinstance(data, dict):
147
+ for value in data.values():
148
+ if isinstance(value, dict):
149
+ count += count_units(value)
150
+ elif isinstance(value, str) and "Unit" in str(value):
151
+ count += 1
152
+ return count
153
+
154
+ total_units = count_units(syllabus_data.get("syllabus", {}))
155
+ logger.info(f"Total units to process: {total_units}")
156
+
157
+ # Process each branch
158
+ for branch_name, branch_data in syllabus_data.get("syllabus", {}).items():
159
+ if not isinstance(branch_data, dict):
160
+ continue
161
+
162
+ # Process each semester
163
+ for sem_name, sem_data in branch_data.items():
164
+ if not isinstance(sem_data, dict):
165
+ continue
166
+
167
+ # Process each subject
168
+ for subject_name, subject_data in sem_data.items():
169
+ if not isinstance(subject_data, dict) or "content" not in subject_data:
170
+ continue
171
+
172
+ content = subject_data["content"]
173
+ if not isinstance(content, dict):
174
+ continue
175
+
176
+ # Format each unit
177
+ for unit_name, unit_content in content.items():
178
+ if not unit_name.startswith("Unit") or not isinstance(unit_content, str):
179
+ continue
180
+
181
+ processed += 1
182
+ progress(processed / total_units, desc=f"Processing {unit_name} in {subject_name}...")
183
+
184
+ # Format the unit content
185
+ formatted_content = self.format_unit_content(
186
+ unit_content,
187
+ unit_name,
188
+ subject_name
189
+ )
190
+
191
+ # Update the content
192
+ syllabus_data["syllabus"][branch_name][sem_name][subject_name]["content"][unit_name] = formatted_content
193
+
194
+ # Add formatting metadata
195
+ if "metadata" not in syllabus_data:
196
+ syllabus_data["metadata"] = {}
197
+
198
+ syllabus_data["metadata"].update({
199
+ "lastFormatted": time.strftime("%Y-%m-%dT%H:%M:%SZ"),
200
+ "formattingModel": "Phi-3 Mini",
201
+ "unitsProcessed": processed,
202
+ "version": "1.0"
203
+ })
204
+
205
+ return syllabus_data
206
+
207
+ except Exception as e:
208
+ logger.error(f"Error processing syllabus: {str(e)}")
209
+ raise gr.Error(f"Error processing syllabus: {str(e)}")
210
+
211
+ # Initialize the formatter
212
+ formatter = None
213
+
214
+ def setup_formatter():
215
+ global formatter
216
+ if formatter is None:
217
+ formatter = SyllabusFormatter()
218
+ return formatter.setup_model()
219
+ return True
220
+
221
+ def process_file(file):
222
+ """Process the uploaded syllabus file"""
223
+ try:
224
+ # Setup formatter if needed
225
+ if not setup_formatter():
226
+ raise gr.Error("Failed to setup the formatting model. Please try again.")
227
+
228
+ # Read and parse JSON
229
+ content = file.read()
230
+ syllabus_data = json.loads(content)
231
+
232
+ # Process syllabus
233
+ formatted_data = formatter.process_syllabus_file(syllabus_data)
234
+
235
+ # Save to temporary file
236
+ with tempfile.NamedTemporaryFile(mode='w', suffix='.json', delete=False) as tmp:
237
+ json.dump(formatted_data, tmp, indent=2)
238
+ return tmp.name
239
+
240
+ except json.JSONDecodeError:
241
+ raise gr.Error("Invalid JSON file. Please check your syllabus file format.")
242
+ except Exception as e:
243
+ raise gr.Error(f"Error processing file: {str(e)}")
244
+
245
+ # Custom theme
246
+ theme = gr.themes.Soft(
247
+ primary_hue="indigo",
248
+ secondary_hue="blue",
249
+ ).set(
250
+ body_background_fill="#fafafa",
251
+ body_background_fill_dark="#1a1a1a",
252
+ button_primary_background_fill="*primary_500",
253
+ button_primary_background_fill_hover="*primary_600"
254
+ )
255
+
256
+ # Gradio interface
257
+ title = "πŸ“š Syllabus Formatter"
258
+ description = """
259
+ Transform your syllabus into a beautifully formatted, easy-to-read document using AI.
260
+
261
+ ### Features:
262
+ - Preserves all original content
263
+ - Improves readability and organization
264
+ - Creates logical grouping and sections
265
+ - Adds professional formatting
266
+
267
+ Simply upload your JSON syllabus file and get a formatted version back!
268
+ """
269
+
270
+ css = """
271
+ .feedback {
272
+ margin-top: 20px;
273
+ padding: 10px;
274
+ border-radius: 8px;
275
+ background-color: #f0f9ff;
276
+ border: 1px solid #bae6fd;
277
+ }
278
+ .dark .feedback {
279
+ background-color: #082f49;
280
+ border-color: #075985;
281
+ }
282
+ """
283
+
284
+ with gr.Blocks(theme=theme, css=css) as iface:
285
+ gr.Markdown(f"# {title}")
286
+ gr.Markdown(description)
287
+
288
+ with gr.Row():
289
+ with gr.Column():
290
+ file_input = gr.File(
291
+ label="Upload Syllabus JSON",
292
+ file_types=[".json"],
293
+ file_count="single"
294
+ )
295
+ process_btn = gr.Button("πŸͺ„ Format Syllabus", variant="primary")
296
+
297
+ output_file = gr.File(
298
+ label="Download Formatted Syllabus",
299
+ file_count="single",
300
+ type="file",
301
+ interactive=False
302
+ )
303
+
304
+ with gr.Row():
305
+ feedback = gr.Markdown(
306
+ value="Upload a JSON syllabus file to begin...",
307
+ elem_classes=["feedback"]
308
+ )
309
+
310
+ def update_feedback(file):
311
+ return "Processing your syllabus... This may take a few minutes depending on the size."
312
+
313
+ # Setup click event
314
+ process_btn.click(
315
+ fn=update_feedback,
316
+ inputs=[file_input],
317
+ outputs=[feedback],
318
+ queue=False
319
+ ).then(
320
+ fn=process_file,
321
+ inputs=[file_input],
322
+ outputs=[output_file]
323
+ ).success(
324
+ fn=lambda: "✨ Syllabus formatting complete! You can now download the formatted file.",
325
+ outputs=[feedback]
326
+ )
327
+
328
+ gr.Markdown("""
329
+ ### πŸ“ Notes:
330
+ - The formatter preserves all original content while improving organization
331
+ - Processing time depends on the size of your syllabus
332
+ - For large files, please be patient as the AI processes each section
333
+
334
+ Made with ❀️ using Microsoft's Phi-3 Mini model
335
+ """)
336
+
337
+ # Launch in dev mode
338
+ if __name__ == "__main__":
339
+ iface.launch()
public/Content-Meta/Dotnotes.json ADDED
The diff for this file is too large to render. See raw diff
 
public/Content-Meta/FifteenFourteen.json ADDED
@@ -0,0 +1,1023 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "metadata": {
3
+ "source": "FifteenFourteen Collection (Scraped)",
4
+ "generatedAt": "2025-06-03T21:22:44.431Z",
5
+ "version": "1.0.0",
6
+ "description": "B.Tech First Year (Sem 1 & 2) study materials scraped from fifteenforteen.vercel.app",
7
+ "totalSubjects": 11,
8
+ "heroPage": "https://fifteenforteen.vercel.app/html/content.html",
9
+ "coverage": "First Year Only (SEM1 & SEM2)",
10
+ "note": "Real Google Drive links scraped from the website",
11
+ "scrapedAt": "2025-06-03T21:22:44.432Z"
12
+ },
13
+ "branches": {
14
+ "COMMON": {
15
+ "1st": {
16
+ "APC": {
17
+ "name": "Applied Chemistry",
18
+ "url": "https://fifteenforteen.vercel.app/html/contents/applied_chemistry.html",
19
+ "units": [
20
+ {
21
+ "number": "Unit 1",
22
+ "content": ""
23
+ },
24
+ {
25
+ "number": "Unit 2",
26
+ "content": ""
27
+ },
28
+ {
29
+ "number": "Unit 3",
30
+ "content": ""
31
+ },
32
+ {
33
+ "number": "Unit 4",
34
+ "content": ""
35
+ }
36
+ ],
37
+ "notes": [
38
+ {
39
+ "id": "1LvpqpkvmQVvC-pK-XXAfErYHYFOMFbh6",
40
+ "name": "Notes 1",
41
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1LvpqpkvmQVvC-pK-XXAfErYHYFOMFbh6",
42
+ "viewUrl": "https://drive.google.com/file/d/1LvpqpkvmQVvC-pK-XXAfErYHYFOMFbh6/preview",
43
+ "originalFolder": "Notes",
44
+ "source": "fifteenforteen",
45
+ "originalUrl": "https://drive.google.com/file/d/1LvpqpkvmQVvC-pK-XXAfErYHYFOMFbh6/view"
46
+ },
47
+ {
48
+ "id": "10lWJREUuStdggSxWfLMhQp2RvBU_GGy-",
49
+ "name": "Notes 2",
50
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=10lWJREUuStdggSxWfLMhQp2RvBU_GGy-",
51
+ "viewUrl": "https://drive.google.com/file/d/10lWJREUuStdggSxWfLMhQp2RvBU_GGy-/preview",
52
+ "originalFolder": "Notes",
53
+ "source": "fifteenforteen",
54
+ "originalUrl": "https://drive.google.com/file/d/10lWJREUuStdggSxWfLMhQp2RvBU_GGy-/view"
55
+ },
56
+ {
57
+ "id": "1cV0YxJuV-k1XBBRzmE_n73lX9roPb_Bn",
58
+ "name": "Notes 3",
59
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1cV0YxJuV-k1XBBRzmE_n73lX9roPb_Bn",
60
+ "viewUrl": "https://drive.google.com/file/d/1cV0YxJuV-k1XBBRzmE_n73lX9roPb_Bn/preview",
61
+ "originalFolder": "Notes",
62
+ "source": "fifteenforteen",
63
+ "originalUrl": "https://drive.google.com/file/d/1cV0YxJuV-k1XBBRzmE_n73lX9roPb_Bn/view"
64
+ },
65
+ {
66
+ "id": "15iD-9OSxVpWXpbHMg-2u1wL_KvYiKvmi",
67
+ "name": "Notes 4",
68
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=15iD-9OSxVpWXpbHMg-2u1wL_KvYiKvmi",
69
+ "viewUrl": "https://drive.google.com/file/d/15iD-9OSxVpWXpbHMg-2u1wL_KvYiKvmi/preview",
70
+ "originalFolder": "Notes",
71
+ "source": "fifteenforteen",
72
+ "originalUrl": "https://drive.google.com/file/d/15iD-9OSxVpWXpbHMg-2u1wL_KvYiKvmi/view"
73
+ },
74
+ {
75
+ "id": "1QtRhCAKw4NB4zhS6D9ktz159AUrnojPU",
76
+ "name": "LINK",
77
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1QtRhCAKw4NB4zhS6D9ktz159AUrnojPU",
78
+ "viewUrl": "https://drive.google.com/file/d/1QtRhCAKw4NB4zhS6D9ktz159AUrnojPU/preview",
79
+ "originalFolder": "Notes",
80
+ "source": "fifteenforteen",
81
+ "originalUrl": "https://drive.google.com/file/d/1QtRhCAKw4NB4zhS6D9ktz159AUrnojPU/view"
82
+ },
83
+ {
84
+ "id": "1GLrMmGHWA2T1EYNWP1sCHoPPrDDaDcVJ",
85
+ "name": "LINK",
86
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1GLrMmGHWA2T1EYNWP1sCHoPPrDDaDcVJ",
87
+ "viewUrl": "https://drive.google.com/file/d/1GLrMmGHWA2T1EYNWP1sCHoPPrDDaDcVJ/preview",
88
+ "originalFolder": "Notes",
89
+ "source": "fifteenforteen",
90
+ "originalUrl": "https://drive.google.com/file/d/1GLrMmGHWA2T1EYNWP1sCHoPPrDDaDcVJ/view"
91
+ }
92
+ ],
93
+ "pyqs": [
94
+ {
95
+ "id": "1vyn7EdId6lw8nyvCIj3psMW9P6jZQY9Z",
96
+ "name": "PYQ",
97
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1vyn7EdId6lw8nyvCIj3psMW9P6jZQY9Z",
98
+ "viewUrl": "https://drive.google.com/file/d/1vyn7EdId6lw8nyvCIj3psMW9P6jZQY9Z/preview",
99
+ "originalFolder": "Pyqs",
100
+ "source": "fifteenforteen",
101
+ "originalUrl": "https://drive.google.com/file/d/1vyn7EdId6lw8nyvCIj3psMW9P6jZQY9Z/view"
102
+ }
103
+ ],
104
+ "viva": [],
105
+ "midsem": [],
106
+ "books": [],
107
+ "lab": [],
108
+ "syllabus": [],
109
+ "videos": [],
110
+ "akash": []
111
+ },
112
+ "PIC": {
113
+ "name": "Programming in C",
114
+ "url": "https://fifteenforteen.vercel.app/html/contents/programming_in_c.html",
115
+ "units": [
116
+ {
117
+ "number": "Unit 1",
118
+ "content": ""
119
+ },
120
+ {
121
+ "number": "Unit 2",
122
+ "content": ""
123
+ },
124
+ {
125
+ "number": "Unit 3",
126
+ "content": ""
127
+ },
128
+ {
129
+ "number": "Unit 4",
130
+ "content": ""
131
+ }
132
+ ],
133
+ "notes": [
134
+ {
135
+ "id": "16qtyJND8VcJx7Y5iPpiUu9GGJ7Hz05JR",
136
+ "name": "Notes 1",
137
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=16qtyJND8VcJx7Y5iPpiUu9GGJ7Hz05JR",
138
+ "viewUrl": "https://drive.google.com/file/d/16qtyJND8VcJx7Y5iPpiUu9GGJ7Hz05JR/preview",
139
+ "originalFolder": "Notes",
140
+ "source": "fifteenforteen",
141
+ "originalUrl": "https://drive.google.com/file/d/16qtyJND8VcJx7Y5iPpiUu9GGJ7Hz05JR/view"
142
+ },
143
+ {
144
+ "id": "1i776eBq2yJsG2yuzzyOEDfxrunIR8vmp",
145
+ "name": "Notes 2",
146
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1i776eBq2yJsG2yuzzyOEDfxrunIR8vmp",
147
+ "viewUrl": "https://drive.google.com/file/d/1i776eBq2yJsG2yuzzyOEDfxrunIR8vmp/preview",
148
+ "originalFolder": "Notes",
149
+ "source": "fifteenforteen",
150
+ "originalUrl": "https://drive.google.com/file/d/1i776eBq2yJsG2yuzzyOEDfxrunIR8vmp/view"
151
+ },
152
+ {
153
+ "id": "1GIpvNQ3RDZQ8WRD1puWi_QrmyDUygKJy",
154
+ "name": "Notes 3",
155
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1GIpvNQ3RDZQ8WRD1puWi_QrmyDUygKJy",
156
+ "viewUrl": "https://drive.google.com/file/d/1GIpvNQ3RDZQ8WRD1puWi_QrmyDUygKJy/preview",
157
+ "originalFolder": "Notes",
158
+ "source": "fifteenforteen",
159
+ "originalUrl": "https://drive.google.com/file/d/1GIpvNQ3RDZQ8WRD1puWi_QrmyDUygKJy/view"
160
+ },
161
+ {
162
+ "id": "14YXl-ZVNEhzXsrMReQgIc9aiLJc1AKyd",
163
+ "name": "Notes 4",
164
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=14YXl-ZVNEhzXsrMReQgIc9aiLJc1AKyd",
165
+ "viewUrl": "https://drive.google.com/file/d/14YXl-ZVNEhzXsrMReQgIc9aiLJc1AKyd/preview",
166
+ "originalFolder": "Notes",
167
+ "source": "fifteenforteen",
168
+ "originalUrl": "https://drive.google.com/file/d/14YXl-ZVNEhzXsrMReQgIc9aiLJc1AKyd/view"
169
+ },
170
+ {
171
+ "id": "13TxPhPDomEflcpX9DdHzRropIhsZ8wEX",
172
+ "name": "LINK",
173
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=13TxPhPDomEflcpX9DdHzRropIhsZ8wEX",
174
+ "viewUrl": "https://drive.google.com/file/d/13TxPhPDomEflcpX9DdHzRropIhsZ8wEX/preview",
175
+ "originalFolder": "Notes",
176
+ "source": "fifteenforteen",
177
+ "originalUrl": "https://drive.google.com/file/d/13TxPhPDomEflcpX9DdHzRropIhsZ8wEX/view"
178
+ },
179
+ {
180
+ "id": "1am__YrIyVn2eehybgYnLsRPXbumFIqRW",
181
+ "name": "LINK",
182
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1am__YrIyVn2eehybgYnLsRPXbumFIqRW",
183
+ "viewUrl": "https://drive.google.com/file/d/1am__YrIyVn2eehybgYnLsRPXbumFIqRW/preview",
184
+ "originalFolder": "Notes",
185
+ "source": "fifteenforteen",
186
+ "originalUrl": "https://drive.google.com/file/d/1am__YrIyVn2eehybgYnLsRPXbumFIqRW/view"
187
+ },
188
+ {
189
+ "id": "1eQ3uQFuGW97cNjLONU5VDxXVp1VKc3Hj",
190
+ "name": "LINK",
191
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1eQ3uQFuGW97cNjLONU5VDxXVp1VKc3Hj",
192
+ "viewUrl": "https://drive.google.com/file/d/1eQ3uQFuGW97cNjLONU5VDxXVp1VKc3Hj/preview",
193
+ "originalFolder": "Notes",
194
+ "source": "fifteenforteen",
195
+ "originalUrl": "https://drive.google.com/file/d/1eQ3uQFuGW97cNjLONU5VDxXVp1VKc3Hj/view"
196
+ }
197
+ ],
198
+ "pyqs": [
199
+ {
200
+ "id": "1UBSfRO_HIxKVH_282aB8gc_fLpjUjTlh",
201
+ "name": "PYQ",
202
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1UBSfRO_HIxKVH_282aB8gc_fLpjUjTlh",
203
+ "viewUrl": "https://drive.google.com/file/d/1UBSfRO_HIxKVH_282aB8gc_fLpjUjTlh/preview",
204
+ "originalFolder": "Pyqs",
205
+ "source": "fifteenforteen",
206
+ "originalUrl": "https://drive.google.com/file/d/1UBSfRO_HIxKVH_282aB8gc_fLpjUjTlh/view"
207
+ }
208
+ ],
209
+ "viva": [],
210
+ "midsem": [],
211
+ "books": [],
212
+ "lab": [],
213
+ "syllabus": [],
214
+ "videos": [],
215
+ "akash": []
216
+ },
217
+ "CS": {
218
+ "name": "Communication Skills",
219
+ "url": "https://fifteenforteen.vercel.app/html/contents/communication_skills.html",
220
+ "units": [
221
+ {
222
+ "number": "Unit 1",
223
+ "content": ""
224
+ },
225
+ {
226
+ "number": "Unit 2",
227
+ "content": ""
228
+ },
229
+ {
230
+ "number": "Unit 3",
231
+ "content": ""
232
+ },
233
+ {
234
+ "number": "Unit 4",
235
+ "content": ""
236
+ }
237
+ ],
238
+ "notes": [
239
+ {
240
+ "id": "181Lu3ZMCvw35EvwZpm33ZFPTnHQ43Phu",
241
+ "name": "Notes 1",
242
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=181Lu3ZMCvw35EvwZpm33ZFPTnHQ43Phu",
243
+ "viewUrl": "https://drive.google.com/file/d/181Lu3ZMCvw35EvwZpm33ZFPTnHQ43Phu/preview",
244
+ "originalFolder": "Notes",
245
+ "source": "fifteenforteen",
246
+ "originalUrl": "https://drive.google.com/file/d/181Lu3ZMCvw35EvwZpm33ZFPTnHQ43Phu/view"
247
+ },
248
+ {
249
+ "id": "1jiHTKV63_dRVm_lBvJIbW0X9qOR5k8R_",
250
+ "name": "Notes 2",
251
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1jiHTKV63_dRVm_lBvJIbW0X9qOR5k8R_",
252
+ "viewUrl": "https://drive.google.com/file/d/1jiHTKV63_dRVm_lBvJIbW0X9qOR5k8R_/preview",
253
+ "originalFolder": "Notes",
254
+ "source": "fifteenforteen",
255
+ "originalUrl": "https://drive.google.com/file/d/1jiHTKV63_dRVm_lBvJIbW0X9qOR5k8R_/view"
256
+ },
257
+ {
258
+ "id": "1pwm4Hlgi9XKWnilhamD8n-MIDpPPjQoO",
259
+ "name": "Notes 3",
260
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1pwm4Hlgi9XKWnilhamD8n-MIDpPPjQoO",
261
+ "viewUrl": "https://drive.google.com/file/d/1pwm4Hlgi9XKWnilhamD8n-MIDpPPjQoO/preview",
262
+ "originalFolder": "Notes",
263
+ "source": "fifteenforteen",
264
+ "originalUrl": "https://drive.google.com/file/d/1pwm4Hlgi9XKWnilhamD8n-MIDpPPjQoO/view"
265
+ },
266
+ {
267
+ "id": "1U4dRoBZ55U9aYiYaJrcJo5ncokXz6766",
268
+ "name": "Notes 4",
269
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1U4dRoBZ55U9aYiYaJrcJo5ncokXz6766",
270
+ "viewUrl": "https://drive.google.com/file/d/1U4dRoBZ55U9aYiYaJrcJo5ncokXz6766/preview",
271
+ "originalFolder": "Notes",
272
+ "source": "fifteenforteen",
273
+ "originalUrl": "https://drive.google.com/file/d/1U4dRoBZ55U9aYiYaJrcJo5ncokXz6766/view"
274
+ }
275
+ ],
276
+ "pyqs": [
277
+ {
278
+ "id": "1y_ctVTxz8JumJz6t0yv4CgLp0nQsvUHo",
279
+ "name": "PYQ",
280
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1y_ctVTxz8JumJz6t0yv4CgLp0nQsvUHo",
281
+ "viewUrl": "https://drive.google.com/file/d/1y_ctVTxz8JumJz6t0yv4CgLp0nQsvUHo/preview",
282
+ "originalFolder": "Pyqs",
283
+ "source": "fifteenforteen",
284
+ "originalUrl": "https://drive.google.com/file/d/1y_ctVTxz8JumJz6t0yv4CgLp0nQsvUHo/view"
285
+ }
286
+ ],
287
+ "viva": [],
288
+ "midsem": [],
289
+ "books": [],
290
+ "lab": [],
291
+ "syllabus": [],
292
+ "videos": [],
293
+ "akash": []
294
+ },
295
+ "APP1": {
296
+ "name": "Applied Physics - 1",
297
+ "url": "https://fifteenforteen.vercel.app/html/contents/applied_physics-1.html",
298
+ "units": [
299
+ {
300
+ "number": "Unit 1",
301
+ "content": ""
302
+ },
303
+ {
304
+ "number": "Unit 2",
305
+ "content": ""
306
+ },
307
+ {
308
+ "number": "Unit 3",
309
+ "content": ""
310
+ },
311
+ {
312
+ "number": "Unit 4",
313
+ "content": ""
314
+ }
315
+ ],
316
+ "notes": [
317
+ {
318
+ "id": "1g3dPwskjwpe87OWSb1IOY1ll3ML2wybj",
319
+ "name": "Notes 1",
320
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1g3dPwskjwpe87OWSb1IOY1ll3ML2wybj",
321
+ "viewUrl": "https://drive.google.com/file/d/1g3dPwskjwpe87OWSb1IOY1ll3ML2wybj/preview",
322
+ "originalFolder": "Notes",
323
+ "source": "fifteenforteen",
324
+ "originalUrl": "https://drive.google.com/file/d/1g3dPwskjwpe87OWSb1IOY1ll3ML2wybj/view"
325
+ },
326
+ {
327
+ "id": "12jgBCyyHK3QywnJPA5Ns4HRR0s4bU9lD",
328
+ "name": "Notes 2",
329
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=12jgBCyyHK3QywnJPA5Ns4HRR0s4bU9lD",
330
+ "viewUrl": "https://drive.google.com/file/d/12jgBCyyHK3QywnJPA5Ns4HRR0s4bU9lD/preview",
331
+ "originalFolder": "Notes",
332
+ "source": "fifteenforteen",
333
+ "originalUrl": "https://drive.google.com/file/d/12jgBCyyHK3QywnJPA5Ns4HRR0s4bU9lD/view"
334
+ },
335
+ {
336
+ "id": "1STPFItb6wKANlfGkWpJ5yjMPxE9wMcr4",
337
+ "name": "Notes 3",
338
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1STPFItb6wKANlfGkWpJ5yjMPxE9wMcr4",
339
+ "viewUrl": "https://drive.google.com/file/d/1STPFItb6wKANlfGkWpJ5yjMPxE9wMcr4/preview",
340
+ "originalFolder": "Notes",
341
+ "source": "fifteenforteen",
342
+ "originalUrl": "https://drive.google.com/file/d/1STPFItb6wKANlfGkWpJ5yjMPxE9wMcr4/view"
343
+ },
344
+ {
345
+ "id": "12jzh5Pk-ufWQnws_qjvwaGOzthZqTojV",
346
+ "name": "Notes 4",
347
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=12jzh5Pk-ufWQnws_qjvwaGOzthZqTojV",
348
+ "viewUrl": "https://drive.google.com/file/d/12jzh5Pk-ufWQnws_qjvwaGOzthZqTojV/preview",
349
+ "originalFolder": "Notes",
350
+ "source": "fifteenforteen",
351
+ "originalUrl": "https://drive.google.com/file/d/12jzh5Pk-ufWQnws_qjvwaGOzthZqTojV/view"
352
+ },
353
+ {
354
+ "id": "1HPftQgRWtc7D_2HPShkcHd_63VFlBAIL",
355
+ "name": "files",
356
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1HPftQgRWtc7D_2HPShkcHd_63VFlBAIL",
357
+ "viewUrl": "https://drive.google.com/file/d/1HPftQgRWtc7D_2HPShkcHd_63VFlBAIL/preview",
358
+ "originalFolder": "Notes",
359
+ "source": "fifteenforteen",
360
+ "originalUrl": "https://drive.google.com/file/d/1HPftQgRWtc7D_2HPShkcHd_63VFlBAIL/view"
361
+ },
362
+ {
363
+ "id": "1P8AuKiygaje724ige4aqaT9_XSUxHaeF",
364
+ "name": "LINK",
365
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1P8AuKiygaje724ige4aqaT9_XSUxHaeF",
366
+ "viewUrl": "https://drive.google.com/file/d/1P8AuKiygaje724ige4aqaT9_XSUxHaeF/preview",
367
+ "originalFolder": "Notes",
368
+ "source": "fifteenforteen",
369
+ "originalUrl": "https://drive.google.com/file/d/1P8AuKiygaje724ige4aqaT9_XSUxHaeF/view"
370
+ }
371
+ ],
372
+ "pyqs": [
373
+ {
374
+ "id": "1Yc2Kw7EnDXS0ZzA6Xv3xKqk8v3-6aomE",
375
+ "name": "PYQ",
376
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1Yc2Kw7EnDXS0ZzA6Xv3xKqk8v3-6aomE",
377
+ "viewUrl": "https://drive.google.com/file/d/1Yc2Kw7EnDXS0ZzA6Xv3xKqk8v3-6aomE/preview",
378
+ "originalFolder": "Pyqs",
379
+ "source": "fifteenforteen",
380
+ "originalUrl": "https://drive.google.com/file/d/1Yc2Kw7EnDXS0ZzA6Xv3xKqk8v3-6aomE/view"
381
+ }
382
+ ],
383
+ "viva": [],
384
+ "midsem": [],
385
+ "books": [],
386
+ "lab": [],
387
+ "syllabus": [],
388
+ "videos": [],
389
+ "akash": []
390
+ },
391
+ "MP": {
392
+ "name": "Manufacturing Processes",
393
+ "url": "https://fifteenforteen.vercel.app/html/contents/manufacturing_processes.html",
394
+ "units": [
395
+ {
396
+ "number": "Unit 1",
397
+ "content": ""
398
+ },
399
+ {
400
+ "number": "Unit 2",
401
+ "content": ""
402
+ },
403
+ {
404
+ "number": "Unit 3",
405
+ "content": ""
406
+ },
407
+ {
408
+ "number": "Unit 4",
409
+ "content": ""
410
+ }
411
+ ],
412
+ "notes": [
413
+ {
414
+ "id": "1PoofkfuWTfOJk-CrJw2uoUWuFFVnXp2H",
415
+ "name": "Notes 1",
416
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1PoofkfuWTfOJk-CrJw2uoUWuFFVnXp2H",
417
+ "viewUrl": "https://drive.google.com/file/d/1PoofkfuWTfOJk-CrJw2uoUWuFFVnXp2H/preview",
418
+ "originalFolder": "Notes",
419
+ "source": "fifteenforteen",
420
+ "originalUrl": "https://drive.google.com/file/d/1PoofkfuWTfOJk-CrJw2uoUWuFFVnXp2H/view"
421
+ },
422
+ {
423
+ "id": "1pUyF6zcoKODUYzO_fF0pPKSvXSoRzQvx",
424
+ "name": "Notes 2",
425
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1pUyF6zcoKODUYzO_fF0pPKSvXSoRzQvx",
426
+ "viewUrl": "https://drive.google.com/file/d/1pUyF6zcoKODUYzO_fF0pPKSvXSoRzQvx/preview",
427
+ "originalFolder": "Notes",
428
+ "source": "fifteenforteen",
429
+ "originalUrl": "https://drive.google.com/file/d/1pUyF6zcoKODUYzO_fF0pPKSvXSoRzQvx/view"
430
+ },
431
+ {
432
+ "id": "1ENVXBIt1zdYdBAFosWIwGRhMUwAFEIgb",
433
+ "name": "Notes 3",
434
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1ENVXBIt1zdYdBAFosWIwGRhMUwAFEIgb",
435
+ "viewUrl": "https://drive.google.com/file/d/1ENVXBIt1zdYdBAFosWIwGRhMUwAFEIgb/preview",
436
+ "originalFolder": "Notes",
437
+ "source": "fifteenforteen",
438
+ "originalUrl": "https://drive.google.com/file/d/1ENVXBIt1zdYdBAFosWIwGRhMUwAFEIgb/view"
439
+ },
440
+ {
441
+ "id": "1EM5DHL9CDrbfHMUCLaoNOwBuZj08fUhb",
442
+ "name": "Notes 4",
443
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1EM5DHL9CDrbfHMUCLaoNOwBuZj08fUhb",
444
+ "viewUrl": "https://drive.google.com/file/d/1EM5DHL9CDrbfHMUCLaoNOwBuZj08fUhb/preview",
445
+ "originalFolder": "Notes",
446
+ "source": "fifteenforteen",
447
+ "originalUrl": "https://drive.google.com/file/d/1EM5DHL9CDrbfHMUCLaoNOwBuZj08fUhb/view"
448
+ },
449
+ {
450
+ "id": "13TxPhPDomEflcpX9DdHzRropIhsZ8wEX",
451
+ "name": "LINK",
452
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=13TxPhPDomEflcpX9DdHzRropIhsZ8wEX",
453
+ "viewUrl": "https://drive.google.com/file/d/13TxPhPDomEflcpX9DdHzRropIhsZ8wEX/preview",
454
+ "originalFolder": "Notes",
455
+ "source": "fifteenforteen",
456
+ "originalUrl": "https://drive.google.com/file/d/13TxPhPDomEflcpX9DdHzRropIhsZ8wEX/view"
457
+ }
458
+ ],
459
+ "pyqs": [
460
+ {
461
+ "id": "1Eh3F64_-jAHdhuXLyAjce5rJGJo0jrxx",
462
+ "name": "PYQ",
463
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1Eh3F64_-jAHdhuXLyAjce5rJGJo0jrxx",
464
+ "viewUrl": "https://drive.google.com/file/d/1Eh3F64_-jAHdhuXLyAjce5rJGJo0jrxx/preview",
465
+ "originalFolder": "Pyqs",
466
+ "source": "fifteenforteen",
467
+ "originalUrl": "https://drive.google.com/file/d/1Eh3F64_-jAHdhuXLyAjce5rJGJo0jrxx/view"
468
+ }
469
+ ],
470
+ "viva": [],
471
+ "midsem": [],
472
+ "books": [],
473
+ "lab": [],
474
+ "syllabus": [],
475
+ "videos": [],
476
+ "akash": []
477
+ },
478
+ "ES": {
479
+ "name": "Electrical Science",
480
+ "url": "https://fifteenforteen.vercel.app/html/contents/electrical_science.html",
481
+ "units": [
482
+ {
483
+ "number": "Unit 1",
484
+ "content": ""
485
+ },
486
+ {
487
+ "number": "Unit 2",
488
+ "content": ""
489
+ },
490
+ {
491
+ "number": "Unit 3",
492
+ "content": ""
493
+ },
494
+ {
495
+ "number": "Unit 4",
496
+ "content": ""
497
+ }
498
+ ],
499
+ "notes": [
500
+ {
501
+ "id": "1u8KeQc3uuf_5wQdzJGwjnPFH91DhlFaL",
502
+ "name": "NOTES",
503
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1u8KeQc3uuf_5wQdzJGwjnPFH91DhlFaL",
504
+ "viewUrl": "https://drive.google.com/file/d/1u8KeQc3uuf_5wQdzJGwjnPFH91DhlFaL/preview",
505
+ "originalFolder": "Notes",
506
+ "source": "fifteenforteen",
507
+ "originalUrl": "https://drive.google.com/file/d/1u8KeQc3uuf_5wQdzJGwjnPFH91DhlFaL/view"
508
+ },
509
+ {
510
+ "id": "1RG7eC9_D6dS80pnh2Oh9UdrNMTyo3SMD",
511
+ "name": "LINK",
512
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1RG7eC9_D6dS80pnh2Oh9UdrNMTyo3SMD",
513
+ "viewUrl": "https://drive.google.com/file/d/1RG7eC9_D6dS80pnh2Oh9UdrNMTyo3SMD/preview",
514
+ "originalFolder": "Notes",
515
+ "source": "fifteenforteen",
516
+ "originalUrl": "https://drive.google.com/file/d/1RG7eC9_D6dS80pnh2Oh9UdrNMTyo3SMD/view"
517
+ },
518
+ {
519
+ "id": "1kIlhTdBEK6HFhWXPQQmzj5eQ5avSHgYV",
520
+ "name": "LINK",
521
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1kIlhTdBEK6HFhWXPQQmzj5eQ5avSHgYV",
522
+ "viewUrl": "https://drive.google.com/file/d/1kIlhTdBEK6HFhWXPQQmzj5eQ5avSHgYV/preview",
523
+ "originalFolder": "Notes",
524
+ "source": "fifteenforteen",
525
+ "originalUrl": "https://drive.google.com/file/d/1kIlhTdBEK6HFhWXPQQmzj5eQ5avSHgYV/view"
526
+ },
527
+ {
528
+ "id": "1eQ1GqMNKDKDD3AKDdN8op_wqRSU9tcR7",
529
+ "name": "LINK",
530
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1eQ1GqMNKDKDD3AKDdN8op_wqRSU9tcR7",
531
+ "viewUrl": "https://drive.google.com/file/d/1eQ1GqMNKDKDD3AKDdN8op_wqRSU9tcR7/preview",
532
+ "originalFolder": "Notes",
533
+ "source": "fifteenforteen",
534
+ "originalUrl": "https://drive.google.com/file/d/1eQ1GqMNKDKDD3AKDdN8op_wqRSU9tcR7/view"
535
+ }
536
+ ],
537
+ "pyqs": [
538
+ {
539
+ "id": "1xzyxjfWg5zq1Zo-IOpEpmpymFhArDatC",
540
+ "name": "PYQ",
541
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1xzyxjfWg5zq1Zo-IOpEpmpymFhArDatC",
542
+ "viewUrl": "https://drive.google.com/file/d/1xzyxjfWg5zq1Zo-IOpEpmpymFhArDatC/preview",
543
+ "originalFolder": "Pyqs",
544
+ "source": "fifteenforteen",
545
+ "originalUrl": "https://drive.google.com/file/d/1xzyxjfWg5zq1Zo-IOpEpmpymFhArDatC/view"
546
+ }
547
+ ],
548
+ "viva": [],
549
+ "midsem": [],
550
+ "books": [],
551
+ "lab": [],
552
+ "syllabus": [],
553
+ "videos": [],
554
+ "akash": []
555
+ }
556
+ },
557
+ "2nd": {
558
+ "APP2": {
559
+ "name": "Applied Physics - 2",
560
+ "url": "https://fifteenforteen.vercel.app/html/contents/applied_physics-2.html",
561
+ "units": [
562
+ {
563
+ "number": "Unit 1",
564
+ "content": ""
565
+ },
566
+ {
567
+ "number": "Unit 2",
568
+ "content": ""
569
+ },
570
+ {
571
+ "number": "Unit 3",
572
+ "content": ""
573
+ },
574
+ {
575
+ "number": "Unit 4",
576
+ "content": ""
577
+ }
578
+ ],
579
+ "notes": [
580
+ {
581
+ "id": "1JWmGgUzJPhj5_AZpXYiZOxAZSb-FPPUl",
582
+ "name": "Notes 1",
583
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1JWmGgUzJPhj5_AZpXYiZOxAZSb-FPPUl",
584
+ "viewUrl": "https://drive.google.com/file/d/1JWmGgUzJPhj5_AZpXYiZOxAZSb-FPPUl/preview",
585
+ "originalFolder": "Notes",
586
+ "source": "fifteenforteen",
587
+ "originalUrl": "https://drive.google.com/file/d/1JWmGgUzJPhj5_AZpXYiZOxAZSb-FPPUl/view"
588
+ },
589
+ {
590
+ "id": "1WY4mIlC0lin09iagOOc6GHBvmkVPd3xv",
591
+ "name": "Notes 2",
592
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1WY4mIlC0lin09iagOOc6GHBvmkVPd3xv",
593
+ "viewUrl": "https://drive.google.com/file/d/1WY4mIlC0lin09iagOOc6GHBvmkVPd3xv/preview",
594
+ "originalFolder": "Notes",
595
+ "source": "fifteenforteen",
596
+ "originalUrl": "https://drive.google.com/file/d/1WY4mIlC0lin09iagOOc6GHBvmkVPd3xv/view"
597
+ },
598
+ {
599
+ "id": "1HqWgM5U72J_Zkiwmn6M5ILpKfQ15bSzA",
600
+ "name": "Notes 3",
601
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1HqWgM5U72J_Zkiwmn6M5ILpKfQ15bSzA",
602
+ "viewUrl": "https://drive.google.com/file/d/1HqWgM5U72J_Zkiwmn6M5ILpKfQ15bSzA/preview",
603
+ "originalFolder": "Notes",
604
+ "source": "fifteenforteen",
605
+ "originalUrl": "https://drive.google.com/file/d/1HqWgM5U72J_Zkiwmn6M5ILpKfQ15bSzA/view"
606
+ },
607
+ {
608
+ "id": "1r2URN_jtp1Y74PjBeCVWs_AElQyt9ABn",
609
+ "name": "Notes 4",
610
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1r2URN_jtp1Y74PjBeCVWs_AElQyt9ABn",
611
+ "viewUrl": "https://drive.google.com/file/d/1r2URN_jtp1Y74PjBeCVWs_AElQyt9ABn/preview",
612
+ "originalFolder": "Notes",
613
+ "source": "fifteenforteen",
614
+ "originalUrl": "https://drive.google.com/file/d/1r2URN_jtp1Y74PjBeCVWs_AElQyt9ABn/view"
615
+ },
616
+ {
617
+ "id": "1UQDWTx5ve3_IBZBs8-7f638DjMI1VnxF",
618
+ "name": "LINK",
619
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1UQDWTx5ve3_IBZBs8-7f638DjMI1VnxF",
620
+ "viewUrl": "https://drive.google.com/file/d/1UQDWTx5ve3_IBZBs8-7f638DjMI1VnxF/preview",
621
+ "originalFolder": "Notes",
622
+ "source": "fifteenforteen",
623
+ "originalUrl": "https://drive.google.com/file/d/1UQDWTx5ve3_IBZBs8-7f638DjMI1VnxF/view"
624
+ },
625
+ {
626
+ "id": "1sXYiKWi60l-j52XELKCNz8YHO5Lahi1B",
627
+ "name": "LINK",
628
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1sXYiKWi60l-j52XELKCNz8YHO5Lahi1B",
629
+ "viewUrl": "https://drive.google.com/file/d/1sXYiKWi60l-j52XELKCNz8YHO5Lahi1B/preview",
630
+ "originalFolder": "Notes",
631
+ "source": "fifteenforteen",
632
+ "originalUrl": "https://drive.google.com/file/d/1sXYiKWi60l-j52XELKCNz8YHO5Lahi1B/view"
633
+ },
634
+ {
635
+ "id": "1P8AuKiygaje724ige4aqaT9_XSUxHaeF",
636
+ "name": "LINK",
637
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1P8AuKiygaje724ige4aqaT9_XSUxHaeF",
638
+ "viewUrl": "https://drive.google.com/file/d/1P8AuKiygaje724ige4aqaT9_XSUxHaeF/preview",
639
+ "originalFolder": "Notes",
640
+ "source": "fifteenforteen",
641
+ "originalUrl": "https://drive.google.com/file/d/1P8AuKiygaje724ige4aqaT9_XSUxHaeF/view"
642
+ }
643
+ ],
644
+ "pyqs": [
645
+ {
646
+ "id": "1IqOupzoqdRIDdLA6pvBbN4iSX4dYJnBB",
647
+ "name": "PYQ",
648
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1IqOupzoqdRIDdLA6pvBbN4iSX4dYJnBB",
649
+ "viewUrl": "https://drive.google.com/file/d/1IqOupzoqdRIDdLA6pvBbN4iSX4dYJnBB/preview",
650
+ "originalFolder": "Pyqs",
651
+ "source": "fifteenforteen",
652
+ "originalUrl": "https://drive.google.com/file/d/1IqOupzoqdRIDdLA6pvBbN4iSX4dYJnBB/view"
653
+ }
654
+ ],
655
+ "viva": [],
656
+ "midsem": [],
657
+ "books": [],
658
+ "lab": [],
659
+ "syllabus": [],
660
+ "videos": [],
661
+ "akash": []
662
+ },
663
+ "APM1": {
664
+ "name": "Applied Mathematics - 1",
665
+ "url": "https://fifteenforteen.vercel.app/html/contents/applied_mathematics-1.html",
666
+ "units": [
667
+ {
668
+ "number": "Unit 1",
669
+ "content": ""
670
+ },
671
+ {
672
+ "number": "Unit 2",
673
+ "content": ""
674
+ },
675
+ {
676
+ "number": "Unit 3",
677
+ "content": ""
678
+ },
679
+ {
680
+ "number": "Unit 4",
681
+ "content": ""
682
+ }
683
+ ],
684
+ "notes": [
685
+ {
686
+ "id": "172WfsMXvWPx7_d4_TAajqJ82xS5d_KcF",
687
+ "name": "Notes 1",
688
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=172WfsMXvWPx7_d4_TAajqJ82xS5d_KcF",
689
+ "viewUrl": "https://drive.google.com/file/d/172WfsMXvWPx7_d4_TAajqJ82xS5d_KcF/preview",
690
+ "originalFolder": "Notes",
691
+ "source": "fifteenforteen",
692
+ "originalUrl": "https://drive.google.com/file/d/172WfsMXvWPx7_d4_TAajqJ82xS5d_KcF/view"
693
+ },
694
+ {
695
+ "id": "1IEfb4rQJuAAL7ICL8jw0vCBQ1Yv4J-kG",
696
+ "name": "Notes 2",
697
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1IEfb4rQJuAAL7ICL8jw0vCBQ1Yv4J-kG",
698
+ "viewUrl": "https://drive.google.com/file/d/1IEfb4rQJuAAL7ICL8jw0vCBQ1Yv4J-kG/preview",
699
+ "originalFolder": "Notes",
700
+ "source": "fifteenforteen",
701
+ "originalUrl": "https://drive.google.com/file/d/1IEfb4rQJuAAL7ICL8jw0vCBQ1Yv4J-kG/view"
702
+ },
703
+ {
704
+ "id": "13EeTwY3rCtGMaiN8Dc7a-pASCLQgmHPm",
705
+ "name": "Notes 3",
706
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=13EeTwY3rCtGMaiN8Dc7a-pASCLQgmHPm",
707
+ "viewUrl": "https://drive.google.com/file/d/13EeTwY3rCtGMaiN8Dc7a-pASCLQgmHPm/preview",
708
+ "originalFolder": "Notes",
709
+ "source": "fifteenforteen",
710
+ "originalUrl": "https://drive.google.com/file/d/13EeTwY3rCtGMaiN8Dc7a-pASCLQgmHPm/view"
711
+ },
712
+ {
713
+ "id": "1CSeJ_VJU2Jlegs33bEhjes-f7wWsWqUI",
714
+ "name": "Notes 4",
715
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1CSeJ_VJU2Jlegs33bEhjes-f7wWsWqUI",
716
+ "viewUrl": "https://drive.google.com/file/d/1CSeJ_VJU2Jlegs33bEhjes-f7wWsWqUI/preview",
717
+ "originalFolder": "Notes",
718
+ "source": "fifteenforteen",
719
+ "originalUrl": "https://drive.google.com/file/d/1CSeJ_VJU2Jlegs33bEhjes-f7wWsWqUI/view"
720
+ }
721
+ ],
722
+ "pyqs": [
723
+ {
724
+ "id": "1oXuWRinT01cIK_Q6tCpg_-MAReXdV_sv",
725
+ "name": "PYQ",
726
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1oXuWRinT01cIK_Q6tCpg_-MAReXdV_sv",
727
+ "viewUrl": "https://drive.google.com/file/d/1oXuWRinT01cIK_Q6tCpg_-MAReXdV_sv/preview",
728
+ "originalFolder": "Pyqs",
729
+ "source": "fifteenforteen",
730
+ "originalUrl": "https://drive.google.com/file/d/1oXuWRinT01cIK_Q6tCpg_-MAReXdV_sv/view"
731
+ }
732
+ ],
733
+ "viva": [],
734
+ "midsem": [],
735
+ "books": [],
736
+ "lab": [],
737
+ "syllabus": [],
738
+ "videos": [],
739
+ "akash": []
740
+ },
741
+ "APM2": {
742
+ "name": "Applied Mathematics - 2",
743
+ "url": "https://fifteenforteen.vercel.app/html/contents/applied_mathematics-2.html",
744
+ "units": [
745
+ {
746
+ "number": "Unit 1",
747
+ "content": ""
748
+ },
749
+ {
750
+ "number": "Unit 2",
751
+ "content": ""
752
+ },
753
+ {
754
+ "number": "Unit 3",
755
+ "content": ""
756
+ },
757
+ {
758
+ "number": "Unit 4",
759
+ "content": ""
760
+ }
761
+ ],
762
+ "notes": [
763
+ {
764
+ "id": "1MFPcr5r_hw-UVWenRaVHyVVCJwfU8FCf",
765
+ "name": "Notes 1",
766
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1MFPcr5r_hw-UVWenRaVHyVVCJwfU8FCf",
767
+ "viewUrl": "https://drive.google.com/file/d/1MFPcr5r_hw-UVWenRaVHyVVCJwfU8FCf/preview",
768
+ "originalFolder": "Notes",
769
+ "source": "fifteenforteen",
770
+ "originalUrl": "https://drive.google.com/file/d/1MFPcr5r_hw-UVWenRaVHyVVCJwfU8FCf/view"
771
+ },
772
+ {
773
+ "id": "1IEfb4rQJuAAL7ICL8jw0vCBQ1Yv4J-kG",
774
+ "name": "Notes 2",
775
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1IEfb4rQJuAAL7ICL8jw0vCBQ1Yv4J-kG",
776
+ "viewUrl": "https://drive.google.com/file/d/1IEfb4rQJuAAL7ICL8jw0vCBQ1Yv4J-kG/preview",
777
+ "originalFolder": "Notes",
778
+ "source": "fifteenforteen",
779
+ "originalUrl": "https://drive.google.com/file/d/1IEfb4rQJuAAL7ICL8jw0vCBQ1Yv4J-kG/view"
780
+ },
781
+ {
782
+ "id": "13EeTwY3rCtGMaiN8Dc7a-pASCLQgmHPm",
783
+ "name": "Notes 3",
784
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=13EeTwY3rCtGMaiN8Dc7a-pASCLQgmHPm",
785
+ "viewUrl": "https://drive.google.com/file/d/13EeTwY3rCtGMaiN8Dc7a-pASCLQgmHPm/preview",
786
+ "originalFolder": "Notes",
787
+ "source": "fifteenforteen",
788
+ "originalUrl": "https://drive.google.com/file/d/13EeTwY3rCtGMaiN8Dc7a-pASCLQgmHPm/view"
789
+ },
790
+ {
791
+ "id": "1CSeJ_VJU2Jlegs33bEhjes-f7wWsWqUI",
792
+ "name": "Notes 4",
793
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1CSeJ_VJU2Jlegs33bEhjes-f7wWsWqUI",
794
+ "viewUrl": "https://drive.google.com/file/d/1CSeJ_VJU2Jlegs33bEhjes-f7wWsWqUI/preview",
795
+ "originalFolder": "Notes",
796
+ "source": "fifteenforteen",
797
+ "originalUrl": "https://drive.google.com/file/d/1CSeJ_VJU2Jlegs33bEhjes-f7wWsWqUI/view"
798
+ },
799
+ {
800
+ "id": "1sWucuhzSvNNr-8blp0rz4RmBTJx9bH1I",
801
+ "name": "LINK",
802
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1sWucuhzSvNNr-8blp0rz4RmBTJx9bH1I",
803
+ "viewUrl": "https://drive.google.com/file/d/1sWucuhzSvNNr-8blp0rz4RmBTJx9bH1I/preview",
804
+ "originalFolder": "Notes",
805
+ "source": "fifteenforteen",
806
+ "originalUrl": "https://drive.google.com/file/d/1sWucuhzSvNNr-8blp0rz4RmBTJx9bH1I/view"
807
+ },
808
+ {
809
+ "id": "1dyoowutqTCGM7HtK1REmNhN3bTTFO8_P",
810
+ "name": "LINK",
811
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1dyoowutqTCGM7HtK1REmNhN3bTTFO8_P",
812
+ "viewUrl": "https://drive.google.com/file/d/1dyoowutqTCGM7HtK1REmNhN3bTTFO8_P/preview",
813
+ "originalFolder": "Notes",
814
+ "source": "fifteenforteen",
815
+ "originalUrl": "https://drive.google.com/file/d/1dyoowutqTCGM7HtK1REmNhN3bTTFO8_P/view"
816
+ }
817
+ ],
818
+ "pyqs": [
819
+ {
820
+ "id": "1gFk2AU2qVq5auVu17mJ5LQjGSGZDSlUm",
821
+ "name": "PYQ",
822
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1gFk2AU2qVq5auVu17mJ5LQjGSGZDSlUm",
823
+ "viewUrl": "https://drive.google.com/file/d/1gFk2AU2qVq5auVu17mJ5LQjGSGZDSlUm/preview",
824
+ "originalFolder": "Pyqs",
825
+ "source": "fifteenforteen",
826
+ "originalUrl": "https://drive.google.com/file/d/1gFk2AU2qVq5auVu17mJ5LQjGSGZDSlUm/view"
827
+ }
828
+ ],
829
+ "viva": [],
830
+ "midsem": [],
831
+ "books": [],
832
+ "lab": [],
833
+ "syllabus": [],
834
+ "videos": [],
835
+ "akash": []
836
+ },
837
+ "EM": {
838
+ "name": "Engineering Mechanics",
839
+ "url": "https://fifteenforteen.vercel.app/html/contents/engineering_mechanics.html",
840
+ "units": [
841
+ {
842
+ "number": "Unit 1",
843
+ "content": ""
844
+ },
845
+ {
846
+ "number": "Unit 2",
847
+ "content": ""
848
+ },
849
+ {
850
+ "number": "Unit 3",
851
+ "content": ""
852
+ },
853
+ {
854
+ "number": "Unit 4",
855
+ "content": ""
856
+ }
857
+ ],
858
+ "notes": [
859
+ {
860
+ "id": "167AILhkLtRxR17Wzn9bf5tRJQQI7mfM4",
861
+ "name": "Notes 1",
862
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=167AILhkLtRxR17Wzn9bf5tRJQQI7mfM4",
863
+ "viewUrl": "https://drive.google.com/file/d/167AILhkLtRxR17Wzn9bf5tRJQQI7mfM4/preview",
864
+ "originalFolder": "Notes",
865
+ "source": "fifteenforteen",
866
+ "originalUrl": "https://drive.google.com/file/d/167AILhkLtRxR17Wzn9bf5tRJQQI7mfM4/view"
867
+ },
868
+ {
869
+ "id": "12NSiOpfGinSQklvw7XLlGZS-f4odAy6r",
870
+ "name": "Notes 2",
871
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=12NSiOpfGinSQklvw7XLlGZS-f4odAy6r",
872
+ "viewUrl": "https://drive.google.com/file/d/12NSiOpfGinSQklvw7XLlGZS-f4odAy6r/preview",
873
+ "originalFolder": "Notes",
874
+ "source": "fifteenforteen",
875
+ "originalUrl": "https://drive.google.com/file/d/12NSiOpfGinSQklvw7XLlGZS-f4odAy6r/view"
876
+ },
877
+ {
878
+ "id": "1qAgmIFtkoys0jo2unIlAK7BB3ublSXp6",
879
+ "name": "Notes 3",
880
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1qAgmIFtkoys0jo2unIlAK7BB3ublSXp6",
881
+ "viewUrl": "https://drive.google.com/file/d/1qAgmIFtkoys0jo2unIlAK7BB3ublSXp6/preview",
882
+ "originalFolder": "Notes",
883
+ "source": "fifteenforteen",
884
+ "originalUrl": "https://drive.google.com/file/d/1qAgmIFtkoys0jo2unIlAK7BB3ublSXp6/view"
885
+ },
886
+ {
887
+ "id": "1thY4G0FkA6vvIgYDsEpDVjizWRiHt2js",
888
+ "name": "Notes 4",
889
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1thY4G0FkA6vvIgYDsEpDVjizWRiHt2js",
890
+ "viewUrl": "https://drive.google.com/file/d/1thY4G0FkA6vvIgYDsEpDVjizWRiHt2js/preview",
891
+ "originalFolder": "Notes",
892
+ "source": "fifteenforteen",
893
+ "originalUrl": "https://drive.google.com/file/d/1thY4G0FkA6vvIgYDsEpDVjizWRiHt2js/view"
894
+ },
895
+ {
896
+ "id": "1R7p-0ySDq8135-kO1FcQA3aTHBuZ2fSy",
897
+ "name": "LINK",
898
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1R7p-0ySDq8135-kO1FcQA3aTHBuZ2fSy",
899
+ "viewUrl": "https://drive.google.com/file/d/1R7p-0ySDq8135-kO1FcQA3aTHBuZ2fSy/preview",
900
+ "originalFolder": "Notes",
901
+ "source": "fifteenforteen",
902
+ "originalUrl": "https://drive.google.com/file/d/1R7p-0ySDq8135-kO1FcQA3aTHBuZ2fSy/view"
903
+ },
904
+ {
905
+ "id": "1ugwH9YoYWOeckCqRlQ-pE6cq3QvDygeW",
906
+ "name": "LINK",
907
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1ugwH9YoYWOeckCqRlQ-pE6cq3QvDygeW",
908
+ "viewUrl": "https://drive.google.com/file/d/1ugwH9YoYWOeckCqRlQ-pE6cq3QvDygeW/preview",
909
+ "originalFolder": "Notes",
910
+ "source": "fifteenforteen",
911
+ "originalUrl": "https://drive.google.com/file/d/1ugwH9YoYWOeckCqRlQ-pE6cq3QvDygeW/view"
912
+ }
913
+ ],
914
+ "pyqs": [
915
+ {
916
+ "id": "1AZcS1QqfLm3U-Y7e_lTD1YwlumxeIZF9",
917
+ "name": "PYQ",
918
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1AZcS1QqfLm3U-Y7e_lTD1YwlumxeIZF9",
919
+ "viewUrl": "https://drive.google.com/file/d/1AZcS1QqfLm3U-Y7e_lTD1YwlumxeIZF9/preview",
920
+ "originalFolder": "Pyqs",
921
+ "source": "fifteenforteen",
922
+ "originalUrl": "https://drive.google.com/file/d/1AZcS1QqfLm3U-Y7e_lTD1YwlumxeIZF9/view"
923
+ }
924
+ ],
925
+ "viva": [],
926
+ "midsem": [],
927
+ "books": [],
928
+ "lab": [],
929
+ "syllabus": [],
930
+ "videos": [],
931
+ "akash": []
932
+ },
933
+ "EVS": {
934
+ "name": "Environmental Science",
935
+ "url": "https://fifteenforteen.vercel.app/html/contents/environmental_science.html",
936
+ "units": [
937
+ {
938
+ "number": "Unit 1",
939
+ "content": ""
940
+ },
941
+ {
942
+ "number": "Unit 2",
943
+ "content": ""
944
+ },
945
+ {
946
+ "number": "Unit 3",
947
+ "content": ""
948
+ },
949
+ {
950
+ "number": "Unit 4",
951
+ "content": ""
952
+ }
953
+ ],
954
+ "notes": [
955
+ {
956
+ "id": "1ewLwo1QzMU2fbXlHi1cEugFryjJEOkXZ",
957
+ "name": "Notes 1",
958
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1ewLwo1QzMU2fbXlHi1cEugFryjJEOkXZ",
959
+ "viewUrl": "https://drive.google.com/file/d/1ewLwo1QzMU2fbXlHi1cEugFryjJEOkXZ/preview",
960
+ "originalFolder": "Notes",
961
+ "source": "fifteenforteen",
962
+ "originalUrl": "https://drive.google.com/file/d/1ewLwo1QzMU2fbXlHi1cEugFryjJEOkXZ/view"
963
+ },
964
+ {
965
+ "id": "1nFi2mct2FvL1P9acJFM5wjfP25He_yWU",
966
+ "name": "Notes 2",
967
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1nFi2mct2FvL1P9acJFM5wjfP25He_yWU",
968
+ "viewUrl": "https://drive.google.com/file/d/1nFi2mct2FvL1P9acJFM5wjfP25He_yWU/preview",
969
+ "originalFolder": "Notes",
970
+ "source": "fifteenforteen",
971
+ "originalUrl": "https://drive.google.com/file/d/1nFi2mct2FvL1P9acJFM5wjfP25He_yWU/view"
972
+ },
973
+ {
974
+ "id": "1STPFItb6wKANlfGkWpJ5yjMPxE9wMcr4",
975
+ "name": "Notes 3",
976
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1STPFItb6wKANlfGkWpJ5yjMPxE9wMcr4",
977
+ "viewUrl": "https://drive.google.com/file/d/1STPFItb6wKANlfGkWpJ5yjMPxE9wMcr4/preview",
978
+ "originalFolder": "Notes",
979
+ "source": "fifteenforteen",
980
+ "originalUrl": "https://drive.google.com/file/d/1STPFItb6wKANlfGkWpJ5yjMPxE9wMcr4/view"
981
+ },
982
+ {
983
+ "id": "12jzh5Pk-ufWQnws_qjvwaGOzthZqTojV",
984
+ "name": "Notes 4",
985
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=12jzh5Pk-ufWQnws_qjvwaGOzthZqTojV",
986
+ "viewUrl": "https://drive.google.com/file/d/12jzh5Pk-ufWQnws_qjvwaGOzthZqTojV/preview",
987
+ "originalFolder": "Notes",
988
+ "source": "fifteenforteen",
989
+ "originalUrl": "https://drive.google.com/file/d/12jzh5Pk-ufWQnws_qjvwaGOzthZqTojV/view"
990
+ },
991
+ {
992
+ "id": "1zregCUYNlB3bpqtAEbhxjYNdqKMdPudo",
993
+ "name": "LINK",
994
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1zregCUYNlB3bpqtAEbhxjYNdqKMdPudo",
995
+ "viewUrl": "https://drive.google.com/file/d/1zregCUYNlB3bpqtAEbhxjYNdqKMdPudo/preview",
996
+ "originalFolder": "Notes",
997
+ "source": "fifteenforteen",
998
+ "originalUrl": "https://drive.google.com/file/d/1zregCUYNlB3bpqtAEbhxjYNdqKMdPudo/view"
999
+ }
1000
+ ],
1001
+ "pyqs": [
1002
+ {
1003
+ "id": "1mGlplTwuihLj_J8KSHFT0-42VclASSq-",
1004
+ "name": "PYQ",
1005
+ "downloadUrl": "https://drive.google.com/uc?export=download&id=1mGlplTwuihLj_J8KSHFT0-42VclASSq-",
1006
+ "viewUrl": "https://drive.google.com/file/d/1mGlplTwuihLj_J8KSHFT0-42VclASSq-/preview",
1007
+ "originalFolder": "Pyqs",
1008
+ "source": "fifteenforteen",
1009
+ "originalUrl": "https://drive.google.com/file/d/1mGlplTwuihLj_J8KSHFT0-42VclASSq-/view"
1010
+ }
1011
+ ],
1012
+ "viva": [],
1013
+ "midsem": [],
1014
+ "books": [],
1015
+ "lab": [],
1016
+ "syllabus": [],
1017
+ "videos": [],
1018
+ "akash": []
1019
+ }
1020
+ }
1021
+ }
1022
+ }
1023
+ }
public/Content-Meta/StudyX.json ADDED
The diff for this file is too large to render. See raw diff
 
public/Content-Meta/UnifiedContent.json ADDED
The diff for this file is too large to render. See raw diff
 
public/Content-Meta/syllabus.json ADDED
The diff for this file is too large to render. See raw diff
 
public/Content-Meta/videos.json ADDED
The diff for this file is too large to render. See raw diff
 
scripts/requirements.txt ADDED
Binary file (59 Bytes). View file
 
scripts/syllabus_formatter.py ADDED
@@ -0,0 +1,386 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ Syllabus Formatter Script
4
+ This script downloads Phi-3 3B model and uses it to format syllabus content
5
+ to be more readable while preserving all content and structure.
6
+ """
7
+
8
+ import json
9
+ import os
10
+ import sys
11
+ from pathlib import Path
12
+ import time
13
+ import logging
14
+ from typing import Dict, Any, List, Tuple
15
+ import re
16
+ import psutil # For memory checks
17
+
18
+ # Imports for type hinting and core functionality
19
+ import torch
20
+ from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
21
+ from transformers import BitsAndBytesConfig # For 8-bit quantization
22
+ import requests
23
+
24
+ # Setup logging
25
+ logging.basicConfig(
26
+ level=logging.INFO,
27
+ format='%(asctime)s - %(levelname)s - %(message)s',
28
+ handlers=[
29
+ logging.FileHandler('syllabus_formatter.log'),
30
+ logging.StreamHandler()
31
+ ]
32
+ )
33
+ logger = logging.getLogger(__name__)
34
+
35
+ class SyllabusFormatter:
36
+ def __init__(self, model_name="microsoft/Phi-3-mini-4k-instruct"):
37
+ """Initialize the formatter with Phi-3 model"""
38
+ self.model_name = model_name
39
+ self.tokenizer = None
40
+ self.model = None
41
+ self.pipe = None
42
+ self.processed_count = 0
43
+ self.total_count = 0
44
+
45
+ def setup_model(self):
46
+ """Download and setup the Phi-3 model with CPU optimization"""
47
+ logger.info(f"Setting up model: {self.model_name}")
48
+
49
+ try:
50
+ # Check available memory
51
+ available_memory = psutil.virtual_memory().available / (1024 * 1024 * 1024) # Convert to GB
52
+ logger.info(f"Available system memory: {available_memory:.2f} GB")
53
+
54
+ if available_memory < 4: # We need at least 4GB free
55
+ logger.warning("Low memory detected. Attempting to load with maximum optimization...")
56
+
57
+ # Load tokenizer
58
+ logger.info("Loading tokenizer...")
59
+ self.tokenizer = AutoTokenizer.from_pretrained(
60
+ self.model_name,
61
+ trust_remote_code=True
62
+ )
63
+
64
+ # Load model with CPU optimizations
65
+ logger.info("Loading model with CPU optimizations...")
66
+ self.model = AutoModelForCausalLM.from_pretrained(
67
+ self.model_name,
68
+ torch_dtype=torch.float32, # Use float32 for CPU
69
+ device_map=None, # Disable device mapping for CPU
70
+ trust_remote_code=True,
71
+ low_cpu_mem_usage=True
72
+ )
73
+
74
+ # Move model to CPU explicitly
75
+ self.model = self.model.to('cpu')
76
+
77
+ # Create pipeline with CPU settings
78
+ logger.info("Creating CPU-optimized pipeline...")
79
+ self.pipe = pipeline(
80
+ "text-generation",
81
+ model=self.model,
82
+ tokenizer=self.tokenizer,
83
+ device='cpu' # Explicitly set to CPU
84
+ )
85
+
86
+ logger.info("Model setup complete with CPU optimizations!")
87
+ return True
88
+
89
+ except Exception as e:
90
+ error_msg = str(e)
91
+ if "paging file" in error_msg.lower():
92
+ logger.error(
93
+ "Windows virtual memory (page file) is too small. Please:\n"
94
+ "1. Open System Properties > Advanced > Performance Settings > Advanced\n"
95
+ "2. Under Virtual Memory, click Change\n"
96
+ "3. Increase the page file size (recommended: 1.5x your RAM size)\n"
97
+ "4. Restart your computer"
98
+ )
99
+ else:
100
+ logger.error(f"Error setting up model: {error_msg}")
101
+ return False
102
+
103
+ def create_formatting_prompt(self, unit_content: str, unit_name: str, subject_name: str = "") -> str:
104
+ """Create a very clear, focused prompt for formatting syllabus content"""
105
+ prompt = f"""<|system|>You are a professional academic syllabus formatter. Your ONLY job is to take badly formatted syllabus content and make it beautifully organized and readable.
106
+
107
+ RULES:
108
+ 1. PRESERVE every single word, topic, and concept from the original
109
+ 2. NEVER add explanations, examples, or new content
110
+ 3. ONLY restructure and format the existing text
111
+ 4. Use clear headings, bullet points, and logical grouping
112
+ 5. Separate different topics with proper spacing
113
+ 6. Make it scannable and easy to read
114
+
115
+ FORMAT STYLE:
116
+ - Use main topic headings with proper capitalization
117
+ - Group related subtopics under main topics
118
+ - Use bullet points (β€’) for lists of concepts
119
+ - Use sub-bullets (β—¦) for details under main bullets
120
+ - Separate major sections with line breaks
121
+ - Keep technical terms exactly as written<|end|>
122
+
123
+ <|user|>Subject: {subject_name}
124
+ Unit: {unit_name}
125
+
126
+ Original content (poorly formatted):
127
+ {unit_content}
128
+
129
+ Task: Reformat this content to be beautifully organized and readable. Do NOT add any new information - only restructure what\'s already there. Make it professional and easy to scan.<|end|>
130
+
131
+ <|assistant|>"""
132
+ return prompt
133
+
134
+ def format_unit_content(self, unit_content: str, unit_name: str, subject_name: str = "") -> str:
135
+ """Format a single unit\'s content using the AI model with focused prompting"""
136
+ try:
137
+ # Create a very clear, focused prompt
138
+ prompt = self.create_formatting_prompt(unit_content, unit_name, subject_name)
139
+
140
+ # Generate formatted content with specific parameters for better output
141
+ response = self.pipe(
142
+ prompt,
143
+ max_new_tokens=2048, # Increased for longer content
144
+ temperature=0.1, # Very low for consistent formatting
145
+ do_sample=True,
146
+ top_p=0.9,
147
+ repetition_penalty=1.1,
148
+ pad_token_id=self.tokenizer.eos_token_id,
149
+ eos_token_id=self.tokenizer.eos_token_id
150
+ )
151
+
152
+ # Extract the formatted content
153
+ generated_text = response[0]['generated_text']
154
+
155
+ # Find the assistant's response more reliably
156
+ assistant_start = generated_text.find("<|assistant|>")
157
+ if assistant_start != -1:
158
+ formatted_content = generated_text[assistant_start + len("<|assistant|>"):].strip()
159
+ else:
160
+ # Fallback: try to find content after the prompt
161
+ prompt_end = generated_text.find(prompt)
162
+ if prompt_end != -1:
163
+ formatted_content = generated_text[prompt_end + len(prompt):].strip()
164
+ else:
165
+ formatted_content = generated_text.strip()
166
+
167
+ # Clean up the generated content
168
+ formatted_content = self.clean_generated_content(formatted_content)
169
+
170
+ # Validate the formatted content
171
+ if not self.validate_formatted_content(unit_content, formatted_content, unit_name):
172
+ logger.warning(f"Validation failed for {subject_name} - {unit_name}, using original")
173
+ return unit_content
174
+
175
+ logger.info(f"βœ“ Successfully formatted {subject_name} - {unit_name}")
176
+ return formatted_content
177
+
178
+ except Exception as e:
179
+ logger.error(f"Error formatting {subject_name} - {unit_name}: {str(e)}")
180
+ return unit_content # Return original content if formatting fails
181
+
182
+ def show_sample_comparison(self, original: str, formatted: str, subject: str, unit: str):
183
+ """Show a before/after comparison for verification"""
184
+ print("\n" + "="*80)
185
+ print(f"πŸ“Š SAMPLE COMPARISON: {subject} - {unit}")
186
+ print("="*80)
187
+ print("πŸ”΄ BEFORE (Original):")
188
+ print("-" * 40)
189
+ print(original[:300] + "..." if len(original) > 300 else original)
190
+ print("\n")
191
+ print("🟒 AFTER (Formatted):")
192
+ print("-" * 40)
193
+ print(formatted[:300] + "..." if len(formatted) > 300 else formatted)
194
+ print("="*80)
195
+
196
+ def validate_formatted_content(self, original: str, formatted: str, unit_name: str) -> bool:
197
+ """Validate that formatted content preserves all important information"""
198
+ # Check length - formatted should not be drastically shorter
199
+ if len(formatted) < len(original) * 0.4:
200
+ logger.warning(f"Formatted content too short for {unit_name}")
201
+ return False
202
+
203
+ # Check for key technical terms preservation
204
+ original_words = set(re.findall(r'\b[A-Z][a-z]*(?:[A-Z][a-z]*)*\b', original))
205
+ formatted_words = set(re.findall(r'\b[A-Z][a-z]*(?:[A-Z][a-z]*)*\b', formatted))
206
+
207
+ # Allow for some formatting differences but ensure major terms are preserved
208
+ missing_important_terms = original_words - formatted_words
209
+ if len(missing_important_terms) > len(original_words) * 0.3:
210
+ logger.warning(f"Too many important terms missing in {unit_name}: {missing_important_terms}")
211
+ return False
212
+
213
+ return True
214
+
215
+ def clean_generated_content(self, content: str) -> str:
216
+ """Clean up generated content removing any artifacts and improving structure"""
217
+ # Remove any remaining special tokens
218
+ content = re.sub(r'<\|.*?\|>', '', content)
219
+
220
+ # Remove any meta-commentary from the AI
221
+ lines = content.split('\n')
222
+ cleaned_lines = []
223
+
224
+ for line in lines:
225
+ line = line.strip()
226
+ # Skip lines that look like AI commentary
227
+ if (line.startswith("Here") and ("formatted" in line.lower() or "organized" in line.lower())) or \
228
+ line.startswith("I have") or line.startswith("The content has been") or \
229
+ line.startswith("Note:") or line.startswith("This formatted version"):
230
+ continue
231
+ if line: # Only add non-empty lines
232
+ cleaned_lines.append(line)
233
+
234
+ content = '\n'.join(cleaned_lines)
235
+
236
+ # Fix multiple consecutive newlines
237
+ content = re.sub(r'\n\s*\n\s*\n+', '\n\n', content)
238
+
239
+ # Ensure proper spacing around headers
240
+ content = re.sub(r'\n([A-Z][^:\n]*:)\n', r'\n\n\1\n', content)
241
+
242
+ return content.strip()
243
+
244
+ def count_total_units(self, syllabus_data: Dict[str, Any]) -> int:
245
+ """Count total number of units to process"""
246
+ count = 0
247
+ for branch_name, branch_data in syllabus_data.get("syllabus", {}).items():
248
+ if isinstance(branch_data, dict):
249
+ for sem_name, sem_data in branch_data.items():
250
+ if isinstance(sem_data, dict):
251
+ for subject_name, subject_data in sem_data.items():
252
+ if isinstance(subject_data, dict) and "content" in subject_data:
253
+ content = subject_data["content"]
254
+ if isinstance(content, dict):
255
+ count += len([k for k in content.keys() if k.startswith("Unit")])
256
+ return count
257
+
258
+ def format_syllabus(self, input_file: str, output_file: str) -> bool:
259
+ """Format the entire syllabus file"""
260
+ try:
261
+ # Load the syllabus file
262
+ logger.info(f"Loading syllabus from: {input_file}")
263
+ with open(input_file, 'r', encoding='utf-8') as f:
264
+ syllabus_data = json.load(f)
265
+
266
+ # Count total units
267
+ self.total_count = self.count_total_units(syllabus_data)
268
+ logger.info(f"Total units to process: {self.total_count}")
269
+
270
+ # Process each branch
271
+ for branch_name, branch_data in syllabus_data.get("syllabus", {}).items():
272
+ if not isinstance(branch_data, dict):
273
+ continue
274
+
275
+ logger.info(f"Processing branch: {branch_name}")
276
+
277
+ # Process each semester
278
+ for sem_name, sem_data in branch_data.items():
279
+ if not isinstance(sem_data, dict):
280
+ continue
281
+
282
+ logger.info(f"Processing {branch_name} - {sem_name}")
283
+
284
+ # Process each subject
285
+ for subject_name, subject_data in sem_data.items():
286
+ if not isinstance(subject_data, dict) or "content" not in subject_data:
287
+ continue
288
+
289
+ content = subject_data["content"]
290
+ if not isinstance(content, dict):
291
+ continue
292
+
293
+ logger.info(f"Processing {branch_name} - {sem_name} - {subject_name}")
294
+
295
+ # Format each unit
296
+ for unit_name, unit_content in content.items():
297
+ if not unit_name.startswith("Unit") or not isinstance(unit_content, str):
298
+ continue
299
+
300
+ self.processed_count += 1
301
+ progress = (self.processed_count / self.total_count) * 100
302
+
303
+ logger.info(f"πŸ”„ Processing {branch_name} > {sem_name} > {subject_name} > {unit_name} "
304
+ f"({self.processed_count}/{self.total_count} - {progress:.1f}%)")
305
+
306
+ # Show original content preview
307
+ preview = unit_content[:100].replace('\n', ' ') + "..." if len(unit_content) > 100 else unit_content
308
+ logger.info(f"πŸ“ Original: {preview}")
309
+
310
+ # Format the unit content with subject context
311
+ formatted_content = self.format_unit_content(
312
+ unit_content,
313
+ unit_name,
314
+ subject_name
315
+ )
316
+
317
+ # Update the content
318
+ syllabus_data["syllabus"][branch_name][sem_name][subject_name]["content"][unit_name] = formatted_content
319
+
320
+ # Show formatted content preview
321
+ formatted_preview = formatted_content[:100].replace('\n', ' ') + "..." if len(formatted_content) > 100 else formatted_content
322
+ logger.info(f"✨ Formatted: {formatted_preview}")
323
+
324
+ # Add delay to prevent overwhelming the model
325
+ time.sleep(0.5) # Increased delay for better processing
326
+
327
+ # Add formatting metadata with detailed info
328
+ if "metadata" not in syllabus_data:
329
+ syllabus_data["metadata"] = {}
330
+
331
+ syllabus_data["metadata"]["lastFormatted"] = time.strftime("%Y-%m-%dT%H:%M:%SZ")
332
+ syllabus_data["metadata"]["formattingNote"] = "Content formatted using Phi-3 3B AI for enhanced readability and structure"
333
+ syllabus_data["metadata"]["originalContentPreserved"] = True
334
+ syllabus_data["metadata"]["unitsProcessed"] = self.processed_count
335
+ syllabus_data["metadata"]["formattingModel"] = self.model_name
336
+ syllabus_data["metadata"]["version"] = "2.0"
337
+
338
+ # Save the formatted syllabus
339
+ logger.info(f"Saving formatted syllabus to: {output_file}")
340
+ with open(output_file, 'w', encoding='utf-8') as f:
341
+ json.dump(syllabus_data, f, indent=2, ensure_ascii=False)
342
+
343
+ logger.info(f"Successfully formatted {self.processed_count} units!")
344
+ return True
345
+
346
+ except Exception as e:
347
+ logger.error(f"Error formatting syllabus: {str(e)}")
348
+ return False
349
+
350
+ def main():
351
+ """Main function"""
352
+ # Setup paths
353
+ script_dir = Path(__file__).parent
354
+ project_root = script_dir.parent
355
+ syllabus_file = project_root / "public" / "Content-Meta" / "syllabus.json"
356
+ output_file = project_root / "public" / "Content-Meta" / "syllabus_formatted.json"
357
+
358
+ # Validate input file
359
+ if not syllabus_file.exists():
360
+ logger.error(f"Syllabus file not found: {syllabus_file}")
361
+ return False
362
+
363
+ # Create formatter
364
+ formatter = SyllabusFormatter()
365
+
366
+ # Setup model
367
+ logger.info("Setting up Phi-3 model...")
368
+ if not formatter.setup_model():
369
+ logger.error("Failed to setup model")
370
+ return False
371
+
372
+ # Format syllabus
373
+ logger.info("Starting syllabus formatting...")
374
+ success = formatter.format_syllabus(str(syllabus_file), str(output_file))
375
+
376
+ if success:
377
+ logger.info(f"Formatting complete! Output saved to: {output_file}")
378
+ logger.info("You can now review the formatted syllabus and replace the original if satisfied.")
379
+ else:
380
+ logger.error("Formatting failed!")
381
+
382
+ return success
383
+
384
+ if __name__ == "__main__":
385
+ success = main()
386
+ sys.exit(0 if success else 1)