From 84324479f018207169ed8c6a6b06f69b44fd8f1d Mon Sep 17 00:00:00 2001 From: ismailsosic Date: Sat, 28 May 2022 08:06:12 +0200 Subject: [PATCH] fix crawler and saver bugs --- .../allcrawlers/autocrawler/olxautocrawler.py | 305 ---------------- kivi_cars/cars/crawler.py | 327 ++++++++++++++++++ kivi_cars/cars/migrations/0001_initial.py | 159 +++++---- kivi_cars/cars/models.py | 163 ++++----- kivi_cars/cars/saver.py | 197 +++++++++++ kivi_cars/cars/views.py | 1 + kivi_cars/kivi_cars/settings.py | 2 +- kivi_cars/kivi_cars/urls.py | 2 + proba2.xlsx | Bin 0 -> 15401 bytes proba3.xlsx | Bin 0 -> 15388 bytes proba4.xlsx | Bin 0 -> 15388 bytes 11 files changed, 690 insertions(+), 466 deletions(-) delete mode 100644 kivi_cars/allcrawlers/autocrawler/olxautocrawler.py create mode 100644 kivi_cars/cars/crawler.py create mode 100644 kivi_cars/cars/saver.py create mode 100644 proba2.xlsx create mode 100644 proba3.xlsx create mode 100644 proba4.xlsx diff --git a/kivi_cars/allcrawlers/autocrawler/olxautocrawler.py b/kivi_cars/allcrawlers/autocrawler/olxautocrawler.py deleted file mode 100644 index 968bb98..0000000 --- a/kivi_cars/allcrawlers/autocrawler/olxautocrawler.py +++ /dev/null @@ -1,305 +0,0 @@ -# ----------Imports------------ -from datetime import date -from traceback import print_tb -from unittest import result -from urllib import response -from urllib.request import Request -from bs4 import BeautifulSoup -from matplotlib import dates -from numpy import diag_indices -import requests -import pandas as pd -import random - -# List of User-Agent -user_agent_list = [ - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36', - 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_4_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Mobile/15E148 Safari/604.1', - 'Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)', - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36 Edg/87.0.664.75', - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18363', -] - -user_agent = user_agent_list[random.randint(0, len(user_agent_list)-1)] -headers = {'User-Agent': user_agent} - -# Array of object filteri - -podaci_db = [] - -# Pagination cross webpages -# n is number of pages to crawl -pages_number_to_crawl = 2 -for i in range(1,pages_number_to_crawl): - # if kategorija=18 - Automobili - main_website = 'https://www.olx.ba/pretraga?id=18&kategorija=18&stanje=0&vrstapregleda=tabela&sort_order=desc&sort_po=datum&kilometra-a_min=0&kilometra-a_max=0&stranica=' + str(i) - category_of_vehicle = 18 - - # Request to website - response_for_page = requests.get(main_website, headers=headers) - - # Soup object - soup_page = BeautifulSoup(response_for_page.content, 'html.parser') - - # Results - results_all_items_per_page = soup_page.find_all('div',{'class':'listitem'}) - - # List of olx id - olx_id = [] - - # All filters - filters = { - "Olx_id" : None, - "Kategorija" : None, - "Cijena" : None, - "Stanje" : None, - "Lokacija_kanton" : None, - "Lokacija_grad" : None, - "Proizvođač" : None, - "Model" : None, - "Godište" : None, - "Kilometraža" : None, - "Kilovata (KW)" : None, - "Kubikaža" : None, - "Gorivo" : None, - "Broj vrata" : None, - "Konjskih snaga" : None, - "Metalik" : None, - "Masa/Težina (kg)" : None, - "Tip" : None, - "Pogon" : None, - "Emisioni standard" : None, - "Veličina felgi" : None, - "Transmisija" : None, - "Broj stepeni prijenosa" : None, - "Boja" : None, - "Muzika / ozvučenje" : None, - "Parking senzori" : None, - "Parking kamera" : None, - "Registrovan do" : None, - "Godina prve registracije" : None, - "Broj prethodnih vlasnika" : None, - "Posjeduje gume" : None, - "Višezonska klima" : None, - "Rolo zavjese" : None, - "Svjetla" : None, - "Zaštita/Blokada" : None, - "Sjedećih mjesta" : None, - "Turbo" : None, - "DPF/FAP filter" : None, - "Strane tablice" : None, - "Ocarinjen" : None, - "Prilagođen invalidima" : None, - "Servo volan" : None, - "Tempomat" : None, - "ESP" : None, - "El. podizači stakala" : None, - "Senzor mrtvog ugla" : None, - "Digitalna klima" : None, - "Touch screen (ekran)" : None, - "Panorama krov" : None, - "Koža" : None, - "Masaža sjedišta" : None, - "El. pomjeranje sjedišta" : None, - "Senzor auto. svjetla" : None, - "Alarm" : None, - "Daljinsko otključavanje" : None, - "Auto kuka" : None, - "Udaren" : None, - "Start-Stop sistem" : None, - "Park assist" : None, - "Registrovan" : None, - "Na lizingu" : None, - "Servisna knjiga" : None, - "Komande na volanu" : None, - "ABS" : None, - "Airbag" : None, - "Električni retrovizori" : None, - "Klima" : None, - "Navigacija" : None, - "Šiber" : None, - "Naslon za ruku" : None, - "Hlađenje sjedišta" : None, - "Grijanje sjedišta" : None, - "Memorija sjedišta" : None, - "Alu felge" : None, - "Centralna brava" : None, - "Oldtimer" : None, - "ISOFIX" : None, - "Datum" : None, - "Vrijeme" : None - } - - # Number of all items - broj_el = 0 - - ## Getting all id's of articles - for i in range(0, len(results_all_items_per_page)): - if(results_all_items_per_page[i].find('p')): - # Divide id from rest of link - address_content = results_all_items_per_page[i].find('a')['href'] - temp = address_content.split('/') - artikal_number = temp[4] - olx_id.append(artikal_number) - broj_el = broj_el + 1 - - for i in range(0, broj_el): - - # New dictionary instance for every item - podaci = filters.copy() - - # Add kategorija - if (category_of_vehicle == 18): podaci['Kategorija'] = ('Automobili') - - # Artikal olx_link - artikal_link = 'https://www.olx.ba/artikal/' + olx_id[i] - podaci["Olx_id"] = olx_id[i] - response_item = requests.get(artikal_link, headers=headers) - soup_item = BeautifulSoup(response_item.content, 'html.parser') - result_item = soup_item.find('div',{'class':'artikal_lijevo'}) - # print(artikal_link) - - - # Getting filters info from item - - # Osnovni filteri - - # Cijena - if (result_item.find('div',{'id':'pc'})): - x_cijena = result_item.find('div',{'id':'pc'}).findAll('p') - item_cijena = x_cijena[1].get_text().split()[0] - if(item_cijena == 'Po'): - item_cijena = "Po dogovoru" - podaci['Cijena'] = item_cijena - # print(podaci['Cijena']) - - # Lokacija - #kanton - if (result_item.find('div',{'class':'mobile-lokacija'})): - x_lokacija = result_item.find('div',{'class':'mobile-lokacija'})['data-content'].split() - item_kanton = x_lokacija[0].replace(',','') - podaci['Lokacija_kanton'] = item_kanton - # print(podaci['Lokacija_kanton']) - - #grad - x_lokacija.pop(0) - item_grad = x_lokacija - mojstring = ' '.join(item_grad) - podaci['Lokacija_grad'] = mojstring - # print(podaci['Lokacija_grad']) - - # Stanje - if (result_item.find('div',{'class':'mobile-stanje'})): - x_stanje = result_item.find('div',{'class':'mobile-stanje'}).get_text().split() - item_stanje = x_stanje[1] - podaci['Stanje'] = item_stanje - # print(podaci['Stanje']) - - # Ispod divs - if (result_item.find_all('div',{'class':'ispod'})): - ispod_divs = result_item.find_all('div',{'class':'ispod'}) - for i in range (len(ispod_divs)): - - # Proizvodjac - if (i==0): - x_proizvodjac_p = ispod_divs[0].find_all('p') - x_proizvodjac = x_proizvodjac_p[1].get_text() - podaci['Proizvođač'] = x_proizvodjac - # print(podaci['Proizvođač']) - - # Model - if (i==1): - x_model_p = ispod_divs[1].find_all('p') - x_model = x_model_p[1].get_text() - podaci['Model'] = x_model - # print(podaci['Model']) - - # Godiste - if (i==2): - x_godiste_p = ispod_divs[2].find_all('p') - x_godiste = x_godiste_p[1].get_text() - podaci['Godište'] = x_godiste - # print(podaci['Godište']) - - # Kilometraza - if (i==3): - x_kilometraza_p = ispod_divs[3].find_all('p') - x_kilometraza = x_kilometraza_p[1].get_text() - podaci['Kilometraža'] = x_kilometraza - # print(podaci['Kilometraža']) - - # Gorivo - if (i==4): - x_gorivo_p = ispod_divs[4].find_all('p') - x_gorivo = x_gorivo_p[1].get_text() - podaci['Gorivo'] = x_gorivo - # print(podaci['Gorivo']) - - - # Napredni filteri - - # Dodatna polja - if (result_item.find_all('div',{'id':'dodatnapolja1'})): - dodatnapolja_all_divs = result_item.find_all('div',{'id':'dodatnapolja1'}) - for i in range (0,len(dodatnapolja_all_divs)): - df_pom = dodatnapolja_all_divs[i].find_all('div',{'class','df'}) - for j in range (0,len(df_pom)): - df_pom1 = df_pom[j].find('div',{'class','df1'}).get_text() - if (df_pom[j].find('div',{'class','df2'}).find('i')): - df_pom2 = True - else : df_pom2 = df_pom[j].find('div',{'class','df2'}).get_text() - podaci[df_pom1] = df_pom2 - - # KW single - kw = podaci['Kilovata (KW)'].split()[0] - podaci['Kilovata (KW)'] = kw - # print(kw) - - - - # Vrijeme i datum - if (result_item.find('div', {'class' : 'ob'})): - date_time_div = result_item.find('div', {'class' : 'ob'}).attrs - datum_vrijeme = date_time_div["data-content"].split() - datum = datum_vrijeme[0] - vrijeme = datum_vrijeme[2] - podaci["Datum"] = datum - podaci["Vrijeme"] = vrijeme - # print(podaci["Datum"], podaci["Vrijeme"]) - - - - - # Insert datas to database - dictionary_copy = podaci.copy() - podaci_db.append(dictionary_copy) - - - - -# ------------- CREATE PANDAS DATAFRAME - DICTIONARY -------------- - -olx_db = pd.DataFrame(podaci_db) # treba biti niz -# print(olx_db) - -olx_db.to_excel('proba231112.xlsx',index=False) - -print("Zavrseno!!") - - - - - - - - - - - - - - - - - - diff --git a/kivi_cars/cars/crawler.py b/kivi_cars/cars/crawler.py new file mode 100644 index 0000000..180db20 --- /dev/null +++ b/kivi_cars/cars/crawler.py @@ -0,0 +1,327 @@ +# ----------Imports------------ +from traceback import print_tb +from unittest import result +from urllib import response +from urllib.request import Request +from bs4 import BeautifulSoup +from matplotlib import dates +from numpy import diag_indices +import requests +import pandas as pd +import random +import datetime + + + +# Define function crawler + +def CarsCrawler(number_of_pages): + + print("Crawler krola!") + + # List of User-Agent + user_agent_list = [ + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36', + 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_4_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Mobile/15E148 Safari/604.1', + 'Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36 Edg/87.0.664.75', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18363', + ] + + user_agent = user_agent_list[random.randint(0, len(user_agent_list)-1)] + headers = {'User-Agent': user_agent} + + # Array of object filteri + + podaci_db = [] + + # Pagination cross webpages + # n is number of pages to crawl + pages_number_to_crawl = number_of_pages + for i in range(1,pages_number_to_crawl): + # if kategorija=18 - Automobili + main_website = 'https://www.olx.ba/pretraga?id=18&kategorija=18&stanje=0&vrstapregleda=tabela&sort_order=desc&sort_po=datum&kilometra-a_min=0&kilometra-a_max=0&stranica=' + str(i) + category_of_vehicle = 18 + + # Request to website + response_for_page = requests.get(main_website, headers=headers) + + # Soup object + soup_page = BeautifulSoup(response_for_page.content, 'html.parser') + + # Results + results_all_items_per_page = soup_page.find_all('div',{'class':'listitem'}) + + # List of olx id + olx_id = [] + + # All filters + filters = { + "Olx_id" : None, + "Kategorija" : None, + "Cijena" : None, + "Stanje" : None, + "Lokacija_kanton" : None, + "Lokacija_grad" : None, + "Proizvođač" : None, + "Model" : None, + "Godište" : None, + "Kilometraža" : None, + "Kilovata (KW)" : None, + "Kubikaža" : None, + "Gorivo" : None, + "Broj vrata" : None, + "Konjskih snaga" : None, + "Metalik" : None, + "Masa/Težina (kg)" : None, + "Tip" : None, + "Pogon" : None, + "Emisioni standard" : None, + "Veličina felgi" : None, + "Transmisija" : None, + "Broj stepeni prijenosa" : None, + "Boja" : None, + "Muzika / ozvučenje" : None, + "Parking senzori" : None, + "Parking kamera" : None, + "Registrovan do" : None, + "Godina prve registracije" : None, + "Broj prethodnih vlasnika" : None, + "Posjeduje gume" : None, + "Višezonska klima" : None, + "Rolo zavjese" : None, + "Svjetla" : None, + "Zaštita/Blokada" : None, + "Sjedećih mjesta" : None, + "Turbo" : None, + "DPF/FAP filter" : None, + "Strane tablice" : None, + "Ocarinjen" : None, + "Prilagođen invalidima" : None, + "Servo volan" : None, + "Tempomat" : None, + "ESP" : None, + "El. podizači stakala" : None, + "Senzor mrtvog ugla" : None, + "Digitalna klima" : None, + "Touch screen (ekran)" : None, + "Panorama krov" : None, + "Koža" : None, + "Masaža sjedišta" : None, + "El. pomjeranje sjedišta" : None, + "Senzor auto. svjetla" : None, + "Alarm" : None, + "Daljinsko otključavanje" : None, + "Auto kuka" : None, + "Udaren" : None, + "Start-Stop sistem" : None, + "Park assist" : None, + "Registrovan" : None, + "Na lizingu" : None, + "Servisna knjiga" : None, + "Komande na volanu" : None, + "ABS" : None, + "Airbag" : None, + "Električni retrovizori" : None, + "Klima" : None, + "Navigacija" : None, + "Šiber" : None, + "Naslon za ruku" : None, + "Hlađenje sjedišta" : None, + "Grijanje sjedišta" : None, + "Memorija sjedišta" : None, + "Alu felge" : None, + "Centralna brava" : None, + "Oldtimer" : None, + "ISOFIX" : None, + "Datum" : None, + "Vrijeme" : None + } + + + + # Number of all items + broj_el = 0 + + ## Getting all id's of articles + for i in range(0, len(results_all_items_per_page)): + if(results_all_items_per_page[i].find('p')): + # Divide id from rest of link + address_content = results_all_items_per_page[i].find('a')['href'] + temp = address_content.split('/') + artikal_number = temp[4] + olx_id.append(artikal_number) + broj_el = broj_el + 1 + + for i in range(0, broj_el): + + # New dictionary instance for every item + podaci = filters.copy() + + # Add kategorija + if (category_of_vehicle == 18): podaci['Kategorija'] = ('Automobili') + + # Artikal olx_link + artikal_link = 'https://www.olx.ba/artikal/' + olx_id[i] + podaci["Olx_id"] = olx_id[i] + response_item = requests.get(artikal_link, headers=headers) + soup_item = BeautifulSoup(response_item.content, 'html.parser') + result_item = soup_item.find('div',{'class':'artikal_lijevo'}) + # print(artikal_link) + + + # Getting filters info from item + + # Osnovni filteri + + # Cijena + if (result_item.find('div',{'id':'pc'})): + x_cijena = result_item.find('div',{'id':'pc'}).findAll('p') + item_cijena = x_cijena[1].get_text().split()[0] + if(item_cijena == 'Po'): + item_cijena = "Po dogovoru" + podaci['Cijena'] = item_cijena + # print(podaci['Cijena']) + + # Lokacija + #kanton + if (result_item.find('div',{'class':'mobile-lokacija'})): + x_lokacija = result_item.find('div',{'class':'mobile-lokacija'})['data-content'].split() + item_kanton = x_lokacija[0].replace(',','') + podaci['Lokacija_kanton'] = item_kanton + # print(podaci['Lokacija_kanton']) + + #grad + x_lokacija.pop(0) + item_grad = x_lokacija + mojstring = ' '.join(item_grad) + podaci['Lokacija_grad'] = mojstring + # print(podaci['Lokacija_grad']) + + # Stanje + if (result_item.find('div',{'class':'mobile-stanje'})): + x_stanje = result_item.find('div',{'class':'mobile-stanje'}).get_text().split() + item_stanje = x_stanje[1] + podaci['Stanje'] = item_stanje + # print(podaci['Stanje']) + + # Ispod divs + if (result_item.find_all('div',{'class':'ispod'})): + ispod_divs = result_item.find_all('div',{'class':'ispod'}) + for i in range (len(ispod_divs)): + + # Proizvodjac + if (i==0): + x_proizvodjac_p = ispod_divs[0].find_all('p') + x_proizvodjac = x_proizvodjac_p[1].get_text() + podaci['Proizvođač'] = x_proizvodjac + # print(podaci['Proizvođač']) + + # Model + if (i==1): + x_model_p = ispod_divs[1].find_all('p') + x_model = x_model_p[1].get_text() + podaci['Model'] = x_model + # print(podaci['Model']) + + # Godiste + if (i==2): + x_godiste_p = ispod_divs[2].find_all('p') + x_godiste = x_godiste_p[1].get_text() + podaci['Godište'] = x_godiste + # print(podaci['Godište']) + + # Kilometraza + if (i==3): + x_kilometraza_p = ispod_divs[3].find_all('p') + x_kilometraza = x_kilometraza_p[1].get_text() + podaci['Kilometraža'] = x_kilometraza + # print(podaci['Kilometraža']) + + # Gorivo + if (i==4): + x_gorivo_p = ispod_divs[4].find_all('p') + x_gorivo = x_gorivo_p[1].get_text() + podaci['Gorivo'] = x_gorivo + # print(podaci['Gorivo']) + + + # Napredni filteri + + # Dodatna polja + if (result_item.find_all('div',{'id':'dodatnapolja1'})): + dodatnapolja_all_divs = result_item.find_all('div',{'id':'dodatnapolja1'}) + for i in range (0,len(dodatnapolja_all_divs)): + if(dodatnapolja_all_divs[i].find_all('div',{'class','df'})): + df_pom = dodatnapolja_all_divs[i].find_all('div',{'class','df'}) + for j in range (0,len(df_pom)): + df_pom1 = df_pom[j].find('div',{'class','df1'}).get_text() + if (df_pom[j].find('div',{'class','df2'}).find('i')): + df_pom2 = True + else : df_pom2 = df_pom[j].find('div',{'class','df2'}).get_text() + podaci[df_pom1] = df_pom2 + + # KW single + if podaci['Kilovata (KW)']: + kw = podaci['Kilovata (KW)'].split()[0] + podaci['Kilovata (KW)'] = kw + # print(kw) + + # Datum objave + if (result_item.find('time', {'class' : 'entry-date'})): + date_objave_div = result_item.find('time', {'class' : 'entry-date'}).get_text().split() + datum_objave = date_objave_div[0] + datum_objave = datum_objave.split('.') + datum_objave = datum_objave[2] + "-" + datum_objave[1] + "-" + datum_objave[0] + # print(datum_objave) + + + # Datum obnove + if (result_item.find('div', {'class' : 'ob'})): + datum_obnove_div = result_item.find('div', {'class' : 'ob'}).attrs + datum_vrijeme = datum_obnove_div["data-content"].split('.') + datum = datum_vrijeme[2] + "-" + datum_vrijeme[1] + "-" + datum_vrijeme[0] + if datum == 'None': + podaci["Datum"] = datum_objave + else: + # print(datum) + podaci["Datum"] = datum + # podaci["Vrijeme"] = vrijeme + + + + + # Insert datas to database + dictionary_copy = podaci.copy() + podaci_db.append(dictionary_copy) + + print("Zavrseno!") + return podaci_db + + + + +# ------------- CREATE PANDAS DATAFRAME - DICTIONARY -------------- + +# olx_db = pd.DataFrame(podaci_db) # treba biti niz +# # print(olx_db) + +# olx_db.to_excel('proba231112.xlsx',index=False) + + + + + + + + + + + + + + + + + + diff --git a/kivi_cars/cars/migrations/0001_initial.py b/kivi_cars/cars/migrations/0001_initial.py index 6e75642..2fd4929 100644 --- a/kivi_cars/cars/migrations/0001_initial.py +++ b/kivi_cars/cars/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.0.4 on 2022-05-16 04:55 +# Generated by Django 4.0.4 on 2022-05-28 05:43 from django.db import migrations, models @@ -15,85 +15,84 @@ class Migration(migrations.Migration): name='Car', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('Olx_id', models.CharField(max_length=10)), - ('Kategorija', models.CharField(max_length=30)), - ('Cijena', models.CharField(max_length=30)), - ('Stanje', models.CharField(max_length=30)), - ('Lokacija_kanton', models.CharField(max_length=50)), - ('Lokacija_grad', models.CharField(max_length=50)), - ('Proizvođač', models.CharField(max_length=30)), - ('Model', models.CharField(max_length=30)), - ('Godište', models.CharField(max_length=30)), - ('Kilometraža', models.CharField(max_length=30)), - ('Kilovata_KW', models.CharField(max_length=30)), - ('Kubikaža', models.CharField(max_length=30)), - ('Gorivo', models.CharField(max_length=30)), - ('Broj_vrata', models.CharField(max_length=30)), - ('Konjskih_snaga', models.CharField(max_length=30)), - ('Metalik', models.CharField(max_length=30)), - ('Masa_Težina_kg', models.CharField(max_length=30)), - ('Tip', models.CharField(max_length=30)), - ('Pogon', models.CharField(max_length=30)), - ('Emisioni_standard', models.CharField(max_length=30)), - ('Veličina_felgi', models.CharField(max_length=30)), - ('Transmisija', models.CharField(max_length=30)), - ('Broj_stepeni_prijenosa', models.CharField(max_length=30)), - ('Boja', models.CharField(max_length=30)), - ('Muzika_ozvučenje', models.CharField(max_length=30)), - ('Parking_senzori', models.CharField(max_length=30)), - ('Parking_kamera', models.CharField(max_length=30)), - ('Registrovan_do', models.CharField(max_length=30)), - ('Godina_prve_registracije', models.CharField(max_length=30)), - ('Broj_prethodnih_vlasnik', models.CharField(max_length=30)), - ('Posjeduje_gume', models.CharField(max_length=30)), - ('Višezonska_klima', models.CharField(max_length=30)), - ('Rolo_zavjese', models.CharField(max_length=30)), - ('Svjetla', models.CharField(max_length=30)), - ('Zaštita_Blokada', models.CharField(max_length=30)), - ('Sjedećih_mjesta', models.CharField(max_length=30)), - ('Turbo', models.CharField(max_length=30)), - ('DPF_FAP_filter', models.CharField(max_length=30)), - ('Strane_tablice', models.CharField(max_length=30)), - ('Ocarinjen', models.CharField(max_length=30)), - ('Prilagođen_invalidima', models.CharField(max_length=30)), - ('Servo_volan', models.CharField(max_length=30)), - ('Tempomat', models.CharField(max_length=30)), - ('ESP', models.CharField(max_length=30)), - ('El_podizači_stakala', models.CharField(max_length=30)), - ('Senzor_mrtvog_ugla', models.CharField(max_length=30)), - ('Digitalna_klima', models.CharField(max_length=30)), - ('Touch_screen_ekran', models.CharField(max_length=30)), - ('Panorama_krov', models.CharField(max_length=30)), - ('Koža', models.CharField(max_length=30)), - ('Masaža_sjedišta', models.CharField(max_length=30)), - ('El_pomjeranje_sjedišta', models.CharField(max_length=30)), - ('Senzor_auto_svjetla', models.CharField(max_length=30)), - ('Alarm', models.CharField(max_length=30)), - ('Daljinsko_otključavanje', models.CharField(max_length=30)), - ('Auto_kuka', models.CharField(max_length=30)), - ('Udaren', models.CharField(max_length=30)), - ('Start_Stop_sistem', models.CharField(max_length=30)), - ('Park_assist', models.CharField(max_length=30)), - ('Registrovan', models.CharField(max_length=30)), - ('Na_lizingu', models.CharField(max_length=30)), - ('Servisna_knjiga', models.CharField(max_length=30)), - ('Komande_na_volanu', models.CharField(max_length=30)), - ('ABS', models.CharField(max_length=30)), - ('Airbag', models.CharField(max_length=30)), - ('Električni_retrovizori', models.CharField(max_length=30)), - ('Klima', models.CharField(max_length=30)), - ('Navigacija', models.CharField(max_length=30)), - ('Šiber', models.CharField(max_length=30)), - ('Naslon_za_ruku', models.CharField(max_length=30)), - ('Hlađenje_sjedišta', models.CharField(max_length=30)), - ('Grijanje_sjedišta', models.CharField(max_length=30)), - ('Memorija_sjedišta', models.CharField(max_length=30)), - ('Alu_felge', models.CharField(max_length=30)), - ('Centralna_brava', models.CharField(max_length=30)), - ('Oldtimer', models.CharField(max_length=30)), - ('ISOFIX', models.CharField(max_length=30)), - ('Datum', models.DateField()), - ('Vrijeme', models.TimeField()), + ('Olx_id', models.CharField(max_length=10, null=True)), + ('Kategorija', models.CharField(max_length=30, null=True)), + ('Cijena', models.CharField(max_length=30, null=True)), + ('Stanje', models.CharField(max_length=30, null=True)), + ('Lokacija_kanton', models.CharField(max_length=50, null=True)), + ('Lokacija_grad', models.CharField(max_length=50, null=True)), + ('Proizvođač', models.CharField(max_length=30, null=True)), + ('Model', models.CharField(max_length=30, null=True)), + ('Godište', models.CharField(max_length=30, null=True)), + ('Kilometraža', models.CharField(max_length=30, null=True)), + ('Kilovata_KW', models.CharField(max_length=30, null=True)), + ('Kubikaža', models.CharField(max_length=30, null=True)), + ('Gorivo', models.CharField(max_length=30, null=True)), + ('Broj_vrata', models.CharField(max_length=30, null=True)), + ('Konjskih_snaga', models.CharField(max_length=30, null=True)), + ('Metalik', models.CharField(max_length=30, null=True)), + ('Masa_Težina_kg', models.CharField(max_length=30, null=True)), + ('Tip', models.CharField(max_length=30, null=True)), + ('Pogon', models.CharField(max_length=30, null=True)), + ('Emisioni_standard', models.CharField(max_length=30, null=True)), + ('Veličina_felgi', models.CharField(max_length=30, null=True)), + ('Transmisija', models.CharField(max_length=30, null=True)), + ('Broj_stepeni_prijenosa', models.CharField(max_length=30, null=True)), + ('Boja', models.CharField(max_length=30, null=True)), + ('Muzika_ozvučenje', models.CharField(max_length=30, null=True)), + ('Parking_senzori', models.CharField(max_length=30, null=True)), + ('Parking_kamera', models.CharField(max_length=30, null=True)), + ('Registrovan_do', models.CharField(max_length=30, null=True)), + ('Godina_prve_registracije', models.CharField(max_length=30, null=True)), + ('Broj_prethodnih_vlasnika', models.CharField(max_length=30, null=True)), + ('Posjeduje_gume', models.CharField(max_length=30, null=True)), + ('Višezonska_klima', models.CharField(max_length=30, null=True)), + ('Rolo_zavjese', models.CharField(max_length=30, null=True)), + ('Svjetla', models.CharField(max_length=30, null=True)), + ('Zaštita_Blokada', models.CharField(max_length=30, null=True)), + ('Sjedećih_mjesta', models.CharField(max_length=30, null=True)), + ('Turbo', models.CharField(max_length=30, null=True)), + ('DPF_FAP_filter', models.CharField(max_length=30, null=True)), + ('Strane_tablice', models.CharField(max_length=30, null=True)), + ('Ocarinjen', models.CharField(max_length=30, null=True)), + ('Prilagođen_invalidima', models.CharField(max_length=30, null=True)), + ('Servo_volan', models.CharField(max_length=30, null=True)), + ('Tempomat', models.CharField(max_length=30, null=True)), + ('ESP', models.CharField(max_length=30, null=True)), + ('El_podizači_stakala', models.CharField(max_length=30, null=True)), + ('Senzor_mrtvog_ugla', models.CharField(max_length=30, null=True)), + ('Digitalna_klima', models.CharField(max_length=30, null=True)), + ('Touch_screen_ekran', models.CharField(max_length=30, null=True)), + ('Panorama_krov', models.CharField(max_length=30, null=True)), + ('Koža', models.CharField(max_length=30, null=True)), + ('Masaža_sjedišta', models.CharField(max_length=30, null=True)), + ('El_pomjeranje_sjedišta', models.CharField(max_length=30, null=True)), + ('Senzor_auto_svjetla', models.CharField(max_length=30, null=True)), + ('Alarm', models.CharField(max_length=30, null=True)), + ('Daljinsko_otključavanje', models.CharField(max_length=30, null=True)), + ('Auto_kuka', models.CharField(max_length=30, null=True)), + ('Udaren', models.CharField(max_length=30, null=True)), + ('Start_Stop_sistem', models.CharField(max_length=30, null=True)), + ('Park_assist', models.CharField(max_length=30, null=True)), + ('Registrovan', models.CharField(max_length=30, null=True)), + ('Na_lizingu', models.CharField(max_length=30, null=True)), + ('Servisna_knjiga', models.CharField(max_length=30, null=True)), + ('Komande_na_volanu', models.CharField(max_length=30, null=True)), + ('ABS', models.CharField(max_length=30, null=True)), + ('Airbag', models.CharField(max_length=30, null=True)), + ('Električni_retrovizori', models.CharField(max_length=30, null=True)), + ('Klima', models.CharField(max_length=30, null=True)), + ('Navigacija', models.CharField(max_length=30, null=True)), + ('Šiber', models.CharField(max_length=30, null=True)), + ('Naslon_za_ruku', models.CharField(max_length=30, null=True)), + ('Hlađenje_sjedišta', models.CharField(max_length=30, null=True)), + ('Grijanje_sjedišta', models.CharField(max_length=30, null=True)), + ('Memorija_sjedišta', models.CharField(max_length=30, null=True)), + ('Alu_felge', models.CharField(max_length=30, null=True)), + ('Centralna_brava', models.CharField(max_length=30, null=True)), + ('Oldtimer', models.CharField(max_length=30, null=True)), + ('ISOFIX', models.CharField(max_length=30, null=True)), + ('Datum', models.CharField(max_length=15, null=True)), ], ), ] diff --git a/kivi_cars/cars/models.py b/kivi_cars/cars/models.py index d1b3735..5df52ed 100644 --- a/kivi_cars/cars/models.py +++ b/kivi_cars/cars/models.py @@ -2,83 +2,86 @@ from django.db import models # Create your models here. -class Car (models.Model): - Olx_id = models.CharField(max_length=10) - Kategorija = models.CharField(max_length=30) - Cijena = models.CharField(max_length=30) - Stanje = models.CharField(max_length=30) - Lokacija_kanton = models.CharField(max_length=50) - Lokacija_grad = models.CharField(max_length=50) - Proizvođač = models.CharField(max_length=30) - Model = models.CharField(max_length=30) - Godište = models.CharField(max_length=30) - Kilometraža = models.CharField(max_length=30) - Kilovata_KW = models.CharField(max_length=30) - Kubikaža = models.CharField(max_length=30) - Gorivo = models.CharField(max_length=30) - Broj_vrata = models.CharField(max_length=30) - Konjskih_snaga = models.CharField(max_length=30) - Metalik = models.CharField(max_length=30) - Masa_Težina_kg = models.CharField(max_length=30) - Tip = models.CharField(max_length=30) - Pogon = models.CharField(max_length=30) - Emisioni_standard = models.CharField(max_length=30) - Veličina_felgi = models.CharField(max_length=30) - Transmisija = models.CharField(max_length=30) - Broj_stepeni_prijenosa = models.CharField(max_length=30) - Boja = models.CharField(max_length=30) - Muzika_ozvučenje = models.CharField(max_length=30) - Parking_senzori= models.CharField(max_length=30) - Parking_kamera = models.CharField(max_length=30) - Registrovan_do = models.CharField(max_length=30) - Godina_prve_registracije = models.CharField(max_length=30) - Broj_prethodnih_vlasnik = models.CharField(max_length=30) - Posjeduje_gume = models.CharField(max_length=30) - Višezonska_klima = models.CharField(max_length=30) - Rolo_zavjese = models.CharField(max_length=30) - Svjetla = models.CharField(max_length=30) - Zaštita_Blokada = models.CharField(max_length=30) - Sjedećih_mjesta = models.CharField(max_length=30) - Turbo = models.CharField(max_length=30) - DPF_FAP_filter = models.CharField(max_length=30) - Strane_tablice = models.CharField(max_length=30) - Ocarinjen = models.CharField(max_length=30) - Prilagođen_invalidima = models.CharField(max_length=30) - Servo_volan = models.CharField(max_length=30) - Tempomat = models.CharField(max_length=30) - ESP = models.CharField(max_length=30) - El_podizači_stakala = models.CharField(max_length=30) - Senzor_mrtvog_ugla = models.CharField(max_length=30) - Digitalna_klima = models.CharField(max_length=30) - Touch_screen_ekran = models.CharField(max_length=30) - Panorama_krov = models.CharField(max_length=30) - Koža = models.CharField(max_length=30) - Masaža_sjedišta = models.CharField(max_length=30) - El_pomjeranje_sjedišta= models.CharField(max_length=30) - Senzor_auto_svjetla = models.CharField(max_length=30) - Alarm = models.CharField(max_length=30) - Daljinsko_otključavanje = models.CharField(max_length=30) - Auto_kuka = models.CharField(max_length=30) - Udaren = models.CharField(max_length=30) - Start_Stop_sistem = models.CharField(max_length=30) - Park_assist = models.CharField(max_length=30) - Registrovan = models.CharField(max_length=30) - Na_lizingu = models.CharField(max_length=30) - Servisna_knjiga = models.CharField(max_length=30) - Komande_na_volanu = models.CharField(max_length=30) - ABS = models.CharField(max_length=30) - Airbag = models.CharField(max_length=30) - Električni_retrovizori = models.CharField(max_length=30) - Klima = models.CharField(max_length=30) - Navigacija = models.CharField(max_length=30) - Šiber= models.CharField(max_length=30) - Naslon_za_ruku= models.CharField(max_length=30) - Hlađenje_sjedišta = models.CharField(max_length=30) - Grijanje_sjedišta = models.CharField(max_length=30) - Memorija_sjedišta = models.CharField(max_length=30) - Alu_felge = models.CharField(max_length=30) - Centralna_brava = models.CharField(max_length=30) - Oldtimer = models.CharField(max_length=30) - ISOFIX = models.CharField(max_length=30) - Datum = models.DateField() - Vrijeme = models.TimeField() \ No newline at end of file +class Car(models.Model): + Olx_id = models.CharField(max_length=10, null=True) + Kategorija = models.CharField(max_length=30, null=True) + Cijena = models.CharField(max_length=30, null=True) + Stanje = models.CharField(max_length=30, null=True) + Lokacija_kanton = models.CharField(max_length=50, null=True) + Lokacija_grad = models.CharField(max_length=50, null=True) + Proizvođač = models.CharField(max_length=30, null=True) + Model = models.CharField(max_length=30, null=True) + Godište = models.CharField(max_length=30, null=True) + Kilometraža = models.CharField(max_length=30, null=True) + Kilovata_KW = models.CharField(max_length=30, null=True) + Kubikaža = models.CharField(max_length=30, null=True) + Gorivo = models.CharField(max_length=30, null=True) + Broj_vrata = models.CharField(max_length=30, null=True) + Konjskih_snaga = models.CharField(max_length=30, null=True) + Metalik = models.CharField(max_length=30, null=True) + Masa_Težina_kg = models.CharField(max_length=30, null=True) + Tip = models.CharField(max_length=30, null=True) + Pogon = models.CharField(max_length=30, null=True) + Emisioni_standard = models.CharField(max_length=30, null=True) + Veličina_felgi = models.CharField(max_length=30, null=True) + Transmisija = models.CharField(max_length=30, null=True) + Broj_stepeni_prijenosa = models.CharField(max_length=30, null=True) + Boja = models.CharField(max_length=30, null=True) + Muzika_ozvučenje = models.CharField(max_length=30, null=True) + Parking_senzori= models.CharField(max_length=30, null=True) + Parking_kamera = models.CharField(max_length=30, null=True) + Registrovan_do = models.CharField(max_length=30, null=True) + Godina_prve_registracije = models.CharField(max_length=30, null=True) + Broj_prethodnih_vlasnika = models.CharField(max_length=30, null=True) + Posjeduje_gume = models.CharField(max_length=30, null=True) + Višezonska_klima = models.CharField(max_length=30, null=True) + Rolo_zavjese = models.CharField(max_length=30, null=True) + Svjetla = models.CharField(max_length=30, null=True) + Zaštita_Blokada = models.CharField(max_length=30, null=True) + Sjedećih_mjesta = models.CharField(max_length=30, null=True) + Turbo = models.CharField(max_length=30, null=True) + DPF_FAP_filter = models.CharField(max_length=30, null=True) + Strane_tablice = models.CharField(max_length=30, null=True) + Ocarinjen = models.CharField(max_length=30, null=True) + Prilagođen_invalidima = models.CharField(max_length=30, null=True) + Servo_volan = models.CharField(max_length=30, null=True) + Tempomat = models.CharField(max_length=30, null=True) + ESP = models.CharField(max_length=30, null=True) + El_podizači_stakala = models.CharField(max_length=30, null=True) + Senzor_mrtvog_ugla = models.CharField(max_length=30, null=True) + Digitalna_klima = models.CharField(max_length=30, null=True) + Touch_screen_ekran = models.CharField(max_length=30, null=True) + Panorama_krov = models.CharField(max_length=30, null=True) + Koža = models.CharField(max_length=30, null=True) + Masaža_sjedišta = models.CharField(max_length=30, null=True) + El_pomjeranje_sjedišta= models.CharField(max_length=30, null=True) + Senzor_auto_svjetla = models.CharField(max_length=30, null=True) + Alarm = models.CharField(max_length=30, null=True) + Daljinsko_otključavanje = models.CharField(max_length=30, null=True) + Auto_kuka = models.CharField(max_length=30, null=True) + Udaren = models.CharField(max_length=30, null=True) + Start_Stop_sistem = models.CharField(max_length=30, null=True) + Park_assist = models.CharField(max_length=30, null=True) + Registrovan = models.CharField(max_length=30, null=True) + Na_lizingu = models.CharField(max_length=30, null=True) + Servisna_knjiga = models.CharField(max_length=30, null=True) + Komande_na_volanu = models.CharField(max_length=30, null=True) + ABS = models.CharField(max_length=30, null=True) + Airbag = models.CharField(max_length=30, null=True) + Električni_retrovizori = models.CharField(max_length=30, null=True) + Klima = models.CharField(max_length=30, null=True) + Navigacija = models.CharField(max_length=30, null=True) + Šiber= models.CharField(max_length=30, null=True) + Naslon_za_ruku= models.CharField(max_length=30, null=True) + Hlađenje_sjedišta = models.CharField(max_length=30, null=True) + Grijanje_sjedišta = models.CharField(max_length=30, null=True) + Memorija_sjedišta = models.CharField(max_length=30, null=True) + Alu_felge = models.CharField(max_length=30, null=True) + Centralna_brava = models.CharField(max_length=30, null=True) + Oldtimer = models.CharField(max_length=30, null=True) + ISOFIX = models.CharField(max_length=30, null=True) + Datum = models.CharField(max_length=15, null=True) + # Vrijeme = models.CharField(max_length=20, blank=True) + + def __str__(self): + return (self.Olx_id) \ No newline at end of file diff --git a/kivi_cars/cars/saver.py b/kivi_cars/cars/saver.py new file mode 100644 index 0000000..f27ef2b --- /dev/null +++ b/kivi_cars/cars/saver.py @@ -0,0 +1,197 @@ +import time +from cars.crawler import CarsCrawler +from cars.models import Car + +#if num_of_crawl is 0 --> first start --> crawl all pages +#if num_of_crawl is 1 --> second and others --> crawl just 2 pages + +num_of_crawl = 0 + + + +while True: + def Saver(): + print("_________________________________") + global num_of_crawl + if num_of_crawl == 0: + cars = CarsCrawler(5) + num_of_crawl += 1 + else: + cars = CarsCrawler(2) + + # print(len(cars)) + for car in cars: + print(car["Datum"], car["Olx_id"]) + if Car.objects.all().filter(Olx_id = car["Olx_id"], Datum = car["Datum"]).exists(): + print("Artikal postoji") + continue + + try: + auto = Car.objects.get(Olx_id = car["Olx_id"]) + auto.Kategorija = car["Kategorija"] + auto.Cijena = car["Cijena"] + auto.Stanje = car["Stanje"] + auto.Lokacija_kanton = car["Lokacija_kanton"] + auto.Lokacija_grad = car["Lokacija_grad"] + auto.Proizvođač = car["Proizvođač"] + auto.Model = car["Model"] + auto.Godište = car["Godište"] + auto.Kilometraža = car["Kilometraža"] + auto.Kilovata_KW = car["Kilovata (KW)"] + auto.Kubikaža = car["Kubikaža"] + auto.Gorivo = car["Gorivo"] + auto.Broj_vrata = car["Broj vrata"] + auto.Konjskih_snaga = car["Konjskih snaga"] + auto.Metalik = car["Metalik"] + auto.Masa_Težina_kg = car["Masa/Težina (kg)"] + auto.Tip = car["Tip"] + auto.Pogon = car["Pogon"] + auto.Emisioni_standard = car["Emisioni standard"] + auto.Veličina_felgi = car["Veličina felgi"] + auto.Transmisija = car["Transmisija"] + auto.Broj_stepeni_prijenosa = car["Broj stepeni prijenosa"] + auto.Boja = car["Boja"] + auto.Muzika_ozvučenje = car["Muzika / ozvučenje"] + auto.Parking_senzori = car["Parking senzori"] + auto.Parking_kamera = car["Parking kamera"] + auto.Registrovan_do = car["Registrovan do"] + auto.Godina_prve_registracije = car["Godina prve registracije"] + auto.Broj_prethodnih_vlasnika = car["Broj prethodnih vlasnika"] + auto.Posjeduje_gume = car["Posjeduje gume"] + auto.Višezonska_klima = car["Višezonska klima"] + auto.Rolo_zavjese = car["Rolo zavjese"] + auto.Svjetla = car["Svjetla"] + auto.Zaštita_Blokada = car["Zaštita/Blokada"] + auto.Sjedećih_mjesta = car["Sjedećih mjesta"] + auto.Turbo = car["Turbo"] + auto.DPF_FAP_filter = car["DPF/FAP filter"] + auto.Strane_tablice = car["Strane tablice"] + auto.Ocarinjen = car["Ocarinjen"] + auto.Prilagođen_invalidima = car["Prilagođen invalidima"] + auto.Servo_volan = car["Servo volan"] + auto.Tempomat = car["Tempomat"] + auto.ESP = car["ESP"] + auto.El_podizači_stakala = car["El. podizači stakala"] + auto.Senzor_mrtvog_ugla = car["Senzor mrtvog ugla"] + auto.Digitalna_klima = car["Digitalna klima"] + auto.Touch_screen_ekran = car["Touch screen (ekran)"] + auto.Panorama_krov = car["Panorama krov"] + auto.Koža = car["Koža"] + auto.Masaža_sjedišta = car["Masaža sjedišta"] + auto.El_pomjeranje_sjedišta= car["El. pomjeranje sjedišta"] + auto.Senzor_auto_svjetla = car["Senzor auto. svjetla"] + auto.Alarm = car["Alarm"] + auto.Daljinsko_otključavanje = car["Daljinsko otključavanje"] + auto.Auto_kuka = car["Auto kuka"] + auto.Udaren = car["Udaren"] + auto.Start_Stop_sistem = car["Start-Stop sistem"] + auto.Park_assist = car["Park assist"] + auto.Registrovan = car["Registrovan"] + auto.Na_lizingu = car["Na lizingu"] + auto.Servisna_knjiga = car["Servisna knjiga"] + auto.Komande_na_volanu = car["Komande na volanu"] + auto.ABS = car["ABS"] + auto.Airbag = car["Airbag"] + auto.Električni_retrovizori = car["Električni retrovizori"] + auto.Klima = car["Klima"] + auto.Navigacija = car["Navigacija"] + auto.Šiber = car["Šiber"] + auto.Naslon_za_ruku= car["Naslon za ruku"] + auto.Hlađenje_sjedišta = car["Hlađenje sjedišta"] + auto.Grijanje_sjedišta = car["Grijanje sjedišta"] + auto.Memorija_sjedišta = car["Memorija sjedišta"] + auto.Alu_felge = car["Alu felge"] + auto.Centralna_brava = car["Centralna brava"] + auto.Oldtimer = car["Oldtimer"] + auto.ISOFIX = car["ISOFIX"] + auto.Datum = car["Datum"] + auto.save() + print("Artikal obnovljen") + + except Car.DoesNotExist: + auto = Car.objects.create( + Olx_id = car["Olx_id"], + Kategorija = car["Kategorija"], + Cijena = car["Cijena"], + Stanje = car["Stanje"], + Lokacija_kanton = car["Lokacija_kanton"], + Lokacija_grad = car["Lokacija_grad"], + Proizvođač = car["Proizvođač"], + Model = car["Model"], + Godište = car["Godište"], + Kilometraža = car["Kilometraža"], + Kilovata_KW = car["Kilovata (KW)"], + Kubikaža = car["Kubikaža"], + Gorivo = car["Gorivo"], + Broj_vrata = car["Broj vrata"], + Konjskih_snaga = car["Konjskih snaga"], + Metalik = car["Metalik"], + Masa_Težina_kg = car["Masa/Težina (kg)"], + Tip = car["Tip"], + Pogon = car["Pogon"], + Emisioni_standard = car["Emisioni standard"], + Veličina_felgi = car["Veličina felgi"], + Transmisija = car["Transmisija"], + Broj_stepeni_prijenosa = car["Broj stepeni prijenosa"], + Boja = car["Boja"], + Muzika_ozvučenje = car["Muzika / ozvučenje"], + Parking_senzori = car["Parking senzori"], + Parking_kamera = car["Parking kamera"], + Registrovan_do = car["Registrovan do"], + Godina_prve_registracije = car["Godina prve registracije"], + Broj_prethodnih_vlasnika = car["Broj prethodnih vlasnika"], + Posjeduje_gume = car["Posjeduje gume"], + Višezonska_klima = car["Višezonska klima"], + Rolo_zavjese = car["Rolo zavjese"], + Svjetla = car["Svjetla"], + Zaštita_Blokada = car["Zaštita/Blokada"], + Sjedećih_mjesta = car["Sjedećih mjesta"], + Turbo = car["Turbo"], + DPF_FAP_filter = car["DPF/FAP filter"], + Strane_tablice = car["Strane tablice"], + Ocarinjen = car["Ocarinjen"], + Prilagođen_invalidima = car["Prilagođen invalidima"], + Servo_volan = car["Servo volan"], + Tempomat = car["Tempomat"], + ESP = car["ESP"], + El_podizači_stakala = car["El. podizači stakala"], + Senzor_mrtvog_ugla = car["Senzor mrtvog ugla"], + Digitalna_klima = car["Digitalna klima"], + Touch_screen_ekran = car["Touch screen (ekran)"], + Panorama_krov = car["Panorama krov"], + Koža = car["Koža"], + Masaža_sjedišta = car["Masaža sjedišta"], + El_pomjeranje_sjedišta= car["El. pomjeranje sjedišta"], + Senzor_auto_svjetla = car["Senzor auto. svjetla"], + Alarm = car["Alarm"], + Daljinsko_otključavanje = car["Daljinsko otključavanje"], + Auto_kuka = car["Auto kuka"], + Udaren = car["Udaren"], + Start_Stop_sistem = car["Start-Stop sistem"], + Park_assist = car["Park assist"], + Registrovan = car["Registrovan"], + Na_lizingu = car["Na lizingu"], + Servisna_knjiga = car["Servisna knjiga"], + Komande_na_volanu = car["Komande na volanu"], + ABS = car["ABS"], + Airbag = car["Airbag"], + Električni_retrovizori = car["Električni retrovizori"], + Klima = car["Klima"], + Navigacija = car["Navigacija"], + Šiber = car["Šiber"], + Naslon_za_ruku= car["Naslon za ruku"], + Hlađenje_sjedišta = car["Hlađenje sjedišta"], + Grijanje_sjedišta = car["Grijanje sjedišta"], + Memorija_sjedišta = car["Memorija sjedišta"], + Alu_felge = car["Alu felge"], + Centralna_brava = car["Centralna brava"], + Oldtimer = car["Oldtimer"], + ISOFIX = car["ISOFIX"], + Datum = car["Datum"], + # Vrijeme = car["Vrijeme"] + ) + auto.save() + print("Novi artikal je spasen") + print("___________________________") + Saver() + time.sleep(120) \ No newline at end of file diff --git a/kivi_cars/cars/views.py b/kivi_cars/cars/views.py index 91ea44a..27cdb63 100644 --- a/kivi_cars/cars/views.py +++ b/kivi_cars/cars/views.py @@ -1,3 +1,4 @@ from django.shortcuts import render # Create your views here. + diff --git a/kivi_cars/kivi_cars/settings.py b/kivi_cars/kivi_cars/settings.py index d46c43f..27ed46d 100644 --- a/kivi_cars/kivi_cars/settings.py +++ b/kivi_cars/kivi_cars/settings.py @@ -84,7 +84,7 @@ DATABASES = { 'NAME': 'kivi_cars', 'USER': 'postgres', 'HOST': 'localhost', - 'PASSWORD': 'postgres' + 'PASSWORD': 'b18' } } diff --git a/kivi_cars/kivi_cars/urls.py b/kivi_cars/kivi_cars/urls.py index e874ea1..b33eb8d 100644 --- a/kivi_cars/kivi_cars/urls.py +++ b/kivi_cars/kivi_cars/urls.py @@ -16,8 +16,10 @@ Including another URLconf from django.urls.conf import include from django.contrib import admin from django.urls import path +from cars.saver import Saver urlpatterns = [ path('admin/', admin.site.urls), path('generator/', include("Generator.urls")), ] + diff --git a/proba2.xlsx b/proba2.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2e18ccef0c3e86c1d466186a4773ada30cd4ea6d GIT binary patch literal 15401 zcmbWe1z23$vMo#qgaE-B2o52^gS!*lNpP1m?(P;6tZ|2+!Ce}6Z`>U^NN{)8*V+4? zch1he@BiQT;G5O-TB{~=6*WeUHR<{!`y2rW4i4@mTn$l$3X-rq&=2+w3>%oRVPtFg z$-&mnk?FIY9iyAIm3)K%Dm)9O*wcW0OPz3s2=K$0Qbi?(ClOPWk!YoePb*JHqz$Pp zzQi($Dcx!zIzymJi6Kvs^=WIKHjuk+4xIX@lY^(gNh%@0;?E z=n)bb4(Oz%ZVH>bU^`>#u3U0Nv?mAarNSwWBdUu8vYBH(bG=XhSng)p8POhWnS;;Z z;IRI4xrVk5#=qB_8{MJM#r!Hz-*~shIVN0MOq1!2f~W`(5Ud^NrY$xp0a9$Lqh`=X z`byM${d7OC7Kc3Hgp~orV~**n#`l_}GVjde1|T9w4Pmt?s8THuA2w}sY?$(Y7~9k( z!$dH&JeFFpm|#X3WF`u&nn>0p5CpOzmpro?Gn7SkgZvr*NMt-(CB=Lvj!7wOJu3F$ zv3GxmULFbEGQXLq0XbP#6vT5(h)qpFJep}z10_1@vUo=y>3-<0BgZH_4awJ*a0Ml|Y+(@tMAAb(H%S3qAX1WWMX9zQcS02bW3> z2Zs%djGGmclbNx#@!yu^cWe%{v>g|?aeR)-$J|UWtx!)!+RO6vzUw zG{UXijiUX1+ax(L2NTc^V&ofB_z~!L?ncBVx3;<6&kh-Z+kwGxr)~!GOwgI8I;N!+ zbyf;2VP=B-^5b@tTsgfOEpxaoZts3Btu9Q}5L|tFV+FZiSQ0cI-Qgu+^|N6n z(s<)LVw=CNpcVW}rL();!c<7jvUhw!>dV)D?>NLp>C5a%+?T9qe7tEIBQ9Q--3J+A z0}D><)`Tl-CvM!egA<{4#0V>jP3fI!=T>bw!pPOx=3_>4mkVXlc}3yMA1AN8m-kZ4 zQc=RSKTcY@E>1>(dP>LK&{|JE26dHzdWy%K_ROiMAIdCqc3zu_NUZI70B~zIK1{xW z)39@y8Jc*WphtV_97i}$(zGb7bF6X51HyXjfgsG7PY@)qOE{!OA)>=^b&tz^@+udu z4O!`onb3)v8KtfHMEEkf&+kI=D>>w6`NKtGQ-2PdN18Y9h-I9wdGWLSgQk?x*n7wA z^^E-3S$UBWyJmXile>4?pM$7v_^=&#iA_bkMlUa;b17Lzk8V)*6!=Za)DkLmM@QGw z!yMiYfs;6>RUi)|Y+D;lWqMw#fqOnHtgy{@0iigsZ8Jn~vjFcSyMsfIiAKkY(c^+$I}#d&)kYe~Et7nZ zWv_wokgnGy-Ld_3(Bz@sCvck0iaz2>atcpo9fK-gXor;@DLYvcxy4`2BBLmXU9fsKXAQGXvg za7@>YyltdSi9Dz>Y0MP@NEacp*-^fbiJ#plZ=k8?*IwT#&vX)`AHCt%->M!)WfQG) zkln3~YptQ;mN^Fx*(s0?zTz|Gk0Ggb{XxQUcd6^L{w|kUIZ?EpP^9&_bz|C3Uhedy z=mwNYr6}93n;nQ7;VREOLW6gby7kuF`1svchhjzc5q|Y(rA}xkh`aT zl4*R;Cw3fbs}c%&i8_P&*%Nx46(a+NA4uQI72!{nR1H|Pd!E0K%JPy66W_MmO4QL` z8;@Co<{8)6l+(HrSie=`=`>HmHZ2}lG6r|3l8mZqpH{S52vp-Lj6Q0X_GP@nQh1FD zkTQ(J%ah4EBT#PLdN19r%H1Z;RtrePZ(iH%wO3HC2e{N?z_T_q@f3O(vzX?cE;GDB zrq>SE1gy&I9!zhgq?UQSb-7J+?JzifuO!27i6fb$wm?6DkUFNZa@-98s+r*|9&GG5* z4hi{!RSaxxEdO{znaWq~dE)mb<$ea5bGf+k%4@1vE7#~fmXIux7g@{;!!Yf0cKt{k zU}+w>v}b|kmHQWsvsalW+{;1Y$%Jgvp(Q-wD7M1WA2x)bQ)p(FXzaw%h1kwsFu+iImOE-sl& zKGk^X+&|o<^rZMcW(zewvie>}UI_WzCFpK_^YXbYrHFgd@!j3Ba7y`Tk_}W!+4OyQ zq+)mB%e?q@HfF*-@RTm@Th5@crL6dq{?Xp<;x6SDsB**o#INrZ6Yu+TE6s~v?_4!v z!c z%&SWG%U;{b)uRO``$pgUOZSt+plqR3pLs8KO`VbsFRiTXQ@1mrh~B5$qw#6my)y@j z&?n8O`#!c|&y3--Js|IGGSAP5O&1CMGf*#dvblpl#cP;kDI?ic<)=}`VD#gaJm+^j z?EG(aO#3Sy$?mheX?a(9knKC~lcT4ZpEeK4@xE3yzRn)=vn@`c#a{bk=?l)@nVMs+<>DdvdNUL%rE# zEH&I4ZKo#}eLF@P_9K&4tlD9aVbd)p%t5R4MC`eOOY6oy8_3Y!mZ7*%faiH=NR!W1 zOIXx`N9nbX@70>fx=(U*NqxZlxe0qi+3;!q6{}S$x(LMR^dkn>ytUwk0;S3j-NU^H zd&Lhc?sgR?^TbjJu(upZ$wQ)hYobZKe0ghe@;()8EV5(k7Z3h>YcYz z(lakF4nZzZA8OrHchx^zxL7RZO9(+WyH4snJAxRgE$yeAY|oHLLFA^Gdc+SrU7k2H z8oCOSzP_Ne7j(hUVL{b3iF6z@OD~1ir+zH|X+xKnE$mKk7SN;Jmf*Tx%a6t-92CN{ zb8d6nuc{6)s-E?1dgMH}@D1-d^V)U(#6lA9J4)qlo$gH-DcI!t1E|OQm?|%6?BrR< zsWK$nvSXI2E3^>hr9>ouIOx8K5~soX-G*8S0kh7XMQZO z4u>(WYldv(iF7;g~I!ok%@mhH{ z>oi^s(1-2umb={a>KM)l*HM$^W44RqmV%xdi+fsp?a(ln8jE>+q~+ud(>M2%QqK3( zt3O-NRU;L0vkQ!?5SIJx`t21rar- zzbSuzL#^&!y1zy~+?ZXERPhy!UkyT!D>3(aH%s{k0Rz*P;#ic}|`Z9x82KVKLc6bmgNer+l}z zpRsd8$x{N%@~G2DcUP3ejaB7p^VZlcJS+f?psY0oQL}ResmiIOc_}sKL&9#%wWvhO zgF*^--Ml!+7H?f^fqA_6#BBoC+gR`Oa$Br?wkTT_AopxK{1Sq`Y8n}@eT7PoIWp9) zlgD~{6ug_3mgbKGkeQRWBNuD!SmK;JM-aj6unWc_y{nXSTx;!D(7mJGxQN-?Hza9Z8TV-AOd*x-#8( z8nJV=TyPPOX-#U|W^a0CA03{qBdKgPa-|v)Kh(NbwvY`A#Sb4oncdg=kbR~eZPF@< zd(wc*{ze>bb2LD(EX(+ORmVhq1Lugr8*6Q}$y^b7s@8bD-a^TMV{QKW^rV|;lE=RG zvG|BVL-A~B?qdfYK89zTlP80%B8nlWr-n>ZQMe51`J%2XhV-syBjg#IPD{&D373F1 z(vYpOod*z2+C!UEs9#@}Mp_v*#9)I1Ht1w&`pICgIIw{N8*sAQ-(L1aAza4ff8|c4 zsVHyvgO6R&LEn-)iTR;@8Z)OQB2CPYNdZh4%f$}{pEE>10(J`+HHUjFIMu3JlqI3+ zZ{9Cxj9=!X!yy@_ngJj>T0uMGq~r6Bn~mkE`2%~!R;I1RIB|wVaqw0b&#R*opwsDW|^n?QgHS#E12+tW4Yk~D|>++`;0Y% zUoc`Br%eYpBLu<}o9?Ja;&o|q>)MU~dM#ysdA_E}r21ot9?PY|{+ESBwo0x5GKV|f zIb)zzqYZ&=(NRJnPor^M{!u~(moExfPZrk2TH|mMX5?*qgaC5AC2q5=yW+m%zs)XjlbPpKS!saRTQp=C$;=iT|J!xi5x4R)rSCw$TRU?pGOSiBUz24f=Wq4rQW!1hn*+}bw`=-h5wVpNK*K0@hx-Cek7V;O#tY}h zbO>)hqoIx>QH<()CIy?A4gOKVUSLBu#lkzLp)n*Z6LRGFKGgT5y{1y|PRM8~iPC-I zf=T4)IZt6|EI^Q{Tyd>!LqqN6lzzyB|Oz$R(K*nPbs4-Vt{-SfDRup1L35{L_ zCop`EN*Dw0R`&9%Rf1y}zAL?59>m<6)97_68wrcIDlw9cyI+4%H$#XKQTK~aFLj-; zDTS!>#72;3N#3cMX!!Cn&r~~%d*K973>FXV>Mp2l?pEQW4L-}PC!1dCu>2(EpV*ub}mUf^A&cV#n7UTa(3zOrgv=()7^5~E`CVkvjCo-oYgoPjaIr>mwurE^vA z$imzni{Ooe%yUoXlBL4bUxoF28arCaC&g^MNO@(5lGS62-MIvm+Ptf)AS>1eXLjV=us7N z$uA{IR735(*H!MD)&O5g_S3ql)-zeIyF^pF8z867H`xQ(E~FQU_|SBUh>9nU(Q4;H zo?Gp>!XsOI?!(%&rG(=;7|q^l^Gekv;aowk4`+1C$S~#U*8l-mNNb38uEHzdU#iOy z+d&HKU?b|+H-<8AqUB)=$+VV*X|qe~)Q9q|*g}lU{%*Iq#)G!}h})NM*BXQgnSZ$p z{Rp7wXNU|lmpv+8L1z&rd1%-=ELtgJ#=Y6=d&}Mx4IfL4{oNiS>mX^=gL@?A=Z%Pt zlho~F)Qf9d&`#m@PIlxIAU2v@vhOQ?u>HA)s-2m*lRXLlwZ}t`#aWJT(A-BZ~U*wuS9IqOF z-S#Kj3Td8M8xOlKEPafWAhsR`P5*pjsSsvisW22@%Hyo^c^H&;rGdHU+V=Dh=NFB$qRD) zD(S?_c0^L)RIR#a7?bMF(%ewm=du%qYneU*@(WQ{zV zIBh(e*lq4HqFG2^V5cg@t0hK1#lU4D!3V}fMUcK^URaD2u)`#J0rq@M@V7f3Ysb8O z_4J0gE1}!&9KQqeMX~Swbk?+5sG6br3a389S2O{?Wq#1^b|OL`?4WEGhljsrX+DKk zc5m{uMNf#0l5z+>!F#w|*-p0fGi1yW_Vr zi{1o5Q|TE#QNK8aIyWuT!H28infYW>`A_HHy3F0Xb_8r6aXP4j&v!6)(d1Wym#OUF zOx+@uRwx0h@Ka8 zd;%PeyATG(yo{)w+&{k6l7eSjQ0V#uu#u%fF5PDNLLQMFg)jk-Sv5ws*YT%d&a!5I z1)dRod)b%8*4@eZx|XstVxL>IMBng%aBo(lt>>0wrX1|U@ZBN{4R)nR__Sq-p5X;y z@vKHm&n|~r`F|b)Trh4u)p%%IeHYgAtjnC)fPPe~mREjQeeVI)K2$#s&Mu_^6Iw!B zu_;AruqpEvZsmy^E>fgyB@dfI?xtE@xxP1%!IO(r>AC9LbYE&;kX$J{94W%-JxO|D zFJkz8I)k_(KFkuGAk4HtW(+M_H_Dpo+z$oamnJ7XCs-Qi>)ozZDoq7X6sm402D)w= zT`x`DxSBn=*3VWhoLAdZBBxTr=xTeXotx#!rH!NgU~DNH{Sn4pVRPsTaa~H77Vl6a z;V1ij3WqG)=03H@ot~M7RV`2}mctqUDr-0+ptzx69eU-BX-^yzhpA}-Swp~#d4>7i zWZD=o9&K$x1DfpPWQ+6HGfE*?wPQu6Ui;frQl!3x4q-|LQbuFVn*;(hC2PNv&r~=E z@X~+ZeY;lTCa?((4Ck=w*TK~^4bIb>3l|mYRIw zGb8U>*jkD;uJWvr;HRL3GnkdQDMLUf^tq~WktI-7|%<5iWQ(q+xvm6!WQ#bFEV zta9oJ-EVB4aHrSWOUTBus6*{vN6xdjLj>TJwUp|3s*oh3jNRKEl$EnksMfn=oit@h zx%*l6zLkC7xdFV@Xb zxL_?3^s%|Buh#H^{$ZEK)jdQPWh=sTkI$8HgeH|Q+MtdH)zjmsd_=E;UhU*irx2}$ zZz(Klvt_QS93SN8NaW@!$ZbmVU{bKnIxIf!gXL%c^;ztQE=eKxE11Y-Xawfnys6y| z`LFQEKNrv%RQ8r^Pp0-1=_G>y33k^=W^Iw7$x7~*y6?Xvq|SlQ?GXB6d&1f zCCkPxQFK+cw9K2;G$ZPYDg{VWYq@9f8BBmq;bRq4YJ>x%bFsD<=%n^Yy}0cTxUqP} zPZ%<0nim?8q%39@M-Pcl5zD#yqu=H3Sa%AnURFdY9Jtq^WYo6l1_V_fSkG?@)FOS1 zNV|dd+|eV}#3E_}-=jLzPleaBm-%fuV!cS0GFo9-|M3&87v088ID~mms(*1}+^-7Q zQZv_afJUFg!?Hm5j(NmJNHBTZCIagrmw^6q&xzhAUd5?bvp?3#t-O;h=Z1RW=i3VQ zLV7T}UpJLr_@-EvHwc{~`Gu#|DlQw^s#$Sp`$T;h1HYkp3FLJ;nB5EboM~iCELDS$ z8ti8(*Zu8aaQx+tHr<2SS!jF2I#v_l;mx=q=(0O$;yVlHVbQEpWoUR4Fz-y=Y7zHL zCrf0Hs@jIXoZV$+muR4IO=o;;nu=)9Ar_5(`>LX~b))rHa1P2|1O!97zV-1oCRR$< z+dIvpNK2nuPbkC4)zEdB$D#4Yc~hYu$xCzZFlLt=&^>~mweJ?{C+UTtVW{7LPPzAb zX3k!0RKLyb{H#dOctW$f=P?;2{^v67CH3n$^Wma883`1Z0DRvN-85H}vdpzWElnj3 zv`MTS{@9>PO5UjLLa|W_-Z(SDA@Dam4kp9|3BCOlRRR$#&EK#L0b($r=nv?L8)*;{ zoB*0>ylMZ1%L0`a5?PhqrS4QSr3)$(A=&&kH{^7dLRY@Tf=|u5QdFay@uA0JI^6CT z;uk%YgeK4T&>rnh54onJRer65W+dJ{-G(Gd#l!y3IAM8QUK{{oXAA_znY0`>xlmYT zS#BlA9M%!uU_SN|f(4+LxS_yPg6m~VtAffTY13$HU-8d!2^tr8gwgL47EhF}Ytxel zja}(~pp=m^by(}^`5nxZx7O&lgitLvMVYkDbNXT#PtUzdU21PrcC0y$=*aVK zDd?lEU>EwGBUg0rUD0BbUVuAiO^`CPvBFDgz=5pOn{j1Ox-@(El3R;z+$N3&p)*)p z-5BsqOg@VQlxL64=b~7ke0i&obqBz0tP|~*GljYx=+5lN6{xhr0%Wn=?Qf=ZlQ7~9 zHpS!MN92r?$Em(08%Fj*{#L)5ckrpdZ z3Phj6Pby5|&4LpJt^@WV@eQXD;86tIWTE!WVUI3Hh9Eh!x;^dmHSfr{p1ivN;nvcX zd3DB9(5usZulW0e{h|?See|bTN$;5wyVGt(B2%?;f`P47pJdDwS)?}L{8-L|@@jK? znZN87VJ4HN4c>(aV$b)|SF)~rFR3}N+`q)m%Z7wHw3{z8(nSIjd#l_zFHh}PeqQWb zvOYPd`1YqORX-^b?4u?e8-G>?m+WiObPdZ@=0fK?~@Uo)(J`|YK z3Wz4V^d;}c*%{Y*pDCWJT+)g3UsAH6C0~F3z>>QuZ?V(}h%c%$1j#IF^Un4}KCc86 z8ORK4^HTR^Y2rJZ4n9c@ z@6lzy4c}uT-$2Abc(R2kg7b?GxHaI}+L}gCefiMswVX$*NRBxIPzt5Yj*A2p7ar9u z)aYYE4sM=(hOid$XKgJzczAvI6rdD4k|pjo z5jSvVqO%Gm-Cs4KN`3=H=(V!-zM${yfvIR)N!~*HZ5&klU^vk7`73GMK+-1WnE&kcN70tk%`|e1mdAba{#sKW@lsxL$$CSU*?62=Mxzls0@zyM+|( zK7>*QEI@RP8(MHmP_JKhM0t<_yz_j1^Mn66dG8(KezsYv(e{bx2ju6Q~O2B0?Ps;Md~bE&*|I6~TPRKcN$j@7ae@ zz*}lV>Qf|m$< zadL&8v5j?QV!5XW8d*wrR8*X?16+k(u>*BZJt2#Az;sy^nq@|cSkokl;?)DS^j9ui z>yOFCHzO}*B!4ay*41*}mrJ&meW9KhkPNH6B0L~v)iY=X@w&}{KY7uaSameqZ>{eY za1PlVK04@fpU~-Wk1ydG9&sZ{(PVt)$FmFepLt!Di4A#Z9K_ho{QOQ(*R@*!NcQ>1Ktu|!D(bTl7jDe6cs*LoHg`+;+C3!-0E z+`P{BdLjp}JaUcFGUVVmtEB8sm~h0ZqAf7F*qS42prC!i3FpWiFF-=`Wvgo9v?RoD z;wKi7^R#6$HZZ#^>FqQBR-@k))VZ0xEXlm0r%6{#Udb;v^R>2WxB*#)Hwk|@gU+SN`7b?SfiA5 zQ#K+82}J^0v@?0B`9BvM@7ISaqs+g(|IT<>|Ap39msU9kB*0i+ZW1yzeO3SIqpGJ) zMRM-knh5d2T4%1puarZLi_oijOyl0CFBIy07ea5O59Twn%{nq1bJ=`BI;#BgyrK6z zB$Bs|`$sr;*q%DaDh~pTtTFbHs56m>WUUr{$_d?cMA{XcC!qGG&3DmR#ZPs)T)9PEo1pk!SBmXSU@)XgxICXp_Z2G>^UWG22~ zsu@-eik7YS281)58;=@c{Fnxf>=t?9UGgB^-Si>IH~S5pQZisW?_ zYBp@FgkxMzq@XsF#l=#Eu%En7ii<0eo~BiEobV#i)o=C_A$7w7cM(Ivr5mlR9$#L$ z=^tVuhhI|RyXEb>4RCi}GWaI))=DCce!U>^ns}sT^pscSig))8eBp&xEJW3{n9jm( zw4It6`AV1BssED{w)DCOVggkFWrBonHG`Oe`HDp70KBXrvzE$h4MGiB`tTpHQ?k`Q z^c5H~^};lQQvFDoH*dtqUR0`Q?!ECR@vr=so0=o zPg#k4?y>Z2Fl5gp!sr)`0xm z{Fb4)DW4jVbD`1vK=mx80~h-7bo^MU6{;GWw;*VtQHYq0$c_u6C$1J(rn78KYijew z<8z7xAEiSfGtNYxN@<_d&l?kq2&Pg+$FX9T?B-9;l=KW}K(_!<+J>5JzQjuf9lWPl zPdPiGhM?g>9ZG-}w0i!FEkHw>7+XWyVpI)4iDDT)3YAo=EG(foy?up-&uhFLmPszU z^~&35`)j6bphz+S@O{4q;RZO~h(3IFPKGt%g{~DPf$TTh+L*B1X8>*K9;IKsYD(Lz zFNKi`x8G2Z_~&(fxTJF;@vr#y$pv!)T?8r|%=gkc{mjGXzv^EwW5?4l^!{qo4jt5Y_9@#J8Y&jSv+Mwd6qy zkbDVm-MASCCs*@&nnC3|`mhFjhu z_5D}~mRe~klCy6+_Ubl-zpHn!7fYa>lO$H0WN=whfnYVT(YQn)oTMSGH?MCwlpHzr z)J=E}+ZMb_sjYmADmdG-)?#2@QelqE=RTgNN~*gulppfFoUqbwGQBMYH>GXea>NU= zF`Eiem8sI&pA#n+Ck|=ax@tjLu%j4fM}$b|y;h1VkfZqZ_oIsk-8dTvoih1_tJN+p z8;o6MiYpz3v#7=+#I9hhtYmd$EG-T?lvVNfCy~hugNwy7&;0ky87lJYn&Q>QdZs+rvNKobo_I+=WRCyWQJ0_lTQvg&18LF&1Hn~|%3peI=Ut59@Li!Lk9#1v+Ve$NDRBwiQ+ zHkeSXB9L9n@QyYF4uu}A(yb#2%MJO;<`HiE$2?drj&KqVEsboy}gCf3PX>n{seo;*{ z{EK`3O(`dO&l?QF5FdA&Mp1F^_el~FACoosN~eF?SPMNx%xAlL>G}!fa2%ht!L|>q zDT-h=yBSV;bq&ZL$kxhYqbO)qCiu1|=;<$dA(m`bcptKdOg~HqRy7Vg z`$l8Wa4Q@8!Rqsl#=WXu&Rl(ce_7>%H_M35vq1KH!>vIL!b$KMuJfUa8zNSs@Cy^n zXo88cu(a|LdumwehK#6B)nO+E|9B%plf#0;r?0rIU_jz*EaxAZ`wPIQ-y^0m*Geo; z_zZkzEcY8xrSBzUM!@f-*L#ldNYz^%c5a4=UoW%83%{0~*-RBSHSj3fK&`5VUf z^BiEBIhUrIahJ9=BdH?0R*iX3olJ9U42e?i86-v>;;o21BjFQBA^EqbL%zr_9e5D&XzfTQ;`lv55<8)x`~Ld$T*fokUdY|~l_-b4u= zlYn9SjyzUYHHjs0D;yQ?8u5njGdXcf?ijOVPaqkSEEG9!h>TqR4LC9};D91I(06~` z_%mMzf8r3kk0BQm3bas)d^V|&|8*v($9MPk{<2r+~nYd3*bOT z#bPOfl1|l@8W7)D=foQJ&_ZKF?MWg7dp7nz{QZ!^skI*-wFi|d**kR^Hg<2KQbX5n zmaS`9Ym>cdJav&OULZQTC3KbY?k_W=FQuGq1YNkqHRvCScj}#(@25>YW3_8YdC9PZ zEgxrXdvW_RMbsNj(A??TZQ|Je1-;v(WrznC_0S$0yTNu`CR* zaU0P^=7eeZUYa9i9=z!$`KyNi|3Z$PlnHy#!uns3tNrhgWAe$42o6O9I5-|uifG5a zudbGHO|tq}kEl6on* z?-^%)W1n1mvXzv1eTEy~Dirx>yi_MH9D+R9={8Xo0TVZI3_J7=F;2u6J;W}qA&Vem zy_s)KmLf0cTWNyCZw(Gyrxz@}0A6~&1v~8^IK49Q^_7x5^KOew@|hl#Drv25S;2&T&i~plEs05k(`DA{GE9mRaHH(_#z_nJinR&o#1GU&!@*>BnbgF;D)B&{^T- zB);TU=~$iN#%@(ltjuZ;Y*(>C7vtVT28(Rv>3`I;RJGJ>yryHNP{sGAe;u&#R!{#N ztLH)kdIVqak?FYY#yJL&sNr~s7mUqd~=Hn}`F9$>iB(@xvn8?GW;Rm&KIj{#c z=p){&TFFsQB29)DnLFpN=NSm}n1=HSddkxdhI$#9&qVWIrLnMgPsXRPRJ8qXVJOk; zL|>GNOpkWvwxfZ=gRMar0oFFAN2{7kU`+^AXm%RXAjAeg#ntp9C|d};1S4f$GDo$b zK#<69qAUdUcwck$BT)U{rV|1g6Um^A(SM~Apz*(_(+Rra4T=6GeiM;)r($gaZl9LM zSRuHkMtS-4HTx^+1;w}4mex=XanHU2mpCc!j)%MZA<5 zyEaiu`iW;Gjw|&67Fowt{2XawlxEH&fHksD*Yv1Hg_hO*SxXuO`SZ>Pg8wd!B;IDg zwvZ^r1eFcUog{zTV2R&$PW-o}`OAjE&K7dyEJS+c8Rdz=S&C6O=HS$PUt~aRPORJ;Xb}rZwTH)LOGlp4s?1 z=XtyT<8@GJ+Q0NrD0o0EfA_yuv2S@d_C`KgIK_-Jk64uhdKMXL;0~`)9CD@ z&)o6Fd?J6wk@4AnRNLJ2o)zM+z-1{=5ro*Og;oRQ+}~gIrL)u(rJ! z`j&pt!tav+EXT!|Z-cIx3@bF}u&FhF;Y#f%q2UhOXRA}#|MXlQ1(CNJEVBiF~jQkKIeNL{n_9RMcmde zagQ^>L4~6RtJ`laH)#LN=sL;0kak!mzlLQsEUDr29gM9UnHYcDv=~_%c$QZm$^pju za)sUSEG2UlqQR*3psnoh-O+~K=a=Dg?QhJmWS`R08Okx(f4C4kLUXNpn7ei6)i_Gw zDlKUZ((SV}=s09QFl4evja|%P(r=zo_AzwX%+$#_-b>=|CF}Z1O=fT!8^EyGniJbT9&;=vrANyHcF{W;tNaMDn~|^xLUs(K+W2 z)=+eY^h`$8OxERzooM{gb+HtAh>=_&RhI!Oy~aZ{*Z5}B(oIhAQVV1#HyQWY+#646 zB2f9a{&)TxnR@|;<1de8Q2CiJNE*F6{qb+aBb-9OCJNd#s##PRnPqz&kqBeryy=Gc z$BmB?5vhcPPM?I3q9VUV6`@dvQ%2{_a>YVdTDdkE&6o~BP7j7w&AX?l{|qkM-dbZR zEU0&|02BTl+`kj)KSTUiQq@EYpnqe26;KY?fWt4C%7o8jEWyPK{(6JuCk8I=JRs_T zlOkzk)*MY}yD~CmVh{1;Q=H`koS9J#829dz!sYN04p~ zQX%KdAOMT$g?VJvPOPs-u27Kf&ja-aj#0__Qu3Aaz12T%G9^&Np9pq?v(NwTU(*(~ zwQ(}Gane_Dw=;Is{hdXnv7^7Us7F6{*V%%N+wQ|2W7zxsc2xgv-R#W_pskZ_B(zfI z2N*40HoNEY%JH7ExXut^h}Tp=&0Q3SEa1cRmspL!m+9}Er4#^9d1=8)H4aFtJ`G-& zbZ+n;5ibaDJZk*34jGI`No=!`TL-W;hN|*ez^1AVVdI39ptaSN3k;bPahe8)zK$L- z9XpY9P*pJb`TJig*B)Qu!UC<{W4B24nrBtP@0dLs93(VteC2G7v;E^TLRKaWIj85v zmsAGHaR@H^Nz~{2rC}R`s0OL^DQgt0`5FY@tu(8h;?O>ks6HK@b$_FSd20V9d$e0M z?vK~+a$JrPAQeMoXRaC4588z87?}@8o-^gSu{|Hrf`18=|Lz5R29E>xe{So9WzAn- zUtkgb?@gY6djHvF`L{0|+?QwN|LOg&p36Vo|7=D4w|hVA*Z&WViGNP;XDiCTCaCp8 zdHL4_|6^mypR@caC;m0dmuF$Df6el5aq*|?pS=BVS3Qn@u=t;jfAZkJ9VI#c_sajp zihnx)iSvIu=WzYy{C`0GpY!|)rGL)@;)a9!AAt2q77^At3I~S_`xb;T_%zS&cmE3} C_jz0Z literal 0 HcmV?d00001 diff --git a/proba3.xlsx b/proba3.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..38fa3c45233f0e245dd585d5b71fff2980f1aa59 GIT binary patch literal 15388 zcmbWe1yo$y(lrVM2ol^qxVw9TySoQy+&yRr?(TMQr*U^^+}$C#Yk=UdlXLHXzkA;I zkMYKX(bcwV_1d$mX3f2Nm6Gf`XiNwQ2sj8RnrgN8pXH7H!Ov>IH&pP=)ZRqN$=<=4 z`HO=ClZUO1e6%1U6f3IO+lXUF)8`%$<4;p6)wL*I1kACfqO~HvoxD9UcEt9$5}OF- zblauKjKOL#J7n=F5Lh_jjSBk3c7!Pwg(hDi_z&VHA}6J!jmqbUOW+IB_T^uZqa|{j zkclfj6!wp6901gPg`_Y@Z%(!wrE{DYRJX|_3zz(s21@@m-LG-qgpR?}9EF5{K>MH5 zHL-UB{GM-NT#rH@%ZFe?z;TD`N-wf<$|x#zY-}p@Ha71D_B4mG@!a{D<>-R{)&T3P zuwP>mY=9Wa5$)rrIL5;HtraHe4;iOJgcP58$$7KF;|>QLF7jsugmxgm54ih$ED6*K zAYYKE3zkj|0i|Xo!QudZg`P36z|Fh9}A=VqAewb-kwxeTp-MkE4 zJt<-`45nunQrJ+s*#%OFNv}yRKJxAE^HZCQUDs92FJl%TUHo3Txrba#n z3>KfJ)RcAX4L{cJk+A>58dZw|T_I=nV5vEo8E`Jsajtz;QFH38}&HJwZEGKeg#f8Hb ze{1K;gQszHCc=RbdP})2yEp5nO;^EZ`1*XyDbuC9m8!U+vM5!>*?XVOlMIVYgeYCb zS!?(8+32u=$|(<|&MU=`zN)Z+@+p@SODgJ@D(iwHYzq;IofA)VtcJZ$vmYU}9NZSh zX5J+m&_22*;x7}mt$)_L)H>%4Lwg+nK`&U&;3acNIAz7cAVYBXPs=HJ13x#0Z}rB{ z=*2Ef(l#jJ!=(@T-%5Tb1+4*JZd2NZ3)nrgeE24;6a6g9A&bx2GA0wAoey_&iW3&) zMJ62D8Q`y;$aTMjP}}iiIPnphi+E4o-NhABvQ1t*Ae<-&n3HHESL;ts?q)|ik+-ei zY5CkKO4^YxmUh>XEhb7(i02G3w(g?wG)N<{VF<%z1*cjm5keKfvnJ;T|EeFTK-AdeeZS(ZLP-6N{y?re|MGFfu1$UF9jFSPh z;E~jQRhcP3gn>SuhzR>RIE8`=y_DBiUJB!tzHsF=bN16^A~VIKOk9j*9eJ?})%YPh zevbr@z%|5TM!@qG<{^_4fiRAM2+EwGPJ%Shvh9)>ND-Z0*^5RmB4mumh40jW?ceBF z8fc`0J}~W}FjJ5AtX;vGAY?RjIv(dbu@Hxh7H_}}K6WA^7Ojgom`5i4EYDF3`X$?- zPrB#u`>5GVvv2S`yA4D1z2qE@%q|L5vG5Ta$NT(rZTOBr4Xd285DuXdVm1Vrs}^FR zJx>n=?&N`XrK;~#}%G0}7y9~x8xCeSYN=5(LFSO{fbojop71On5w8OgC@W&P_uQ#3zEj9k+7!ylUJ zQo@g_%>uZ?(X&Me?2c4#Ws(;6fGsr50=m0Lz+4w0hRFv3!-M*9M0U|8C)wl1#LfmP z9+{stV-5<$qaXOq1>%Vs-Txxue7e(j+a)h#QB4tT#uw>)XWN>!#>bPL8rOm_s}gJ9 z_izOAz~AOwhHmjm)wDfWnx1|-=uxiDzYs_!8VtS8BR$UzPMz!%4f*P2m};Ihpu~Y` zYg0kNAkk#hym-Zcxn*j^_}BXYpfc38inB@Tb0LmG9m9&ZAudzm#0&R}dPci#QZ{5+N)$ z4%@EMd3-D^2IP3+u-GNkche%mZ>f)n9oHXPXt5?Lg?RnM83KY83}z_NF~h4rz>wlN z?Oa?WSh+_oJ~H^*2CA`{&f|=ThV=-tJBco-QQlOoP$34bZmW&A;dfFQ$@Y2LWie8} zts2Y;*5e3D+~lWi5!Zz{XLvUEidVd8Ef7DjZSp#-@@>2`*vDWHE%5E}2@n5+@w~8FaJRno!F#S;r_huhO<4B5H%UCKNu=&i4#OBskm4vB*>4#t2rt&uB#R{=p_?ezkw zy0<_2$5})d)ut}xQSrVrc88tq~ zYMSmjV|@B$=g(&s#-8j?@dr06U3P;B%NO>YV+WgV3ybDCUAs-oHkH4U6=imT#-17D zqg@KXMf1&~uWq-WT8V(%C%1Qxwp{7$4?9gEekY1=zbczEVk8sVg)7I;?dF9czMbEW@HlcE;a$@ZV0lBsIG#Cr9HLUI8yR z9*%ccf$naCTR z)d44#`}*bX=^HuN`4{(~t~Xuh@>^?-SK#`?{1HI$eulp4x<+($vECgtf4KQp*|7ZR zdamCZ5WXsakJI$vtrOkau>L&XW_eNW)y$lv{St za{u|pM#sByU2)Wre=R?p6ej^#moc5PViT|L_3R6ZnmAbYaM?kPp$}bV&=nr`)2o;+ zXy4^t+@K^mv{R7SB%G-h*#R{WXj7-(9h_Ojxkxr>F+bdMf*#1{u|0t`?qKH$Cv36e}ji0K`l3gXuC+?f0aHW-t z;TQMr!c1c4#lxfFx~cN^5(y_O3_0G+eFH}y)#Rw&emW$q@2g&@iGV8DhJccF5A|}m z2`foBjk(5F+NNzPFq=j9UwPw%T^fhhHs;~5>c;!@8IgvbWgR(b^B;UO$Eo&`?pn)I zzdeFZt$khZIf43{>#ZiGsoy4uRXtuiQpZLzeAtQCTi=zYhQWfGOME8JyY|`Laj{gV zswpN0&;9Amaz{@ck@3gtTnSQcj*?d8K`tB&%qE>v9w&>}(QC=YKd26sSgEtt8saIR`_`=?aSl9xp3Q`OTy_d^n8sDVUP*3IRUY#qpy#X0 z$&=JRU5ESKRko{-$wee83kmo*6}y+GW(b+qIkM6sY1n$Y?`#0WEv@V`U)Tk^C_>cb z)Gn|`*_n?^jBAhgnowi~=ZVzEw7+=YUk2{)SBHm{Whlzr*Qc@y%a4j3-YT)G6GZ{{ z^L5`QG{)4P`tqBeNCb^R_4OI!7w!Fvm8pIc*fDXFIamwDpiM=3@9|=+PO6_Z)93XW zw;JmNT#nf6AloZTjytkO*$NG7TQBEX-D&cHC*#L@2F|PYUpf7RX0xZ(=S;`#loKIr zi1Qmg+eC4X59_W59yb%j1|gn4tGaplcjKNWqq>RtcTsK~&y%`=V+ zxziPtwp;~;@xaXQQ|`gwA{*Els5R^MS9Fn@Z3x0CtrG2OG-gS?tw3(7O5;`gm*M`J zK#$;RcGr4mnA)l{kt>!n?hNbOeVsak*GBh}pYo06jmt55 z$NI078s#mGN9kqy#%dXw#&kC_nKSL!oS(fV`wfI%G7b0Y48i1eZ^MAr)?hZ<_VG!K z#;3wPAGyRQe-@G?BC_a!5XJG6wfy9eiZe%TiNfa4_F+?d!dX*bo6pAl%=*k{WXUG? zP090ta8gI6y7FO7W*vplp5zq8jVD2Dae5mT$CWqEOJCc<{g;|9UkCrI>L*#?=C!Xf zDAgxSe?XUzrEi}9B*OIcm5uKEEQYnzjP7m~p3IEeZXTYD$~d}Ayo_loo(wt&{7A$! z1@H0WcUB62qGbSxUt{Z&zbFh-c`m1qJNwrZ2)T*tGrc~i$wcC_+vZg6m7kd5` zHYNZ9suu~%WbPpCfr5>-uh}zxY@-BpWU9Z<=}3DeVx0)T8b7@_UD5xzMy}C?>qXtDcs7c+oY9NY zEXeqT-lrca+@EpW2C#~@!`nM*+dCLf8SNzK#U;1?6rwqRYk$N+Z7!Gi-uzS$Hf!7U z-uowBgT@4|>lVL>l@Q^>Kp&Z3JO%c$L2!H^W+gg%e`%0rnDXsCC}!RLypx~! zomo^2fX{_nk@73KQ@=<4x~&6Qv`9P>S;pAZ`*})97bQ}nXe=J3EhT^H0tqhdt9ZCb z8#YmCC2_8_Tv=As9VJ%P_9`e|JqGxcA)0a~?U%-4aNP1M2^3oMs~IW!%dEN;bPMIc zO==b;+76Fl;sHRaBaQ4Z+4QmVwiR}=MgDszd)BwX)gwG6b{95Wf$AIHwIdn3;#{kh z`vVevbtC=L8fjY16>@=A#d2df{D67?i^Q&QF0R8l25Th&I|?(&5RU&c?gl7c+gx5$^{-tJws4QJXRH> zo1&uK^Ou)be%eH!N%9*QbFS3$$VFO>%E~n)eCKf@V2RtnKGz-g@{n;qKOuga>pZ%^ z6Y9Q;!p7BWXLOzPBHV^tXy5RfBh(B~j_Cw}rtO=tn;03+Z>o~9apFkHs5z?N_Z?@A z&}N6XVSLvqzctwIR)DkG$Z9R$##thcVhAQY_w7a`j<3LEe8--+n>sWwbBNrvewdVZI9+T$yB$d29Wkv+WMQ+s(~ zS7Cr!`-22WO{6U521z7N_d1NfIhh`-V>ecQZx2?!$ON&C7+4t{sq~h1Ehf*7Vb|RdkVqkWp4(flQyIzbF zw+IGvAuko%PI$_0^iU-IMh(<^1VTENu$Q4|`i(TGgsmtBUQuZ|iC{ufL@=z=Ci);* zGRoTB4;||IwU3O-Z|KIktNwiHGYz!*y5NLfb}RT)XuBgll~~J|c0y({p~Uu8d_a%r z49t(#ZAt=}V%R4@t9NWy$KzQC!6($#oiC>2O-Y=a=N`g>_>T3Q)EdqK6}+rvmAtH) zjr()TL7dd-8z!GC5~gpno~&Pl3}!w1GA2+;1o>S|f5}eqeDs4)PtO;ZYwQx@Op+l^xpM#Jqj#o&x}d|ah}iV;JI&qb1dF( zXAi(_|4Tj+r(-$fo{wUg<$9k!*t|RPz{^?4DZVL>(=M0=@@l~B{DX6peUBzW$G5Ko z_Sw5>Lq)&^)p%vHolYG^>Bp&Y*5Y5|tU15N69~}-Au7OcG3If42FF9A3Zk+k2D<$G z^lkdww=^-%KX>+AGnPa!TE!5!7N%YJ3#EpMxA>6HmIftD>R!! z_~(6THOVdtmU^9f9rVg+@-Ztx%4vMTg^C3Xg&)4o(MEkOD;Mz8$7La;+w%nc1d|I1 zexA6;0)ii0hxF}i+;mneqq+6A4?{?eId$s?GjZopMEloXYAV}*?ezczy|WhDNbSSk zP{!8*3I+N0RW+OWcTWk+hn{Rs+*@1XfiaiLUcQf?gIAwXGoB28^bv?E3YRFp9lZ~k zy$+uB+jyq^9)pHAMLI{2-jCKLzXhRiMc4tlV8^RiUaOpTjDG(nwLX1;v@}aeMk*~c zo&TPwt8;vHprwrhB=%&BD>Ebdv!q7}{bJe;KR6yPx^dRU!-tW=AJ4Y<3k`e|Wn!Sl zPuy*XF8pAv6H+uU(`h{8F9e9I=wBq=GD#PJHNH`|))j^( zFZd^mT3yLSao>BAG6$U1^_~ncL^QAD)l$$r54)VsakHETFrIYKZ z#{?Y4H@JkCZGKN(+k1XbsTn&=%cus%%_y?`m1r_`TL{VcHOT0SCi43%kRZj+3o7UP zh>t@S3n%B+(Q+1xP3yps4s%)$Ngho1*%vyvMniAFl;3ikqVc+}mtgOmtvk_cO-q+1 z)sgj)#1%`2jh;Z_>*X`erVCfW&{r*&`>Gz=P3#M%>@epa0C$QWg1Dt@LIws43XxTD1TGwPdWTBsqA%-s_wfD!ACdN10^Lv$z9Y^) zNV_17>UtjP>91}6f?+bY#dum3Q7LE9-D&{PvOEtg%fQRvODK(;~`t zg)Sfw=a*xJe*Li--f5|E(}(NU{D=C>`w^BwcG9P%%!Tj=;(Ci3T-w*Br(bZdR;-PK zd&UbDT?Ub7O>0PJG2=aj!WZ;TM=rPx7Gp12Mt<$iS-_6Acd!|<%+XE|%+cXg%+cSq zzC7`{^*${=XasWXfQo!TxF0g-pI=zEw=y&6^ab2Uq(j{*A|`ltzA@uW;~-O}7sW4S z(3_=`8QWK-4x$rDxzJ2wgk{V8l*_Y(8)V9=;b1dKiB5&##K))s=nu>7(6}8(b|iI# z4^?xp83QMl`~~vn+NH;J74weN@c7+8iDlfZNa=I!VepePc+75Rk%c!}^=?d(Ut^;XJT87#8OwApZCarG3Oe4xt*10JDl;5y$Q|@-WjdtxMMH7@hO1HOV;+_-DorU zvnwyw9H&NFFyP&Qb=Af9uPWy-qsCYl3R!R$(cI((UzzXD=_QP})?hcXP$uwXx-98h z<(!r4-^7eEjk*h*HACo-Mbo*BBdSs@g+duyjfrJlK2GO~&3=kWnZmjOLsKvS3x?*| zIN)z+AWgy01WMkSd0o8XA@@8ros>MOA{N2UUd68f;mP zfXw(|YAy3H(uHU^Ui#Iq8?PZgi_s>I?Rnt!J8RL!IA?jjdv>As-aRMsPP=;1!<9Z0 zXJ1IORw7=QJXWeVgJh{aGXx)z)Oq6hZ<=yZv=E#KK4@rSt{RytOEG2;@vJ7OEz;?$L{xgut(9*hP{8fLX+?VKjfli zQP6m{Dm#p>i>F?`Gzc=6x>0OLl$a~V)Jp$kjKPekCi6FhMltg36)Lo;mK6io2AE}- zTKLvAK{!ctFbnGD7Gw$xQ3*@k5l%@^s|opNGfirbS9Z7q$a`pB=r13q$;0kIsWWM; zT<5hGg+|#@W_*621%2$Q#FD92_)3CF`lz#p$Kcv?9!(CH+mV4ga* zoZ6T5np9)N#YIEIUi8v(AW&6N{p6&dU^n5^?)1WNP$l5Obzfol$y@v6JpLFGy?+8X z&&DglKg1ha%fzsyit+?|VaZW!((u6J=S|rLU`D%s;59uwWo;Awjv9MOv)r~cAkCmu z3>(j-;#fLqQyZh4p<0!i`O)mdW=iaSw@0N9DD*?-fl(zm=9bHhEA#GfFy85cWBD=PWCgz~bO95U z3pXa^T#vR`xolfHoF8G$4%f$sXHfvxao7ds=O4T4_VwhYy~7xl0TQpbSX^;*i(7F8 zi(7`8x)_#vdKk3hp6l*sQcGfs6P$GG_QKbs&oRQrUX5q;*vq@@mtAj5N&v2e39{AK zaFGm#nqy`mGEIiIox)37LC%!XbFEk`Jwb!-tL^Pjx|N1L)?J?J3Z3qxHF!K7{(i;#RzHXWHDlJ3@g$SgcZ5?p;w!y8k$X4Nw4?rOa)}&q7@G3k2ELyhb9$s`g&d_kt?;8Rs~N4~^f=4O=W|*oNwE)UTWB%3E{2d7n{e zkhJQ+Ux1`-rgjG`ZBE2fsi+MT(Q`OJD&bBs>;|e0ohi#Yy3@2pe~ttT*SwL9Vg2l5 z=F-{$q=FeUt;Pssu}@oxX}CTyc=3B_bkN^&qwB!hLzG4Nvr>vL^B{nRQ*h#etZ2wY6nNGUK{@)B`BcwVh>R zLC0qzY+sSBZJtYNR}Q=1L89~XSDLdwPohAN@|7cLTe!BJ`4#NDCTYYC+-AmJe}Dh| zthXX*`@i#K7mx(YdKV+~O_jVyOTMFz=6SYuVDMar1q*Mh;o zZTHSJhq~{Ds#IKus$5ZF*$alrjIYLl>x2AQG!>`4F)>H3hpc(~($r{c1v=KB(y(0Q z6hsnH$K{sYb#hmiYp7vvYt%7X>1JN{V+8_S9C8P(f+7a7H>bKfMd(!&&pTt5+jk)A z9EAv4=4UraON})rj`y@4&==Nyw%^MwRWz;Ryc^rrLL5%^vY-iRK|T9!v^4#h3Y}3P(9u# zIRDLP|4P`f@q%l4y3OBNTVs4*nRc~UU4you%~YBSop^l%i~5pWd1 zKhiAmPY9upnBz{u5Pr;^AK-M!Yc_P}?ca~$yqLKAg`N*%Si?pWGt?pR5?oT{k?De+ zcDXqBUOaw9QIt?Q1|I0|K0Hy~Qh$IuZ#1b{Ni!n-F=Ov$n|V>);F<{0awcMN@G71Y ziC6cR zgvq~3r}(SBkv#xN#>5a6VPO){jl7FixGhijo6XXHv)Oz`Dms|l`ghGmu96j;<3ds- z1yV|s+V!QVCb`rJbYr#bPX&Nq-|8X^lT~exoyr*9O%UVh^aPR{PN&MtrM~({P#;Ga z>L&^Q0#=a~HhH)-kC=BcblRS;xEmu|Gu|gn`8WnV6CcX2NYXr6~xbaO=p!1%LU6 zF^xfR3`lDh%GySjA0#41pk&`!hZUmL_s>{_EyTdweTL_T1HGqx_{c#Lc-W_ON9RHm zSRJ6`hB|{RvidocAMW?%4ZN$aram6VBUi5dAM;y;A#mq9VEi^G!_x&{eTN0&e_sp* zWhgZleid}f$b&2C4(vSB%g$A5h7Zy$yTsv_XMoh%Tvns}lrdg7Yctc|F~3n_Z~vf> zAcdunU~$$EZC&IRcLkL%tu{(!Sa+4>@&1j`=?UdTE~tx7j-n&ron?K%JNTcrqEt4y zJroGutFb6QF7gKMY*?<~e8X}Jd`wv~MvTbpyQgAvF@hEF_)HEnb7MZ}v$zZ^NzIC$ zlHkdT3f{#;7Ag}wNe;|xMZA!kSh9d#<7zlQ8NUr_(LFB-Bk04D9)83k`j>_fS^c5L z7StJl>Vb-YBC`G2Vl8lBd`??SGf(7z%Ej)F@p9r2IigCm6FG9DiCIc0QEMZTu4f*g zKyQ|=%#hl4BTFNT%TQ{~8Z`)7khfS@sbr?M?|6dQJf}8q-iVxp^GSY=oU``#HtHpHtsg^Cp#xiC80Y6F3CPZpv(@cFU-E zHOA8@YnAt3tGpD^$qlzdii!p+;PL?uBXgaDh1gtrrYJ>8$3N60nKDFOFUf>IMnK8# zur|i$P2_dY7=>3-m{@-6*HD>Lz+8G?IQkKqs30#O)&(^kS#-I4$`!R2S!DUM6hEBp zd(!idbG9PuRCBiat^m2i)xb{q-^NxkT7qURuvh-Ksic-nD7x~XRaub3l=~APagBeD z0-K3FyuafE!S70iLPNIV!ln$LejL!yPoJj{@T$(hD#z>GvYzk;?JZ`4)Me^)PM5?<#RY;Rvc)iIbc8% z2G}ZzC2|x${=0Y~oiEMNo8gbvRB8eazKhA{>4%-ma3B>dZH&f;qpyQ61L65& z$h*O$!fM0@D>v}1u+Gxv4xlaGgQ@zL^lgS(SC*`roGDmt3W(1WSl^xn9oc_78Z6Ci zsVnUqUem+YuyOhVdhEUTvZug{r;`)LMrW|n1i3mI%3bIkyggor!`~iNwF3@`h^sxj z=#o3jIlpw#rI@_Kh~f09?&ei}uB8_!;=H&IAZ|3r=rS%9b4>Ea0LoBaXOXaQm>ve^ zss>Ns@|ho!8^FJc;orM~Q%F_R#urbvPr!i1Os?MwwFiI3BI>M|2E2WhV`v-3WMF0} z3@1_?@>AhrY?-hDOEL@ujH-p;2LMpy;xn8Om}N*GVy%P>Sg?cMaM^S1Fpe9mTG^<6 zua*2UjntCln06vRsD7J;gnVgd-*zJg#25IY-wcu=b@1;)53WB1{f;)3pg}LB-S4c} zzsfHJnAI-p-1V@3SsS0#YdDuT+&=T0#cW);!o0>VbWgsK?ZGt0m6XwO#|vTJ>m};y zp)8qH>u3wx7#MKA`Or|@~#Pt{FTQpXo=Rb_Q%d_pOqpYWBWT_EWNoSHtA{J&nZI}*ij3_&} z4ZJ1;4S?j`lIG7N9QP4e3Vx9A8xG8*MrQ#_oQr$uLz_Rau>^#U#Ri+5dIO^Pd*lKb z-8%C+v%1BgVbDZKqjHxX!XMqBPRi&_$n+SHQkEXrsCs+vb}eS$LbI4n{vamEo9@CD zo&~J1q)z?w!Vw_`_*4F*=)d#siedWMyd1hReLJ(c<;FXvZ*sz2d$=l0yr+?`GAjCs zh#H)GH=q%PcJ=Msq|;csEav2Py7P#1qfSw?TN!%RwvgO?VYJhm!UFquVC_T390{Yn zb{DedJFcpXvRa2@Q1hKAX6WTyysMOM$Q;Ur92B*r(>d58z2IpYlCRBJ=Uzl;|TAaf_*q@;hEOX zPZ$>E6=ePZ=5NC@Zs_vPil;jOOa7k32l4`Vio2`Y>MXI@%b2Wo1{>?&x|!V$Dms%P0I{=hAA>{)L}Wy*#y76!QL$*gn$&FUBM*1lM%o zfX+;T=IBYS+__%AFNveDy~uYTxzJBq+x4BbH>$#t`mir%Y;B(|W;&|ciDt^~B-%R% zh*S(~>G5T)ha2pSJBR?Ui(WM=x>uH`S#v^c4lNmQj2js8iH!EQkEj`v_qL~%aovtiCWqXPLNWE{Yp&Ffa0x1Z5HQyo!BV`9kws!FKg z5ZVS952*YYyi?I|#E>gJ{769*SoHt9j9UsAP$kc=K&$@Y^8(v{Rs2ThufczUsfY@N#unCa~dl zqxq)K*GX0_{vB>`BYjAStGIPYt~=dE%Cb4fgMW7w{$jdPFEI)PKicatQx*Lrub#+w z#NZU~LU=ns=;r=?Jq%#55YT2V0?W`z6C(a-bml(4V(l%@R0B+@yfXgGUNi8NK4U}2 zwBEGIlixGyr1f?|$vm2?Q0%0ym1y6`1kylJo=0j6Ncy5ZFP~@m7*^RW^#YJ}^Kmf15h{MFFVF>luv z6#hYa<&eBmevd3x`RpdnQ%Au8#H<&B7uNTFL^O$e@`QZS^B{YE@Q(4`e9OmX^U%ht zyap@@8@U_#HsY_n3T#>o^>#=fZr6XI?sOBIfZ=$Q_7$egKTbH~-6aPY1vV`i41?Rx^b{uG@7fw2X{bl6i3j;;w&l}{Rb!o35NeIIhr+HTF(yqWUa;L@R zCr0&fIfGC3=8htvgft@5AF|k72BvsLN$^^Y4&!rUi{h5d!yiqcWCMin((+zYyJt|N ze2Pkhsj4}8jdN&^W8fL0z=w=HntZ2qC05BD6jGfdN$5b(e@}Y)F_9>+K48iXbsPDQ zIuco5P}lsMdjIe*n5qAzj=)9B(}}}!AjYStLYV4rq9(Kbg9q4Tjk06@7Sys>ul2J= z&XpUO_O)Sn4#j(&!;M0}H)*chWWQXkHl6Za0A^37O*IG({E~>~7aO@Y=Zf-Am=*of za5jDYREhUhS(%A;`$)QWm(_*zIcToB!i`^lrd%g3yfGDVqr89Ed3*QYyH4-#V&IFR zARufJAs~?c-gWBi^3?|5{JUXcU1K#mg9Y^ktN(qXypnQ>NCDT3Owx)~;d)4Cy3uz^ z!xGkV)2>eTMvVAVy6es}uGGpx~fuF$>8mxKLTOOQJ{RJ%r*Q&lSkZZxZZi~u$G0q|E z*B}IcVB+GHzj57pn)BMRmlkyVV&_2Kv&$)IX9r*qbZz3M%OZa(fc$-tY}SY6m5` zX?tri#0}vaTi3_2fb8220pDa}AQsAU*XoYhxI%jYyGHvr?#y8#8lK2g_9lf>rFZfO zFnskjG6zr(PWtn&74ny#)Q?aEO0LPKJuzqCi8Qk;@T&})AWr!;`V@PT-Yv~vCP&Q( zX7$iz?OwE_<igQDeGa*TEd!(a6flv*y^qLoPnUB9SDFdL)=pxU2vhM zFtOiIDSYC-#8z~Z`@F<_tvqapl9FilB+!|zz#2zr=gzI{k~V}c4~&p%VYq3h8M?M> zvJa`DwARA>MfxEgjV$D6(8g=yHTydjb}qkEq}tIs6VW08_B_)O_9V&B5>ls;cwC4X z9H*h8Sd5_0sGSaTa2nYrIm2+nCPMF$DB*v^qR;ALs^ucIhxx{Z&`gfTgD2EG zcv(9r)(@Y6=m0~x(taq`ilu7NP{ii2gZ#AqIFtULcTr2-A1%;i-?FnAfhZh*xe+?A z7TOH3^y@8aa8^RpTGJY3JLYN8ams#T%;kukx?MtL*uSA1V(hb9Xp(b&mi~zlchc%y z4{%4oyoLN#)t62#BdW9P_>EomZG3GKVJ;mk)J~s^IWLRGZf-xu=1Gb>F#L=wkc)6j z1PW!ZcNW|fni$u6Y#zSdOqE~?K6GWV6o$<#io;XcS3kh~_le%QLYA?B+puWCCyMfS z>i*s^ZftLF{X2Q1VyAyMVu|||j=Z0;`z|eaVvzbx8V*&|Yf{I(A-O+k$F3SkEln%8 z9Yj62xG>ydkQs`?pC@|vCF;hRNu7RX{ANv)QR@s?@(#xgsb(HsXX9XwL#rpeY~y=^ zw+?1qW{<^Zr%upBx&IwW@&&HTnJz?)*(dEN1xB3wI?aje(P-$hU#e>PwcN7%Q(0YmEp5AZUcqjnR zKfXr%Z*bX9c3LaJpgw^C#{V1KzXR!iLi{JF8sY?z16V!;0nzs$a7*TLp^BI)uy8`Z zKcM-G)s*+15%fSv5w)^tPbPQWo0>CognRKTFY=?`SWt}s22Y703it`J#20>GQbpb7 zZ-4YbR5<$F0B1?K*+YU?I}|Oa%!vF(x>9t+DOBkj!*hkg;$1;fB5F!Yx2L^MF!>xy66*Z1C4PX9P?V+2_M|j$mkw)fKbWn5(x$PUBOC?QCz| zqR3o{)3i7Z^$dvVIf!J3)rFG&r2nDz%kx`eWUviAMu*g(WnLZBkp<-FD86~?2UlCn z!@usLWo07a!N1CW%Vd><|Ji={ANL{f$Nw+Q zi2oempY13A9-z@59`4To|7$bKKS%keocQ-B-yr?i{*3Y;aq&;rfAaQ!T$MThi^c!x z_)i}Ek0T$~|C#x}S@ECF|IG9MIHz#`asIz#{XfU~XDa7i2o(Alw@JR-J%c> Q@Zf(TFoO^A{(koV0J5x+kpKVy literal 0 HcmV?d00001 diff --git a/proba4.xlsx b/proba4.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3b6c0092341b081ec04e7a034bc91854c40ce614 GIT binary patch literal 15388 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