From 16f69dc70ba3334ceaa9affdcfd80f8f989340ec Mon Sep 17 00:00:00 2001 From: Gowtham Date: Tue, 1 Oct 2024 17:58:47 +0530 Subject: [PATCH 1/3] Created an anti-malware program --- A/Anti-Malware application/README.md | 26 + A/Anti-Malware application/anti-malware.py | 241 ++++++++ A/Anti-Malware application/database3.csv | 639 +++++++++++++++++++++ 3 files changed, 906 insertions(+) create mode 100644 A/Anti-Malware application/README.md create mode 100644 A/Anti-Malware application/anti-malware.py create mode 100755 A/Anti-Malware application/database3.csv diff --git a/A/Anti-Malware application/README.md b/A/Anti-Malware application/README.md new file mode 100644 index 00000000..29fba0cd --- /dev/null +++ b/A/Anti-Malware application/README.md @@ -0,0 +1,26 @@ +# A ML-based anti-malware program written in Python # + +

I first created this project for a competition. I had to learn a lot of new stuff and take inspiration(and a bit of code) from others who had tried similar projects before. This project uses customtkinter and scikit-learn to handle the GUI and ML operations respectively. It utilizes a decision tree classifier to classify files as malware or benign. It can classify a single file or all the files in a folder. It currently only works with executable files(but can be modified to work with other file types). Using the PEfile library, this program extracts information from the executable file(s) to classify them. + + +Note: It is not perfect and is prone to a lot of false-positives, but I hardly encountered any false-negatives. I think this is due to the overfitting of the model. + +### Installation and execution + +1) Install the necessary libraries +``` +pip3 install customtkinter +pip3 install tkinter +pip3 install pandas +pip3 install sklearn +pip3 install pefile +pip3 install numpy + +``` + +2) Execute the program +``` +python3 anti-malware.py +``` + +Happy learning! \ No newline at end of file diff --git a/A/Anti-Malware application/anti-malware.py b/A/Anti-Malware application/anti-malware.py new file mode 100644 index 00000000..af8f53a4 --- /dev/null +++ b/A/Anti-Malware application/anti-malware.py @@ -0,0 +1,241 @@ +################################################################################# +### Author: Pyerie # +### Application: A not-so-accurate ML based anti-malware solution # +################################################################################# + +print("[+] Loading.... ") +import customtkinter +from tkinter.filedialog import * +from tkinter import * +import pefile +import numpy as np +import pandas as pd +from sklearn.tree import DecisionTreeClassifier +from sklearn.model_selection import train_test_split +from sklearn import metrics +import os + + + +dataset = pd.read_csv('database3.csv') +X = dataset.drop(['legitimate'],axis=1).values + +y = dataset['legitimate'].values + + + +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1) +clf = DecisionTreeClassifier() + + +y_test = y_test.reshape(-1,1) +for i in range(0, 10): + clf = clf.fit(X_train,y_train) +res1 = clf.predict(X_test) +accuracy = metrics.accuracy_score(y_test, res1) +accuracy = str(accuracy)[2:4] + "%" +print("Accuracy: "+accuracy) + + +customtkinter.set_appearance_mode("dark") +customtkinter.set_default_color_theme("dark-blue") + + +window = Tk() +screen_width = window.winfo_screenwidth() +screen_height = window.winfo_screenheight() +window.geometry(str(screen_width)+"x"+str(screen_height)) +window.title("eSuraksha") +window['bg'] = "#121212" +def extract_features(file): + features = [] + + + + try: + + pe_obj = pefile.PE(file, fast_load=True) + except pefile.PEFormatError as error: + print("Not PE file!") + + features.append(pe_obj.OPTIONAL_HEADER.DATA_DIRECTORY[6].Size) + features.append(pe_obj.OPTIONAL_HEADER.DATA_DIRECTORY[6].VirtualAddress) + features.append(pe_obj.OPTIONAL_HEADER.MajorImageVersion) + features.append(pe_obj.OPTIONAL_HEADER.MajorOperatingSystemVersion) + features.append(pe_obj.OPTIONAL_HEADER.DATA_DIRECTORY[0].VirtualAddress) + features.append(pe_obj.OPTIONAL_HEADER.DATA_DIRECTORY[0].Size) + try: + features.append(pe_obj.OPTIONAL_HEADER.DATA_DIRECTORY[12].VirtualAddress) + except: + features.append(0) + features.append(pe_obj.OPTIONAL_HEADER.DATA_DIRECTORY[2].Size) + features.append(pe_obj.OPTIONAL_HEADER.MajorLinkerVersion) + features.append(pe_obj.FILE_HEADER.NumberOfSections) + features.append(pe_obj.OPTIONAL_HEADER.SizeOfStackReserve) + features.append(pe_obj.OPTIONAL_HEADER.DllCharacteristics) + features.append(pe_obj.OPTIONAL_HEADER.AddressOfEntryPoint) + features.append(pe_obj.OPTIONAL_HEADER.ImageBase) + + + + + + + return features + +toplevel_created = False + +toplevel2_created = False + +def single_file(): + + global toplevel_created + global toplevel2_created + global single_file_top + if toplevel_created == "True": + single_file_top.destroy() + toplevel_created = "False" + elif toplevel_created == "False": + pass + + if toplevel2_created == "True": + many_files.destroy() + toplevel2_created = "False" + elif toplevel2_created == "False": + pass + + single_file_top = Toplevel(window) + single_file_top.geometry("350x200") + customtkinter.set_appearance_mode("dark") + customtkinter.set_default_color_theme("dark-blue") + single_file_top['bg'] = "#121212" + single_file_top.title("Scan a single file") + toplevel_created = "True" + result = customtkinter.CTkLabel(single_file_top, text="Loading...") + result.pack() + + file_path = askopenfilename() + try: + features_extracted = extract_features(str(file_path)) + not_pe = False + except UnboundLocalError as e: + not_pe = True + result.after(0, result.destroy) + benign_l = customtkinter.CTkLabel(single_file_top, text="Not PE file!") + benign_l.pack() + toplevel2_created = False + + if not_pe != True: + data_of_sample = np.array(features_extracted) + data_of_sample = data_of_sample.reshape(1,-1) + + + prediction = clf.predict(data_of_sample) + + + if prediction == 1: + result.after(0, result.destroy) + + malware_l = customtkinter.CTkLabel(single_file_top, fg_color="red", text="ML model detected malware!") + malware_l.pack() + + + elif prediction == 0: + result.after(0, result.destroy) + benign_l = customtkinter.CTkLabel(single_file_top, fg_color="green", text="No malware detected!") + benign_l.pack() + + +def scan_many(): + + + global toplevel2_created + global toplevel_created + global many_files + + if toplevel2_created == "True": + many_files.destroy() + toplevel2_created = "False" + elif toplevel2_created == "False": + pass + + if toplevel_created == "True": + single_file_top.destroy() + toplevel_created = "False" + elif toplevel_created == "False": + pass + + many_files = Toplevel(window) + many_files.geometry("350x200") + customtkinter.set_appearance_mode("dark") + customtkinter.set_default_color_theme("dark-blue") + many_files['bg'] = "#121212" + many_files.title("Scan a directory") + toplevel2_created = "True" + result2 = customtkinter.CTkLabel(many_files, text="Loading...") + result2.pack() + malware_many = [] + directory = askdirectory() + global extracted + for root, directory, files in os.walk(str(directory)): + for name_of_file in files: + path = os.path.join(str(root),str(name_of_file)) + + formats_of_pe = [".acm" , ".ax" , ".cpl" , ".dll" , ".drv" , ".efi" , ".exe" , ".mui" , ".ocx" , ".scr" , ".sys" , ".tsp", ".bin"] + for format_i in formats_of_pe: + if name_of_file.endswith(format_i) == True: + + extracted = 1 + try: + + features_of_many = extract_features(str(path)) + except UnboundLocalError as e: + pass + break + + else: + extracted = 0 + + + + if extracted == 1: + data_for_many = np.array(features_of_many) + data_for_many = data_for_many.reshape(1,-1) + + prediction_for_many = clf.predict(data_for_many) + + + if prediction_for_many == 1: + malware_many.append(str(path)) + + + if len(malware_many) != 0: + result2.after(0, result2.destroy) + malware_label2 = customtkinter.CTkLabel(many_files,text="Malware found: ") + malware_label2.pack() + malware_text_box = customtkinter.CTkTextbox(many_files) + for_text_box = '' + + for name_of_malware in malware_many: + for_text_box += "".join([name_of_malware, '\n------------------------------------------']) + + + + malware_text_box.insert('0.0',for_text_box) + malware_text_box.configure(state="disabled") + malware_text_box.pack() + + + + + elif len(malware_many) == 0: + result2.after(0, result2.destroy) + benign_label = customtkinter.CTkLabel(many_files,text="No malware found!") + benign_label.pack() + +button1 = customtkinter.CTkButton(master=window, command=single_file,text="Scan a single file") +button1.pack() +button2 = customtkinter.CTkButton(master=window, command=scan_many, text="Scan a folder") +button2.pack() + +window.mainloop() \ No newline at end of file diff --git a/A/Anti-Malware application/database3.csv b/A/Anti-Malware application/database3.csv new file mode 100755 index 00000000..b0148daa --- /dev/null +++ b/A/Anti-Malware application/database3.csv @@ -0,0 +1,639 @@ +debug_size,debug_RVA,image_version,os_version,export_RVA,export_size,IATRVA,res_size,linker_version,number_of_sections,stack_reserve_size,dll,address_of_entrypoint,image_base,legitimate +0,0,0,4,0,0,0,0,5,3,1048576,0,4096,142606336,1 +0,0,0,4,0,0,0,1504,11,3,4194304,34112,0,5368709120,1 +0,0,0,4,0,0,0,1504,11,3,4194304,34112,0,5368709120,1 +0,0,0,4,0,0,0,1512,8,3,4194304,34112,0,4194304,1 +0,0,0,4,0,0,0,1512,8,3,4194304,34112,0,4194304,1 +0,0,0,4,0,0,0,156,6,3,1048576,0,129744,4194304,1 +0,0,0,4,0,0,0,163500,2,8,1048576,0,361688,4194304,1 +0,0,0,4,0,0,0,202776,8,4,1048576,1536,83152,4194304,1 +0,0,0,4,0,0,0,202776,8,4,1048576,1536,83152,4194304,1 +0,0,0,4,0,0,0,232,8,3,1048576,1536,75280,4194304,1 +0,0,0,4,0,0,0,232,8,3,1048576,1536,75280,4194304,1 +0,0,0,4,0,0,0,33908,2,10,1048576,0,794730,4194304,1 +0,0,0,4,0,0,0,371784,6,3,1048576,34112,0,4194304,1 +0,0,0,4,0,0,0,5120,2,8,1048576,0,32996,4194304,1 +0,0,0,4,0,0,0,5120,2,8,1048576,0,32996,4194304,1 +0,0,0,4,0,0,0,552,8,4,1048576,1536,42288,4194304,1 +0,0,0,4,0,0,168460,0,2,17,2097152,352,5376,4194304,1 +0,0,0,4,0,0,168460,0,2,17,2097152,352,5376,4194304,1 +0,0,0,4,0,0,24576,467844,6,4,1048576,0,21247,4194304,1 +0,0,0,4,0,0,24576,467844,6,4,1048576,0,21247,4194304,1 +0,0,0,4,0,0,24576,87868,7,4,1048576,0,5467,4194304,1 +0,0,0,4,0,0,24576,87868,7,4,1048576,0,5467,4194304,1 +0,0,0,4,0,0,28672,0,6,3,1048576,0,10124,4194304,1 +0,0,0,4,0,0,32784,2400,5,4,1048576,0,16896,4194304,1 +0,0,0,4,0,0,32784,2400,5,4,1048576,0,16896,4194304,1 +0,0,0,4,0,0,335872,1512,8,5,1048576,34112,335882,4194304,1 +0,0,0,4,0,0,335872,1512,8,5,1048576,34112,335882,4194304,1 +0,0,0,4,0,0,4096,29980,8,4,1048576,1024,15088,4194304,1 +0,0,0,4,0,0,4096,29980,8,4,1048576,1024,15088,4194304,1 +0,0,0,4,0,0,4096,48367,6,3,1048576,0,4524,4194304,1 +0,0,0,4,0,0,4096,48367,6,3,1048576,0,4524,4194304,1 +0,0,0,4,0,0,40960,3515476,6,4,1048576,0,39446,4194304,1 +0,0,0,4,0,0,5308416,1520,8,5,1048576,34112,5308426,4194304,1 +0,0,0,4,0,0,5308416,1520,8,5,1048576,34112,5308426,4194304,1 +0,0,0,4,0,0,8192,1544,48,3,1048576,34144,11014,4194304,0 +0,0,0,4,0,0,8192,1792,8,3,1048576,34112,391150,4194304,1 +0,0,0,4,0,0,8192,1792,8,3,1048576,34112,391150,4194304,1 +0,0,0,4,0,0,8192,24192,11,3,1048576,34112,443086,4194304,1 +0,0,0,4,0,0,8192,36168,5,5,1048576,0,4096,4194304,1 +0,0,0,4,0,0,8192,36168,5,5,1048576,0,4096,4194304,1 +0,0,0,4,0,0,8192,39758,48,3,1048576,34112,143694,4194304,1 +0,0,0,4,0,0,8192,44240,48,3,1048576,34144,2160194,4194304,0 +0,0,0,4,0,0,8192,796,6,4,1048576,34112,1520718,4194304,1 +0,0,0,4,0,0,90112,1504,11,5,1048576,34112,90122,4194304,1 +0,0,0,4,121319424,6601,121334772,392,2,13,2097152,352,5344,5368709120,0 +0,0,0,4,12880,405,12288,0,6,4,1048576,0,8369,268435456,1 +0,0,0,4,12880,405,12288,0,6,4,1048576,0,8369,268435456,1 +0,0,0,4,13888,128,12288,0,8,5,1048576,0,10560,268435456,1 +0,0,0,4,13888,128,12288,0,8,5,1048576,0,10560,268435456,1 +0,0,0,4,1433600,181,0,105472,5,8,1048576,0,5136,4194304,1 +0,0,0,4,1433600,181,0,105472,5,8,1048576,0,5136,4194304,1 +0,0,0,4,16576,240,16384,15568,6,5,1048576,0,13088,268435456,1 +0,0,0,4,16576,240,16384,15568,6,5,1048576,0,13088,268435456,1 +0,0,0,4,16576,248,16384,18472,6,5,1048576,0,13104,268435456,1 +0,0,0,4,16576,248,16384,18472,6,5,1048576,0,13104,268435456,1 +0,0,0,4,211136,1458,184320,0,8,4,1048576,0,8390,536870912,1 +0,0,0,4,23248,85,20480,0,7,4,1048576,0,16837,268435456,1 +0,0,0,4,23248,85,20480,0,7,4,1048576,0,16837,268435456,1 +0,0,0,4,28000,96,24576,0,6,4,1048576,0,21066,268435456,1 +0,0,0,4,28000,96,24576,0,6,4,1048576,0,21066,268435456,1 +0,0,0,4,398336,1452,344064,0,8,5,1048576,0,247712,536870912,1 +0,0,0,4,398336,1452,344064,0,8,5,1048576,0,247712,536870912,1 +0,0,0,4,47696,130,45056,0,8,4,1048576,0,43951,268435456,1 +0,0,0,4,74624,121,61440,0,8,5,1048576,0,13664,1342177280,1 +0,0,0,4,74624,121,61440,0,8,5,1048576,0,13664,1342177280,1 +0,0,0,4,9088,123,8192,0,8,4,1048576,1024,7941,1342177280,1 +0,0,0,5,0,0,0,0,10,3,1048576,33024,414720,4194304,1 +0,0,0,5,0,0,0,0,10,3,1048576,33024,414720,4194304,1 +0,0,0,5,0,0,0,1324,10,3,1048576,33088,924368,4194304,1 +0,0,0,5,0,0,0,1324,10,3,1048576,33088,924368,4194304,1 +0,0,0,5,0,0,102400,0,9,4,10000000,33088,89711,4194304,1 +0,0,0,5,0,0,102400,0,9,4,10000000,33088,89711,4194304,1 +0,0,0,5,0,0,110592,26064,9,4,1048576,32768,65089,4194304,1 +0,0,0,5,0,0,110592,26064,9,4,1048576,32768,65089,4194304,1 +0,0,0,5,0,0,114688,0,9,4,10000000,33088,104257,4194304,1 +0,0,0,5,0,0,122880,0,9,4,10000000,33088,107951,4194304,1 +0,0,0,5,0,0,122880,0,9,4,10000000,33088,107951,4194304,1 +0,0,0,5,0,0,176128,0,9,4,10000000,33088,169999,4194304,1 +0,0,0,5,0,0,176128,0,9,4,10000000,33088,169999,4194304,1 +0,0,0,5,0,0,176128,1000,10,6,1048576,33088,106848,5368709120,1 +0,0,0,5,0,0,176128,1000,10,6,1048576,33088,106848,5368709120,1 +0,0,0,5,0,0,20480,436,9,5,10000000,33088,16053,4194304,1 +0,0,0,5,0,0,20480,436,9,5,10000000,33088,16053,4194304,1 +0,0,0,5,0,0,204800,0,10,4,1048576,33088,12982,4194304,1 +0,0,0,5,0,0,27068,5352,7,4,1048576,0,5486,4194304,1 +0,0,0,5,0,0,27112,5600,9,4,2097152,0,5540,4194304,1 +0,0,0,5,0,0,28672,2816,10,4,1048576,33024,8657,4194304,1 +0,0,0,5,0,0,28672,2816,10,4,1048576,33024,8657,4194304,1 +0,0,0,5,0,0,28672,436,10,6,1048576,33088,7976,5368709120,1 +0,0,0,5,0,0,28672,436,10,6,1048576,33088,7976,5368709120,1 +0,0,0,5,0,0,28672,8076,10,4,1048576,33024,8657,4194304,1 +0,0,0,5,0,0,28672,8076,10,4,1048576,33024,8657,4194304,1 +0,0,0,5,0,0,32768,436,9,5,10000000,33088,31181,4194304,1 +0,0,0,5,0,0,339968,0,10,4,1048576,33088,59428,4194304,1 +0,0,0,5,0,0,339968,0,10,4,1048576,33088,59428,4194304,1 +0,0,0,5,0,0,36864,138500,9,4,1048576,32768,9680,4194304,1 +0,0,0,5,0,0,393316,17832,10,3,1048576,33024,393495,4194304,1 +0,0,0,5,0,0,393316,17832,10,3,1048576,33024,393495,4194304,1 +0,0,0,5,0,0,4096,18456,10,3,1048576,32768,22485,4194304,1 +0,0,0,5,0,0,462848,149002,10,5,1048576,0,316285,4194304,1 +0,0,0,5,0,0,73728,0,9,3,1048576,32768,29764,4194304,1 +0,0,0,5,0,0,73728,0,9,3,1048576,32768,29764,4194304,1 +0,0,0,5,0,0,77824,3708,9,4,1048576,32768,30134,4194304,1 +0,0,0,5,0,0,77824,3708,9,4,1048576,32768,30134,4194304,1 +0,0,0,5,0,0,81920,784,14,6,1048576,33088,11183,4194304,1 +0,0,0,5,0,0,81920,784,14,6,1048576,33088,11183,4194304,1 +0,0,0,5,0,0,81920,864,14,6,1048576,33088,11706,4194304,1 +0,0,0,5,0,0,81920,864,14,6,1048576,33088,11706,4194304,1 +0,0,0,5,0,0,90112,0,10,3,1048576,0,49257,4194304,1 +0,0,0,5,0,0,90112,0,10,3,1048576,0,49257,4194304,1 +0,0,0,5,0,0,90112,0,10,3,1048576,0,68474,4194304,1 +0,0,0,5,0,0,90112,0,10,4,1048576,320,39389,268435456,1 +0,0,0,5,0,0,90112,0,10,4,1048576,320,39389,268435456,1 +0,0,0,5,0,0,90112,436,9,5,10000000,33088,82305,4194304,1 +0,0,0,5,0,0,90112,436,9,5,10000000,33088,82305,4194304,1 +0,0,0,5,0,0,94208,0,10,3,1048576,0,42247,4194304,1 +0,0,0,5,0,0,94208,0,10,3,1048576,0,42247,4194304,1 +0,0,0,5,0,0,94208,0,10,3,1048576,0,84734,4194304,1 +0,0,0,5,0,0,98304,0,10,3,1048576,0,59417,4194304,1 +0,0,0,5,0,0,98304,0,10,3,1048576,0,59544,4194304,1 +0,0,0,5,0,0,98304,0,10,3,1048576,0,59544,4194304,1 +0,0,0,5,112064,213,90112,0,10,4,1048576,320,52370,268435456,1 +0,0,0,5,112064,213,90112,0,10,4,1048576,320,52370,268435456,1 +0,0,0,5,129392,71,98304,436,10,6,1048576,320,39544,6442450944,1 +0,0,0,5,129392,71,98304,436,10,6,1048576,320,39544,6442450944,1 +0,0,0,5,161136,7233,135168,1088,9,5,10000000,0,133948,268435456,1 +0,0,0,5,161136,7233,135168,1088,9,5,10000000,0,133948,268435456,1 +0,0,0,5,202576,1609,167936,1040,9,5,1048576,0,162866,268435456,1 +0,0,0,5,202576,1609,167936,1040,9,5,1048576,0,162866,268435456,1 +0,0,0,5,21568,218,16384,0,9,4,10000000,320,11674,268435456,1 +0,0,0,5,39760,128,32768,436,9,5,1048576,320,5793,268435456,1 +0,0,0,5,39760,128,32768,436,9,5,1048576,320,5793,268435456,1 +0,0,0,5,56352,4343,53248,0,9,4,1048576,0,49832,268435456,1 +0,0,0,5,58864,1436,40960,912,9,5,1048576,0,38872,1514930176,1 +0,0,0,5,58864,1436,40960,912,9,5,1048576,0,38872,1514930176,1 +0,0,0,5,715024,92326,552960,1088,9,5,10000000,0,548935,268435456,1 +0,0,0,5,715024,92326,552960,1088,9,5,10000000,0,548935,268435456,1 +0,0,0,5,87312,54,53248,247608,10,5,1048576,320,32057,268435456,1 +0,0,0,6,0,0,0,2064,6,3,262144,34112,100624,319815680,1 +0,0,0,6,0,0,0,2064,6,3,262144,34112,100624,319815680,1 +0,0,1,4,0,0,0,69632,2,5,327680,0,4568,4194304,1 +0,0,1,4,0,0,0,69632,2,5,327680,0,4568,4194304,1 +0,0,1,4,0,0,4096,104264,6,3,1048576,0,5420,4194304,1 +0,0,1,4,0,0,4096,104264,6,3,1048576,0,5420,4194304,1 +0,0,1,4,0,0,4096,111432,6,3,1048576,0,5420,4194304,1 +0,0,1,4,0,0,4096,111432,6,3,1048576,0,5420,4194304,1 +0,0,1,4,0,0,4096,2264,6,3,1048576,0,4596,4194304,1 +0,0,1,4,0,0,4096,2264,6,3,1048576,0,4596,4194304,1 +0,0,1,4,0,0,4096,305992,6,3,1048576,0,5420,4194304,1 +0,0,1,4,0,0,4096,305992,6,3,1048576,0,5420,4194304,1 +0,0,1,4,0,0,4096,306504,6,3,1048576,0,5420,4194304,1 +0,0,1,4,0,0,4096,306504,6,3,1048576,0,5420,4194304,1 +0,0,1,4,0,0,4096,307528,6,3,1048576,0,5420,4194304,1 +0,0,1,4,0,0,4096,307528,6,3,1048576,0,5420,4194304,1 +0,0,1,4,0,0,4096,8048,6,3,1048576,0,5168,4194304,1 +0,0,1,4,0,0,4096,8048,6,3,1048576,0,5168,4194304,1 +0,0,1,4,13488,265,12288,0,7,4,10000000,0,7832,268435456,1 +0,0,1,4,13488,265,12288,0,7,4,10000000,0,7832,268435456,1 +0,0,1,4,15312,71,12288,0,7,4,1048576,0,8804,268435456,1 +0,0,1,4,15312,71,12288,0,7,4,1048576,0,8804,268435456,1 +0,0,1,4,43488,6680,40960,0,7,4,1048576,0,40195,268435456,1 +0,0,1,4,43488,6680,40960,0,7,4,1048576,0,40195,268435456,1 +0,0,1,4,56272,6927,53248,0,7,4,10000000,0,50056,268435456,1 +0,0,1,4,79024,16065,73728,0,7,4,10000000,0,70170,268435456,1 +0,0,1,4,9088,263,8192,0,7,4,1048576,0,6183,268435456,1 +0,0,1,4,9088,263,8192,0,7,4,1048576,0,6183,268435456,1 +0,0,1,4,929792,370,0,0,2,7,2097152,0,4192,1711276032,1 +0,0,1,4,929792,370,0,0,2,7,2097152,0,4192,1711276032,1 +0,0,1,4,9424,666,8192,0,7,4,1048576,0,5902,268435456,1 +0,0,1,4,9424,666,8192,0,7,4,1048576,0,5902,268435456,1 +0,0,1,5,0,0,16384,110413,10,5,1048576,33088,8992,4194304,1 +0,0,1,5,0,0,24576,0,12,4,1048576,33024,5049,4194304,1 +0,0,1,5,104128,59,98304,0,9,4,10000000,320,92784,268435456,1 +0,0,1,5,118544,212,102400,0,9,4,10000000,320,90040,268435456,1 +0,0,1,5,118544,212,102400,0,9,4,10000000,320,90040,268435456,1 +0,0,1,5,129136,59,118784,0,9,5,10000000,320,114964,6442450944,1 +0,0,1,5,129136,59,118784,0,9,5,10000000,320,114964,6442450944,1 +0,0,1,5,131056,75,114688,0,9,4,10000000,320,107077,268435456,1 +0,0,1,5,131056,75,114688,0,9,4,10000000,320,107077,268435456,1 +0,0,1,5,13696,247,12288,436,9,5,10000000,320,7470,268435456,1 +0,0,1,5,13696,247,12288,436,9,5,10000000,320,7470,268435456,1 +0,0,1,5,14368,962,12288,0,9,4,10000000,320,7461,268435456,1 +0,0,1,5,145792,212,122880,0,9,4,10000000,320,108280,268435456,1 +0,0,1,5,145792,212,122880,0,9,4,10000000,320,108280,268435456,1 +0,0,1,5,16048,217,12288,0,9,4,10000000,320,10234,268435456,1 +0,0,1,5,16048,217,12288,0,9,4,10000000,320,10234,268435456,1 +0,0,1,5,161648,75,139264,0,9,5,10000000,320,131988,6442450944,1 +0,0,1,5,161648,75,139264,0,9,5,10000000,320,131988,6442450944,1 +0,0,1,5,17552,1186,16384,0,9,4,10000000,320,14078,268435456,1 +0,0,1,5,247232,1775,229376,0,9,4,10000000,320,220208,268435456,1 +0,0,1,5,247232,1775,229376,0,9,4,10000000,320,220208,268435456,1 +0,0,1,5,27616,116,24576,436,9,5,10000000,320,20148,268435456,1 +0,0,1,5,27616,116,24576,436,9,5,10000000,320,20148,268435456,1 +0,0,1,5,30928,2314,28672,0,9,4,10000000,320,25856,268435456,1 +0,0,1,5,30928,2314,28672,0,9,4,10000000,320,25856,268435456,1 +0,0,10,10,0,0,0,2336,5,3,1048576,0,87536,4194304,1 +0,0,10,10,0,0,0,2336,5,3,1048576,0,87536,4194304,1 +0,0,2,4,206848,15373,200704,0,7,4,10000000,0,197109,268435456,1 +0,0,2,4,241408,15431,221184,0,7,4,1048576,0,219149,268435456,1 +0,0,2,4,241408,15431,221184,0,7,4,1048576,0,219149,268435456,1 +0,0,2,4,35184,1232,32768,0,7,4,10000000,0,29044,268435456,1 +0,0,2,4,35184,1232,32768,0,7,4,10000000,0,29044,268435456,1 +0,0,2,4,39984,1188,36864,0,7,4,1048576,0,33163,268435456,1 +0,0,2,4,39984,1188,36864,0,7,4,1048576,0,33163,268435456,1 +0,0,2,4,9120,151,8192,0,7,4,1048576,0,5493,268435456,1 +0,0,2,4,9312,309,8192,0,7,4,1048576,0,5843,268435456,1 +0,0,2,4,9312,309,8192,0,7,4,1048576,0,5843,268435456,1 +0,0,2,5,13680,329,12288,0,9,4,10000000,320,7258,268435456,1 +0,0,2,5,13680,329,12288,0,9,4,10000000,320,7258,268435456,1 +0,0,2,5,16016,191,12288,0,9,4,10000000,320,10058,268435456,1 +0,0,2,5,16016,191,12288,0,9,4,10000000,320,10058,268435456,1 +0,0,2,5,52304,8652,49152,0,9,4,10000000,320,44646,268435456,1 +0,0,2,5,52304,8652,49152,0,9,4,10000000,320,44646,268435456,1 +0,0,2,5,745296,50343,606208,0,9,4,10000000,0,598258,268435456,1 +0,0,2,5,745296,50343,606208,0,9,4,10000000,0,598258,268435456,1 +0,0,2,5,79616,19797,73728,0,9,4,10000000,320,71941,268435456,1 +0,0,2,5,79616,19797,73728,0,9,4,10000000,320,71941,268435456,1 +0,0,2,5,9504,175,8192,0,9,4,10000000,320,7066,268435456,1 +0,0,3,4,0,0,4096,123832,6,3,1048576,0,4640,4194304,1 +0,0,3,4,0,0,4096,123832,6,3,1048576,0,4640,4194304,1 +0,0,3,5,13472,164,12288,436,9,5,10000000,320,8894,268435456,1 +0,0,3,5,13472,164,12288,436,9,5,10000000,320,8894,268435456,1 +0,0,3,5,213056,19079,208896,0,9,4,10000000,320,206398,268435456,1 +0,0,3,5,31328,1351,28672,0,9,4,10000000,320,24640,268435456,1 +0,0,3,5,31328,1351,28672,0,9,4,10000000,320,24640,268435456,1 +0,0,4,5,25792,206,24576,0,9,4,10000000,320,21620,268435456,1 +0,0,4,5,25792,206,24576,0,9,4,10000000,320,21620,268435456,1 +0,0,5,4,0,0,0,0,7,3,1048576,0,93712,268435456,1 +0,0,5,4,0,0,0,0,7,3,1048576,0,93712,268435456,1 +0,0,5,5,0,0,0,82356,2,9,1048576,0,4096,4194304,1 +0,0,5,5,0,0,1024,0,7,3,262144,0,24070,65536,1 +0,0,5,5,0,0,1024,0,7,3,262144,0,24070,65536,1 +0,0,5,5,0,0,9856,0,7,5,262144,0,9616,65536,1 +0,0,6,4,0,0,28672,15144,6,5,1048576,32768,12538,4194304,1 +0,0,6,4,0,0,28672,2528,6,5,1048576,32768,12538,4194304,1 +0,0,6,4,0,0,28672,27496,6,5,1048576,34112,12505,4194304,0 +0,0,6,4,0,0,28672,97856,6,5,1048576,32768,12577,4194304,1 +0,0,6,4,0,0,28672,97856,6,5,1048576,32768,12577,4194304,1 +0,0,6,4,0,0,32768,35448,6,5,1048576,34112,13888,4194304,0 +0,0,6,5,0,0,103172,328448,2,8,1048576,33088,71708,4194304,0 +0,0,6,5,0,0,36864,281464,10,6,1048576,34112,14864,4194304,0 +0,0,6,6,0,0,0,0,9,7,262144,34112,7168,319815680,1 +0,0,6,6,0,0,0,0,9,7,262144,34112,7168,319815680,1 +0,0,6,6,0,0,13184,904,8,6,262144,0,1392,65536,1 +0,0,6,6,0,0,13184,904,8,6,262144,0,1392,65536,1 +0,0,6,6,802816,154,795380,69632,2,10,1048576,33088,745196,4194304,0 +0,0,7,9,0,0,182536,2232,8,3,1048576,0,176352,4194304,1 +0,0,7,9,0,0,182536,2232,8,3,1048576,0,176352,4194304,1 +0,0,8,4,0,0,4096,17126,6,3,1048576,0,4532,4194304,1 +0,0,8,4,0,0,4096,17126,6,3,1048576,0,4532,4194304,1 +0,0,8,5,10064,129,8192,0,9,4,10000000,320,6750,268435456,1 +0,0,8,5,10064,129,8192,0,9,4,10000000,320,6750,268435456,1 +0,0,8,5,147136,721,81920,0,9,4,10000000,320,77302,268435456,1 +0,0,8,5,147136,721,81920,0,9,4,10000000,320,77302,268435456,1 +0,0,8,5,24816,10332,20480,0,9,4,10000000,320,15934,268435456,1 +0,0,8,5,24816,10332,20480,0,9,4,10000000,320,15934,268435456,1 +0,0,9,4,0,0,4096,37956,6,3,1048576,0,4680,4194304,1 +0,0,9,4,0,0,4096,37956,6,3,1048576,0,4680,4194304,1 +0,485207007,0,4,0,0,0,98,76,3,1048576,0,4120,4194304,1 +112,100480,0,6,0,0,69632,480,14,6,1048576,33120,12256,5368709120,1 +112,100480,0,6,0,0,69632,480,14,6,1048576,33120,12256,5368709120,1 +112,258400,0,6,0,0,208896,480,14,6,1048576,33120,14624,5368709120,1 +112,291328,0,6,0,0,233472,480,14,5,1048576,33088,24460,4194304,1 +28,104544,0,6,0,0,81920,0,14,5,1048576,33088,11344,4194304,1 +28,104544,0,6,0,0,81920,0,14,5,1048576,33088,11344,4194304,1 +28,107104,0,4,0,0,107088,1510,8,3,1048576,34112,107074,4194304,1 +28,107104,0,4,0,0,107088,1510,8,3,1048576,34112,107074,4194304,1 +28,107176,0,4,0,0,107160,1510,8,3,1048576,34112,107146,4194304,1 +28,107176,0,4,0,0,107160,1510,8,3,1048576,34112,107146,4194304,1 +28,114296,0,4,0,0,114288,1510,8,3,1048576,34112,114274,4194304,1 +28,114296,0,4,0,0,114288,1510,8,3,1048576,34112,114274,4194304,1 +28,114368,0,4,0,0,114360,1510,8,3,1048576,34112,114346,4194304,1 +28,114368,0,4,0,0,114360,1510,8,3,1048576,34112,114346,4194304,1 +28,13164,0,4,0,0,8192,1512,11,3,1048576,34112,13566,4194304,1 +28,13164,0,4,0,0,8192,1512,11,3,1048576,34112,13566,4194304,1 +28,175552,0,5,0,0,135168,104672,14,6,1048576,33088,30362,4194304,1 +28,175552,0,5,0,0,135168,104672,14,6,1048576,33088,30362,4194304,1 +28,234624,0,5,0,0,172032,1508,14,7,2000000,49504,45840,5368709120,1 +28,30432,0,6,30464,56,28672,960,14,5,1048576,1280,27574,268435456,1 +28,33264,6,6,0,0,32768,0,9,6,262144,0,45156,65536,1 +28,33264,6,6,0,0,32768,0,9,6,262144,0,45156,65536,1 +28,402428,0,4,0,0,8192,28488,48,3,1048576,34144,402822,4194304,1 +28,649584,0,5,0,0,569344,149120,14,5,1048576,33088,275803,4194304,1 +28,649584,0,5,0,0,569344,149120,14,5,1048576,33088,275803,4194304,1 +28,660084,0,4,0,0,8192,21188,48,3,1048576,34112,660302,4194304,1 +28,660084,0,4,0,0,8192,21188,48,3,1048576,34112,660302,4194304,1 +28,763376,0,5,0,0,679936,149120,14,5,1048576,33088,281259,4194304,1 +28,763376,0,5,0,0,679936,149120,14,5,1048576,33088,281259,4194304,1 +28,78528,0,5,84864,51,77824,16384,9,5,1048576,34048,45804,4194304,1 +28,78528,0,5,84864,51,77824,16384,9,5,1048576,34048,45804,4194304,1 +28,81440,0,5,0,0,139264,716,8,5,1048576,1344,71440,4194304,1 +28,9588,0,4,0,0,8192,1504,48,3,1048576,34112,9982,4194304,1 +28,9588,0,4,0,0,8192,1504,48,3,1048576,34112,9982,4194304,1 +56,1081264,0,5,0,0,921600,436404,14,6,1048576,33088,548672,4194304,1 +56,109136,0,6,111840,80,86016,856,14,6,1048576,320,19001,268435456,1 +56,109136,0,6,111840,80,86016,856,14,6,1048576,320,19001,268435456,1 +56,186544,0,6,0,0,143360,480,14,7,1048576,352,38400,6442450944,1 +56,186544,0,6,0,0,143360,480,14,7,1048576,352,38400,6442450944,1 +56,2092800,0,5,0,0,2088960,176992,12,5,1048576,33088,1450535,4194304,1 +56,219384,0,6,0,0,180224,44848,14,7,1048576,49504,134464,5368709120,0 +56,242176,0,6,0,0,184320,480,14,6,1048576,320,5376,268435456,1 +56,242176,0,6,0,0,184320,480,14,6,1048576,320,5376,268435456,1 +56,245472,0,6,0,0,184320,134528,14,7,1048576,33120,39624,5368709120,1 +56,295200,0,6,0,0,225280,480,14,7,1048576,352,5296,6442450944,1 +56,295200,0,6,0,0,225280,480,14,7,1048576,352,5296,6442450944,1 +56,49520,6,6,0,0,28672,209496,14,6,1048576,33120,6264,5368709120,1 +56,49520,6,6,0,0,28672,209496,14,6,1048576,33120,6264,5368709120,1 +56,663472,0,6,0,0,540672,480,14,7,1048576,33120,349504,5368709120,1 +56,663472,0,6,0,0,540672,480,14,7,1048576,33120,349504,5368709120,1 +56,72712,0,6,74560,128,53248,480,14,5,1048576,320,6392,268435456,1 +56,80688,0,6,84064,132,61440,480,14,6,1048576,320,9740,268435456,1 +56,80688,0,6,84064,132,61440,480,14,6,1048576,320,9740,268435456,1 +56,80688,0,6,84064,132,61440,480,14,6,1048576,320,9741,268435456,1 +56,80688,0,6,84064,132,61440,480,14,6,1048576,320,9741,268435456,1 +84,240320,0,5,247856,52,208896,57400,14,6,1048576,49472,126704,4194304,1 +84,5136,10,10,0,0,40960,492840,14,5,262144,49472,27232,4194304,1 +84,622684,0,4,0,0,8192,4240,48,3,1048576,34112,629726,4194304,1 +84,663900,0,4,0,0,8192,4240,48,3,1048576,34112,670938,4194304,1 +84,689960,0,4,0,0,8192,1452,48,3,1048576,34112,716474,4194304,1 +84,859764,0,4,0,0,8192,4240,48,3,1048576,34112,866802,4194304,1 +84,87440,10,10,93856,21216,80312,1056,14,7,262144,16736,69776,6442450944,1 +84,985696,0,4,0,0,8192,205244,48,3,1048576,34112,992090,4194304,1 +0,0,0,4,0,0,8192,44240,48,3,1048576,34144,2160194,4194304,0 +0,0,0,4,0,0,8192,44240,48,3,1048576,34144,2160194,4194304,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +0,0,0,4,0,0,8192,44240,48,3,1048576,34144,2160194,4194304,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +84,704232,0,4,0,0,8192,1204,48,3,1048576,34144,704522,268435456,0 +0,0,0,4,0,0,8192,44240,48,3,1048576,34144,2160194,4194304,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +84,704232,0,4,0,0,8192,1204,48,3,1048576,34144,704522,268435456,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,44240,48,3,1048576,34144,2160194,4194304,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +84,704232,0,4,0,0,8192,1204,48,3,1048576,34144,704522,268435456,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,920,48,3,1048576,34144,1146110,268435456,0 +0,0,0,4,0,0,8192,44240,48,3,1048576,34144,2160194,4194304,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +84,704232,0,4,0,0,8192,1204,48,3,1048576,34144,704522,268435456,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,920,48,3,1048576,34144,1146110,268435456,0 +0,0,0,4,0,0,8192,932,48,3,1048576,34144,2175182,268435456,0 +0,0,0,4,0,0,8192,44240,48,3,1048576,34144,2160194,4194304,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +84,704232,0,4,0,0,8192,1204,48,3,1048576,34144,704522,268435456,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,920,48,3,1048576,34144,1146110,268435456,0 +0,0,0,4,0,0,8192,932,48,3,1048576,34144,2175182,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29252,4194304,0 +0,0,0,4,0,0,8192,44240,48,3,1048576,34144,2160194,4194304,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +84,704232,0,4,0,0,8192,1204,48,3,1048576,34144,704522,268435456,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,920,48,3,1048576,34144,1146110,268435456,0 +0,0,0,4,0,0,8192,932,48,3,1048576,34144,2175182,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29252,4194304,0 +28,108816,0,6,0,0,81920,4072,14,6,1048576,33120,39160,5368709120,0 +0,0,0,4,0,0,8192,44240,48,3,1048576,34144,2160194,4194304,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +84,704232,0,4,0,0,8192,1204,48,3,1048576,34144,704522,268435456,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,920,48,3,1048576,34144,1146110,268435456,0 +0,0,0,4,0,0,8192,932,48,3,1048576,34144,2175182,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29252,4194304,0 +28,108816,0,6,0,0,81920,4072,14,6,1048576,33120,39160,5368709120,0 +84,114032,0,4,0,0,8192,1348,48,3,1048576,34144,114318,268435456,0 +0,0,0,4,0,0,8192,44240,48,3,1048576,34144,2160194,4194304,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +84,704232,0,4,0,0,8192,1204,48,3,1048576,34144,704522,268435456,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,920,48,3,1048576,34144,1146110,268435456,0 +0,0,0,4,0,0,8192,932,48,3,1048576,34144,2175182,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29252,4194304,0 +28,108816,0,6,0,0,81920,4072,14,6,1048576,33120,39160,5368709120,0 +84,114032,0,4,0,0,8192,1348,48,3,1048576,34144,114318,268435456,0 +0,0,0,4,0,0,8192,952,48,3,1048576,34144,690138,268435456,0 +0,0,0,4,0,0,8192,44240,48,3,1048576,34144,2160194,4194304,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +84,704232,0,4,0,0,8192,1204,48,3,1048576,34144,704522,268435456,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,920,48,3,1048576,34144,1146110,268435456,0 +0,0,0,4,0,0,8192,932,48,3,1048576,34144,2175182,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29252,4194304,0 +28,108816,0,6,0,0,81920,4072,14,6,1048576,33120,39160,5368709120,0 +84,114032,0,4,0,0,8192,1348,48,3,1048576,34144,114318,268435456,0 +0,0,0,4,0,0,8192,952,48,3,1048576,34144,690138,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29588,4194304,0 +0,0,0,4,0,0,8192,44240,48,3,1048576,34144,2160194,4194304,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +84,704232,0,4,0,0,8192,1204,48,3,1048576,34144,704522,268435456,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,920,48,3,1048576,34144,1146110,268435456,0 +0,0,0,4,0,0,8192,932,48,3,1048576,34144,2175182,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29252,4194304,0 +28,108816,0,6,0,0,81920,4072,14,6,1048576,33120,39160,5368709120,0 +84,114032,0,4,0,0,8192,1348,48,3,1048576,34144,114318,268435456,0 +0,0,0,4,0,0,8192,952,48,3,1048576,34144,690138,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29588,4194304,0 +0,0,0,4,0,0,8192,924,48,3,1048576,34144,51898,268435456,0 +0,0,0,4,0,0,8192,44240,48,3,1048576,34144,2160194,4194304,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +84,704232,0,4,0,0,8192,1204,48,3,1048576,34144,704522,268435456,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,920,48,3,1048576,34144,1146110,268435456,0 +0,0,0,4,0,0,8192,932,48,3,1048576,34144,2175182,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29252,4194304,0 +28,108816,0,6,0,0,81920,4072,14,6,1048576,33120,39160,5368709120,0 +84,114032,0,4,0,0,8192,1348,48,3,1048576,34144,114318,268435456,0 +0,0,0,4,0,0,8192,952,48,3,1048576,34144,690138,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29588,4194304,0 +0,0,0,4,0,0,8192,924,48,3,1048576,34144,51898,268435456,0 +0,0,6,4,0,0,32768,30704,6,5,1048576,34112,13199,4194304,0 +0,0,0,4,0,0,8192,44240,48,3,1048576,34144,2160194,4194304,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +84,704232,0,4,0,0,8192,1204,48,3,1048576,34144,704522,268435456,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,920,48,3,1048576,34144,1146110,268435456,0 +0,0,0,4,0,0,8192,932,48,3,1048576,34144,2175182,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29252,4194304,0 +28,108816,0,6,0,0,81920,4072,14,6,1048576,33120,39160,5368709120,0 +84,114032,0,4,0,0,8192,1348,48,3,1048576,34144,114318,268435456,0 +0,0,0,4,0,0,8192,952,48,3,1048576,34144,690138,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29588,4194304,0 +0,0,0,4,0,0,8192,924,48,3,1048576,34144,51898,268435456,0 +0,0,6,4,0,0,32768,30704,6,5,1048576,34112,13199,4194304,0 +0,0,0,6,0,0,1187112,368472,14,10,1048576,33120,755732,5368709120,0 +0,0,0,4,0,0,8192,44240,48,3,1048576,34144,2160194,4194304,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +84,704232,0,4,0,0,8192,1204,48,3,1048576,34144,704522,268435456,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,920,48,3,1048576,34144,1146110,268435456,0 +0,0,0,4,0,0,8192,932,48,3,1048576,34144,2175182,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29252,4194304,0 +28,108816,0,6,0,0,81920,4072,14,6,1048576,33120,39160,5368709120,0 +84,114032,0,4,0,0,8192,1348,48,3,1048576,34144,114318,268435456,0 +0,0,0,4,0,0,8192,952,48,3,1048576,34144,690138,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29588,4194304,0 +0,0,0,4,0,0,8192,924,48,3,1048576,34144,51898,268435456,0 +0,0,6,4,0,0,32768,30704,6,5,1048576,34112,13199,4194304,0 +0,0,0,6,0,0,1187112,368472,14,10,1048576,33120,755732,5368709120,0 +28,445964,0,4,0,0,8192,1128,48,3,1048576,34144,446358,268435456,0 +0,0,0,4,0,0,8192,44240,48,3,1048576,34144,2160194,4194304,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +84,704232,0,4,0,0,8192,1204,48,3,1048576,34144,704522,268435456,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,920,48,3,1048576,34144,1146110,268435456,0 +0,0,0,4,0,0,8192,932,48,3,1048576,34144,2175182,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29252,4194304,0 +28,108816,0,6,0,0,81920,4072,14,6,1048576,33120,39160,5368709120,0 +84,114032,0,4,0,0,8192,1348,48,3,1048576,34144,114318,268435456,0 +0,0,0,4,0,0,8192,952,48,3,1048576,34144,690138,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29588,4194304,0 +0,0,0,4,0,0,8192,924,48,3,1048576,34144,51898,268435456,0 +0,0,6,4,0,0,32768,30704,6,5,1048576,34112,13199,4194304,0 +0,0,0,6,0,0,1187112,368472,14,10,1048576,33120,755732,5368709120,0 +28,445964,0,4,0,0,8192,1128,48,3,1048576,34144,446358,268435456,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +0,0,0,4,0,0,8192,44240,48,3,1048576,34144,2160194,4194304,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +84,704232,0,4,0,0,8192,1204,48,3,1048576,34144,704522,268435456,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,920,48,3,1048576,34144,1146110,268435456,0 +0,0,0,4,0,0,8192,932,48,3,1048576,34144,2175182,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29252,4194304,0 +28,108816,0,6,0,0,81920,4072,14,6,1048576,33120,39160,5368709120,0 +84,114032,0,4,0,0,8192,1348,48,3,1048576,34144,114318,268435456,0 +0,0,0,4,0,0,8192,952,48,3,1048576,34144,690138,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29588,4194304,0 +0,0,0,4,0,0,8192,924,48,3,1048576,34144,51898,268435456,0 +0,0,6,4,0,0,32768,30704,6,5,1048576,34112,13199,4194304,0 +0,0,0,6,0,0,1187112,368472,14,10,1048576,33120,755732,5368709120,0 +28,445964,0,4,0,0,8192,1128,48,3,1048576,34144,446358,268435456,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +0,0,6,4,0,0,32768,68928,6,5,1048576,34112,13199,4194304,0 +0,0,0,4,0,0,8192,44240,48,3,1048576,34144,2160194,4194304,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +84,704232,0,4,0,0,8192,1204,48,3,1048576,34144,704522,268435456,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,920,48,3,1048576,34144,1146110,268435456,0 +0,0,0,4,0,0,8192,932,48,3,1048576,34144,2175182,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29252,4194304,0 +28,108816,0,6,0,0,81920,4072,14,6,1048576,33120,39160,5368709120,0 +84,114032,0,4,0,0,8192,1348,48,3,1048576,34144,114318,268435456,0 +0,0,0,4,0,0,8192,952,48,3,1048576,34144,690138,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29588,4194304,0 +0,0,0,4,0,0,8192,924,48,3,1048576,34144,51898,268435456,0 +0,0,6,4,0,0,32768,30704,6,5,1048576,34112,13199,4194304,0 +0,0,0,6,0,0,1187112,368472,14,10,1048576,33120,755732,5368709120,0 +28,445964,0,4,0,0,8192,1128,48,3,1048576,34144,446358,268435456,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +0,0,6,4,0,0,32768,68928,6,5,1048576,34112,13199,4194304,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,44240,48,3,1048576,34144,2160194,4194304,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +84,704232,0,4,0,0,8192,1204,48,3,1048576,34144,704522,268435456,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,920,48,3,1048576,34144,1146110,268435456,0 +0,0,0,4,0,0,8192,932,48,3,1048576,34144,2175182,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29252,4194304,0 +28,108816,0,6,0,0,81920,4072,14,6,1048576,33120,39160,5368709120,0 +84,114032,0,4,0,0,8192,1348,48,3,1048576,34144,114318,268435456,0 +0,0,0,4,0,0,8192,952,48,3,1048576,34144,690138,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29588,4194304,0 +0,0,0,4,0,0,8192,924,48,3,1048576,34144,51898,268435456,0 +0,0,6,4,0,0,32768,30704,6,5,1048576,34112,13199,4194304,0 +0,0,0,6,0,0,1187112,368472,14,10,1048576,33120,755732,5368709120,0 +28,445964,0,4,0,0,8192,1128,48,3,1048576,34144,446358,268435456,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +0,0,6,4,0,0,32768,68928,6,5,1048576,34112,13199,4194304,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,956,48,3,1048576,34144,146370,268435456,0 +0,0,0,4,0,0,8192,44240,48,3,1048576,34144,2160194,4194304,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +84,704232,0,4,0,0,8192,1204,48,3,1048576,34144,704522,268435456,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,920,48,3,1048576,34144,1146110,268435456,0 +0,0,0,4,0,0,8192,932,48,3,1048576,34144,2175182,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29252,4194304,0 +28,108816,0,6,0,0,81920,4072,14,6,1048576,33120,39160,5368709120,0 +84,114032,0,4,0,0,8192,1348,48,3,1048576,34144,114318,268435456,0 +0,0,0,4,0,0,8192,952,48,3,1048576,34144,690138,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29588,4194304,0 +0,0,0,4,0,0,8192,924,48,3,1048576,34144,51898,268435456,0 +0,0,6,4,0,0,32768,30704,6,5,1048576,34112,13199,4194304,0 +0,0,0,6,0,0,1187112,368472,14,10,1048576,33120,755732,5368709120,0 +28,445964,0,4,0,0,8192,1128,48,3,1048576,34144,446358,268435456,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +0,0,6,4,0,0,32768,68928,6,5,1048576,34112,13199,4194304,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,956,48,3,1048576,34144,146370,268435456,0 +0,0,0,4,0,0,8192,1544,48,3,1048576,34144,11014,4194304,0 +0,0,0,4,0,0,8192,44240,48,3,1048576,34144,2160194,4194304,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +84,704232,0,4,0,0,8192,1204,48,3,1048576,34144,704522,268435456,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,920,48,3,1048576,34144,1146110,268435456,0 +0,0,0,4,0,0,8192,932,48,3,1048576,34144,2175182,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29252,4194304,0 +28,108816,0,6,0,0,81920,4072,14,6,1048576,33120,39160,5368709120,0 +84,114032,0,4,0,0,8192,1348,48,3,1048576,34144,114318,268435456,0 +0,0,0,4,0,0,8192,952,48,3,1048576,34144,690138,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29588,4194304,0 +0,0,0,4,0,0,8192,924,48,3,1048576,34144,51898,268435456,0 +0,0,6,4,0,0,32768,30704,6,5,1048576,34112,13199,4194304,0 +0,0,0,6,0,0,1187112,368472,14,10,1048576,33120,755732,5368709120,0 +28,445964,0,4,0,0,8192,1128,48,3,1048576,34144,446358,268435456,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +0,0,6,4,0,0,32768,68928,6,5,1048576,34112,13199,4194304,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,956,48,3,1048576,34144,146370,268435456,0 +0,0,0,4,0,0,8192,1544,48,3,1048576,34144,11014,4194304,0 +28,224408,0,6,0,0,188416,64880,14,6,1048576,33120,127600,5368709120,0 +0,0,0,4,0,0,8192,44240,48,3,1048576,34144,2160194,4194304,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +84,704232,0,4,0,0,8192,1204,48,3,1048576,34144,704522,268435456,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,920,48,3,1048576,34144,1146110,268435456,0 +0,0,0,4,0,0,8192,932,48,3,1048576,34144,2175182,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29252,4194304,0 +28,108816,0,6,0,0,81920,4072,14,6,1048576,33120,39160,5368709120,0 +84,114032,0,4,0,0,8192,1348,48,3,1048576,34144,114318,268435456,0 +0,0,0,4,0,0,8192,952,48,3,1048576,34144,690138,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29588,4194304,0 +0,0,0,4,0,0,8192,924,48,3,1048576,34144,51898,268435456,0 +0,0,6,4,0,0,32768,30704,6,5,1048576,34112,13199,4194304,0 +0,0,0,6,0,0,1187112,368472,14,10,1048576,33120,755732,5368709120,0 +28,445964,0,4,0,0,8192,1128,48,3,1048576,34144,446358,268435456,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +0,0,6,4,0,0,32768,68928,6,5,1048576,34112,13199,4194304,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,956,48,3,1048576,34144,146370,268435456,0 +0,0,0,4,0,0,8192,1544,48,3,1048576,34144,11014,4194304,0 +28,224408,0,6,0,0,188416,64880,14,6,1048576,33120,127600,5368709120,0 +0,0,0,6,0,0,0,36048,14,3,4194304,0,5400240,4194304,0 +0,0,0,4,0,0,8192,44240,48,3,1048576,34144,2160194,4194304,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +84,704232,0,4,0,0,8192,1204,48,3,1048576,34144,704522,268435456,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,920,48,3,1048576,34144,1146110,268435456,0 +0,0,0,4,0,0,8192,932,48,3,1048576,34144,2175182,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29252,4194304,0 +28,108816,0,6,0,0,81920,4072,14,6,1048576,33120,39160,5368709120,0 +84,114032,0,4,0,0,8192,1348,48,3,1048576,34144,114318,268435456,0 +0,0,0,4,0,0,8192,952,48,3,1048576,34144,690138,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29588,4194304,0 +0,0,0,4,0,0,8192,924,48,3,1048576,34144,51898,268435456,0 +0,0,6,4,0,0,32768,30704,6,5,1048576,34112,13199,4194304,0 +0,0,0,6,0,0,1187112,368472,14,10,1048576,33120,755732,5368709120,0 +28,445964,0,4,0,0,8192,1128,48,3,1048576,34144,446358,268435456,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +0,0,6,4,0,0,32768,68928,6,5,1048576,34112,13199,4194304,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,956,48,3,1048576,34144,146370,268435456,0 +0,0,0,4,0,0,8192,1544,48,3,1048576,34144,11014,4194304,0 +28,224408,0,6,0,0,188416,64880,14,6,1048576,33120,127600,5368709120,0 +0,0,0,6,0,0,0,36048,14,3,4194304,0,5400240,4194304,0 +0,0,0,4,0,0,8192,908,48,3,1048576,34144,157578,268435456,0 +0,0,0,4,0,0,8192,44240,48,3,1048576,34144,2160194,4194304,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +84,704232,0,4,0,0,8192,1204,48,3,1048576,34144,704522,268435456,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,920,48,3,1048576,34144,1146110,268435456,0 +0,0,0,4,0,0,8192,932,48,3,1048576,34144,2175182,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29252,4194304,0 +28,108816,0,6,0,0,81920,4072,14,6,1048576,33120,39160,5368709120,0 +84,114032,0,4,0,0,8192,1348,48,3,1048576,34144,114318,268435456,0 +0,0,0,4,0,0,8192,952,48,3,1048576,34144,690138,268435456,0 +0,0,0,4,0,0,32768,4072,6,4,1048576,256,29588,4194304,0 +0,0,0,4,0,0,8192,924,48,3,1048576,34144,51898,268435456,0 +0,0,6,4,0,0,32768,30704,6,5,1048576,34112,13199,4194304,0 +0,0,0,6,0,0,1187112,368472,14,10,1048576,33120,755732,5368709120,0 +28,445964,0,4,0,0,8192,1128,48,3,1048576,34144,446358,268435456,0 +0,0,0,6,0,0,0,64332,14,3,1048576,33088,330944,4194304,0 +0,0,6,4,0,0,32768,68928,6,5,1048576,34112,13199,4194304,0 +0,0,6,5,0,0,103172,75496,2,8,1048576,33088,71644,4194304,0 +0,0,0,4,0,0,8192,956,48,3,1048576,34144,146370,268435456,0 +0,0,0,4,0,0,8192,1544,48,3,1048576,34144,11014,4194304,0 +28,224408,0,6,0,0,188416,64880,14,6,1048576,33120,127600,5368709120,0 +0,0,0,6,0,0,0,36048,14,3,4194304,0,5400240,4194304,0 +0,0,0,4,0,0,8192,908,48,3,1048576,34144,157578,268435456,0 +0,0,6,6,802816,154,795380,69632,2,10,1048576,33088,745196,4194304,0 +112,157424,0,6,0,0,122880,163843400,14,5,1048576,33088,43787,4194304,0 +112,157424,0,6,0,0,122880,114220356,14,5,1048576,33088,42392,4194304,0 +0,0,6,4,0,0,32768,75880,6,5,1048576,34112,13238,4194304,0 +56,2405360,0,6,0,0,2109440,20296,14,6,1048576,33088,1613407,4194304,0 +112, 153040, 0, 6, 0, 0, 118784, 122137172, 14, 5, 1048576, 33088, 40936, 4194304,0 +112,175744,0,6,0,0,139264,95569956,14,7,1048576,33088,46622,4194304,0 +112,861680,0,6,0,0,749568,1544416,14,5,1048576,33088,450027,4194304,0 +0,0,6,5,0,0,103172,45568,2,8,1048576,33088,71644,4194304,0 +0,0,6,4,0,0,32768,105488,6,5,1048576,34112,13888,4194304,0 +0,0,6,6,802816,154,795380,51260,2,10,1048576,33088,745196,4194304,0 +0,0,6,6,802816,154,795380,51260,2,10,1048576,33088,745196,4194304,0 +112,787560,0,6,0,0,446464,59024,14,5,1048576,33088,301013,4194304,0 +84,33792,10,5,225168,84,233472,180108,14,6,1048576,33088,117719,4194304,0 +28, 234320, 0, 5, 0, 0, 172032, 61452, 14, 7, 2000000, 49504, 42672, 5368709120, 0 +0, 0, 0, 4, 0, 0, 0, 4444, 5, 2, 1048576, 0, 207065, 4194304, 1 + From eb60836df4a3b23d3508748067df84d62c329c72 Mon Sep 17 00:00:00 2001 From: Gowtham Date: Tue, 1 Oct 2024 18:00:10 +0530 Subject: [PATCH 2/3] Created an anti-malware program --- .../README.md | 0 .../anti-malware.py | 0 .../database3.csv | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename A/{Anti-Malware application => Anti-Malware_application}/README.md (100%) rename A/{Anti-Malware application => Anti-Malware_application}/anti-malware.py (100%) rename A/{Anti-Malware application => Anti-Malware_application}/database3.csv (100%) diff --git a/A/Anti-Malware application/README.md b/A/Anti-Malware_application/README.md similarity index 100% rename from A/Anti-Malware application/README.md rename to A/Anti-Malware_application/README.md diff --git a/A/Anti-Malware application/anti-malware.py b/A/Anti-Malware_application/anti-malware.py similarity index 100% rename from A/Anti-Malware application/anti-malware.py rename to A/Anti-Malware_application/anti-malware.py diff --git a/A/Anti-Malware application/database3.csv b/A/Anti-Malware_application/database3.csv similarity index 100% rename from A/Anti-Malware application/database3.csv rename to A/Anti-Malware_application/database3.csv From 9adb41d6dda178de1906bdfe3185006893e67ed3 Mon Sep 17 00:00:00 2001 From: pyerie Date: Tue, 1 Oct 2024 22:59:22 +0530 Subject: [PATCH 3/3] Create RAG boilerplate using langchain --- .../RAG_boilerplate.py | 50 +++++++++++++++++++ R/RAG_with_langchain_boilerplate/README.md | 32 ++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 R/RAG_with_langchain_boilerplate/RAG_boilerplate.py create mode 100644 R/RAG_with_langchain_boilerplate/README.md diff --git a/R/RAG_with_langchain_boilerplate/RAG_boilerplate.py b/R/RAG_with_langchain_boilerplate/RAG_boilerplate.py new file mode 100644 index 00000000..eb460a79 --- /dev/null +++ b/R/RAG_with_langchain_boilerplate/RAG_boilerplate.py @@ -0,0 +1,50 @@ +from langchain_community.llms import Ollama +from langchain_community.document_loaders import PyPDFLoader +from langchain_community.embeddings import OllamaEmbeddings +from langchain_community.vectorstores import FAISS +from langchain_core.prompts import ChatPromptTemplate +from langchain_text_splitters import RecursiveCharacterTextSplitter +from langchain.chains.combine_documents import create_stuff_documents_chain +from langchain.chains import create_retrieval_chain + +def create_RAG_model(input_file, llm): + # Create the LLM (Large Language Model) + llm = Ollama(model="dolphin-phi") + # Define model used to embed the info + embeddings = OllamaEmbeddings(model="nomic-embed-text") + # Load the PDF + loader = PyPDFLoader(input_file) + doc = loader.load() + # Split the text and embed it into the vector DB + text_splitter = RecursiveCharacterTextSplitter() + split = text_splitter.split_documents(doc) + vector_store = FAISS.from_documents(split, embeddings) + + + # Prompt generation: Giving the LLM character and purpose + prompt = ChatPromptTemplate.from_template( + """ + Answer the following questions only based on the given context + + + {context} + + + Question: {input} + """ + ) + # Linking the LLM, vector DB and the prompt + docs_chain = create_stuff_documents_chain(llm, prompt) + retriever = vector_store.as_retriever() + retrieval_chain = create_retrieval_chain(retriever, docs_chain) + return retrieval_chain + +# Using the retrieval chain +# Example: + +''' +chain = create_RAG_model("your_file_here.pdf", "mistral") +output = chain.invoke({"input":"What is the purpose of RAG?"}) +print(output["answer"]) +''' + diff --git a/R/RAG_with_langchain_boilerplate/README.md b/R/RAG_with_langchain_boilerplate/README.md new file mode 100644 index 00000000..71ade5b7 --- /dev/null +++ b/R/RAG_with_langchain_boilerplate/README.md @@ -0,0 +1,32 @@ +# Rag boilerplate in Python using LangChain # + +### About RAG ### +Hi there! This is a RAG(Retrieval Augmented Generation) boilerplate/template in Python. RAG is an amazing technology that links input sources(PDFs in this case) to LLMs(Large Language Models). Then, the LLMs gain the ability to answer questions that they initially didn't know about. + +### How RAG works ### +RAG works by splitting the input file(s) into semantically related chunks and embeds these chunks into a vector database. A vector database stores data in a mathematical representation to enable speedy access(of course, machines are more fluent in math). When a prompt or query is given by the user, it gets embedded into the vector DB too. Then, the data stored alongside the query are returned(the data stored alongside the query are the most related because the data is embedded semantically). + +### Installation and use ### +1) Install dependencies + +``` +pip3 install langchain-community +pip3 install langchain-core +pip3 install langchain-text-splitters +pip3 install langchain +``` + +(excuse me if you find any missing dependencies) + +2) Use the template + +Refer to the commented code at the end of the ```RAG_boilerplate.py``` file and modify it to suit your needs (remember to uncomment the code block). + +3) Download a PDF input file and execute + +Download a PDF to implement RAG on (also, specify it in the code) and execute it using ```python3 RAG_boilerplate.py``` + +4) Happy learning! + + +