From 58fdf6a36143acc03806a4c27e8ede895082f7e9 Mon Sep 17 00:00:00 2001 From: Nitish Ramakrishnan <69108657+niccolopaganini@users.noreply.github.com> Date: Fri, 22 Sep 2023 12:12:58 -0600 Subject: [PATCH 1/2] API Mirgrations script changes - Condensing 12 python scripts to 4 with more distinctive purposes - One bash that calls them and deletes unnecessary CSVs - Pending: Update README, setup script --- bin/API_migration_scripts/API_cf.sh | 45 +++++++++ bin/API_migration_scripts/CSVs.png | Bin 0 -> 61791 bytes bin/API_migration_scripts/README.md | 83 ++++++++++++++++ bin/API_migration_scripts/c1_m2_u3_s4.py | 82 ++++++++++++++++ .../l7_sl8_cs9_cswc10.py | 91 ++++++++++++++++++ bin/API_migration_scripts/me11_mo12.py | 46 +++++++++ bin/API_migration_scripts/o5_up6.py | 58 +++++++++++ 7 files changed, 405 insertions(+) create mode 100644 bin/API_migration_scripts/API_cf.sh create mode 100644 bin/API_migration_scripts/CSVs.png create mode 100644 bin/API_migration_scripts/README.md create mode 100644 bin/API_migration_scripts/c1_m2_u3_s4.py create mode 100644 bin/API_migration_scripts/l7_sl8_cs9_cswc10.py create mode 100644 bin/API_migration_scripts/me11_mo12.py create mode 100644 bin/API_migration_scripts/o5_up6.py diff --git a/bin/API_migration_scripts/API_cf.sh b/bin/API_migration_scripts/API_cf.sh new file mode 100644 index 000000000..cb8814067 --- /dev/null +++ b/bin/API_migration_scripts/API_cf.sh @@ -0,0 +1,45 @@ +read -p "Enter the URL which contains the API changes: " url + +python c1_m2_u3_s4.py "$url" +sleep 4 +python o5_up6.py +sleep 10 +python l7_sl8_cs9_cswc10.py "$url" +sleep 4 +python me11_mo12.py + +if [ -e classes.csv ]; then + rm classes.csv +fi + +if [ -e modified_csv.csv ]; then + rm modified_csv.csv +fi + +if [ -e unique_classes.csv ]; then + rm unique_classes.csv +fi + +if [ -e simplify_classes.csv ]; then + rm simplify_classes.csv +fi + +if [ -e unique_packages.csv ]; then + rm unique_packages.csv +fi + +if [ -e links.csv ]; then + rm links.csv +fi + +if [ -e simplified_links.csv ]; then + rm simplified_links.csv +fi + +if [ -e changed_scraped.csv ]; then + rm changed_script.csv +fi + +if [ -e changed_scraped_without_column.csv ]; then + rm changed_scraped_without_column.csv +fi \ No newline at end of file diff --git a/bin/API_migration_scripts/CSVs.png b/bin/API_migration_scripts/CSVs.png new file mode 100644 index 0000000000000000000000000000000000000000..0dcf7fb9ef4f6ee3077f4e30454feea07c35e448 GIT binary patch literal 61791 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%0A4}JCg6mhdePUmn1MwdnX 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 literal 0 HcmV?d00001 diff --git a/bin/API_migration_scripts/README.md b/bin/API_migration_scripts/README.md new file mode 100644 index 000000000..63b3b451a --- /dev/null +++ b/bin/API_migration_scripts/README.md @@ -0,0 +1,83 @@ + +# ReadMe - API Migration Automation script + +This README allows one to successfully run to the API Migration Automation scripts. This script searches all directories for plujgins and then stores the changed methods & fields in a CSV. This script DOES NOT change code but automates the process of finding packages required for the API migration. + + +## File(s) Description + +### Python Scripts +| .py | Description | +| ------------- | ------------- | +| classes | scrapes packages/ classes | +| modified_csv | removes unnecessary info | +| unique_classes | compiles a unique list from the above | +| simplify_classes | removes unnecessary from the above | +| output | compares the above csv with all the plugins form the given directory | +| unique_packages | removes the path column and compiles a unique list | +| links | scrapes similar to classes but stores them as URLs | +| simplified_links | removes unnecessary info | +| changed_scraped | gets the methods with the URLs and desc. | +| changed_scraped_without_column | filters to the methods| +| matching_entries | gets the matching packages | +| merged_output | gets the name of the packages, file location, and method name (as a whole) | + +The above python scripts creates the following CSVs + +### CSVs + +| .CSVs | Description | +| ------------- | ------------- | +| classes | scrapes packages/ classes | +| modified_csv | removes unnecessary info | +| unique_classes | compiles a unique list from the above | +| simplify_classes | removes unnecessary from the above | +| output | compares the above csv with all the plugins form the given directory | +| unique_packages | removes the path column and compiles a unique list | +| links | scrapes similar to classes but stores them as URLs | +| simplified_links | removes unnecessary info | +| changed_scraped | gets the methods with the URLs and desc. | +| changed_scraped_without_column | filters to the methods| +| matching_entries | gets the matching packages | +| merged_output | gets the name of the packages, file location, and method name (as a whole) | + +#### Image 1 Below + +![CSV_Files_Importance](https://github.com/niccolopaganini/e-mission-phone-nvsr-iter1/blob/16b6ba09b3e6dc37e0927b6ff338400e3236e28b/bin/API_migration_scripts/screenshots/CSVs.png) + +## Setup/ How to run + +### Setup +__1. Navigate to the directory__ +``` +.../e-mission-phone/bin/API_Migration_scripts +``` + +**2. Grab API changes' link** + +Copy the link which has the API changes mentioned +_Link should look something like this:_ +``` +https://developer.android.com/sdk/api_diff/33/changes/alldiffs_index_changes +``` + +__3. This command runs the shell script which in turn executes the python scripts__ +``` +bash bash API_cf.sh.sh +``` +## Expected Output +Excepted Output will be a CSV file (```merged_output.csv```). The file opened in an excel will be in the following format: +``` + | | +``` + +For example: +``` +content | /Users/nseptank/Downloads/e-mission-phone/plugins/cordova-plugin-file/src/android/FileUtils.java | ../../../../reference/android/companion/CompanionDeviceManager.html#hasNotificationAccess(android.content.ComponentName) +``` +I formatted it in this way because the method has the "full extension" so having the directory location in the middle can allow one to look at the classes on the left for a high level view and can scroll to the right for more information (basically quality of life from my perspective). + +#### _Reasons why I didn't print changes_ +1. The whole process on average took 4 minutes to run. +2. Quality of life - Looks more presentable/ easy to understand +3. Work span can take more time and this will have to be run just once. After that it's just you referring the CSV. diff --git a/bin/API_migration_scripts/c1_m2_u3_s4.py b/bin/API_migration_scripts/c1_m2_u3_s4.py new file mode 100644 index 000000000..b7b041fbf --- /dev/null +++ b/bin/API_migration_scripts/c1_m2_u3_s4.py @@ -0,0 +1,82 @@ +import csv +import requests +import bs4 +import pandas as pd +import sys + +def main(): + if len(sys.argv) != 2: + print("Usage: python combined_script.py ") + sys.exit(1) + + url = sys.argv[1] + response = requests.get(url) + soup = bs4.BeautifulSoup(response.content, "html.parser") + + links = [] + for a in soup.find_all("a"): + if a.has_attr("href") and a["href"].startswith("/sdk/api_diff/33/changes/"): + links.append(a["href"]) + + csv_file = open("classes.csv", "w", newline="") + csv_writer = csv.DictWriter(csv_file, fieldnames=["Package Class"]) + csv_writer.writeheader() + + for link in links: + css_class = link.split("/")[-1] + csv_writer.writerow({"Package Class": css_class}) + + # Modify the CSV + csv_path = "classes.csv" + with open(csv_path, "r") as f: + reader = csv.DictReader(f) + with open("modified_csv.csv", "w") as fw: + writer = csv.DictWriter(fw, fieldnames=["Package Class"]) + writer.writeheader() + for row in reader: + class_name = row["Package Class"] + class_name = class_name.split("#")[0] + class_name = class_name.lstrip(".") + class_name = class_name.strip("[]") + class_name = class_name.rstrip(".") + row["Package Class"] = class_name + writer.writerow(row) + + # Create unique classes + with open("modified_csv.csv", "r") as f: + classes = set() + for line in f: + class_name = line.strip().split(",")[0] + classes.add(class_name) + + with open("unique_classes.csv", "w") as fw: + writer = csv.writer(fw) + for class_name in classes: + writer.writerow([class_name]) + + # Simplify classes + def simplify(csv_file, output_file): + with open(csv_file, "r") as f: + reader = csv.reader(f) + lines = [] + for row in reader: + new_row = [] + for item in row: + end_index = item.rfind(".") + if end_index == -1: + new_row.append(item) + else: + simplified_item = item[end_index + 1:] + new_row.append(simplified_item) + lines.append(new_row) + + with open(output_file, "w") as f: + writer = csv.writer(f) + writer.writerows(lines) + + csv_file = "unique_classes.csv" + output_file = "simplify_classes.csv" + simplify(csv_file, output_file) + +if __name__ == "__main__": + main() diff --git a/bin/API_migration_scripts/l7_sl8_cs9_cswc10.py b/bin/API_migration_scripts/l7_sl8_cs9_cswc10.py new file mode 100644 index 000000000..56d90b4de --- /dev/null +++ b/bin/API_migration_scripts/l7_sl8_cs9_cswc10.py @@ -0,0 +1,91 @@ +import os +import csv +import requests +import bs4 +import sys + +# Define functions for each part of the original scripts + +def get_links(url): + response = requests.get(url) + soup = bs4.BeautifulSoup(response.content, "html.parser") + + links = [] + for a in soup.find_all("a"): + if "href" in a.attrs: + links.append(a["href"]) + + return links + +def filter_links(links, output_file): + filtered_links = [link for link in links if link.startswith("/sdk")] + + with open(output_file, "w", newline="") as f: + csvwriter = csv.writer(f) + csvwriter.writerows([[link] for link in filtered_links]) + +def get_changed_content(url): + response = requests.get(f"https://developer.android.com{url}") + + if response.status_code == 200: + soup = bs4.BeautifulSoup(response.content, "html.parser") + + tables = soup.find_all("table", summary=lambda s: s and ("Changed Methods" in s or "Changed Fields" in s)) + + contents = [] + + for table in tables: + for row in table.find_all("tr"): + cells = row.find_all("td") + if len(cells) == 3: + method_name = cells[0].find("a", href=True) + if method_name: + method_url = method_name['href'] + method_name_text = method_name.text + description = cells[1].text.strip() + + contents.append([method_name_text, method_url, description]) + + return contents + +def main(): + if len(sys.argv) != 2: + print("Usage: python combined_script.py ") + sys.exit(1) + + url = sys.argv[1] + + # Get links from the URL + links = get_links(url) + + # Filter and save relevant links + filtered_links_file = "simplified_links.csv" + filter_links(links, filtered_links_file) + + # Scrape changed content and save it + scraped_content_file = "changed_scraped.csv" + with open(scraped_content_file, "w", newline='') as f: + csvwriter = csv.writer(f) + csvwriter.writerow(['Method Name', 'Method URL', 'Description']) + + for link in links: + changed_content = get_changed_content(link) + if changed_content: + with open(scraped_content_file, "a", newline='') as f: + csvwriter = csv.writer(f) + csvwriter.writerows(changed_content) + + # Remove the first column from the scraped content + with open(scraped_content_file, "r") as input_file: + reader = csv.reader(input_file) + data = [row for row in reader] + + new_data = [[row[1]] for row in data] + + scraped_content_without_column_file = "changed_scraped_without_column.csv" + with open(scraped_content_without_column_file, "w", newline='') as output_file: + writer = csv.writer(output_file) + writer.writerows(new_data) + +if __name__ == "__main__": + main() diff --git a/bin/API_migration_scripts/me11_mo12.py b/bin/API_migration_scripts/me11_mo12.py new file mode 100644 index 000000000..c0e9bb649 --- /dev/null +++ b/bin/API_migration_scripts/me11_mo12.py @@ -0,0 +1,46 @@ +import csv +import re +import pandas as pd + +try: + # Load unique packages into a set + unique_packages = set() + with open("unique_packages.csv", "r") as unique_file: + reader = csv.reader(unique_file) + for row in reader: + if row: + unique_packages.add(row[0].strip()) # Remove leading/trailing whitespace + + # Load scraped data and find matching entries + matching_entries = [] + with open("changed_scraped_without_column.csv", "r") as scraped_file: + reader = csv.reader(scraped_file) + for row in reader: + if row: + url = row[0] + # Extract words from the URL using regular expressions + words = re.findall(r'\w+', url) + # Check if any word from unique_packages is in the list of words + matching_packages = [package for package in unique_packages if any(word == package for word in words)] + if matching_packages: + matching_entries.append([", ".join(matching_packages), url]) + + # Write the matching entries to a new CSV file + with open("matching_entries.csv", "w", newline='') as matching_file: + writer = csv.writer(matching_file) + writer.writerow(["Matching Packages", "Matching Content"]) + writer.writerows(matching_entries) + + # Merge the output CSV and matching entries CSV + output_df = pd.read_csv('output.csv', header=None) + matching_entries_df = pd.read_csv('matching_entries.csv', header=None) + + merged_df = output_df.merge(matching_entries_df, left_on=0, right_on=0, how='inner') + + merged_df.columns = ['Package', 'Location', 'Description'] + merged_df.drop_duplicates(inplace=True) + + merged_df.to_csv('merged_output.csv', index=False, header=None) + +except Exception as e: + print(f"An error occurred: {str(e)}") diff --git a/bin/API_migration_scripts/o5_up6.py b/bin/API_migration_scripts/o5_up6.py new file mode 100644 index 000000000..01c4fb99a --- /dev/null +++ b/bin/API_migration_scripts/o5_up6.py @@ -0,0 +1,58 @@ +import os +import csv + +SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) +PROJECT_DIR = os.path.dirname(os.path.dirname(SCRIPT_DIR)) + +PLUGINS_DIR = os.path.join(PROJECT_DIR, "plugins") +#print("plugins:",PLUGINS_DIR) +CSV_FILE = os.path.join(PROJECT_DIR, "bin/API_migration_scripts/simplify_classes.csv") +#print("simlify_csv:",CSV_FILE) +OUTPUT_CSV = os.path.join(PROJECT_DIR, "bin/API_migration_scripts/output.csv") +#print("output_csv:",OUTPUT_CSV) + +def ensure_output_csv_exists(): + if not os.path.exists(OUTPUT_CSV): + with open(OUTPUT_CSV, "w") as f: + writer = csv.writer(f) + #writer.writerow(["class", "java_file"]) + +def match_csv_java(directory, csv_file): + java_files = [] + for root, directories, files in os.walk(directory): + for file in files: + if file.endswith(".java"): + java_files.append(os.path.join(root, file)) + + if os.path.exists(csv_file): + with open(csv_file, "r") as f: + reader = csv.reader(f) + for row in reader: + if row: + classes = row[0] + + for java_file in java_files: + with open(java_file, "r", encoding="utf-8") as f: + text = f.read() + if classes in text: + with open(OUTPUT_CSV, "a") as csvfile: + csvwriter = csv.writer(csvfile) + csvwriter.writerow([classes, java_file]) + +def get_unique_packages(csv_file): + packages = set() + with open(csv_file, "r") as f: + reader = csv.reader(f) + for row in reader: + if row: + packages.add(row[0]) + + with open("unique_packages.csv", "w") as f: + csvwriter = csv.writer(f) + for package in packages: + csvwriter.writerow([package]) + +if __name__ == "__main__": + ensure_output_csv_exists() + match_csv_java(PLUGINS_DIR, CSV_FILE) + get_unique_packages(OUTPUT_CSV) From da2e2ad36b87eae00453be80b49d4ac00c65b3b2 Mon Sep 17 00:00:00 2001 From: Nitish Ramakrishnan <69108657+niccolopaganini@users.noreply.github.com> Date: Fri, 22 Sep 2023 12:31:08 -0600 Subject: [PATCH 2/2] Delete bin/API_migration_scripts directory --- bin/API_migration_scripts/API_cf.sh | 45 --------- bin/API_migration_scripts/CSVs.png | Bin 61791 -> 0 bytes bin/API_migration_scripts/README.md | 83 ---------------- bin/API_migration_scripts/c1_m2_u3_s4.py | 82 ---------------- .../l7_sl8_cs9_cswc10.py | 91 ------------------ bin/API_migration_scripts/me11_mo12.py | 46 --------- bin/API_migration_scripts/o5_up6.py | 58 ----------- 7 files changed, 405 deletions(-) delete mode 100644 bin/API_migration_scripts/API_cf.sh delete mode 100644 bin/API_migration_scripts/CSVs.png delete mode 100644 bin/API_migration_scripts/README.md delete mode 100644 bin/API_migration_scripts/c1_m2_u3_s4.py delete mode 100644 bin/API_migration_scripts/l7_sl8_cs9_cswc10.py delete mode 100644 bin/API_migration_scripts/me11_mo12.py delete mode 100644 bin/API_migration_scripts/o5_up6.py diff --git a/bin/API_migration_scripts/API_cf.sh b/bin/API_migration_scripts/API_cf.sh deleted file mode 100644 index cb8814067..000000000 --- a/bin/API_migration_scripts/API_cf.sh +++ /dev/null @@ -1,45 +0,0 @@ -read -p "Enter the URL which contains the API changes: " url - -python c1_m2_u3_s4.py "$url" -sleep 4 -python o5_up6.py -sleep 10 -python l7_sl8_cs9_cswc10.py "$url" -sleep 4 -python me11_mo12.py - -if [ -e classes.csv ]; then - rm classes.csv -fi - -if [ -e modified_csv.csv ]; then - rm modified_csv.csv -fi - -if [ -e unique_classes.csv ]; then - rm unique_classes.csv -fi - -if [ -e simplify_classes.csv ]; then - rm simplify_classes.csv -fi - -if [ -e unique_packages.csv ]; then - rm unique_packages.csv -fi - -if [ -e links.csv ]; then - rm links.csv -fi - -if [ -e simplified_links.csv ]; then - rm simplified_links.csv -fi - -if [ -e changed_scraped.csv ]; then - rm changed_script.csv -fi - -if [ -e changed_scraped_without_column.csv ]; then - rm changed_scraped_without_column.csv -fi \ No newline at end of file diff --git a/bin/API_migration_scripts/CSVs.png b/bin/API_migration_scripts/CSVs.png deleted file mode 100644 index 0dcf7fb9ef4f6ee3077f4e30454feea07c35e448..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61791 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%0A4}JCg6mhdePUmn1MwdnX z7ZB0jmF1Sd4<)~H=|(M;@vCQZp|F!B<0T_A!_$Dq=MDcxGThsI6~{|K3u3UVe$SQ$ zs0D}16ov5CV|-6}Dy!Jp1o$YHfM&Xzz*J_%KHZg3Cseofx$3t0c-sVN%D(2pX$584 zy8L>g_Qp$WX_`_}(am>i%vI_Pzo*|?WKfhJw+Opx7SZ9y;s;?Xdc3+qXOG_L^jkQ| z{!+q>M1L!IO6qjG`%JD(ii%qkQ39@@X&H9S#$ zgEGF^(Su!=`mggHo^)0wXv+JrZg>YQ6Pu=%iVxsQxIl8>Ia=#77egB`H-~J{y)LMO zU3gU4KDEf0Ls)rvt1apfbJI*-#g}U(V;maeCsTyr0v~gg%!wjn%j@~Ey8xTjPJ}6H z<+p{EYz7^L19!kRA00Uxbm0mv3-dZS8Z3m#`ft^4k^(3vHkdm|-sZCaIb4vJUenx` zCB+HRH%jbp_>a;UWf|8MbBJ=A-gu+cOeykr z!-kk8@h67GY*h5(Wz?dr(T6qJ*F-uACjZ{`;r0ps(uk;!=E ztOu>lIhx0->rsFbadCR^8xfAO+(%8lVqS{i$jMnmCYTPB@ zaA7;knOGT7gWOGmH4&SYt(PIjmbxXMkgU4rw(u9AH$YS#3d88w`j$UF4Is{-GT0i7(bL>$aJ zpGl`)%c#EL%Mf@ocsF%>k-xQXCsd4vfnf5EGpPUi)hWmz1u5J#z>3!nOup6hDQS@tLZg(7&I}xM|pwb8cGnOd{+1$wSAoA%1PW!Jk}lKS0dM+6jOu zLX=ww7MM@PPYy`M@e$oYK9mCSOp(&nX1{HZ9M~OQXkLL?2qpOJ{knmg2BSV`vU$da zd4LphB5?atFe;1Nj?Q&9fEDpkwesR(7W#&L>y}XOi3lU}%-IAt{yV>WbJ+o#k|gKv zr*%(+&>hXTephro1xDwY_^83#`s+slw`cFwlA^OnU3J?OUyBWp5LB2R9L5%d+kB@0gbTrVGqvAo4q5E%|UBI40c%d5xNn2x|`5{!7hyfDkgb$|lLE00zyi zo{olLkfxYj&_P94g$g!R*?`(47H@4A9RkZz@=6oErdjn2AODNHfNltMD+~&`90pj* z<>}Sw{NHfa^CKUyy7jN_V2^-hXUw@Xxee?lE*TB*4z}_A(joocN=^Yx&XRsh%-(!S z511=;X0qlE70G>%P>yb*B19|w8pDICExI}hx;I{vS(qZPWg&W-)9R>Bh9A>Y+k>5o zp7onk3PYWtRuY3x2Rl`)C0G|`Hw`)!+Z{4-vZ5-^D}D~!ny;E!N|4E0ud=^^)mUr_ zQ%kUR&#KA~LIyiqhaHT4fxpwNaK(3*pdFmH9Un|CnC1={78|S?>@@gN3)$1MUcJ-p zFjqBv%t&BX@iRC(ET$s4;-^@4l&P9yIihUKA+s?v>=3U@syid9w9p|&hOF3nwJPq) zBBr9EVwgQW>d+4smDTUyZ?!4k9LVa5+a;xC=W|-)NYVIC2G8sZKieJNyd4%sf|v?K zi<|qVX4}f))l}|KC&S!>HdPDD?Ig$!5}j>ez-V)EZ8R_sJ*l}Pe9`sug&#wk$vV@F`Sy-#R3+W(iU8jC0nvy zt&N_zh$<4VaJ@F)J?s>FR^oiwN7rEHb&|38MglrkS}=*(p?kcVQErXdZ@#Ji665-p zg%@(WaHvyHbm$t>uDz)WH#<-50$EFBtENXeSEWZ$|5bvHR%zWc0U%Qc<3?Ci*hGdu zs7REFd*3<+y>6;OTQN+S8O0`^dEMu_MoF*dZj%=*9Y}Guq2XPp%@o2A<{DGfU*Y=7 zPJ(gmq&%;fNG;I3;gJTiztb_IBr`*vefM!MLpp-XR|kb5tSDwd(DkmgY|dz6zXPo?Wdm@M-p^B`;>-!qyg#g z)aj$0h;ckCTD2ds$-`M}>#Ts1ay9QSlLuZpWHzL4N;Z+zjT2vj0B+PVwFSR6<#Khp zXxi3esB=8sr*60g7Nr6uzP`Yq7unoq<%b|EQxi!9ez1X-47tbFsQwqeo+g?LS5Be7 zBeT=UwmUbSUiOCy${f|~EzK^2_^bDX3)5u62pfIc9imEftw+45rY)SNS+Ck0Fi?nC zQk9gxiAUPAg*~b~hWn-o`xldk_xz*RDhz|S$Xi+aD|qroeJ3|7UZ$4FSewWBGxwW# z-PiOC2prlIJ}j4p3(eeKBWd9*Cs=Tnr>Y#k_`>AFN@DQ( zOhUjhE2f7-N|29SuCuRfAEuP4EG0CWTgkL+u?|1X8u=^^sNz>r?He%?mlv|LO|NvQQsNg8#axY>G8BK@bq?GqgnsWaTv{NxkeOXvx!?Xh`LKjuN&n2}hQX$CTvYbfAfTjXne5uQIMj7I8}u6eZ5u1m zOf&diI%F+_SGW0OX74@2$+SdWRw?aJqbgTjlxuOj(W5?qXF88C;r)R+aMp_wi8(yP z)|YfF2*{g!DVt!k8Fk2L@K-exL2_BbP`RF_&@3r6i^KiJiG`sIGnCW^PSUv6LR?3= z=?CmT0;U%jS3Te5GACCIDAc@LkK#@KQV}zo?bvr{qLc=A>tn1@wrfb@8e>ZywdI&q z_OLy8_UX=hl>yoZM$g6l8LI$N2AL^jO|T);AHN82$ zpXQ+i{60+U4Jp$FYOgipq|+xt{|I;R`WZN z#7xz{1^-Ory`Iwf{=4S=yly+KcyY2DtVsnYQiAi(h50?*o2MH+*BU;Ci&6`*X=V*F}A6lRGOp@B)nZQlEVb62?zvc``EaF5_|m8NvDtx>w4(T>GDSLo=eeRGwj0W$Pi z_br&n=%@;|*8?ju=8GA~WCYh(5ML@aidwTyId6x83zb3 z`ea^aS#B7MFg}(>2z9W$4wF^JHyZZ@Su#+D!ec-(yi((Klzl#9CB*exuuH$}J7jFi zCc|fZP?FL4GSUWA(fF;m7}IBhF27=`(*PmfdrA4uP0lZjoga7~254t^bTPX-WIQeZ zYZ{Lex831;66I`y5bHJh(AU!8ABzB%XK$2N94-$49u7tw{V0?DuSEj{rmF@YCkA&% z&%Lz*58;!G`%e_6D+WR}US3*fx8~GJ>K6R+yKl+9;2bd6U;i_lh}5}v*K`OJFlu_7 zc8t!(KhB1q%nrZ7Y9v=k!uGyDGa-p?5D)7ocok)Sj9(pPqUz`eL(;q=P?}axSp4AU z=(}_JSud4)Kl%7)t`uiwGu+JrR}B1HI-n)0ExO%Yn!vsD-J^hhM}%zbhJu&v+`~sq zdgd!Y5{9Z6rm%++G_O9O9})**v8jNAzkMGnNU~M`*-R_@0T!LAK%CWO?gx30WuCtCyY9E%jD9sv+{(UkC z3pn}Q$9fEtk5F16OMXkhvf&YA$QIs71e?~xoN88w43jyc=Z0?lWredq*+3D2!Oo)ELsw(tnvM9Y8TwCw;^Njjsc!Z! zR&uJ9X7gUojhqsEF&A!9{2^DGvPBPDzv^@^-xvO6qkYiz?6+=Jlx*ib%l<;AS~gtK zu9^A=nIiyydOHv89@W4%p`~=xQK1?|hsUR)A+Fpco5{adw!;M;Y0}zM0W+m|!fF#w z;!eer`p8UE{U;G4{IdMjJdL;>vjHD}1d`2aJl3^AhJ3S*>5LyqP8c9Gct`ANL}^xQ zRCmyv^L9G=Q9Z*>$|%yqdK)YcwW|TEjVu<$$a<>TWN3F&`6Tz0sH8rtQ16+hC%`E& zjEWlY2NzG?_Ep~U0Pm?>rBhbaEjO8L+d1b>%kn+5X6euLx%naB@h@sZa9fX6kIo7C zd)Eo6i)=(V3hXn{A-^>_S2zw7{T}!(^BW|WDX%eCd9KMQR)#bwts8*uqKgx0-UB$P zdWlfl`L6?uq}dk^$X;}DCVXynHgV?p6R-q5feoCmORsSTE)cVQ(s-OyIw#JWWadYa zv)N!ccPGB2>nVfblZZ8>V_4#TWEpV>?K7h`C8R})!3E&?Hr^Ot8Ejv`o>%#7s@`t$ ztB(k+9*jpBPvP0 zG*1HG6YNRCd$CjentCU)M*5mhvtH7_v&Bb@kH5;w@64l_NhK>OrsQS!52B0n?6wqEgA}Dc_#ul??+Fo*Y=;{E3Cd#W+Gg7v>&ZOX~T14sNuoc}-K{{#AjvNp)TqEI6laE-c}`QV zJTxKaa~Aq@@m?unyka1T!8@>W(I)<`h*YHW3*>jEZ)%Y&vw2Ivm?55jG>30ZKb)Bm zBR4wxoiwyT`TK}(u6Wfot$1MSTBgdt$6UURtG`L#Zwq-Fn&UmY*RsqhXx2IIc3CA*`A%ehOs>@H0a#gs1|*=AA4Kz|I|MHUm25$2R2 zIqzp;wW7>>$Lfx3S0)|ZTjcy$6KnmA`jlh|_6|1a2Q{bzDj5rpWcEf9sYfDQ+ zlv!plAQ&z1v+hrSo(~I(b_Q)tMmlaL`lBKcjzx+|A@hZYNbJ5-CQmrl3rBAGqSeG) zV8k+Ay88mJs}6rHp6pcV3ez%(%yT^|#KCaF6_>2DYbBZUUniGtK7`{uHc~Z7Q45pb z0rXA_Kli8mb1O>f)z&K?5(@87I&I4>dYPx{N$b-HjJpGi3-}%%ytnJ-C#gE&08t_J z6faZz=Q~TL^g~z!BFdScYoGn+98pih?-o6MN1c3UXY`S7>_Y-sMZdGiKaeuNN)Fiz zq0WMQ;5Qd~iZaIzy;T;I3*Sb=d1(^%Qmy1ZdHuiF%|0al9rNnXYJNZokdz5QI;YsL zgWxs9^<_NF^cD`{pJ^nN8d_oEHz9KDn<3)P6vlKa0Nqh^fwaOl^BVjAE_Q36<{V|O z2!$CtOD(G$`T5Sw&V-G^6)>%wogsSS7l*c`Ze;~7de(m$=fHH^bHjW#=LZwbpI3zv z@*~ZLk-1vUH2`I*OM_FYe5NQ}8hh?WP?}g(a9&(7_;yiGYBSS46oBh%8%GxU{{BPs z2?3S)H%mPLza*Q?Ws7mslg97O?tHK!fbyjp=q>t}e`Ui<4k)vQJzeMhlPMCiFZpRV zxv$S^n;f|;_-sB}ZOyxUSfQuZyh2lI%QkWrJe4uOXC0!~Kb!mski2M;9{Nt!&!|E& z%+%3iMTV14hR?+Qkm&yh4qKA_)%;aC_fp@HFsrSas;ch)%W9(eAbQ>*k98(GXw>b2hx}vtk=kEZZ4| z9b!0OT#}KxD6<*LUdFQQVK$&uh7ifl*8r2l=3r6RC3i49k{xh9{SQ?Qyyu3YlhMOf za~S8}+5ZXw{{7+kcxfd+2)KJcV%1uK)KN-U-Hi zvNS?!Opu!M`OjpeTV~Gv;$-L^Z)-f{^&`#u_Sfj!mb`5#rfxZ|NW7n zk`o!GuB1!!r~UtJ?w#PXC%^}1V}3U~|M%-h34smOuKS_l|Lv7*><8JtrKYd{zh3;q zfH4O1ImvX;-b)>@R{9~(?bK{w3=r^4#ytMbpB_H`KhM!3+zV-`Vj_>w>Z1=WIP7KnHmvkS zSaNtak6|y2w$?8Vf(Ua?lrXPJBD=5@Hr{@&$M|Q7V6*RQ9-!vd|LxHm;30hEkpx9J zB)6PUSQUuNureJf_GXjWhrvm=EpuYJV}P}}an4<)fK` z@vhZd1LCLsv9F*ESb9~sHng@Y6reqZ2*zh`I%3XD)i1p+k|*5^j*%EKvfAN#il zl`$f)<`(+^{LlE|B~oKBG90VNH&5r=hQJt<#Mg^ni+h8>-nL#P_uI@=E@JMj`A!-{ z?hHK_w!DPI-gWZ1mv5H1FKBC+&-*_U*=3DFYNay-c0lqD=Y6nTcI$JqPuTlx5^P-F z9IZY_AAih^m%`_@#9F#$nmTD{M}yz6SZWd(nP$tx*L5v25yc`NhhRBu$E3%vHH_DL zzAKyf3oDEGBou`(Wof>dWAoelc~U1kP=xxQQ7@AtWd51ZhEJc1bw)Ub#(|HI+KFO7 z{#>=KpZb7lfGK`^7gxH1-4lHYt$RZ+ zDlV0af)#pkoveaHVrAZQS+&w~;}=SqXqmNOriY+aJs*r-estw19g{nl3t8x(Oh%@; zxwigAS6N=g_;pPCzuVmIrxwcBKEh_gzr~++-wFmFyL|6idSd`txt9sX)ip*Rcju@= zG}~Ucl_*R-Xl-=5+Yb+UeH5%(Rvfaot1a`2m7c5@@6}{%88(!i)LH#f)Za;vvV1_K zHS%caQWa|X!{PN#6ak|BlX>kAPcg_p_XA-!=IDF3Rr?{`W_aFK3b!Lk1iye3lvx8| z51g)Q``=hEF~M7JXc_QVo^d&3k-t=xWN2YH{mb1PMM8l4_%hw9saNO6NRb6Ac$U8GwHh+@6rn|;eVF1Vi#Foc`{L7D2iSinh#?tK80SL;wF-q zkiMEYlci|I4GU9*5<*EnzMqbMQy(s6S@wuJV8GtQ{XlbOjVbG%I(`;WY495gBY{B* zg<&xbJ>VuGy^P@~*%#`~ZS={OWSU{4kDjxTq{Kv+GH(~US~&bTxyr{kx%rbQ{pleJ zY!7V_ut8)#-iR%HwDIAKyaulr;Ix6et9uR?-+PxGq;3gi*)#6wm0J$Yu6UxmG~ zweHh4!90|USM62mrL8SbLiWT^O$PJ^O-1x9qnQF$XBB%Bh(9=Y1?;l^JEaLiTPT4$ zSF)oO!z|6}J_1E_M{9^+y`-S`wImX5FnXfxyJ9XJn-cZgR8C74v2SSQw!d6VtD{-_ zNEVPdc`lvraB^@gjy@zPa@BgD+WbyIwVBh*nUgpt`aK%DAJ|S!cEQMV-tEvVi_DAI zN`_Ks2u2G#i9$mQj}wFsv|!n?bXnZcgCudtPNDGn=Rt+jEr*f}4be}rnR$}v8hD{= za?f?;Go?d8yRC^QPabek6+-^m0b1fzv3n1+N%8iG-Inl*W+8k?ZXK|!)^owvZP+ce z>|3zHFmI{-%F%SiSQNr|yXJBOZJhsS%}ooXQ=4CA zys2d?tt7?0LcYnww>eVEme)6p=wjj5tBjMWyP&h~*~Hj!p7q;AT-8>eKsKyy@(-@6 zx>sR|#M`e}UrA7LgF*`-o)QnfI>;3!AR%iLtA^6Fe-iWrN?^CbJrZS-W_f`()m>-| zv22_T;>4v;2~mu|i3%QKu*n=Qr%^Se^9J9FZdG*J;1k6g$=sMx!XYL}+oCz%-;J0cC_$NH1HN?PK z%17d8UIZxZ`1cyE{AayOi4ro4tSW}R6NRLb@lZ{0zCKo+Ghq!Bs=xQPZ&J=fieYN& zqv*$Hslf!*d`@;N$r54*GL<#%u=#FtoLSbqrd2ZeR+a}Y>UAXSu0@YHd>$;;ASn9% zz_p;4q<5J}RM#|5(~r%J3@urCJnz@(uojCy@rI0uQjEd#HKk)UR}y+EQivj6KulTt zf^4-|lEG!6&Zi&5#>Tv7J7T3GfGPxpu-=4;0D7_?nYnIkb%MB@|6XRc)XnA69vOx@ zCAm|MEPJV%C~UV1RA8Cwp_{zw28(61#kD@gmq$ILzQEWVYTWu&|D`?{mQx_WE2{dj zz1UjO;;Sv?7==>5eE1NkV~V06lmhmx{cpxccMC#OzkS{+q^xKk)1*+MqEfnBV7G7x z6nMuBKsB>7ynPQE4;#Hp{DvwnO#Gy-QIqo5#h&LbH7YDr)}YkQMLt0RH`1GyTVLjk zy&*&wDH$H4QvP@HtH($_nrI~Az2E%!Dz&_3`O_gnQ2D1~^&Z%giUAE&GdE6+$qv^# zo-=(avuxt^rAh0~yyll%4`beSw~pHe>onA0#9Fb)di!1WurQ)}T}Jcn~`X1wVY9^5vv$_hz}kVs}-p8x;APWq@kK);VSk z`PnRc1@OFH;OX{5ZmF`08oXfm*cQVCojWQ#5I5n@*ZzFu;`h9(Q)iGro}2tz{<9{7 z?MbSkvpVP`6AJY7J&WZ=uAqjLzR%QQd7og0*~6w3nimBYwpz6I9M?N`(lfU@;!xc* zaRMJ=B8D{W`YV&?ltvzCqE<$tdD0?@9X|~tKWX|uF83l&f0&1w_nIxq3Tbv$MeRBU zyu!6%2sF#~GmsVTrDoV7pXidau!-jGq`D0@h$FS42&Nby(g(fifI*C-w~IWT!;`!l-Zvev_-toHi>bG(bv zzUg0fS0_G$ox|m}%v-gVRD9OLoQ4HmCK&Q$7$#0mG4}CFNOs`w=2aQZ<`t<4kW_75*!V*of6f25@E<5 zw!j^ugLAH1Hcu8r$Phf~mLtxK{4BL`-)bmWC8Wg;4@^z z>xKs;qQP!l5#O3Ozp1ymYQyE{uBkN-2JLz?Bxsd>t}(yIjvfi#;5eRcj{G(Vbn2xTO@S1{PZF5begphx`$U?Dpd}m|wCd4$iTheI-Dcmet z$s0yT{xNgD8MyKAmm6^~3qdf=Bi5E2rN=%lM}-wTH_II~VN}_5pH_D=tvk5Y*o{jg<}=UpM7K57 zZ)zyxUaPhO9toc0Jp#04Xm|45=dWR!_$W*D>>j0L4xa>hkhxtYvD3&>VF^!PgZ(;V zs{$|gCS|guxn078&4=Ezl!QNcgEM(!E~8HgW|W0ax?}l2Gsjbh``3(Y<1$-rD)jF3 z!PR`%6LE0j3i7&nj)yu4MD8}A%(X22oXRaXD~9Ew@2jzBjhX!s}6SPgOdBnD^Vt~Us1foG!>gk(E8J6MJq zi!l%E-RPqEc|vOSdY-a|HhXafG#})a=2Z6TYV_``=2?boKTxvPt&`WhswNHY&f1li zM5=mO1|5yS>NmS(?e8Cn$;A03W*)g~@+oB=(-Y4mi}!A?XHtHQ7i$MjW=YCs9g$%k zPX$eFmi9krbQ^bpPFL|izb`yUZs(4vM0CC8ZQALtwAw~|^m)Q&wJqEB`wm9eINqm-_e>V@Vf-mR&b|A^YwI=gTsA0RjXot( zQ+hq|3-fcj4*sm2ineLyab7A zh(r=pepcOEdXvLLpPA31qfTx*-{>UK?Mbqxc)tEUscjmpakb~MaRhcsacSqdU%}*y^klcJ@EVCgxO^GS+qi%{qVF8#`Z@~Hy2-_#peyl z;AC;c#V0u$Hms;x%X^KlMa#8APf3UoGX97)!1RCEbbSE0M;IKVOP!vr^SbNGqqKfSu#1>hca6(AtlY!#cu5#5gy8F~HQzrM1DKT&COrXaDbRW+2428Vitk+s) z%G*W{37kXU(FL_lyXp9fatqz4j;wH@GPyz9qZ;q(r0mv(fIK$Qh>#zQo$C2{-65fG z;w0x-Z(SO*M1?&a*_MjcXcr_yM8v@O_y@++jYrNA%lFk~Dzk^0O$ec^y)NCj>84@X zQsh)DJ~BS$1Y9xi6npmA_E>i~tau9xJKE$-o3z$aTxw5LbGlOFDMIA@kA*qAJ=w%) zyG>1&D}Dgd10;6tB#hUm_zI(9k`xDfIYp?4EXsFjGdQJ4w4HZe@B>CR+o7N5}!NpsPw;|@|?BF)zb>@1dyC?yM!E8sOW#Czxcg)R1_ z5Vs0vZ{s%9ieFfQC;cTMLa7JrY15(o!2JNYM5p(uT*8;R0>vN^RoA}8uV8jA|90Da zGtTYq*O}rB%ICU^Lg59c%@h1i~_Us7*`CQ>rE7bZ$@{-EvC9RB9QQFcmL zoQjAg>$!ityXGk^Ts+3eh#H!L(3 zWA+#kKBxV}Z}yIp&NLyp)95MrK5NBN;_;UsmrFaw6)Oo}VqnP`F12bQ3PN-jW*ZM> znQGVMX}s9%$&cx+R#Zs{9r6DkQRf{`<^TWxifoP|BP&iqvSrU?$023!5#l)Z9+}6M ztV%{%l`S(X``CrZ2*+1da-hTh|hi>Iu*LjWS<2mk+UYgjDb!|+_M8g~X z_p>=NUl8p}F7np|m3NnSR9R2u*l{mbb?1Be{0^Xt6G?LS1(3KdUZ$jvADceteW+sY z)0#ZS_UJrM-*ZY*o=&5-dK{z%aUtINMT!F9du;gRm@{5(p*!m(H1NI-lL zg}B@`JE%acOeD=5$IuCB>q=V41qq=&{M7)DBe%P7pMsq2MrgLTQf=dARsX#sQ;Wt_ zX|FR;{H(Q;yq-o2Pis5y<`%W+%x6hdWAZjrXtEDKYQ1hH@N?oz@I8NgSw#$+c2g6O zJAYDk7d!H4F~;IdFSz}b9?B>g68AZ$ROQOhT0n1vGn7C$)bI3gw;)45Fh_prGhv7t z(<5K16P-Rx6jw`zBO^8C*Ha$C^jl!aX8J`t^vz5E@WkvnB^A|=DL=0k*o;^`=1Ddv zLR%>t4VrE`s&cZt$I)zK{6pB-2qL%nXF>tou}sSbya=6iWr% zwoE;X(t86U^t5E|FVq&>?#`t?EeD?rKwqu+W7M)|MO9Qx1F^chHP?gTJ+fbeaut6eK^Vs4w>tNCbldOPpH9LuDL+m7HWsL( z)tR)qY{eaZG<&?gz>@5@ICli?dm^_QJc7+&%=&_V`ui>sv5V{YWFGhV4EM<~?PJKx zK;hUAsUO4X_30$tSQb*-*l<_cm4aj=dT$jx;U{aozHYBhy()AMgA&D~W_tH5>Ft%m zQO2etFf%uYKA5k~rphF*0KPs(z{l|hN_OqRwomNs$rMSWRjyC_4HL~j*~_aL`|^bs z+xA9!0uOW+d%YIThb7WYx(cGkr`Ey6H;2`4-wuA?P@&&6lc2~De@2^EIK8l8b`d6PeaG` zgneygjCjYfxn00#?Z%y)c^Lb^hXa%@B{$Kcmfu~?H7KG=m8ZxDtLHu318lZx=*2E( z;bTOD@}9C~Y-x)W6k>bJPkDJ^RNjexfe|uw&8QGDp9Bp17M1Lp_3q;(i|SL66QiOt zJ!v7+)X_~Gs#ZZ^P~qQ1sJZ?-!!C|k>px2ai_oO{)hqbE)H=F;;xC|Bfq-;l4A%w%&1Eu83}rOIQk#&M$)bLzX3iehjF^ z_gTyIt1zFPoUY7Utp#h~|o^J?d{G+J4>$Nc73aV<;;ed zvOTd!F2g(h_b*4-uY>?&ww~M4IClXRD_8H}wH9D5Ph2^sgvfInM9|#cofx~mAffoF&QrdfWwHl@q zub4K|{+!#Xopvd`gHvg^oOhuMO(qH60^+=6bpf_u)$BbiFVyb7g(MX=nwMGLAmGVc z{@nO|alTLgp5KLJle#;+SiMN_V3-W4>Q|7D+W2X-IyR!NP9I|0^jhXv&mgcbK1BZ_ z^&6ep1dMc_`W0^ooy;B=>jf!>R2n3NX}NOpLI@naR#l=sFIeTyU1a)5#=qfZ1*(kV zj(5~1#%#1-Oev``SMH<-?O?GnI(n_l2{*f5E2a>{?@GTaSvGBMi1{0m^tef(u3z!K1z~LT7zN z&1NdO<&jiyzL|qS_Vp=b2DLf&qU4X?QK&(7z6nX489Ip-F0T~+Aj(!LH(-S8k)mYN&0u~20_0d*` z)t%pCMCB{}8>~KZ!DBrb7%8k#;}l4PIi8Y%go;CG#iwqiuWU>01idEYh;p3e$PM4) z&F>p!rAoaEj(*%+YPVUGXR;^GXxI#xHGJ0#_eeu*)@v>^H#i|#A*l*h5E6dnSEke- z0`Kw*|Co3eFuhrtg2OHU%KY4tH-QF5y&mI^%5Y1n=)IyuFqfxLvHXV3$dP#QMxTkp z5ucwh|IuHcx$)pP{ADuV@aQhB$@WBU-ncH!obUG#4SPy={;UT;Y0hgduEH{Z`iKaM zjO6pFZOBcC`D^&;8Qhk+yHn!pmWk2St3D^$msnZKS_xaZ(tuf7y5Z*tIVBYqkJOS1 z+zNM#iBQ67=6IsDMjv#;zSoa>qBBf@D%GCi|Kxdx5+~xm*Bzktfp32d>dC^sHoa|X59z*T&)ZNw!AsQB?;8&M9PJF zb;{n@_AgEgeP;fI3<=(y9Gb+E$!vCE@^EFXU_6Gc?gqEaQ9aas%Z@%|r*E$4xyqE` zh&oL>d5(!FpiiB9*^kP_?tExb{1dbj*Q#cEN~L0N%P^@yb2)Yk`2yRqf%(mzdV0@v z`w%c-{ksx>ML2N)+qpqZEq`$po_~Qpp5o4MKu<3EIRaMo0*6PUy9}6*;!&eCM$d3YO~3H-VHPBRZ7s zK!PM5v(LxI4Gay}lb1EiyuiNbf{iYHjBI6Hs(J&5%&J_iA$M1pIqtnny!2{B!RV*{ zsc1vg7r>Q1j>)`_Qr=~uVSQo`8w(uL6$#9d2mQOqUV85+P2M_la_5Rg_Z7^~b2YkTRX|_| zm#thIVcn+}>scL*(|pUuDdQ#Hoh>ehuXija{cq8#f{XTo=t%J9HY6jqoB;42CS7~Q zOfsw(gI*u7)|uBjy0J4%A2OqFc|;RDl;)aYs}*1-U@gP=g6hInft9K%CixyqYr{~j zbEHWt5eFocwdc6VN6R60 zEFQ=$r8NS3^e9y>d!{#ivv=BG%n`*F6USS&!*!FsLCfp}C|JlM=qwtBA6L08P__T~lh9x#W<{-oSE3&t97*vMDvr zw8-V9^b%K-p-k}lJJBVe82Mx54sZsCYxWIpTcwCI;MKVDJl=GtGDH!W&st7V(H6wh ztp>LzO)Eb{9J>`^NfG>VYvW`4^V_ z%P#eDdQ?R|l$`e?>U@hL=d@p}6RQ+wz(Tn$Q10uoO5cvrd~`Xdwb#~*fb3X0VdyP! zR@1aZRpcVc+7<3Ew8@@NShZ7cX5DPvAyHdF7bvx7AV0CsvS(Y{Bo|3orBbQAZS|p# zLoiOX!75%kO8N7DIPFjhbxRhNb!iiKQ|NF$+;GsHd~>ZhsTM|**_4C zLq8u(M$-Gd7sJ;t(C=}TOVJHNLT5~}D^+ehT6B3?tb6aMh+c!eDnkzXOr@wMIr}M? z-P+{});t;Yyajeaop4krF+ikfV}nx3S+3tKjE){wy03C|g5a?+(%0n}he|4<=qPHJ z`Zh2@l{%7Na`90#0p=@PFSrKrC1MI(EES#!Sjz2r`d)6B7L%XGe=!TBiIGo7)b*;X zN%jq$h|d)Zw~Kf46D&$U83Lv<3RtyFwNjeIIQau!8UYua_UNJ4)@W+T8TH$Rudv@q z3(%^Vfls3MW_mc`{hrz_*%>mj!@3ac$u;xX&ki&kZL?rc<8=K znw43Q>cB1{Bd~890|fQ6C3rtyzVxzTy^E7O)Fr){Ve@j2k5SyY0os4gS7t}~^OJ6( zuV2;3uKt$FBJOzVyR=lgT!IhE?!?>zzA1CL(;2WN)FyG)rZ4Xo$=VY=8`E5rkjwDK zxykLhqK&=1BQIM1sbE6?ri12&qlR7Yxs+xCG&{W0gMAG+v*0m3IXv=KSYTYpm#26J zXtMiH=dMco1!uj1vRpHlkIf~xnPeYJ2%QHSgS^T0o+irRP-qYf;R;ys)j?=wFR)2$ zvp`=QgqYd&higjajIA$9iB(wU@?_Y8JN#)%(%9mM+{7HF%aK^i9$wiht0udvABeAB zXLqMYI`^otl9&T$Q4Hn~KhHD^gg6fG#r$s0-TXcLhU1D8P;cyxc7+L(jSxM%lJqE9 zqB~+ON>`Ahzy6D7yPiQ)Qy;B3uUu1gT&mG_AT>!@!yJlZ+U1Q$^oNK8h#akWT3qd? zR+Si_KHLQ-ZLCK3Y+*Vy&1ejOnBpg9txGZfy8EGwD*ost0m4J{VZYQk%;PML_6qQ**IN_^5MD&BP7S+^MOy~d)*|uiY zm{_|WP4HTBz|gOrx@au10BwjV{y3}u*PegK6iuDO8uhF4;4yOM$1$BA4g^N@;V|#y zoa$2wJvEWvl}T~(W&2<#x;6TRK(5Xqn1s-v+iKf`zh#BMNV>$!J*N?NKx2xV7rs|O zzr*+`E7v?RNCICUWV%CN&d+_|915h2$U-@lER_?84VGRU-T4&pB6@V1oF$n!fhzji z!WPlxT2apItoI%?OC>dfzV*1PBZezmqG|rRfJ0Qr7SIA(t2rtS0Bb-9q2@-ur|6pH z!hL(8*7^et+uRhNh!NnC9DzNVB4@?l7oNMKdT;vn99db8o#Kyu`J-au%L0C{FW%Z# z#F8)Bwx_x2Zt6%-FNNOxILL4ihkH%jDjL+ddeW!$&QZWo6BqeL9_^k%bX9n;&UA!W zf@U(MSdLN4F4a|FdiQi6SRs*KOOb4V=qnMUu3p|~|LwuBY?Qa!a>UUVwkE^Hk+M&E zY>UY@h^nYZ@wmLq+#S2cX1>$2;dpx+(`WI&7(0PDL-C`l@11wkB_1(vtlH9upQ2vZ z4WR)%%hoR7WD#`yr$=sFieogLnbmd#WQn-o!y$6Mz5pv)LS|hz$=J7^n>R~mCL1`z zv(WyVuTgg(F_!b}S1>4E1hrM<{Fu#c^El=Z+$%_{fVksA;fH#3k6C=qvHMDr0$r~P zyDO2f?R*Mxo_Qv_J-qXLBm4IY=G3VCTj|o)mMlQ@GWlJ`Kjo)x7Job;15!wq{^BoLzYEyCRxpK{c!-e?2H0n#y1-y^Y;1( zR86Hm*2@Z9)Cb8m9VnDZA_5x{cNgA&xBN@c7fzT>75lj27S|IoTIIkdbKPgbpL?V) zzVMd1$EMSTqJA13LlIWO>^;>GT0O`Stf-{Rq{2f=^s)wnAglFq3LAm{S>(PA(RZ6?}eY!GWwb1aTA4p(31#u z!K)i=k3e60CwC>kbB{=hzilk4p8O-uz1Of}8)ckd0u$!Lg0Qvr)4O>Qbq#}XW2sKd0{SJKnHmVI`fApw%65oxoGCDw-Z}7lV zV>;D~o7Ij+GFm*3funh5oXaTF6Dd7oWfe5?5y?6=mEm2)C&A%kxAXx3{@&GUU*e~{ zmV7nC&4KWK)s|gnk^sx~6m}s^mzO;79scEiXADc zjLq5!v=3m?l4~w`S}05hHl_p^lH4MA z>OV}i=HJ2bFdh#y1axZ};2_3;C;)Xj1H|tNe0xM};>JFfM}!4t;hjSzkFHnGblr*7 ze0RJN!~HTbn7t7hCV2f#81>SRjw_dVT4e}TEQd@Ux7@N&k|X5({FKccX7;RLYm^hw zpqX@q^OYO5pG2P6o4Ta-R03SgQ^z=4y$tTl80q!TdGFhjc?71?YScm4nDH$4$37*T zqf@f9`A(AVuf2Sp_mFF{W%&4xlAvF7)ue%B(09w%2^t)k90l~mYcjh4gLgne=E%DR znbBAPfy5QP$F;U!TaPFdwl#&jedaVWC1l`T=U=q;1>PAiW4YXEfXbQns5T}NdNlUX z4`>7e!e(g2W_LK#boeqjYBZgugsjR-IbGien@YwNw^k3b49;a}W$xBT7pELvK_9(( zl_0rp3Q6?ijy(sm6fwJFPzW*`X#wPzeKBf>lYEhZsJ|c0qQ%J+jdr_#4M|7eWQPfe z1Uu?3&RoMJ;dG8kdnn}{clE^TfHg{J@h64pM1^W90*V_*luCx-?tPfz3>nVpnttQ! z=$`$O;OAR;Kl98gI*ww7ZQF8)LN>9=Z6NMYhT$G-AOFiy<8qH^f}i;?%s%-?%B zKmD4hvZ93ETxoZC<3LRQ`I|WJdRC%4aq+^NXR2H~R*FI%yU3LYU)#^nl^slHz-T-& zAM1L9s$4l<9`^~*&-Fp?FVMe)Cx)x;%!kLxCR0YDg)=67Jh;`eRQ*@ z=C#z=UQtuaCeZ01PdLAULMhpPwD9!(_{yG;<0xQUWxqzPr9MW}cilxj5ciCU#CXpw zK*s7x?diD;`N3ZD!xPP<40?^1ACrbPiP5N+fOG?@W=uB2Ol-kmdZj{!>@0Err$M7 z-mF9_NG&;XWg{c@9xTI{4KC!&7HXpeAR1X>QR_alB+fi7dVbm)zj}%W9HrkB!6uO6 zJvr&`cB@%$Wkas1WL7D$O1@ZR7l?`3Lw;jAkq8y7kkb+xlU-^{!&UGY1nvHP& zWoPL)*C6q5%`>vDpY(-F@x<`!b3y7K^KD-$74o@x=rErYY?zU~7|~Hk>rK#|H*Hu6 z2pQH4O4So(BjkV<2$69l)vG{JiDKkMx z-aU>0vMvv<1Cvt^u754Ac#`G96I-m~s%dD~#}t`6&c(-$D$Za1@>GR%;IMd#RGE6% zWSKfUuy)hVK?Vr#ogJTeOwJf|UoHq-SfhC{&F-H!xnltX$$MVhK5`_FFOnTKZg~sR zmPF3m@3IT8sj^w?I0zKht(oZbB~Amu`9cHt)*ZBCpyo4qaKYULr>pK(l(jt4)HMwf zHd((Nz+it{qZDTRvf2la%lq(!r(kzLWZ0SPL)|Z0Nf){y4d`Y?|9E8&>$DuJBku~> zce^!x<)rTzBz@N22|i78lb(@;MA9l7$;gM$_R7KgO@V%}E6$9h*|(zOdJOLz0nM%I zn%=hT=KfoX{-aY*wKZif9>37@(Zm$!As1mS|MvC;@W}*2o*3B0Nd0|EYf!M7UNSQE znDz&!wEC^4uhc*9z1EEy2s%=cwAIj{eWGDnSfayG!|AAHgg&%jYy}+X#GlBs^1xDu zxg*@N5bHY~UtkS;%C7=@36n)6U$lvy#Kz$Z)QyEFyqTvGy>9?1M!Ac6K(fOyS)(V| zQI!G#5E4?L2n?(hw0Zqb``W>$?DjjR^u8&{1L(Za|O zU`p4`w@)uyc#jv;_c=*btls;WEsuyI3YF$&85Ae*M1-VMnt?=ju|d{Rppb71Xu?U5 zO@K*6skZY#(O-DYrzzyu`u}%KkNW1p{q2V@nV(z#umAu4;~%uCAg4bFFZBBoP{M!X ziA`#RX}MF_WAjvF9eKQM7K(l2MW;)cS_m5w-s~TaR-sXwqhC&uTjp-7d zV5y;xS~|(~=yZMgT(u=mIy5DKlSSSf$cC(93x4+a{@^m`wpC$80XXdEO=4J(CnteJ zK{EjZ@G)IgN?-!77zv^_k9%Rk!pyE=(#v)PG;J=jIOdf=+ene6MxExaviA#WQ8T3zTk6E8=rDy`9 zc=}|a2|jq?oO6(7zY7emwq_mZ<(!U%UE;s~T9It^yk!8s9AK9Pk~|LmkbOg5^g#6& z{Tz5?m-(FNj&y;6mXFXy15aOF4Nx3c3;T5ssY_%V6qi-GF!e5B&MH5&M2p2n?a%Cl zXiZ*{oPYhMoq#l`Vj1LsQCkXw#;M;?05q1k1CS9zXmCWIR~q`Px$$i)0%j6mmIk7@ zYgt2Y39)WgVL>e_iCSRiw{AO&!bI7w;?GvCI zWhx>-JlN4c1ee+vL}IA9yO(p>#CT1Gj(f|ucI$u-f=njeu+9Iry*M8ZVFlf>AOH-l z14-Y!s$6=lP{?mP^U$_Z<~smel??>ut#4Dw?EawB4^|QI_Yn$N1o{?$*0z6#P|0z1 zfluq%Uvi~vP4~#>4*y&6V(bbx_PXm^gj=+BOBgOm)Ak-EzFS03LX zPZ4tD6EZR62jr*ngGdklC9wKR1^Mf(^gHx$3-$V(;fIpHmyKH0o#pkbs4 zXc!3sAI}w_@6{y|c>=KHq-mxyP;U+*EOt$17U=%XwqCadXI&xSYvZ%tcT*BK{{fZ(qOzs$mXpPFlqR_PAmb)~T)z{!yq`>IB>Q&yT-h=!UWKR|kRU^vg2BB=N$XzPpE)AcXmSRR};UY_h9S z{(#m(JZ89^$dl!}5VJK%0&RQ!6<6kwwLt-pun|*q9wWRxrkWli$yELH&$h_0plu0U zbaBY1#UpMyIoOn-quXm(GxP)i|NT)hD+6ZfYq$0v*!IgjlL!K`2##dyX=R=TaJi%O z`)`7zy0dlj26?)JvRTyi`*rD^!l|TIbI~E^<(Du#%DW4QjYu4#!6p2|U9vdhD9wpBOhn$b8@z;mKPUD&xQ`0};i zyQl?(SFuS=7901EB>%CzC~!U=K3(4Rt2fiA zLI5uqN4*N*4etz=-cR*xw7lc=G@dZ>$=^@8QagtqGCAHU@9_krPYa}$cO87AzHk0- zFKdSXNWZ_3sX5WJcZ6SjidN1Erua* zh8qc*-N4_^fvG_>FtlRLQ~=K6MS*s>@XCb^z=_b?!r`d!k{zn`k5h1YoOH<$f9yzH zxXuvsZS~hFR7I>~F359wdbW1y3}C)bP{3BSTIed@u|=JNH;Z@6`O#b};~`^^>E`#p z9T^P+cE+;#Acy+TX*4+Uy=C_UFi9BHr}x75gy4I;wZ49w-A0VElzWvr)x0-ivop?D zZuc$ZH#Ug`fXWjT<7y4tm*=gQKA7Jy_6oWixvwUyPinX)zZX8TJiB3dJHg{@6L8ZxIf*gI=Un1fra9dEQh2P!eed+8d!{~_fLnccWYEJc!88i_j)k8O ztcEw8H!S6O{zaIUlr<5{%wO#QZRE%xh*eBHQ5L|@ zFO~hn)1^W<6?*6Zf1~?|DCR8sMiu8`OLOuyMDh zYDjbGo<;^OUjS7D1Ol}KW_sio$m zUJ0~(D%S?Mzs`#FW8m;q?Ulq4K~Zbr_Zf+~2*lrmB819cAnb{)*~q zi>TbrOOFQA|nf(4)j0(^y=jALmBJP<8`MVbUxqfOl=}x?OT?hZ>P3xGoq zOID;P51z`C;mQegmkt>gFZc?CFU2JF6Hb+Q<1`mD1NI6an2E+#1U=8rnl_H+QC3_( zX-5Cto>@FiV>W!yE8wH0;spry7UQtKOCc~eL8(GIQw&%MHGyWop-O9xgNrD}trgbLeIwLS~=38oXD<_$CW zdWOFdIfn1-CBCJNXYE~5T+w@u}>dNS2xTWU$5&?kkY@B3{1Q^YR{ zNpC;2vD|;l@9lCRYW?Cg<$$q}$u7duscae*og^_`F{lz)eladXc zoiT%R#v6sA!r4!d5sf#rqG}Hy|1tPLz38t5$m-`D*e<##1ndC3JnOp33Ymt+5s`iSC(^d?>nb?DBCo}9K!VN zHWR_}y57_`u~(1gQZ{;QL=8J#6f3W9rFx2LYv` zQ^x%wJ;Tv-?Vsy|Ms3j$f`@#wXCWN+-i9^eN4LjH6gs@50q$qM>Csx zcZ$f3Jjt@j_uv&d?bN!wxZC7612o1UGrdl>#i_((bwN}iWOfG76>92YIA5Do)$+F1p zdrt%JJ$lXOcow3ov4*XJfhN2!RI@=u)mB24qwKfwcxR`{Z>jutjxSA$)r3WtwY~}F z6F!+h=|p448=wAQsMbrV5mRB?_AHWqNZ|DKHR8*M2Q#(VR&+vQ@e&U>g(@}=A8v%d z(e#^Lx<6f}rxJF`^P=BtdoZhKH6w#g+WN1U!I2U6^riswIL@Hk-pmIJ_N4|vfn-MU zlZ(A)IJ56{U-$S&zlRzv4tib^8Q<2WeQ3)-o4a?I62AD$3&6e~ZXcgk&siZSYF9ejcC0 z-y8ABnpgyQFs71xn4750s%sIxcw37Otq+r|_cCf5{%s=Uly5&f$X5#-b@9_tL3 zjT`$rPuV*6|0?dOk(hVW0FKH*V^4 znTDm&maqcrwBnN--!EM`<8f)&y|eiO1ahCPe)D|Skm_{n9VWU%Iz-snQX*cZBkJS1 zv&=!g&qCd--|23q$guIqS3%Z9xzp8gy4uCZ(p#b?zw1Xn`-Wi2EttJUJK7#jwoDVV z(?h-JEuuQCNp6MkK?Tne&HD{ZC-nbi+3u@aI%jgABZ>X}(S*Z1S-Q(!KRjB&(&H*;(4 zJf!F9gBp0At*VEdWG#F@GlG&{6+1|<&92YnIylo=6epnz7R2h`~_ZipRpx?Gf(#s_# zE#YgO2c=nnpt8d&EM*`wS~r(Ees@DMq~vj1ci8Hi)}NP4HC-H(Bcxj=X)Qfs8k zI732N>HRH$bJ!{tuQ5TlqI+>%b4-aD%SpEnbZWACRxO4HtY#m7!X=^D*Ma0%Xz zVk$g3$pm5!$~!2LmvC-c-pL+EVW_ zE#aiATcZbMgh7X&cM!*8DXq;|i9pXwcNzbq-5uxS0bMQuFx5CW-AOl!w@K+$#4ipu{kpjW5r%VtQCjzGD)lT{h8u&gETpGF=Cc=)ce3g9E>zK`oZ)iJSjPzs2l$ zxHEIxlyB0#(5lzTu|bCoW9?;1BdmeDZG0|cNl_qnBHLj9^-FCG2NgL! zxpojnWb9TRk^uOs7^jJyd4 zgv!g~1*A7cVD*<<0+JuF2NrPCb%h<)gB4vQTqV3~l%B!o<=@NK9%(a1k&oA4GxyML zWH*#2Q*-U{2O?3>?k`U$e2;LTp%Pt2;0QbUBp)liwh<;;QG{0P{$#J4xj`WAZA+?f zLDQ?qahrDrO+eZp)H)#oL0hAIHitiT?GH!z&0dop%Fg>(b>thkZ^O1x&(v)0nP5K~ zv4e+mN|iaSVVH(i3K0|E)wjt2ZY6PO!VCOq!|eAFPL&^2w7O*F;`}<_J`bAeLXg~% zblquB>pR2#T#Y>%KeVQAG@QoB{$?y966JjShdz{VY`?}M?zYALC;A#&I-4od=&M$x zohQwV+6_zmvey><(uz$BdOg>MYpd-ml*V4d4O$!bBD=Q?ec&oep3{`}0Mc<=8Nb|e z@RN5%(T|2z)Anv2fql-oJiL^m^*}@2C)v%jo#fMvM^3jcR+BD1^DP9g0U%RDJuG;M zb^zDfSuM4(5xs=HGEqq1yy_-IMirq}jjFsqK(oPC1{g9@0cq19B(Sz42e1FAE=eys zYv_KvGk}d87wT!MEp4rspN=Mh-X+q^2!!r@*s#wJTrOD zc8A5~fdxcB_Ot-*KM{Ai+|>~$aM1xVXYOoh3ufT>)Q zQA_i0H+Z*R01Xw6w}N|*i9Add{;J$-;^YU*#A%8@GE$qZa%u`A72DpTj0qol4kKK$ zddJOUeo^Q#^IUkFR;7osTa7(!4ussLO;ZW6$tVD|7GIyJ2J~Z)S;`9Dbi&Z$wVZs! zeHYn(h}hKAo95q$wRj>mNp|mZzrWgcXSFvy!FM#WkV0LLqfcS=m$6jq*(ir+z;BqH zqPlP?<{scr>$i|zrt;jKy~2)!;g`&EO%FxmcGZUEDTZaox2IOJ2W*4IgGI0QYOW4w zOL&`a1)a@|(aU~qoiCskiUT!E+{dpGCgBP^ktX5#1$>0*#8>rtxb@`9lq-cFZps}s zz%sq9QwTOv+S)hhtCVf9BW(^nGoLe5IS$L zX&7H8VHg>z%+sG>5+ROl%p0#+uQ{a_yxuiNsizn?(C__y{KJDtte|Yqx>E5=)BkFx zg37scPhdB`?7mli^~*9go=5Z?&6`hULbIH^znJ?>vgyG6t@JcoEv4t5K0)MP8TUW% z`#nJOuiQQoeZ-9E$(Zs+&X!Cb{yY&0@fjp5;CFT*F|R^ye;;#8q!`)VdFZ%(%qX9MyQyU zYZ9M#Vq|BWFCDL*yIp4c0`GLoLoDbf5iY=5Y!EW&jjya-2P#FraeKG+uoz2`;Z>>9 z9;+v^xa1_~qi+%3k>4sp@by-i_x94t0}EQh0!=>?7#f$B9DA=Ykz zt=ccFQ*T(xN_;A~S#U}7hOWLWU-#0q`y8cME?YlutZk+nGk0nM(9$*NQsgIC0C*`h2PU=CLAf{`v7 zdk)~Aa~T=rJeL~@Fd3yLrk6I2mT_)90`CL@sRxn#$yMcU2~HG1Z|m7qD*wuUo95E{ zH<9b%8I)1~I=a0gz;jLQ&&K)F=B_$RQL+Hj`cAgGm4l0|gq{8c)u4Cn@x%uM*KG0_ z?GzLWSMk)lw{{Rfs082N1Vas(|2*7U$IPCHDewM84hJ888lfL8M>%dD5#G@t~7rDeS9VDtP zVf>UBcIbol|MFhIxwK9`>SWgL6+}(~beT@>^m^Xapt>G9eJCt%Z>wm?ieT6h$!;>m zck;sI$dqgMMcUbC$0!|HXvJLmk_DD*ksK$B*un|@I<&|gezzFS5BBs>JK*@H-u2q< z2h4{%K%{Kwuldpw&`I_%fwBoK?V1p#dLuVq**R%;Z>n=;jj8aDwA3v11Af&Bt;&%@ zlDcxc=`49wCK(k0_fws2%sSymD$W8mYR~s&-@NvuvR&-rj_`$2Q}C)7%lR5vC_-NT ztJnSC0{uRIy^8~J#zR9(HOkMeLUG*r^e?SFPdWHcYhE}duD@y7f)v) z{>c}E+9Eg7vx}%TZCTQ@=(%35oTlDtPQ*r0HRsCeo&)Cm*=HlW!?n6G`C?Y@tS|!< zN!(gk8Dn3CQvVRjN0wk$)RpxiiCM0RDMuqEM?<30# z)zn>)q7DYeSc3ec!o_nJYyvygZWPu>cT5ABZ)ATW!UcqS9NyAb2~8$vGguJj&L3>B zt{1#x{c4~o*SgG!kh_YGEHfDB-LbhS6mND+;nBRR#q{yt>fgHI4(nQjK1Lg@thOq+z`Ke7mVEkbdKugKs%qvXz7Jqq zOUnQ?*-POjpiJ+=`C}Du;hnHFi$2>Rh50@*A!s{3;tK^V^i#~j=lKVoryr`9n)#g1Ip@00b*}6EzTOo@2RBL`JUWbMK;?Jq;_c5a z59V4qycQq5Y}2vUfKu$EjLkdUMb|bGdhgcU_Vy_732C$$%-%!4yF46wOxw+}r0&9( zf^`2#0ZpJ$PL&AX59%T3p?5|v8RhRvJhC8#bjWVOSd*ZjJq3m2fvE}RkE?Q z28)NSZRj|@)^O9Oa5H0#yP?U}FWl;Op_^2-18W4b{TV8*W}R2-oaOR+T3^TX{H^dA zBflFEPq-se#b?fZN4!X~kd8RU*(lp^{t5q50u46(QcqeM59Oo45>;l&izjB3bVCgr zU3{0rnXb#l_)reRiYA&WxPB2rzF~Cc(ha+$DwT=MA+(anNZ>h<@_)RriaitKIaq^SnA|Fe|k*5S%l2D#cYfJ`U?BQce9D z6y-WMm8gCAyw_caZ{w_W_VTc|yS)b-Ggv1cRL=GniL<$Nomq3yWFiae6ICh{xMCDs zix9HpJFlC#7-3ZqfsYc?E|k{}te$^R%Hc;?!5r@S9XeEE17w9U>Evag*^|T>v5A~d z68bgTdK9*_#2iS(f-a3o8|Io^D9pF<3ZDpNNXhc4&Fhx&6fPMs-lFKEYnUtxY9xi1 zP2M%D=Ic>#t8DwJ%nW2K(TSS_s62EZ48OsRW8V-&CrWS~+9%mtYEB5;wmcZ$s;xMm zS!cYa>|r` z4_GlPxCAkT^QnpFeEQ!?Y`l8QK->}Gk7DL!b8=CW$A5WkDhJz{itOMDfv;e#zWT2^ zsHrMAe1Do!j13V#N%BZ2QZ>oBlA2voa=duEg*J!z<@G z!+FScZ1$fn*+b3yWmPfsd@ZQveo3{yr_ z0k&wb9w+wr6Op%dJD;y6<}HG^kz))n6!Q^bm@%5BKz2C1m*Qm==jfb}cBPmIyvjl; z2Uor{o=6^AzrL-0?E2Ksifu)ETa-4(*MdX|W?E(eI(_XJzi)SM-cmF_8zAnu{GMEP zIuMb5&GiF!c9@Bh=%ByknL`0OZdpyX7*(0a+P;Z=@hZRbwDcTsI3+N3VF=-ZOWgorW^5sgO z)YAvTmDu|GNM3@f7A;t28$qG3;!16dD2_PUD5VwMeTR7^nHFd1l|0qs=py4Y7S!SX@hWpU8R=ewRKWTxus3 z$nneuS;oFypi8@@u`+vO(SnOYcR5S^k(gd%kicTdiRf?YjaNE8uIDT_O*em{FdZ_- zN?QaW?vhRc28~)?hMYA!VS$08UcnK4lRuFACEHxPe9}9pH{$R5(-H(-Ub;}UT6mR| z|8qEr+J|hU(d4zBd!*OfcbHF7lj=Un>^3|q@-jcnAeiJz9D-V1V|7ZXJKfguW+Qz@ zl-$f$ST+YXD5*%6tIx$#j4cN5UC29kl^F^FeoI*ZeE?7bQkvHr*9%jjrVz=3T}9GA zH1};1z0>O`FlXGPbLGCj7)8x~WG{zRJujOd6Klfvrps?KD4YwKC~pg0*hwu6n;(?O z)HZHf>K1~lo*V2r3BX8yFG~QlEJP+&cakZtmk1CLbpq@3i)^*glavBq5e-1YicAf( zl=KcJlHG}UR)hR-%B1~i*TD?+F;uBKPi5~JYxZ_WZL*6~nH?KhH0O2qe=j(A4KZ@C zv*JlY^qLkf`cJVRePOP$(#7iQ>!eQp^c?mY-&K}SPjxCTl@Hx7{LHN^g)scPfT;iY z%tll>-(0kahwWCPH%oY1aX&B#QLu61>%+C0nt&))HX0z6nxeu@53VnksT zO(=Xu3AD3n^=$bk7z?$u+bxa4CYobe zaq74EH~#s_)crkHZ3xuQ$CVe~|3qa#=2m97t?ShlH!(U1K{GUQ29asv^30Q7QRN+h z)pmXR?DLn>=UC8DGU`W3cw!zluCy+BT;ViGgpl69XZZQa02k@!SuoAmI~0p%6ly&( zwIRI@9XH#350g>hBDZMGu`cRtOe7(VoPmuB6gW1v5QKluSbp?8`h;~-hrEwfqEjy` z#gr$K?_@yDPR@{S+w_#8L}S#$-sOztZA`06(=r7d z%fz}(P42Bu5%@S7%X%VA3qc7lTd@Ge!QD z0m19L%v4hrQjX6e>T{N>rWOk=AD=OYX_V`t&9UB4k0Z@E&&;tTRp#{D2e)f7=bjVw zWFQXy%t1UOAd_@beGt6g&#m%)GdmU6@ll+ml79cOmVmQb@my#|L#y;lE-i}G=r?O! zilR(skm^j8aKMshooFKo#LTOjnzZYU3m*!POW7^lu>afi)}Sne2lwrn{Hvq@j&EA# zN;z=Oa+fYB#aVktW8fTUHI+aZ&o1dW0$}zZ}zDw79&UK^smIs%)Z8 z|CAQKV{uJPd6}6$TaI}{Wl9yIfhA`ruQp2x{}E;Z^ARr#O$2L?paV)H&Cfz-MJFEK zav?nQaaGKEW^~S07>+hL2x-4c6r7rF-h`1UY)s#tKIa37lsYNb{H`Ya$FGS&qD%37 ziFyOM7r4j*3-p*N)rrC>zbYP|vQTkcdAlqh>N%BlTE|JFktXAGxw(}}h{d(DCgY!V z;I+(jy~j{rKgv%?N3p|?Em6A<=&8oQ@UztxL z8U+rw={=nYA-$Y|4G%8TANWT{qkKOG5(HAQQ?Op_jQ48yDysF8{6vhXi1n|qLl7aYg?JN5D?Ze6%e@Mg7Q0w+mM=I!_|a8!k|egr1kS|Yj( z|EWlw;m8XOm%@pH8+$Z3mAnDQ+=esRtMOEd*dl1S2Fj|teb|$6m1-S(nS4st$RP}e z3_$ZbFlozSA7i1rFof&BCkMJdj=pLteD{5%SHMM_gd6k@FdTeTl=9zWm=!vP(GOxP za_Q16U#Q1K2m8|di%*L6U#>P0z<<^qYTjEOg^G(bkY>~mb+sQ{6avU$vqGJwXx#yW zH5j^+E?GP@s0KKMQ#vrG?N2CWsj&t9ihsg#(YKnI=DVe5hyc0CAeJk)L^Xb*yP za_(VqdWbK%mfT{Tr2La@)g-HN$V4Z+H!!@ zVflYomK(VEny7qdeRg7cJpUf^mH3%^q<8h%Qk=u-j8~t=u@wT;H!T!fkM^DAq2)_{ z*z35BMbVlbtj3{)jIoqO+^Qbf&WGnPgDv#hP00e?JcPLm)M0O7+_m1Bv#`UOms8g zB+i1j5Cz>y@@{YM<8685%uL<;)#710-SgB5EQxD+5(;~Uy)mp_htXuJ>OUJwm=~h; z0U3`?nn?dI=qS+(8q9d1T6vQxi?eFc_k}}nXzH0w^$U0%`Ci+udfpYQ%PJ**Ey^q! z3@cvtrQUe%CI3bxy=vK3+~+M{u668dIQI1m@355$DU<5|9Dm>=z>}z#wvVQt2)W_w z8=Dk6OF&NTZY#rPx)mIHo07A??Ere9w%p3t_WdlOpJ@DFn{f1zik8s`L!V%GuA0Au zUG66cLcXa*hC4NIrm6)ZudqS9UffUPEKex#@mMK*`}dIo z#f^Ck0V8(S{h@_|zh#ns9m2w*&9*FdAMK@JZ88ST&KfEbyXHc$Vd-v6d6_kVjC z2@d^&`P`}h`TSLA$g5L#?hE~AzyR@e9=v6~VUJ$(AKUx+{26G-GtKY1egKMo4;b9? z4WYLzdztr_oZ8QS?tq5e5$2v;@INP}jKcUq|3Hmk-FG^2wD`?qH_@2IA?RpBk5dn?`sV zYkKsL&R)YVbOYMp!RdKrpTAhk*~obzJ88#d zl6EKHre%Zfo53rgEt*Dx3IOtq0&F=KO+D{esFmTb1;9~&b7LU-jR7u8*-eV3i{*H5 zvP_baZC^>NyryFE#|S3t9IRhUeQWA&L_(bVh;`0!2o@C_hj!R&$8bGsG8{@oFU-3OJ2iwS_Dh6&DyQ1}Nx z@$AK6o5hiK1cTZIJq$#Vp^>fbK?g%QktG-$Fw~63pub}wf|}zO9ETVTumzdwfG(#< z%%y0+jKC`!1E>H8BnM0lF&mXY@@45RLvQD5W+%>gP61Q<-L(ktXTHcyIrm=SEA!-y z#8nOhM3=VGMjym&nfjp&dfi|!)Htjs0^(&_>=!Dsxeb|PK!+wA!`4W>-_mmaeWkpe zeQ$thxBte-^ixaq=SFme{1(oTkT*S5zxzUWh@umvZ(gsMJUxLts(74_Fjz@*muw#h zck1ZA1auMyT1aN_&7S=`S>9ccR{ypfEL&r4W?Zvm=U^uv>G>Ujfn;U{2Sho)J4Jd? zqu@IqNP^gteRscMid*Zvkl?U}!=RQ8S2sFL+}4+0X(;{kQ-yRb8P5ha+r>hPv7y@- zjiWyG`wI6Lqi)I@l?@PLtSW=-sn$4p_OBn&>d^oelTLV?hr~7Rg@M1(1Lmpp$o%}V(V>$P+KTfTBXt~ z3xC3co0aJ6i&8X^Vsbw?Z74Va3$^B=y}!S88zY&r5{?B>n@^7Yc_yyg^R3F|!?^3S zU~}X>$3J4M0k~Fx8Hxg(-Zuq_Fr7Uw0l5 zz(Mhq$sX_t%ir`wLN$?(6RYh=nk%@UnZ;i|{0Q)RHx-AlC$=-F@Y3G+3OM`eyM8gl zh^jAQg+5HJA4NXV&m;%u-Lb?c3>G6+zF1d&uDq)ktkip@b46v9^R`Y%!o|%3i4T*F%?(7=bSK0XS-T0#aP*Jlq`cSo94^5y6kup z|29CZN_yk>CRjykyOlpWMkR2+!CQ&EMF150QVoaIcgfjj9P)#{drPwMB~3^=lcad# z7cKaTi36$+%%|1$C({mmZnQKFXRPS`eQ!JheDf=}HyEB}f)ZZB`zvGjKVcaf=e>;g zKKW{}yJv_4s0J}+ZL8+y4gs4%~}`c5`bA@0iI3Eh{`FYu|>G{ zkuQKe`EHNhZ@tt;I}*QIIUQkRB{V^Snzm4qW<;A2%<>CR~Q;c(UG=P~lq zup8PC2j*8c=gk2flc^-g_bJK{dmVIjVW_s0A68CkGcu90@efBJm^ltb<#tUUzE(vk z`OVSZHzB>`k^3B9`eEv8&ynbR!dne+Wk+DProFSZ9DnyZZ}$%doP547%KIP*=iy45}{$<9+Ae+4XE#wM0|#kU4naMn`s% z2BqbrPCOI!SqVFz`o<>qu<4YJ?I38ZRrj#+{f2DBOQxVV1-QYw%`zF56;RjPhXsd7 z{B>iUJgjhc;5JOU&(^?6Ycz};nTn+&jb#YW9C?Z^dl`~no${2WFDmFkdey1*mlQ7x z7*5BKz0lHH3X)2bV)W!b&JpzrIYXo+vOu(+O=NSj=AGNmJQ?2|+ z-c2~&OTlj~zbDiuxM%xOQqbF($Ic~;8_58qmNd#c1AwtRotqr}riI(FnyT;6-{uceRtDk$Ms`q$B8UBSWem>gE2g?w?9Z_IAsz~hktlbtS~k=^Po_>!m#k!^{&44hnM-i zs67+g_fp0mhz4X)hkUOKSC3+nn*X5PC{dW6^O}0Sklbr){qBY_4@JyOTzyGhj?IJ4 z-F#Om6L-y@bFi*MYVp#s%ZECb zcTK2@9l@-DF{X7NqoDOEw4yxsYbNQqJ}DCGLheAHBs^E~Jq=YIbz zV4Q)D!}A@h7L*Euj0lqC0(cZ~@T^qGK?&TNZOsRkB*GJOo!L#-Yrj_v(Cz13V zZcQIw$kz8ecV7GT`S~#7Mpe_r#6+)4lU>P*#byVDU6y0)?CdLpTNC)=2%o*pW}zbC z+#;^pfBJI^Yw6=eO(U{2<66Fcc$Sx^T+hHLY7(v)C(^tq|29MTo%ngvIv5QHYzR63 z{KqDteYn?%}%Gic5`mNq&gE^*AGKlIi#*VU_I(IGPT?Jk}q3D`HkqKHy`9LmPJJ}Gv z8Ts$Ct~8v^mULA;|N3aVUIMTQPI0cgW0g+g|Ma~o>i1foFTPdjXkLp-uNeY1Wl(7R zdSVN|aM#%#KZc$Qra`;n23$XmDi-usyAV4AYJ#u4{LI#BV~ssxyvd^49G zH(5~bKpArck?rjIEhSqAzJH%xn578Kp`>uHE9o|zu-}4qIv~LBj+9y#+YaNLW;+vh zcaBmqG(9=Rw_x?0uGq1sv1QTz*sqm-P5KyhbLsjuw*V9^r@kTw8B7uu&MbKjkowmO zBc1j(mnz+s4EK@kF#=AL4e#Zgzg|8q*3z=jpO+!*(3^QhymW-sX>q8y(h+;H)7}P` zIKlpF8>yTl!gA}%_B}O8tE#F}Se&nt^V+n9A(zt%D;CcWmDw2h)Gz97FJtOkt6b)$ zTF|V;_dX^Lm0IhLy>l03s4thJVOOB%H7hMIZ)pf1!Mz`}YT4;mSu8NBXj%XE*`g`r z#74<)pI~{4j-$j?P3iSfGFlE}cIQ%I8GRJj(kn8ZxNl&`IBhRucMry@Tr8SHPZvAS zv~ORMp5HO;H$j0_*8sL%W5S+$lT0g4>G)`cLs49h9Q8j4Y3->s(Yg?iwb}lTmES9k zFjH||bn7N}xSy}DMf#Lttlke!cATZJY%Yz>_vYqVsqEG5fdV6O+o3ltx*K*o)v;8a zWu>LwGaj_R&Fca%FRD8?c>b6dDY1^Ppw{*9lmGr7uT(GZ8==MK9$~;NOaidIC z{I{W!u7bnB!z)ALkL~_iQR+Y6T>~s_eEe1Tuf3|`uObMRMo*Dm^|vi^75OhmRmckd v>tccRTm{zCPt*KspZx#f{J%Oohez{ktriqWYU+-FUso<^s})`}d-T5me{4>Z diff --git a/bin/API_migration_scripts/README.md b/bin/API_migration_scripts/README.md deleted file mode 100644 index 63b3b451a..000000000 --- a/bin/API_migration_scripts/README.md +++ /dev/null @@ -1,83 +0,0 @@ - -# ReadMe - API Migration Automation script - -This README allows one to successfully run to the API Migration Automation scripts. This script searches all directories for plujgins and then stores the changed methods & fields in a CSV. This script DOES NOT change code but automates the process of finding packages required for the API migration. - - -## File(s) Description - -### Python Scripts -| .py | Description | -| ------------- | ------------- | -| classes | scrapes packages/ classes | -| modified_csv | removes unnecessary info | -| unique_classes | compiles a unique list from the above | -| simplify_classes | removes unnecessary from the above | -| output | compares the above csv with all the plugins form the given directory | -| unique_packages | removes the path column and compiles a unique list | -| links | scrapes similar to classes but stores them as URLs | -| simplified_links | removes unnecessary info | -| changed_scraped | gets the methods with the URLs and desc. | -| changed_scraped_without_column | filters to the methods| -| matching_entries | gets the matching packages | -| merged_output | gets the name of the packages, file location, and method name (as a whole) | - -The above python scripts creates the following CSVs - -### CSVs - -| .CSVs | Description | -| ------------- | ------------- | -| classes | scrapes packages/ classes | -| modified_csv | removes unnecessary info | -| unique_classes | compiles a unique list from the above | -| simplify_classes | removes unnecessary from the above | -| output | compares the above csv with all the plugins form the given directory | -| unique_packages | removes the path column and compiles a unique list | -| links | scrapes similar to classes but stores them as URLs | -| simplified_links | removes unnecessary info | -| changed_scraped | gets the methods with the URLs and desc. | -| changed_scraped_without_column | filters to the methods| -| matching_entries | gets the matching packages | -| merged_output | gets the name of the packages, file location, and method name (as a whole) | - -#### Image 1 Below - -![CSV_Files_Importance](https://github.com/niccolopaganini/e-mission-phone-nvsr-iter1/blob/16b6ba09b3e6dc37e0927b6ff338400e3236e28b/bin/API_migration_scripts/screenshots/CSVs.png) - -## Setup/ How to run - -### Setup -__1. Navigate to the directory__ -``` -.../e-mission-phone/bin/API_Migration_scripts -``` - -**2. Grab API changes' link** - -Copy the link which has the API changes mentioned -_Link should look something like this:_ -``` -https://developer.android.com/sdk/api_diff/33/changes/alldiffs_index_changes -``` - -__3. This command runs the shell script which in turn executes the python scripts__ -``` -bash bash API_cf.sh.sh -``` -## Expected Output -Excepted Output will be a CSV file (```merged_output.csv```). The file opened in an excel will be in the following format: -``` - | | -``` - -For example: -``` -content | /Users/nseptank/Downloads/e-mission-phone/plugins/cordova-plugin-file/src/android/FileUtils.java | ../../../../reference/android/companion/CompanionDeviceManager.html#hasNotificationAccess(android.content.ComponentName) -``` -I formatted it in this way because the method has the "full extension" so having the directory location in the middle can allow one to look at the classes on the left for a high level view and can scroll to the right for more information (basically quality of life from my perspective). - -#### _Reasons why I didn't print changes_ -1. The whole process on average took 4 minutes to run. -2. Quality of life - Looks more presentable/ easy to understand -3. Work span can take more time and this will have to be run just once. After that it's just you referring the CSV. diff --git a/bin/API_migration_scripts/c1_m2_u3_s4.py b/bin/API_migration_scripts/c1_m2_u3_s4.py deleted file mode 100644 index b7b041fbf..000000000 --- a/bin/API_migration_scripts/c1_m2_u3_s4.py +++ /dev/null @@ -1,82 +0,0 @@ -import csv -import requests -import bs4 -import pandas as pd -import sys - -def main(): - if len(sys.argv) != 2: - print("Usage: python combined_script.py ") - sys.exit(1) - - url = sys.argv[1] - response = requests.get(url) - soup = bs4.BeautifulSoup(response.content, "html.parser") - - links = [] - for a in soup.find_all("a"): - if a.has_attr("href") and a["href"].startswith("/sdk/api_diff/33/changes/"): - links.append(a["href"]) - - csv_file = open("classes.csv", "w", newline="") - csv_writer = csv.DictWriter(csv_file, fieldnames=["Package Class"]) - csv_writer.writeheader() - - for link in links: - css_class = link.split("/")[-1] - csv_writer.writerow({"Package Class": css_class}) - - # Modify the CSV - csv_path = "classes.csv" - with open(csv_path, "r") as f: - reader = csv.DictReader(f) - with open("modified_csv.csv", "w") as fw: - writer = csv.DictWriter(fw, fieldnames=["Package Class"]) - writer.writeheader() - for row in reader: - class_name = row["Package Class"] - class_name = class_name.split("#")[0] - class_name = class_name.lstrip(".") - class_name = class_name.strip("[]") - class_name = class_name.rstrip(".") - row["Package Class"] = class_name - writer.writerow(row) - - # Create unique classes - with open("modified_csv.csv", "r") as f: - classes = set() - for line in f: - class_name = line.strip().split(",")[0] - classes.add(class_name) - - with open("unique_classes.csv", "w") as fw: - writer = csv.writer(fw) - for class_name in classes: - writer.writerow([class_name]) - - # Simplify classes - def simplify(csv_file, output_file): - with open(csv_file, "r") as f: - reader = csv.reader(f) - lines = [] - for row in reader: - new_row = [] - for item in row: - end_index = item.rfind(".") - if end_index == -1: - new_row.append(item) - else: - simplified_item = item[end_index + 1:] - new_row.append(simplified_item) - lines.append(new_row) - - with open(output_file, "w") as f: - writer = csv.writer(f) - writer.writerows(lines) - - csv_file = "unique_classes.csv" - output_file = "simplify_classes.csv" - simplify(csv_file, output_file) - -if __name__ == "__main__": - main() diff --git a/bin/API_migration_scripts/l7_sl8_cs9_cswc10.py b/bin/API_migration_scripts/l7_sl8_cs9_cswc10.py deleted file mode 100644 index 56d90b4de..000000000 --- a/bin/API_migration_scripts/l7_sl8_cs9_cswc10.py +++ /dev/null @@ -1,91 +0,0 @@ -import os -import csv -import requests -import bs4 -import sys - -# Define functions for each part of the original scripts - -def get_links(url): - response = requests.get(url) - soup = bs4.BeautifulSoup(response.content, "html.parser") - - links = [] - for a in soup.find_all("a"): - if "href" in a.attrs: - links.append(a["href"]) - - return links - -def filter_links(links, output_file): - filtered_links = [link for link in links if link.startswith("/sdk")] - - with open(output_file, "w", newline="") as f: - csvwriter = csv.writer(f) - csvwriter.writerows([[link] for link in filtered_links]) - -def get_changed_content(url): - response = requests.get(f"https://developer.android.com{url}") - - if response.status_code == 200: - soup = bs4.BeautifulSoup(response.content, "html.parser") - - tables = soup.find_all("table", summary=lambda s: s and ("Changed Methods" in s or "Changed Fields" in s)) - - contents = [] - - for table in tables: - for row in table.find_all("tr"): - cells = row.find_all("td") - if len(cells) == 3: - method_name = cells[0].find("a", href=True) - if method_name: - method_url = method_name['href'] - method_name_text = method_name.text - description = cells[1].text.strip() - - contents.append([method_name_text, method_url, description]) - - return contents - -def main(): - if len(sys.argv) != 2: - print("Usage: python combined_script.py ") - sys.exit(1) - - url = sys.argv[1] - - # Get links from the URL - links = get_links(url) - - # Filter and save relevant links - filtered_links_file = "simplified_links.csv" - filter_links(links, filtered_links_file) - - # Scrape changed content and save it - scraped_content_file = "changed_scraped.csv" - with open(scraped_content_file, "w", newline='') as f: - csvwriter = csv.writer(f) - csvwriter.writerow(['Method Name', 'Method URL', 'Description']) - - for link in links: - changed_content = get_changed_content(link) - if changed_content: - with open(scraped_content_file, "a", newline='') as f: - csvwriter = csv.writer(f) - csvwriter.writerows(changed_content) - - # Remove the first column from the scraped content - with open(scraped_content_file, "r") as input_file: - reader = csv.reader(input_file) - data = [row for row in reader] - - new_data = [[row[1]] for row in data] - - scraped_content_without_column_file = "changed_scraped_without_column.csv" - with open(scraped_content_without_column_file, "w", newline='') as output_file: - writer = csv.writer(output_file) - writer.writerows(new_data) - -if __name__ == "__main__": - main() diff --git a/bin/API_migration_scripts/me11_mo12.py b/bin/API_migration_scripts/me11_mo12.py deleted file mode 100644 index c0e9bb649..000000000 --- a/bin/API_migration_scripts/me11_mo12.py +++ /dev/null @@ -1,46 +0,0 @@ -import csv -import re -import pandas as pd - -try: - # Load unique packages into a set - unique_packages = set() - with open("unique_packages.csv", "r") as unique_file: - reader = csv.reader(unique_file) - for row in reader: - if row: - unique_packages.add(row[0].strip()) # Remove leading/trailing whitespace - - # Load scraped data and find matching entries - matching_entries = [] - with open("changed_scraped_without_column.csv", "r") as scraped_file: - reader = csv.reader(scraped_file) - for row in reader: - if row: - url = row[0] - # Extract words from the URL using regular expressions - words = re.findall(r'\w+', url) - # Check if any word from unique_packages is in the list of words - matching_packages = [package for package in unique_packages if any(word == package for word in words)] - if matching_packages: - matching_entries.append([", ".join(matching_packages), url]) - - # Write the matching entries to a new CSV file - with open("matching_entries.csv", "w", newline='') as matching_file: - writer = csv.writer(matching_file) - writer.writerow(["Matching Packages", "Matching Content"]) - writer.writerows(matching_entries) - - # Merge the output CSV and matching entries CSV - output_df = pd.read_csv('output.csv', header=None) - matching_entries_df = pd.read_csv('matching_entries.csv', header=None) - - merged_df = output_df.merge(matching_entries_df, left_on=0, right_on=0, how='inner') - - merged_df.columns = ['Package', 'Location', 'Description'] - merged_df.drop_duplicates(inplace=True) - - merged_df.to_csv('merged_output.csv', index=False, header=None) - -except Exception as e: - print(f"An error occurred: {str(e)}") diff --git a/bin/API_migration_scripts/o5_up6.py b/bin/API_migration_scripts/o5_up6.py deleted file mode 100644 index 01c4fb99a..000000000 --- a/bin/API_migration_scripts/o5_up6.py +++ /dev/null @@ -1,58 +0,0 @@ -import os -import csv - -SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) -PROJECT_DIR = os.path.dirname(os.path.dirname(SCRIPT_DIR)) - -PLUGINS_DIR = os.path.join(PROJECT_DIR, "plugins") -#print("plugins:",PLUGINS_DIR) -CSV_FILE = os.path.join(PROJECT_DIR, "bin/API_migration_scripts/simplify_classes.csv") -#print("simlify_csv:",CSV_FILE) -OUTPUT_CSV = os.path.join(PROJECT_DIR, "bin/API_migration_scripts/output.csv") -#print("output_csv:",OUTPUT_CSV) - -def ensure_output_csv_exists(): - if not os.path.exists(OUTPUT_CSV): - with open(OUTPUT_CSV, "w") as f: - writer = csv.writer(f) - #writer.writerow(["class", "java_file"]) - -def match_csv_java(directory, csv_file): - java_files = [] - for root, directories, files in os.walk(directory): - for file in files: - if file.endswith(".java"): - java_files.append(os.path.join(root, file)) - - if os.path.exists(csv_file): - with open(csv_file, "r") as f: - reader = csv.reader(f) - for row in reader: - if row: - classes = row[0] - - for java_file in java_files: - with open(java_file, "r", encoding="utf-8") as f: - text = f.read() - if classes in text: - with open(OUTPUT_CSV, "a") as csvfile: - csvwriter = csv.writer(csvfile) - csvwriter.writerow([classes, java_file]) - -def get_unique_packages(csv_file): - packages = set() - with open(csv_file, "r") as f: - reader = csv.reader(f) - for row in reader: - if row: - packages.add(row[0]) - - with open("unique_packages.csv", "w") as f: - csvwriter = csv.writer(f) - for package in packages: - csvwriter.writerow([package]) - -if __name__ == "__main__": - ensure_output_csv_exists() - match_csv_java(PLUGINS_DIR, CSV_FILE) - get_unique_packages(OUTPUT_CSV)