From 5d07bd95c3a4aee4cf3eada69ea2390adb255507 Mon Sep 17 00:00:00 2001 From: mlauer154 Date: Tue, 5 Sep 2023 18:56:55 -0500 Subject: [PATCH] Optimization abort button, output folder link, status bar opt updates --- pymead/gui/dockable_tab_widget.py | 3 + pymead/gui/gui.py | 81 +++++++++++++++--- pymead/gui/gui_settings/buttons.json | 7 ++ pymead/gui/main_icon_toolbar.py | 4 + pymead/gui/text_area.py | 6 +- pymead/gui/worker.py | 4 + pymead/icons/stop.png | Bin 0 -> 38601 bytes pymead/optimization/opt_callback.py | 9 +- pymead/optimization/opt_setup.py | 6 +- pymead/optimization/pop_chrom.py | 45 +++++++--- pymead/resources/cascadia-code/Cascadia.ttf | Bin 71776 -> 0 bytes .../cascadia-code/SIL Open Font License.txt | 44 ---------- pymead/version.py | 2 +- 13 files changed, 133 insertions(+), 78 deletions(-) create mode 100644 pymead/icons/stop.png delete mode 100644 pymead/resources/cascadia-code/Cascadia.ttf delete mode 100644 pymead/resources/cascadia-code/SIL Open Font License.txt diff --git a/pymead/gui/dockable_tab_widget.py b/pymead/gui/dockable_tab_widget.py index 78c34c28..90e863bf 100644 --- a/pymead/gui/dockable_tab_widget.py +++ b/pymead/gui/dockable_tab_widget.py @@ -55,6 +55,9 @@ def add_new_tab_widget(self, widget, name): self.setCentralWidget(dw) def on_tab_closed(self, name: str, event: QCloseEvent): + if name == "Geometry": + event.ignore() + return idx = self.names.index(name) self.names.pop(idx) self.dock_widgets.pop(idx) diff --git a/pymead/gui/gui.py b/pymead/gui/gui.py index 34d83286..3b3bc751 100644 --- a/pymead/gui/gui.py +++ b/pymead/gui/gui.py @@ -91,6 +91,9 @@ def __init__(self, path=None, parent=None): # super().__init__(flags=Qt.FramelessWindowHint) super().__init__(parent=parent) # self.setWindowFlags(Qt.CustomizeWindowHint) + print(f"Running GUI with {os.getpid() = }") + self.pool = None + self.current_opt_folder = None self.menu_bar = None self.path = path # single_element_inviscid(np.array([[1, 0], [0, 0], [1, 0]]), 0.0) @@ -137,7 +140,7 @@ def __init__(self, path=None, parent=None): self.n_analyses = 0 self.n_converged_analyses = 0 self.threadpool = QThreadPool().globalInstance() - self.threadpool.setMaxThreadCount(2) + self.threadpool.setMaxThreadCount(4) self.pens = [('#d4251c', Qt.SolidLine), ('darkorange', Qt.SolidLine), ('gold', Qt.SolidLine), ('limegreen', Qt.SolidLine), ('cyan', Qt.SolidLine), ('mediumpurple', Qt.SolidLine), ('deeppink', Qt.SolidLine), ('#d4251c', Qt.DashLine), ('darkorange', Qt.DashLine), @@ -272,8 +275,6 @@ def closeEvent(self, a0) -> None: a0.ignore() break - # TODO: Make an "abort" button for optimization - def on_tab_closed(self, name: str, event: QCloseEvent): if name == "Geometry": event.ignore() # Do not allow user to close the geometry window @@ -282,12 +283,15 @@ def on_tab_closed(self, name: str, event: QCloseEvent): self.n_converged_analyses = 0 elif name == "Opt. Airfoil": self.opt_airfoil_graph = None + self.opt_airfoil_plot_handles = [] elif name == "Drag": self.drag_graph = None elif name == "Parallel Coordinates": self.parallel_coords_graph = None + self.parallel_coords_plot_handles = [] elif name == "Cp": self.Cp_graph = None + self.Cp_graph_plot_handles = [] @pyqtSlot(str) def setStatusBarText(self, message: str): @@ -702,10 +706,14 @@ def add_airfoil(self, airfoil: Airfoil): def disp_message_box(self, message: str, message_mode: str = 'error'): disp_message_box(message, self, message_mode=message_mode) - def output_area_text(self, text: str, mode: str = 'plain'): + def output_area_text(self, text: str, mode: str = 'plain', mono: bool = True): + prepend_html = f"" \ + f"

" previous_cursor = self.text_area.textCursor() self.text_area.moveCursor(QTextCursor.End) if mode == 'plain': + if mode == "plain" and mono: + self.text_area.insertHtml(prepend_html) self.text_area.insertPlainText(text) elif mode == 'html': self.text_area.insertHtml(text) @@ -1202,6 +1210,7 @@ def optimization_accepted(self): opt_settings['Genetic Algorithm']['opt_dir_name']) param_dict['opt_dir'] = opt_dir + self.current_opt_folder = opt_dir.replace(os.sep, "/") name_base = 'ga_airfoil' name = [f"{name_base}_{i}" for i in range(opt_settings['Genetic Algorithm']['n_offspring'])] @@ -1219,6 +1228,8 @@ def optimization_accepted(self): if opt_settings['General Settings']['warm_start_active']: param_dict['warm_start_generation'] = calculate_warm_start_index( opt_settings['General Settings']['warm_start_generation'], opt_dir) + if param_dict['warm_start_generation'] == 0: + opt_settings['General Settings']['warm_start_active'] = False param_dict_save = deepcopy(param_dict) if not opt_settings['General Settings']['warm_start_active']: save_data(param_dict_save, os.path.join(opt_dir, 'param_dict.json')) @@ -1252,26 +1263,64 @@ def run_shape_optimization(self, param_dict: dict, opt_settings: dict, mea: dict self.worker.signals.result.connect(self.shape_opt_result_callback_fn) self.worker.signals.finished.connect(self.shape_opt_finished_callback_fn) self.worker.signals.error.connect(self.shape_opt_error_callback_fn) + self.worker.signals.message.connect(self.message_callback_fn) + self.worker.signals.text.connect(self.text_area_callback_fn) + self.worker.signals.pool.connect(self.set_pool) self.threadpool.start(self.worker) + def stop_optimization(self): + if self.pool is not None: + self.pool.terminate() + self.output_area_text("Optimization terminated. ") + self.output_area_text(self.generate_output_folder_link_text(self.current_opt_folder), mode="html") + self.pool = None + self.current_opt_folder = None + + @staticmethod + def generate_output_folder_link_text(folder: str): + return f"Open output folder\n" + + def set_pool(self, pool_obj: object): + print(f"Setting pool! {pool_obj = }") + self.pool = pool_obj + @staticmethod def shape_opt_progress_callback_fn(progress_object: object): if isinstance(progress_object, OptCallback): progress_object.exec_callback() def shape_opt_finished_callback_fn(self): - self.output_area_text("Completed aerodynamic shape optimization.\n\n") + self.forces_dict = {} + self.pool = None + self.status_bar.showMessage("Optimization Complete!", 3000) + self.output_area_text("Completed aerodynamic shape optimization. ") + self.output_area_text(self.generate_output_folder_link_text(self.current_opt_folder), mode="html") + self.output_area_text("\n\n") + self.current_opt_folder = None + self.status_bar.showMessage("") # self.finished_optimization = True def shape_opt_result_callback_fn(self, result_object: object): pass + def message_callback_fn(self, message: str): + self.status_bar.showMessage(message) + + def text_area_callback_fn(self, message: str): + self.output_area_text(message) + def shape_opt_error_callback_fn(self, error_tuple: tuple): self.output_area_text(f"Error. Error = {error_tuple}\n") - def shape_optimization(self, param_dict: dict, opt_settings: dict, mea: dict, progress_callback): - self.output_area_text(f"\nBeginning aerodynamic shape optimization with " - f"{param_dict['num_processors']} processors...\n") + def shape_optimization(self, param_dict: dict, opt_settings: dict, mea: dict, + progress_callback): + def start_message(warm_start: bool): + first_word = "Resuming" if warm_start else "Beginning" + return f"\n{first_word} aerodynamic shape optimization with {param_dict['num_processors']} processors...\n" + + self.worker.signals.text.emit(start_message(opt_settings["General Settings"]["warm_start_active"])) + Config.show_compile_hint = False forces = [] ref_dirs = get_reference_directions("energy", param_dict['n_obj'], param_dict['n_ref_dirs'], @@ -1279,6 +1328,8 @@ def shape_optimization(self, param_dict: dict, opt_settings: dict, mea: dict, pr mea_object = MEA.generate_from_param_dict(mea) parameter_list, _ = mea_object.extract_parameters() num_parameters = len(parameter_list) + self.worker.signals.text.emit(f"Number of active and unlinked design variables: {num_parameters}\n") + # self.output_area_text(f"Number of active and unlinked design variables: {num_parameters}\n") problem = TPAIOPT(n_var=param_dict['n_var'], n_obj=param_dict['n_obj'], n_constr=param_dict['n_constr'], xl=param_dict['xl'], xu=param_dict['xu'], param_dict=param_dict) @@ -1296,7 +1347,7 @@ def shape_optimization(self, param_dict: dict, opt_settings: dict, mea: dict, pr population = Population(param_dict=param_dict, generation=0, parents=parents, mea=mea, verbose=param_dict['verbose']) - population.eval_pop_fitness() + population.eval_pop_fitness(sig=self.worker.signals.message, pool_sig=self.worker.signals.pool) print(f"Finished evaluating population fitness. Continuing...") new_X = None @@ -1330,7 +1381,7 @@ def shape_optimization(self, param_dict: dict, opt_settings: dict, mea: dict, pr G = np.row_stack((G, np.array([ constraint.value for constraint in self.constraints]))) - print(f"{J = }, {self.objectives = }") + # print(f"{J = }, {self.objectives = }") if new_X.ndim == 1: new_X = np.array([new_X]) @@ -1423,7 +1474,7 @@ def shape_optimization(self, param_dict: dict, opt_settings: dict, mea: dict, pr genes=individual) for idx, individual in enumerate(X)] population = Population(problem.param_dict, generation=n_generation, parents=parents, verbose=param_dict['verbose'], mea=mea) - population.eval_pop_fitness() + population.eval_pop_fitness(sig=self.worker.signals.message, pool_sig=self.worker.signals.pool) for chromosome in population.converged_chromosomes: forces.append(chromosome.forces) @@ -1449,7 +1500,7 @@ def shape_optimization(self, param_dict: dict, opt_settings: dict, mea: dict, pr G = np.row_stack((G, np.array([ constraint.value for constraint in self.constraints]))) - print(f"{J = }, {self.objectives = }") + # print(f"{J = }, {self.objectives = }") algorithm.evaluator.n_eval += param_dict['num_processors'] @@ -1490,8 +1541,12 @@ def shape_optimization(self, param_dict: dict, opt_settings: dict, mea: dict, pr # print(f"{algorithm.opt.get('F') = }") + warm_start_gen = None + if opt_settings["General Settings"]["warm_start_active"]: + warm_start_gen = param_dict["warm_start_generation"] + progress_callback.emit(TextCallback(parent=self, text_list=algorithm.display.progress_dict, - completed=not algorithm.has_next())) + completed=not algorithm.has_next(), warm_start_gen=warm_start_gen)) if len(self.objectives) == 1: if n_generation > 1: diff --git a/pymead/gui/gui_settings/buttons.json b/pymead/gui/gui_settings/buttons.json index dd76ae87..4feb1fcc 100644 --- a/pymead/gui/gui_settings/buttons.json +++ b/pymead/gui/gui_settings/buttons.json @@ -38,6 +38,13 @@ "checked-by-default": false, "function": "on_pos_constraint_pressed" }, + "stop-optimization": { + "icon": "stop.png", + "status_tip": "Terminate optimization", + "checkable": false, + "checked-by-default": false, + "function": "on_stop_button_pressed" + }, "template": { "icon": "picture.png", "status_tip": "A helpful hint", diff --git a/pymead/gui/main_icon_toolbar.py b/pymead/gui/main_icon_toolbar.py index d9293dab..28edf595 100644 --- a/pymead/gui/main_icon_toolbar.py +++ b/pymead/gui/main_icon_toolbar.py @@ -53,6 +53,10 @@ def add_all_buttons(self): button.toggle() self.addWidget(button) + def on_stop_button_pressed(self): + if hasattr(self.parent, "pool") and self.parent.pool is not None: + self.parent.stop_optimization() + def on_grid_button_pressed(self): # import pyqtgraph as pg if hasattr(self.parent.dockable_tab_window, "current_dock_widget"): diff --git a/pymead/gui/text_area.py b/pymead/gui/text_area.py index be754894..6821fe9f 100644 --- a/pymead/gui/text_area.py +++ b/pymead/gui/text_area.py @@ -1,8 +1,8 @@ -from PyQt5.QtWidgets import QTextEdit +from PyQt5.QtWidgets import QTextEdit, QTextBrowser from PyQt5.QtGui import QTextCursor, QColor, QFontDatabase -class ConsoleTextArea(QTextEdit): +class ConsoleTextArea(QTextBrowser): def __init__(self, parent=None): super().__init__(parent) self.setReadOnly(True) @@ -16,3 +16,5 @@ def __init__(self, parent=None): self.moveCursor(QTextCursor.End) # self.setTextColor(QColor("#13294B")) self.setFixedHeight(200) + self.setOpenLinks(True) + self.setOpenExternalLinks(True) diff --git a/pymead/gui/worker.py b/pymead/gui/worker.py index ea424bad..33bfda57 100644 --- a/pymead/gui/worker.py +++ b/pymead/gui/worker.py @@ -1,4 +1,5 @@ from PyQt5.QtCore import QObject, QRunnable, pyqtSignal, pyqtSlot +from multiprocessing.pool import Pool import traceback import sys @@ -11,6 +12,9 @@ class WorkerSignals(QObject): error = pyqtSignal(tuple) result = pyqtSignal(object) progress = pyqtSignal(object) + message = pyqtSignal(str) + text = pyqtSignal(str) + pool = pyqtSignal(object) class Worker(QRunnable): diff --git a/pymead/icons/stop.png b/pymead/icons/stop.png new file mode 100644 index 0000000000000000000000000000000000000000..0d15abdcd198c570fbede6dd30d06396f22d8caf GIT binary patch literal 38601 zcmXs#cRbba_iq#-go}`oO-3Qgj?8Sz-a9)h*Ua8~B;(q$H`y7PiECVYlgqXD_IvB| z{rz!YUN84N&vVXs&OYb4p~{NVcsLX|007|0%Dhzt01T14&jU>GKQjYkli(k02N^9V z0N|v*`=EW!6LkduT0r*g8}-j=TXQ}!@7L0IFOS6}Mu&&5Ab$89+ph{4I?Gdw9y8u+ z-h7O*Y~1ZF%rO&s6tBadD4HP8eHeT$aVBx|mB$JFCboY}_Q{WwgcJdWV8v#$G$f&4 zmuyjfW@?05Xl0fPHcJ}?g?4VL3u;CrwS;D9+GD$AV*b({0c|T{F@uXDwDIOHn_3sv z4_OvYg#jQzm6DF%sCM1miN5FW=E_>h(4sm1=M1;j-!Pidw(Jv0Z=cE2>rXUTfbt`V z2oNJ7S7-<)Vz>0W<+2}rUr~O0^YfMlAEGgFyKs7KxqlDnMZ=*1970stCLLKxUgXh9 zdzUVwQc{-0Gz!%pCgS9pwC<(~C<4Gcl{3KC?5KBYR_smnx9o21&M%cs!(2G@Km~3f z0Z=2B`=deYw(8@N&G`ZK?w>@ONGgNZ7SO3v9ig>v^`DnN>cKpeYm=`JvnsLek2c>T zC-n3M6MS)O9at<5t(~vzL?k%d8POezJrAw^ZCQ3iPGbwK^V{Z z?K^>d4}ST}z0d2A1yst};>8RHHRWMa2Km6aL9hh>VB5`YLB8UlqFyTZ`E7C;>+T@@ z*~IPE)D4-oBlHr3D%;CB6v(V(@dRiw1mrW-Cv7aHzNoQT3KS?DLk02`sZlB``s=mW zh3)(_V2;nn#bZLkSFQ4UJdIc%FGh)JNF7LaAme1%Y-_qQtHLs3)F%7DdekF`?4|XS% z(g(5yd7nIvp6Stk3P^$|(k9adD(ab7gOY_3DNA8)b^-1kUz=U-M(&UFG@FM`T8P#^w>EN6J2sx|Hc(?AOU660=Zw? zDpslH^7xC*#d#qm8B}<0@!S)LRN*scQ{!)L$RkPnp>VDV=mt?zg$9{;@HyqZ zpCq6rmE<=GcwK0WuUO}aTS#8Mv|mHsNBjk}r2>_$*zLIHXo0$%Jv2kAJavQ2>QTMH z^FHKsXMJhrFj`T9%F{6#BxWVw1K;rx zq$q41fay$FlN|dB-~+{Bm`JWL)g`OCVVbZ`b#pqbP@~1AXJG~R0q>Up#)oxopWB3d z#y#q813!u`RdD*bs@y}fBmwnVK~1TWUN3#dg0*`Bz)k30zB%@<({6lIf{Q*(1QJ70 zgfK3E$n9-xtT?*>1G4J&pRAw zAzxHp0iocMvZbv$z7L*^r36ocQG8(B7Si`;Xw0fH4Rx zU&NPaduQsFW@<4Em~}Pw7?69h*~zU%i|ozCtC6~2CoK(A?9}-qk`LdUof;qNr~nZLFE(O#sriw<~Vp*{61{G z9B8l6%ba8AK>H=JgaHvVTu4_)Ec?(XNN~))ce8w?B{c=Sl2%0x(u-J93d8c{;x){KJ%K#RiBGw=x-nm^kFo z-aElSe*)6~iq5v39_7~he1V9;|g8M4l zhD~o$^8=xAIN`QxJ|+R zUK^|CaGc(1xxx+QA_fuj{RN5%?tQw#`h<6uI<3t;mj_hOT3SzsRQ59I$k+BC1`aF+ zijorc4C%{MPtIVET(dXiRnMiqT5lt23Z{Tlt;&2HWs( zXnz`mjFBv2{hV?38wVZtdErUAx0_aR(Q$p zD>?Q~r}A64D3&$F;{QPv{CS!4la++G=cwH9sZ#{=A0sHeA(tvkV${o;Y6k1$9o=(y zAAamT&RNiDA&6dcnxS=xh>3-Rm?>l%7;a}T_7xb$((9#ZVEUvoq1Th<5mtM(-!={> zIwq>h;bb;^S^j=>83d6Up^Ebj%&5Z-dnyew*A-+gg*=&%&OqdZ^4^a;2;cMX)0FR5 zA0q7rm&DfpKIe+s%Ds(D#>p~tOwdw+um^pJ(x;VgCuGIVG-|oA(17of4O@cB?~iwNjb>-4oB(>G#9)zK<7o^Y$kVvPIn z%@Q2C^ZEUs%%UO<@Zu73?ZcC)>;=2x_bNc&1*}D~%|I*%B$0fS%Qd(2@a>4SISqAF zUwFb@Fw_2Sq8WBGgVJ(#3UWF9d%=a1wj2g|n`cnG+43~6Z1~RKj9W;Z%^PQ743N4H zJrOq8SnBhhLo@ay>3tkX5c4!|3?b*SzxBB$*{_FN6`9bD;0}qVehzsZ@jZ*KC5h#% zxa{b4=!8D#)dOP!P3gyW@zP7x0m3hMrV$-jy<*>T>zHXakEt7=8B?CPy~t@p4{1`W zbVFtf8cF;rQkEdTu^DnU67l-tQ}W2_t{u_yka|$Z5?irs=>fD}%s>L=VBYro+};O? zQI2sb+A>5Fn1bu_WpMW$4H5&>glbXM)jbAMg@U$Sn+K4$FH6beb`{)yr~fT&=I%Z% zAdRa?pcyh)v_1FsX^4LeNBKMu12)B$Fvi4&knbGY^K(y=3W^Q%cq5sMIp|ib%g=e5 zB?`Ep9{QdQN%4=dA+ImL)(4l;>1E-q2@J_HXdS5Wa~^%DF*pQWT92kKZZF0+8u?U| z?XA%ix}_MIn5QWEM{s-f!Vv*#Y|hD>DWyjWbEXGlM~fZq^VZ2%+C39ea*|P;&iDnN zX?_X_sC<$T4tzA1iI7bJCdzSX8~=!ruz30=u-S^qsp=f|5syp=G&RH0o7Jr~EZR7o zPgIe#<#d6{2DLekBY2HYQ*;Q-ms(->eh{{tSXk@tqQ$(#p~>{)z1)AKJ1j&bzjs(z z-K-JSrZM0xfbm5V0)b!zB{3zt5+}n6O z-sByNMzo=kfYOL*^>3vn_xjDqXAcfm8)p|^iVb|X!bfsjpHh|Yz0?o;2Wtkxq6w7R zYBbQCDT$7(3qx;sMJFjUqy8xRWKJ$wF~^`?UssG_7k#uUZO=72rhYzM|4#(eRnjy+P-um zgDzaP&wqlM)KmMccrf4$fniD+*U?;TO>c5#-PZWmZayLw=l+{qtYOWI%fEj=hG%ju zRE{)REE5sLa5JPI>_*hSr|>a3RD)zlFZt7rnmid7R1f zgi_c`K{0P6o#ne}!+TOoRrDM7Gr?R*I{dFQn?!A9BgC`z-WVZU*jy8Fxz3<7X5E~d z%3+yh6%%iVeQ&;PWly3Vyz{wDG)NuM&2^rm(dCY}+!E;fTcFcwaB{iN*C@(DghR8c zpBM7cz5j>PT#w9?B9+3X!_F)oE48U07Yhrl>c3)@$lV^VM&g>HkzdKGOBc-p&R;$< z7;*cEid5^Kq0P}iKsEkUs+#;SlquI0>LmU}k$~7yhtEw7Hc|nM(CRS`s|gHQjhl=H z+mic5@aV?m&q}w;{A&p9k?S`*DrdCGY%cB$D#*T_sQ|Juu{eKk=YvnvwSpJ|Y-uin z0MSOUdg_2JwH}>bCbLL&N7MR&yHtGf+fyt_@S0`|$JU-^H$o3O5AFgtK?8-v-+V-m z%~pb$eaDU@iU%8s)hlrs^e&rb%Jv==%V8yP9Av!OqjC08egzTfjg$+ub#^b(Fw;bv zqXJUkGx#>LqxabYpFYP-&L|nWYKm%DJ9(dT=|2ndnp1r`Iha$)#WZajjOqp=CGKq_ z3T-a8nuvh1QR^>!C)V!O)44G$33Yw)hZ8p<2iVGO@&B*rHp|?^Gb=8Q7@xF ze&S6sv#|Sxo5PaOu7`xhXl^wgO56zx#9%NxfsI5AHQ?2+N-;~Xp@o$o6}B_vJ$L;y zlvpum?@RU3-_K2PbSfJMx%8rY{{pUK!Alo6i)6+Ef=plZ)SM5qWHJae!r=5M=S$et zuQuju_87_^fxEX3s4=0nEsj%74+G`r-o!aEy?`<)a0KT?I(|r#g)t#Qz$3B;;*-V~4XWa33G9+v$BGN5^_mVvzJ!4UCF*uH zkpM>`j@%a~=~KA< z*H4U(@IGYieIep2EsUy&IyGn0`L+yT47f8bmD7Vzyj}c1nSlx8Tq2>66)S)pF zumqh>jeG;1EV(Uie1X*hr2wkMdC{F4p?BK8%47FtMoy5;o zV~c$ky5P$Uhjk8$@<2c#|CX<-{*p4z`#VIpV(ro_ep(95LW)BRFoCm`uXWD82cGO&uoE8opM+%%8w4bvK8NIE0=OG6N1b@0 zMH!asn5&Y@k@khk9V`yXCI2AS`V49BM_an5FYM>`PjN2q%fx!GY%Kb5{CPfKfP_OSlG)Ozui79V-nszkVAc*TnB*J zyouT!Iqh4CE0_Fw?7GZUtZ_}{!NyNz{#l{-g}xuR!xG{WXuckS(Nw4M&Jc*c-la?sWt0*J(hp^Bv4vY4&Nsz^#XcRcqubUUtgDYc#B>hBPp}6dhZ1iaAzeqk)E-^yp1oQdKO zZ#-ra#YNhuubFA~U0b2Ky2-(nd;m+P+={)VKJMi$18;ng4TK0DIKVJi86n&II^8DPD$k% z4vo43bNzMB#&yQbk=T;>!&S=y+y%Djf#f{jI-fdz5inkV)cvRO{@6NEK;u_Nj|9VE-*4!|I&@ zdZ$#Pg)^;)Fcwe4+?g#81;W&Yxuf$AAtQmx%+AZp{gnCYYc7TsY&~i~taD>$s9qi> z-6$$J;q_a`?W#rG^QkHNO54@uVD1m=lZ!WWI5b@eGdTq^j^kz-Z0CoA`Ou-Py|^(YkZIP>*ha!?RVzOG z&$9F0mKgHj(C8MNBBzYlpkYw_H@1UiU|osa-*y1S-8@&C6wMWrZF~vOw7)>Ie-1z(KoV5|tg%+Lr_&*u5#- zh-UG|iRdWsjSHjhyS+ulpDX$nKA)EIMFVKbj*v6>qeC9$v^n+=(U9yt)~|GA!X#2N zt{xfnf%blYuaN9?QOC311gu{Kek`6ix!)zDyL9brQ@4d@Zv8f*rJdV5@rM9k-6GzL zla^YazoqV%Hg;`i5K)$_J=TzHQek`cjf0zk@_Ex5JV4npQEH*JY2$F-zmwU?Bb>#1 z5oC{qN_YnM!m5ze3;;-~+Z}E1N1l2tJQjq_!0W;8!fC7Xo?Cu!7DV*^o27UsNe*cL z>REVs>@+68!X|vd6t3TtQ!j?Nz8Y+1oiAmU{^ah~FYl*(1pxw;qDa6SI~MYJIj_%I z1jWd)1$?tdbL30=}ZEa<<1pyR4%e zQ~yayM~ivpS>FpB*b_EmxSEmh&|Ubzdl~^U+h4Uv$<4r0^{6*fa0K6;M_h~cc!l^-@Q5d2cAR6bh`QI%_?SP0Ws(GSnSxjcM`g7YB`0kD3S z=OTLRIm6NLP&j6JT}||=;qLA}1$8hpI}5FeN|iH}OGbOfU(7g7#ECyVle!OxMfR6o zy4#In%&!M2t?eMHhLm1_2Z#}Z9DRz}Lzv|p0F`0YynuUS3&lvTczmO1$lGysUq3WrhUk7>Hk?eibzuW}yw zE;GYeJfEnSA^T?H$z<&=i}zi{9|C}7W$v(lGgIsJcaPB1wK>rj*MvF8QQ+?Kv0)j+ zxB|@uQZu03X8ZtvVN+R?6MaSEg?{-o<*QdA9X(GQ$30&)_CAl6R0>?Jvjx4D?Tr>1 z;F}voj;H(h7vs-S3)wnCb=F|+9Kp@=h3TAl0#&yQ1ED~mNHlWd3K?a2@TxFI^VFJ=635MA0=|;{jIC=gj81OtV73%(G;mZT zw$>+riUx}%&sF6}-dimTi3a>663~?q5UqUuoE+~GI^owBlieI+cE75bR=oTAWP|Qe zQqEpw8Yk3vKNhrx>>85MTkv@0BbiS#gF>?4auL<5v(^RXED3o0U5BC16wwS3tt#)_rgLnGH85$4J#9nVHl`kf>hfyo3Pit;p7lKAn9vrmvyG-t1l9QzehG zf9S#OiK;?&C{514o)sw{c}Cu0ce=rVz!OM07MRLWI@uf;m`r6Co!tNK7!C6o`$YrR zMop46NpI#*2t}rlRU`iq9LZ=Q@+tV8paYSQCXr*BS5GwSSjbMjMs-3d({{}K)tZ#g zH0i9$Gq(Bvu*<lb+g-TRkMZ>f0Ps!PO~lyxoAC88KY<5HlKXYF!mdjIY1Yap-4~y;EKm%3 zRE_}9K(mRjOEbCF`J52vi$dj;E;1!qJhf>Hk+BWKU|PR&b^H&EL6XJ0ze{(QcB9k< z{N5y(wVi{YavTD7w=?7DAfnhWCKy_39|bDKv*y*kC7zXQdfcRcBmDkJkY~euY10 z2mUwzj)E_79S>d0F25dbPnX(OD@aBob3mmAYC+1>n6?b1t^a&~#o|fvww~R@2(v0> zym4jswU_O!ZJ%^A*eiN|4JY$jSP#7q0N>x`Ew6X^;ak`{q*VAbKM=HJ$ANWE73d^S z2qQceR?Rk9a%Oe1rP%afy+MKC>mTo6 z)sHWI{3$>L(VUC9A?6OJjkWWL{cuHtiF$ioxjTx!b)R0FG#(POd7IAaBPg15uNVTT zdL<6^0;qT~1C_eLgwAw16e&IDy&_-G`H;bHKUFkDVJEcwpL9sUt%HffX_CFxmdVv7 z+u70|L`0~ZnabF!QanS?P2BkO^-ap`IhYq55)cCbuX@9>boZVfBf&4wtfqG0^KFv-g#pt*sprSck7jaJ?b*}?ZegYw1dyifcL)AZrO+Oow)N@ZV{fxms_JhKi& zg#1M*Di)Df^IVV7G1frfOmK8c?M|rkM^}ywBE0oky}id;x~8~77;Z$aWndf8Csp&z zg5bL6r6@7ShT zfvmg!RDTC;T4@-d?&x)=Fh4P&TOuE>dcU?tpqgZu0$b}(hU6{&+=!58?iETGCDLKU#}Du1ef5OX^otPEM`v;lL=sG;P&ZPbmdY?$S99 zoR;x@dBo6pA6B-sk?aa$1F^UNbMAf-o)Wq_hq`?1ie!Qw#Tsz=sv)?8^p-UStXt# zZ0fMN+T$u=YQZ8Ie?mNw#j_~a4UUJWKi^_kdK&qHf8y#L99)Q5r9rT*4giY*pD5EB zDV)+P+LXu$Cu+0y3jGvELr5@Y?9(<@8>v$~uEDq@qH^3u86-qEzNRO7;Kf9AhN!Lf zZneH>gfv(}FCwONj32|(m^ikvO|_MCpd2nW1~FP^*xq0H_`6m}H+hfU-=5G>j|vBt zkf5rQ10SzyD$BL|A@f%cw(av2`d78x*1R0FAdB3>4OOC_vALJ%;yF2)TKXhTcI_^j zH=;v+l%WSI;RrNd6fWw>^>ASLtlc8;P%uUBdoXp)b!u{ zh~_+rr9-273kl~ORSoIc3<_Hw&=QpDG=jShA4x1tO6_pk*?j}4D5cpU1KSAk<%IlN z6DE_n&SLeSK>P4$>9VziV3J&Da}x>+h^=RS?0%`dgiE6bamFGLI#(`tqPN2aZJ$e1 ziVJ8VfIjEt(nFNjYS#72KxDjaAc4SMnEn|!>M-D}xi@*RCOi-33RZKnf}Vy=;HG z#Vl{3iws^4WcPH=eDi&d`TahqCG|VGA03eS=krOsr_u|t|EPE=r@c%6RF(65cCWB6 z_<|6Xs9IU}K?PE~QvIyaVu)Y#a(#Y;$D~v+hfTJ>7c7P3yG{2uf*ATXb|EfhLJ|UG z8yJ?dZlbbxw$*-gNcWr{V@BIHpK|WDFU6M%7E)a4_2};AVPNI#P7ZnB@$Fa^Jkdy% zQ&M+8;+iV@M2f&I1<^qEhEPzXa;m$W^BdwDPho6sxKQ=_IZ}`y_2vs0^kqV!Ekiqt zg8fh!=(W=uQ$f?|Z)Fctker<G!S}tga(S?MW2o%(;vVU>fV}`OMLkf{eb@HT z;5696D-uTzf^$5N%aRe+ot8w$qbIpE+&y$=F}qbaVIa0Zuh&vM#L@xP7rW|K z6=Cz$?6KpF(tp6n5Y*%Wy8Ekb)h-wDZ;nrs6jmGe;5^}qSQJkht!`F>vjdzo zcq5-^d(aXTw28W9@fhG>3w%Dvnw%E_Z@$6DHsv%bdh`qC!I9zRp5!QvEkcP3#Clja zHHY5*AV!<|L(_6>ad)Oal{ih1ifAvF(95*~s>6=BGwGGwm${A$Araq4^duU0ig^mZVu>j*)X1b9HjbY5&d*a~QG z@|c@OE)^WjCpRPvbVv`elo3$JYe}V8IZLJx)*t@S1&xWAH@Wn@uAIAvXMQpYaW z>@qJPqN5j8o>YK=O_|8O3{JfoKD~AjND4YhujI36)dg$*-4OfqrZOcv9GY~o{kMBx z-|dexlRAGEG!P~d{vASjCu*Jx3ycKC{ubvpx483Q`|Z_!UOdy6r}K?ETu=KVgY%_a22A$OjJBN(u6Ejz^^QD}Xg*F7vil-Y!jR9(3(eC*)`nwPHvz?W}F4`Aj4UTt`4^zL{ zjl3~dbOL4id^u}S&P`|<_1ipe!F#u8cvVvE;0XI~qI z<3x8l%=5TcSoebn>D}c9L2wrC7Bnv#aK)iZ`|XMWZ+hOSwU_SB*{hlD^FLenx28be z#Q6Ndr0N|Z#C{mAx%+9Nr>{eLmkwoGFO7~@cUvI}{p>630d935DLOV!+RT#dhfjpw znYMlLO5+SUXCgswR5h@bUw<>)7+=&Os;8dMZ{7vQ2DC8O9~90p^<~lFR4@)G*%azw z({Jq!i@9)S3qkq^yx@+#tP}qD2V=)7t@aVc)p0u~PjE>^Mz+skYLS)0A7Zus9GAmF z%C=+0{KreSK^xEu7KdAr`IonsxUf`tP`bcdVPCuTBdR^QXEC zg@M3FxB`(Iarl z1~Pa~(BGc@4OUfs&NhRXyk8exnht73wWnvwZbr4{K7jgkMlo(a4Zj~oFB1~nzDACu5;GhV6JANR^)mts*C5S zmy1Dyl(SFm9{$pK=irOGk0^8V(q;8b+d5(B(%3!mx^=Mr1DbV!G~_-N1AAme7X-JgV{kf?3mTM~sM<~T ztJGX?DQCtc)vw2NKcQyS=0pBW_0T3U7{2)8i4zQ%Z3NsipW4B#zDAO}PE8+IR<01E zVi?#ns&MA+m@y`YW%PRLIM$1g-gs1pucBxVZd=*9_`(V{HNPFJ=ZZI%;oW#AwBP;W z^)=FZSJZAon*8n(dA#9pRtUCjC%b|ACf3lvUKARr=*RHV}tN9~L}I&R{u zjLsgKGoU>97Bx&C$6oW9Eet*=ZWQ5j@f7Emnl>BZt0w=4J+GK0PJduo^j7`(p6#>j zU=Q2r;jyp|>H78$_oKsVEed1iQ1$&(GaKr~*EE^V2aVMV>Tm`fm|B#Iqt9nXySrVx0)A`&R#cb)jm7IpEq)A>({vyVd)WdNlth%=F;zOZR>0H zLZccQ9vP(%Z-b>i9<;42GLDlC1IlayULZ5V?izK`Ntnl^rp5^WSbnvDICC?Z!_ z+J4RH^UAr~!=b2!KM!KtBCLBRFQrp|u;4TxHFre3G)!zbLtm0tdNx}g^_F0Fy$=#5 z2R3mM;>eiRk4C@igVieX*og-Vaagl*g`MDFQyqf@8pk7T)%}q#{_{hPWIER_G9h(Q zrQ7!TAIkPa&7ccTQ=k1yo`(0)aR^4&3bRnSFFjSt0Lw33e|mM?lwgZ^lH?Z#)9>NxSysJ8C%-^P2Nb^X=c>)X3)0N15^*Ke%HB{_Q_ z+Pvws&mNw&woOmRV{+%~Z0n4;y70|=B%fM<6Q-2;?(@s66V1PfHO}LJ2juG8^LgOg z38$klE1%|1t^=LY-HXbQ3yVFq_JQj@pKGw%_pvUnY^<}%hXS--1E<$5rLWdLkcg!E zhu3u7-gK-tzqFsxX<+hPYW@Dqfp)?)SE1Yt#p#w_rMUaYEWCMU{PM%C2c}{9-7^6H zZK`>$Ap-@S2e$FMO0Byy!hGmsePgd;qWTx2CtEgdZ(n!{Ouvdzu1MNKjTUvRSJ>$& z#gV>Rp`C)ojd#UfO`PIgr zCfX1qc);^YE^djh`Y)+FcwfOWO82-%PyV)p-fGk95UUb%=-`91b!uz3bTCB;4mFRd zmyTqkaFG3vlI=HT8=OOxx!KaxnnLv(X!f@~$xyHkdry+U_qQzf7}%R)ritng7wm+7 zA=;2?%Qk?ZyOUlDf>U!%=^7fqB?c^c-LpC9g-LKSnVr#}Y}ofQ&M{6=HSVX&|2G`aNF0S=1Qfj*4K?vG4p z)fj`11F&PHE6axF$q!3fe|!AxuEXC(#4{?4k9B}_2V~ItK%ph6#)$zZPrqRHQe6i) z!>no)x~ErJiz8~_OK64|?f^Z3F#`!gOlsjo<%%}ib3wF(|Ey)FsqIOcF0sY4^V5%? zmElKaO4WiQS-1&gYJAdrvNOul!Gukrf8NgD3(I&9e-}?iGW16!w+5{uN+=|@^!Z(n zFJBFnefB0Q5VS+zTphCJ^k}ff!;rQonjc4TXj-NwFBU5=?e!;1lnmlwL%iM`ny*52 zSv8Kpu~xSO$@^gEm@gg(Fc5W)-UtQTR-a^d{dt}=^Ud({CLU?{=ev4+o7xZ6n-oso z)@P~)r&Hk)mo6TJz40yi+0uX4|Bdnv18KBoxV1e zsYxL^QYb=(|l}*;)K>dLA5D6T~mon_}*i{A+ot54zAl7{*2Yz zHTEPZZK^mvsC?$qoBi!iHUiERa^dtHbCCo~xuu+h=|^+>b1^%Hi8SfWPlTzaDiS)d z8nQa2_$14Nv$1>!OnFb+>h)ekwv;ZTF&(^Rei(eCC|bSlUYt`pkzu!;Au_mm7QiXf zO3tYJgJfQFWNq7he+^lgbj61`wo>r$ta8_*`vKIovkf*X^rB{S-mjdQ zE}mk7IgrJ%EXKxmh^t}S`IIQ^2{xK<^93|@Uvd#&bv}kZEBL7DgC3$}hRsL`78Kp| z^5TX47W&0}JwK?MLyQ>0ey*=Ry|JfzBIg)S$Uk*P0368I4Ly%&c6sSRK$!W(cvKeK z8c|A1po`~W_p%vx2HC-UgeR$QI@Rnp^loJvE58*4}4o6Q|D;ruL*Z;uT9HR0xk5ZKIj zGkz0Xt6}~XQ)j%_u|5bQlK-L}D|xc%r<^Jm!!@0s9RbKj90XN!66oLef8AG>@o}6! z8xFR#UX>JDHN;%8V~pH9>r(u@ZRIgKOQg#6;H8*;z>RQ!t1$Nt8X(DF?UmullC;+? zK(p$H|M~%kw$Iv`2SWdwyuWbk{ta>|NI1k&eTi7WsDbue%H)}BOUR@GD83B59s6KF zbT*C7Qlq34UFv~Ul`G}E@Oonx&?r*%egG}}6b`-u3Zwow`9tR~D8j!79o`_$v`&}% z#=;*o3isZ>_7~#)Yku~H00^uCXR71pb{{l~^nyjS(@hSoGLMa_mhxZ3`5hDoyOo4g zGzHzW`c05`brc96BVVBqj!8YQ?s;cPz%mI-q~H9llggk z(GBD$JE67r(KJ%DyTX~v4vy~u+dD4SIrV-nBE9jG2a&L$n){hB|2eBf+l52Ljz85HMmvVCCeluxh&BbrTGb&FbWeQs4 z$OcATUy_HZuaB$Uz|P^X%3S)SProQ=Ru#UZ=shl)E4zMlx2&1+sHKpG_d2I5b>h&x zc5DDB`^a=#_Xu+vp4y93(R5~zfU_d}T};-REB>>g(M<}qZgd0BIS|DK{oJu;OQV!m zgBEtk-+K}k1AF&rz=1COKpdE$hIc|aIJ!Js_6Bv<;;RhlrW`uTJ!ID`}P?YKTJ~oNSr;bm{e8#`Q+!~Nvy1daB zo^wtgT(NWG)PV?_YVqf*TW5 zQ=GjvIX#a!d*<3rU>PF%yTP_!*S%dBF0$@A$v}+7pWLQC1Z9v|J{YKKIeQv2SN$1b zQ*Hez9gQzZpmqkr(AMixx_K8m z2i81e%4&_`vJUC>kL5)U*@)+P4O$*m;3i_OY2AxUn4Gpa!qXiYtR3~@uDk_F<5{tTHDvKX zd&{DRz6DmJt{fsw&N_CgPfS5fe76GiZ>K>{_KXj}C0u&6Cv?w{k5R+v+Aoej3a^hm z2TNPe|AGmiZ+3Xg4VBGq#X-_6^b^COCJHJbQW-XYc#N75h)iS$AB+M3PUq?MAvlYJ zReoy0%%$aVt_5zWcJ_+c#P-bZ1jPl8tN_XkS;4p9ixBru0{v3hl?W$m;c+Mq?6`fQ zBrWk*lGs$!E9;9@GG4#qyM&J=dlI$S{^#|F`JjLr8!HZtq4t7kTB4}6|Dc5zO*Q*e6%JyQFRa=LH@QK}HK#~+^O zO1VADvnyMhEdnLPFZ+GF$+PKlE!S`n=eznlJVyfF`QQCkfWg?7`@F;6MYOzp^?_@N zh)Eh-aUn|WT@Q0>Yftmu_ci@Pi?>QfU8i0GB6oB)4qF>{n%{o->a~GkztZ9+sg(CJ zFq-{UT%a_cfb)g%Q3=bP`1$ri5^PTFtxJxS7e|P?K z_>s)yQQKOT_PW~prInG3i~yle{~aULl5%^q==HeSbRBh3f;d;7*>^Pe8j5{Z`HsH( zu6A>lqpbE5p@{;&8+(5?+1$F`U_cd0oqdBT6MRWc3Qf{Z9D*XFhfSLGT07Cf z0`nxe2zY?|5=-C9ZLEJLzT%HX?S^687+Az%Yi(T*OE<9#3e>tBw8sYFAllzw(-!uU zSt!)+c$-%KDfkwpgv8)7m|vNLj%d2q&MMt*A0t`+-5SvKOP`rW-_WAu7&eHCp#G@2 zMEsFa7<>h-ap?X{iqw=Garz(NTjbcv(juImc(kNhA;{MGL(0NP$=@g?rJk`O#Tu=L zxK&a|9UOOfI%bs(WsQ=RHcRH)I?E3@#^thkIvb0BU#}f$Q$3XBA6X0}$fimEcL%gu z$m6O~l&2{rm6jcGtnHG?g|GFzNa_uHDiUm5WW&G*UEr27e}4$9^0-98pC z1DobkqfSQfRWiuDFYi#E4+m^1X7*ofrF{&{Dy&R;g1Rd<`u5Lit`i&BjV8L%kJbb# zvAoDCu%+8>c$sK)`)^PK$gG+aprK@Bua_M^F4R2x8b@T;aL}5_?|1!g{kJZCer9%h ztJj@Xsp=@t5zvm&^ma$SThJUan{EsKhue3t@~Gz;;9p4};>rk_=F^-X)cfjfTaa>;aRz!#C45yIakgU1AxWmPZ}=bHvFB&4zzer@bMKnist{g2il z@$$Uj?ya;7ZGk3wC`*zIm3rA8_FykL8{4yo=eF?C$9rD4&56w5R538g#VdS#QRws` z!vPddWY)Kdvj8?G3DY!^2Yley05=I#nB&r{zcr-}{9S|43>CKqHTk*y2BUB3KB@l? z;vt+~VQ>D9gF1Ydt0+P4i5m|oSZ`^7hxI9|)ar^?p#4V{y#_jdQbs75$Qn9+9BAp? zp1)Twm8!V&n8S~JJV?PfRD zFW8t%Uw86-6D-)Pa;vL;c>WdzzpHftn{Mo9geT2sRf+#c*jI&B-9&qDMMMcvDFF$U z4gmqly+II=M!Jy(Dd`SL1?leY?(UZE?(Xh7v++IW=DYa3@p;(upII}r;x}upSyMh7 zz$-DA5uF%R-pNXC0JzSppbb$H0k6mxFrnwXTPW;vRAnQ zmp!+P4VXKP1wH&vej9rkN13pTfI<%-5THqX{#8tcx*S8yfMogkD}-knx+Ylxh9VXm z%*?Z%g9C6efNbJ?r$SXdZ}_Ve^>Ly{x~#{Suz+EpN5XXXKenyJ{7&_n%f9ii!FJ3? zX1k78KfX~p@R(E_%vKk1=6AoM61#V(aa-{Oj(VP)$gXev!h&Uj12;y#Ub3slItrg;9IU6SX|u4{_mh$VtDv zp`X7ooTCG3B^HX;TElZ|TJ_)NCVTi}d>u`e)AZ<5KT-nWCP+r}#d>v|e82k44bx{u zxiPRYe=p%G&Fi1Q;T}11g~d2zHPCNqL?iZ5PJ zIT-qu)WM^Vi7kHOG>1FleZC(zYrdZvuN=T(24uqY?V#PnHJkPw=P2xHlw)Vz_uXar z?HCO~kTwM*3qwgZ=sD}CWa#PPQ*2nGY(S!nmdBDV-M-u_@Uvc=e1JU9yu7f?WEXki zl2oS5FclpE>#LjYe>?V=0r9u5*l#S{k5z0oV!sU>P;-;QicQ1i!M6#J$FAY5%jF8z zt<*Qv1H3bhbB|EsC8#_4slKxfy)R6gf#WoY*58XA&6g-d_-uoc@Wnf9yR3DfGSa}K zao~v#$5Z5^)z!-^^n!0-zfHSgeS7Ff23mYwxG+KnzLtYq+6F67g}NGYyLG#UMlIm- z@HSGNWP=U3OJ(~drs_DZz%A@DH^t!P`oJ6N{B?Lu8bV|oSlS7+Jnpsrv8^^JJp!8O zJs5i#9*bwmXsEjBPzB$BZyZuVMUU(1T0D!n}!RT3Z#hthvtc4hR>DdMPa3bB4fr>Dm3Zt8uO< z9`|1k-n|l-K`l0wJ#>t}r=lSRcuFx$+`(cSf6SBNPZwFqhEJeGOwX}aJsUThjdAni zaycJ5TFI&id@P%<(3P;(HH~4$C z)OPF5%zy#W2Dlh#k>QLdp;y?}e6Pib%ylBlR~f7vUScDb4ue`gN%3)h_nSphx7QvP z^{1?|c;ydcvN4=(pe=ZC^A8DSt#5-bIfMrYk3V5moxivqdi+Y4eT6yvuOgmq?T=-0 zI`k?Pp4tb2i$_jE;MV@vEwNjWzlhQcCxD_xGjA3`&Oak&*@8j@&dsIETJTRz*_@R`eNj=jxPHimyoz4M>W{PDs7uBRZ&;MyC!(KNUh4E_%=0A}VMB|-*~J@9Kj zoGWb^Pe+yaMLo+;``1F2q8HA6y2h{n`_gA;NppOoWM#G%j{`yXs2Sc5Q#>Zvp}we+ zA$@94Scv#?0$s_{75o6nY0H2gjQ(#x`+uXE{WB@t;N~m5RR{DQTtO-Y?zIr{*}X;i zf2jTce7yE~VTjG>`*D9yF5A6|cpucHOKdX>pl?;z`Ua>*1BQ~|pmgXpzk`pujQej< zQkcg^IQagJoIBE3Zl7}o1Iqx%&|d!k5$HQmCJ%F2yMp~&h3o&;&)#@@iLuq6P|?Uq z7~bWt;HEYC{dG`S!m>P5chPPA&5}1M{0I8qSg>Td9qRjCkblEuTM7z8FsfmV-p~IF zb%}o;+R%2j39po9>v+L`%OK95pSeCFB34oP!kC_rs9s8FW;!SsK8yJn`33WZ8~Fh4 zt{FSC77OJ2W#u;Su{?1SUMQxs`36b=mG2tDhaNYS*`Kx>u3%K7`8QgI;2QJQ%S0r) z7P9eag{5GZfASJqA#=_NM-QMR3HYp^M2J#%?98TWpY1i&1{|hx+2A_~DN`hX=7V6P z<*E;JD>z$X$K1=q@J?vs96y)4QnIlyy9P&rvEDzBSug@WgE0!fcMube)tS+r{x(Mm zp8?;?@0`;hJ5nlKmCE512|ccg|1ZeJfw*V^WmLGks~m$B{j$0@68S%a1rm1PqZ=My z*~S(YA38e6hfAL;SEc1t{{d=;mK6@h5(z`H)UN_64S*s?cUZ^2Py!l*>#El>8bNXy&Y>KqP1@H4S9kFZFX#kkx# zNLs4f*e@KsBk`-MwJ-geF3llj=1!>&pCI?rG<}b6^ww2f;r>&^*DBA!*KB%;xQKUApOig7ULy7;k__Jrc>)s+}NkohnU6|+8Tmiy> zb#M8x&*GL<`*lr*@$?W*dKA^LUV$lkyif6;HB807z$28icS*9nf}!*SZexfs68-#r z?a!~BRMR(pOaQ37k6Y8AdT(bMbCFe@{PD_njsJ*6;&H5A)lCr)6$1E~S^sBBMcyDqr`)>_JYH`-WXhxYB&j^&+TJt0b(4TITJqU5!O^X zVVyX5GYCKO>midT<;=aVeF?Q-wM)=g&|Ff5eO83`Eec15aAW25*V;kE{vrY!xipG$ zP?3_a0p4dou7uk{nAlZW^^1Go;)~6Live`;-R<;Fjkb<&pfz%2jun}Y_}SX z;Yo3y7c7MEA0|76fU$L^NP=n=YStfP<6y;U4wfmHL zi1|%en=Zm{cz8Ww1-(IvFbrsD2=R+|PoHItpU)I*>`+<35uWPc3t_9|dkCQg0Jq%+ z?iDf-Z%8Ra=A`s_%OnquZmaj7uxfS1ZPb7JzU@wyg^D33`vpULCzaO0i7S7o3PpLN z{e8f_%o1~mkyO=wIG*WHQ}gK)Ua6g}^MLJpa2f)R93LXBK<&5VADe#u<3!gz zdJe!nL^1(NUB#{IgK`|;pQWVG%r;MwQj?bACNr#%g|OzEZqZaMH5VQf)Z73KhUvm0 zV(3jrB-7K{aBi>a)a)0`ueTAY?{;%yc#GhAupff&N^}UkzQL!1hM7`h8Y|tmDMy0f zBw~M2V=KutJ{<{Y^@B2SJSo!ih1x++p`(Fb_ku=~iU@Duqv$oAWI~Bs*`Pp{I2sVjFl>Uks`LQ!TKW#ZL}BT(`??=jS*QcJDi6Z3ClRSyu10eRA2bHDvx z6P5Lo62mve$K4T@^HS7ku>6#wp()#p-I^>?W!vT+okvw2U61-T)vayc5x`8I*JbSD`3$HJkO~nMKuZXfH}i8t)Q>ix ze9*>^#Y@6`9xz2&QC>}q(ipks7jSnWMC@l&aYq(JYf0p>~c$) z%(CK2ImAlZEBAWZ3Iz*>?r^vy8@HWlQ20S7Vem>C?37Hf;d2sv#0i}hJ;Qcc&09Dl zyA<&ROF;>wa%+^_aI#Q7?n`3A3fU^%eO(oWCQSxCeg44+NjL}Ds_Gqd3(fV`a-u2i z41?St=H$hQXt}P8spX%DZD?+ae*b!cdzq#x zOfzl3jkxthLu4RAefDuIuQ>rUm$9|$Q6KLBaaOPp88pXL7l6NWrz?(qN!uQa=n%w@ zBQY-PC^h!`ZH*S*Bbgu&DiEKk=>Mz4JU;t^BaCdkAv3&1#_ZTNw0z5YO=HVX z(znu9A7pu5t%FV0=Ms>@)%b@EU9`k<_5!swpmcSwp)udPd$N<3miVT=2;@m0<@GeP z!v{^E0&N7pg!Ps!X?lh^U3{HsjEG+YTr~pwr_H1O~h;C5;OsYJ>Pwk*}pW2 zPtB7UZmanXcueP)GhG;bC(B&}kVLzUQThI~JjnCLQr+sda`X@Xw1AOS zMPm7B5XVp}L#Ntu1df+6Kdm>`Co+8V1!dHd(m%{!-Co%B=Fc{f%UY7A(3L3jFjr6H z6~p}rMd?K6)<|3hxthj{_i-2r6-{H+S`U9QnODyUug1_PH=*gCw(!dq=sow$>P>vw z;CzD1F*FV8VJ;Iu*)gHhlT8BVWTTg-3RHH#OyK|=5b(2}=@BR@+wiyRV~f21Fovc| z5Fenm&d{$^6&`7$zZaAa+M$T(#5dp2c>h?=%n;J~G__+I+;r(PZrv21y^*24Z$uF> z?sn_$$=yZTB0m;i<~;tFERv~Sub{rvo~*&~7a;8e(+ z_>US715INt4qHk)J?C16QBnmgSmEi=x3!o*FpIKR)&Li9|72xcCA<15gh2W>*w{ZD zL~^cf878DDY_>~kDufJ>6@50^|RvkqlJku zWq+jRbeQs9*QW~}W=CpQXt{^+P@arwl??rMtTj0)_lHAOsGo&L3@_BWo{1W*+BN)c3nY4mg1rxsu2on7sb_!U+Q@)x8i>EjP|ZN$ z$e673fCNlGNZPR&6Zse~OcY6!R z0LDb3MSuew93OCxo|W|dnt42T#;76=De-m+n8Uw5wpN_}6TttQN#yMZ0`nuh{(}Q$ zJZq3^*`alU|EUW9kmQ*68t^c?nlgkwpOnYV=-ljHaOJAiKFczER^S}3E=&I+?;caOnm zI8&&Gx6K&e-Az@G5od2Q&Mox?@jue9#5;J2-x)!vDV>oSCF1&ojp28uW(o!ri&le~ zU!0%|XK?lOp;~{93r?ig;Qm|f&Cff8nj6DEMXY&*FnXT6BwNa4fA=kBnB?7{>QqOr z(fhY(Tf;*abjr1-&bf{ojtX~omrhxd!4sn2cItL+a@H>H;*#H$0nOTgQda1zn-|poU`i}L=sWHY=}x); z-S%Ilk0nIx-i>}(9W7u{3Zr zW3%xMguc*esIAW9YP$!RK7JRl59iW{Y-bFskBK7iPrH`HS5`fa%&)rn`?##H`3-q^ zO?ZF|GE7Wil(pUM%8zF_8xLBf`}5zB2JAkji>M~&SnNx^VyJ>ayjRkbNpnXKGU7&g6MY=uVa zATm-$emg$8u;hD9PR^HnyL&#&+*$7$fN-9&%;&V!ub0PB2%%T-?};-JHkKr9$sFww`g<@pjOO+a%0&I65dUp*xxnX za4m1^hzY?4+tt>(e%OU7<3|&c0+CEO}-qg-moL ztkV>1x9AaWcC$*Q{V_<-z^3_H*^10WXq`Zk06p;tp@9#VuTRBy_QgY{;0fl57kA`) zsv&z=Sa+wNI!%KD=~1IUtdfatpMNo%7Tu#+vrYH!<(9DQU+fVAtnGsNIYz=fer0i?Hhbp)hP%5TSlJe);=|z#7b? z+=bMVMSk5{gyMC zd2>UQ3VGPCeCf2{91}-%c6`T~+m*~>BwLVx85jLyR@q;BnXO5&x;Sbzrhm>`?;;Hc zwi+HN^#(}|YSCZTACiY&lUo0$`&WmYVX{fqRbf3Q_vC}OH)!0+>uA`u14)Sfacm{q zkl%(M_|OAK_QTkW85a1)%xK=pF||&ZB`1**Oc0|suihnpO5kg*I@hF|tKu9h{!MBB zAZ#B6yNknOL*AXcOie zMXJ<#_mf?#hx!Z@sEo4{!GHQn2A*w%->qU4>0M%0e&nQNY!{P4eNZqsHfEhB9_}dB z8|p}oa8YkU*s;0UvOyP0n3VMuGi~Zf?|S1lWedB~QjfJf{z2@Miz)JWLD)5Swv(}v z`q#vF%G@8GhK(AXNXIoU%B_wUHW__Z9C7t<)`IuDS=z9W%-ioTJ(zzCn z5?|6FgL^mc>kuGJjf7I$0i&Kx4EdFPt?|}-vDB$sC*|f>nf(%OUCtL%%gwZobJO0^ z<)&o;Zn@3vN|tO`17BlJa;_y0{jDMypK~X!bJkw0q;^&83h|F1a1-bi9=Sy3$%_oQ zJ*0j*GPs}1d3EBjwOb!{i&_pW5*ep0^gQIuA|t6q4C&`v`lmk})n8e8s=xZx zq06UL`)m8l>@>vXgH?n@S$>4+D_Sc%TuOn!NaH^DgTvDD{O*%q(ROBPg6d`IBX3A( z@hyYVhmxMP6AjTVTYDZ&l}XJ-G1IX{=Nz@6L^40#b|vml&G@PtLLd(bNlW6-kFK^w zLj-?a7xoKXgQD54t>FBny*uw(ZniG1GME}{5|FHm$iF$;GFNF$b6^t*_?5&t01t%W0QcQWwU4-#^!qmKM^X ztIUMqz;s4U#IFmDuFy+%U8yY2l7bMFidnY+LU*yFpNV@a^>uQm^9an!A*&QUz{gR^ zb{&9+;6$IUxZR2jOF5|rzB6g}%^y>4oLUIgVFWNYUH-;V6@qa_gu4WRI##O*L++)! zeXns1W)Nk5-JcXUdq#H#LaC}0N&A?ZE=T0fNb~7&W(YgKwhIKsW5%L69DFdiwKndD zAF{a-LM-ehWwVyONt^64MqZ4XR?<2Q7i$hFnv=>T{G(KG>y*ZJNg|J{-A;thKbvHk z>VTES!(Y&D-Jh%MptJEn>lbJ8eN%R`qA5+bv?Oy|gxpHJYH(Y%W%LA>)kMr7F9rGD zYe=tq0bU)qpqsF{?_JhG(ReoX zJ*Pj6dC=b4Zk>NAs!i{FZmXt8^{>09pPuJD4_rB@Z}g~z+Rq-mF}px#OkPGH56H9)+m5--2gsZNc#ZHk^7qA4$k9yq;O_PR8a~WB=ufrFWgpDp4rA;MNwYF}<}{HR!D04iJnTxV4B=q%NboTMfm7 z>9F|~y%R?f4n9;qKaRTID=vGs#x?Rbb*p%=gdR?5#Z!VH>O6T8YeKewEAaqN{|(a+ zcjdY5K9Cs}L`>#zSa!Y1vc$Gv8~&1`LjlgRF<6g&l0m?tDw*Ff4?1nTDLV&ARzZ2y zU#)%zbBN=BX>46yTQKR(j7Wb`3brGrRkwZqD7LcR27JsEGjS#l?muoOx>epS??rL7 zkM4Bdh~6rLfc_TaLXN+&hh-v2%ose5X8BnR->m1wd#1A2jD-iD+2(UQFYMRH1D=w1 zmDX50w8+v_44w?gYV&yM>w`c|LW0QRUe$SVz3If@L2ZC-y1FJFd)RzSpx-nOj0~xU z>o$T~g~&)ou?hxFD+P`$7Y(Y)Lgzay;~J<%>C`(v3(zHBRX^x*#f`<`!^J+0E8Lyy z-AQsI#)_KvyP-?fp5-jwKg8IdQGhLm!a;fWa+;lqbGAxEzF88$Jr^D-O3d9@*lNpK zq|Fv&X*p-MDPdTEq2>!q&NuVM=ByS4uljdhAaTGJ&BoSx-ysi?Cs@2%PLh(Gs($PxQNqy^m z7V?=2>&U6sQ+CjJ-{&!&MN9lwU>RbcF!dYvrOnlaIM`62^6JhNS4|$gIPztBbL?=G zZHyU@XObJa^YkC7Z)yAIv%Q|NA3Q3ZI@-*>3PR_&Q5~6RYA+clD|uFmm5x-P{9|wZ z)BUzxYojssGtSwrX#$$}&VNxlkXbm=AQhMi)^8BiEChE7N3U$EgY<65HQ)0`*(zvE z66mE@V>>TE5UnIn{7!(*c!p1AVKi~!fXLN7l&u7}wn!p)1gj#oUF5*wysbBo8{y5n8C7lkB^DED4$BWyewEd^eKe&}l z586v)(rGzx^!~Qrl+VP}3~t>I5?})0yx8vcKq+ZeT?-cF6@9H8(WX?pfT3DUNSMld z$E%hXQ^p`J?geM`3+WGwW%?5`V%ytal{m2fkiR3(0mnJ#?EKug8Y+kG#_Zd3&B>yn z(O48otE*o-_aEizrkUsYsQnV=uxEN|+k8|n4&z*03PhO$v){T*DcLon)Gqh;tFbjN zKn0hgkpMv=ag1Xd1aelV8SOfK$K-@4lU{3AxEzg#~E4~yDF_t9Q9!hUB0pU1Z} z)3A0r{&Xww85Y;8X!YvBkvbAOcj#Gn%Y^b?Xnyz@k40)ilst!5!5Fwo|q zA~O{q7t?fSX%9wbU~O{bwtzdsX57EPZZr&ZDycv4&pvh~j@aqOfb*vG^GCIL{uLVv z*3hH4g7z5SGu0RDFvV-VEn|w?2%WGy{l=W*yRW?|;4&0uA}wHnexZ9C%6uUF!>C2{ zW_?Dg%nK#>l`<%{NFkVMv;J8rJ1>T``hR+m6hRN zQ=@)}MJsakg0Sg5a|cUF5CJ4|eKzUuNPo+#Gtl0F59Yyp97!2nyj#Dcqi{M|-Rn>` z7saCTk@N0qx%nO6=INJ4poDq*f8GY8y=af$##=eT$Z`*3q7G9Ym zpZ@#c+_c{qg=w9VC*hNFB65650)lAykIvd;q;}`^mtjbsBr>vq+D!N=VrOh}n6EZ9 z0E2lfA)_&k*JvvperN7aSgyRt(<2}<00O79&f-CR>}9l+%4jHe#rrl747r)qCo&Q< zV!tM&aM<=n7go(aQevt%e3}?kyvHX|0oLV0Bi%u2c{H^7-4d4rcFY<0DB_Wl#fg#H zb&N&rZJAX3D8Py2eY?}44mMIiZk5dWa%DQ2+8+@d1HfwHee16}UFDPY^LAh1ZC-wH zsW#|AB2KW2_II8tmw9()UtFHihEtA~Zr_(cxkONW=UrI>!p&;`FiLpJXJzZiX1Jx! zka+$G#b{sz-=tzPbN%~CZL_W+dj5Mwuq^5*L`QsdPZ7==BTlwOjI}>2pP9{qa9IKs zLZ>-2D$RbVpF_+MTgvKm`$=;_KV<{o?z!GUGS-dXxn|XrK)r%;(u*;C+0bqJ*j8Hr zDO~=h#BL2Rsf257Z&O|~NhG2WXtl1vb6(> z7>0x?IqXl%SG^CD_dUcXjfuwiXF~|9mTCZI=3Xi4J<;>d69(d;=U_*f7{Fm~h^%(r z;Z^N;+5#3SDmGkg9KJ~Z`+-ai>sT^}{V43NXoq(i!b0HylRgwJ)LA2HtN*PWWIC(s zasufO5pIKz1SyY9C_r{MBeuCFm3L0o^MU2vmS>&$6oP=Cl8%K|J;d@?;xaW zs>+;W$wPwdsalP{lt2M8N;>}8W3kp|VJ_pVe)eExAn6jUI>+_P%Kn5{KX#P;=@(_O zK+Z`#sD4vp`o(F`(r1U)(H*d=iz^VV>Paf*fQwe8jb1p0O!Z-%Y&mlCM$I2h_Mr1v?&z(;hXT>Q15lCjV@ zU?_@57&--H7s_`VQbgwOySWE(KwX-!pH1X^lO54MKB6aH3K&99Km-877lN&`|9LDt z7KKp)Sb-E;suf3-$H?)h`k+;G5A!8&Y|*quY$XDi(>wv=Wc`d6X{rYQG>~8WDK8r? zIZ!jtmUQkja1tormVA>%bCxmKFdLfXkekd)3@?D2zRaK`0e^^t?zs_p{7zM}(VvQu zUrp(#N215vhvJTV`;j#&-}$Oko$arm3Ao;VctyMo=sG8P;tDg*yP%P4MwJHUK8&{h zQuI)rf12v^g49oXR7)}ofot(imKp!|wIuoBF&nc3Ze;}szLwKs2VhW#Z@moGt?}O2 z&^%Av8k-5_4JSkTivmIk4K7U&3J0q4NeA=T6JTDJ=G^lJh^%Ud)Sq%x^jhr$_G}`cNG1|67{-lQ*y^uxBH0 z5qJ#jfpTcre3`mTda(NA&BRmN!|h&`PA{Y$>6dW2JpkQe7Cio6(Zd~`tD=Y0?b>-Y zU(aPeFqKnxvVKN`)v`DeaRx_(#nbK|u znrJjVqX1m&g7SFq<+L&?W5DtHrl|TWW0M}NN>JwW@oKb@VI%TS$~>CgFi1YvXQTg)n4x~NPtVsE zdj*2W7R(GwH}wt5W4AU~Hku+pp+!ODW{InS=tXCrtu@CF8hI0Nj!^7%rwhe=_`Y2> z8>nC!xI@purlU;w{qm43fGXQ!WWU$Z=d3;FtWGF>{kLZZ?og(@b{F%&=X!`z z$06IB1Ll8$-O4Cd!+?&NcX8bgo+gq4enujQzuY+9sPT^=;GzU|5R2wP`WRF6Q>7wo zDBj>Q)y!D1S>D1)ND+gm?}}naUK^8(I?9<3u7?J_S_QMeG5DJGs?6E(kFdpDuR6Vj#FI-)nvIa_Nsa!g%i$ zTw4^~HpIs|iYZn&0*CSrl2rSZY`-U1WnT?@6D(Q^OG_|DeEMpwj9dSK{-2;DSai8z za4rE#j3W;&ikNOBV!8!j5$>5tOT01CyIHSrr|AtKzC7!JPf$)zn4WluBSaj*Vms?E z;%?)+KqSTT)RwQ+zju(V`-7%Qv67=N5Fnzo^$j7|8n8vSnppdGt=9inHJC&B8ApFvQSY##cl;Kdvm3N7l#kbgB%u!j={2IUc^pAa z+S%{H-KJrWA8`)D`Zmb<-~-^j$z7i)$Qrsx5(p2m;`*p}C6UfX^%LHI0X-^M@N})p z%r12#9(dzTnkTM=N(0FphhkXX{PgT+cUR&gA3Pn5+7K(OnN*5I2X-`|OPg6&-Lu$|l ztZ(hGI_kOz%yfvhcbq`5bFWvDz)4AIIxQt_C4*mE;=X-@aoJodrZ*K43V zXvk`NwvyHi=xQ{sBF^F&s$6= z?o;Dz!5;=t zByq(_7pEDysB8WFkx#U<3|OlHZ;4|)))D9pSGnV_N9C`dHqp~ut`W0zN8jNDj}-%* zJ$<&Sq{`V&vC?8TFYZ%^HT?qA=tkFxajdTFWcw-3=U-P2_udvd>IEyP`o|oXVV(J$VCWX14Es%{wJn2|^#mj^|!vPl26-_a9r9Bw#Xr+cjo#n6=(HJ_5>^ zn}hoLI+H2XpS38QLc!L@kDW%l!KYG=)u6fjTu;HbsdnAsvzfx1-`i?1{-jVk3kPj3wY6NB}Mu(U-^czte{(aQXaqH{W=Sz5%_z^jvT; zYRvTW-1rqCZcKnjDDG1DZ45{`tp*vLkfd(w^sk#aa)DYZI}6_@eEwWufR36CXC~W~ zs;3j-sow%|=%T5u_b!u-*dm@=g9ieRv|43MQ0-eM-fxiU%fZ( zkx~BuYUcw#UfqIPaE;xZ*&*o_j{lE#M2JfpBa4c?PeHQ4UreYwZ6(MtQD2o%mpjBg zKS!aM42UUOxA5BKTnq)Oj4spE6-6?hN8sgBFB z%y71-=T!YhyCkX~uIZZHUmZ`*>VD?1a}Y8P-cAy*rh1>YZi?^WkK`?V{pB<-{>9M6 z#O!tU!+RA!VLU1*GOuYCttB2FK(X}{nMnN6r-G@|uFkPV@^^}oPoO~RtQ6inj+(Xt zejjf_*56I-7z)-pw<}vLok1+mY|mo4Na|kL0ecf##DnS}VvOM(2cAni_@a2QwDmeK zLScH302YjG*YM^uNVp6MdzHQS?&Iu_(r^qCOlT|5!V-9OflHeQ{k#=Cj_~+sR=uGt zWcch1{ojv?;KxmYaMicyFj&B;dhZQLDgM@bwC*WZoa^mi&pJ4>PORB7wajxgn}FNsRK@uF)atL&X8Am(C>%IthZhC6b>d#I0(U1#$YOMqN8(DkjxmcBu_z~lHLM;l-wrUyWC zA#i%@(NhvcHheLQFL8{C?;-v`i%;dsK~CUr{M7`er@FOy{u7AH=o8ljsn3^&$wsjF zwHMxmuP|YVUzZnk;QvT?AOP;bEE~lW%|zU11u017Vt)uqjfLa zY~0!lsbhy74>>~&qR+B8n1DX4%Jaa(z_CAd4ULoS7$Bv|~e*!EYLhtpCNED_T;ufgkif%VKxf0lz zK6u-aAn3G&Lj_6D2f?VqEz2_JJ>bO9HWH|Y2UOnF5o1C#u)$+wfUa1a+jMcqoae3n zlaqzqaKA{-E_&e@#Kn_(Y^Cz9EE>2z{4g~>BzO08-U3_7a+fv#5IhJZy`RUIEH;C6?E#;_NbV-eZw<6094ss(Jq4v4-*I zy#M3*l>8(bF!fNGYs?KuYX8jx2-9!2uA$h`72ADJ@xQse%^nwKS~O%b{|SSu0eEil zMe%E+YNN6WifX5~lRD0Zr`I{-20OPFN5Zcl61ir&w%(&FfrmbVwzYh%pm|}=qJZ;@ zvp>GrixS!gws=6NVG9d>{v^HJ+O_((EpebEta?(tifbE;9ugWlF5B|nKO!K}{?Zwo z!G8%FYcfz$fpoAe?VU@?zeOcqJZ6Ya!3s$teky3Puw^%NPWz=oNJ%7D8DI$l_ zlUnTD*G-RI9ttbrzM%Xbp5E=-;$)uYH6}6a-h>paF?obQQs?-^S)a=yiFQXU6z@ZQ z#qYYuF0Pa~UsXzKIZd^Lral6NF;nE@h66ZHpX{ej!^h~H-zGq~Xr$LaeMZ+Zwz)mi zuW#_!M}SZ~V;mig#a1OobnfZ?VvMnv^_312mf@4r!h!}p_bLnaxaPYZt=TwSN>KS| zG7)ytK5F3hXA}x|rMZeRj_RP%RhUjlDohQ$7oKI6?$~qr^Be(6KaK0TaJs67I+RGg#T zu!w_lqCY(y$Xw3{=O7KDD}$33IXk!1IyfI{h?AtAgM;9k9aKZ${LWS~Q{M*{1M$eH zj}to9oZe#nsV@Xi{=8O~6tn;9Tk3cs!O)EIR(lloTm$~7`X^p(4?@hFX@6*nujdF%h~PE4x4_+?wEh$GdRjcC>7bl| z4D!=04$`j?8ndLHvqMM4+BeiWAn-va0I>$RR7Ax9p4t?dVNrMxv^cUoQbmmSC$DMP>?rW886zEM|Cal z5@EXz-0FRH0|6PJl1f3kEl^jj8m=gIM)^uFpzY>+$AvucO1|sor@-?9_tX|TMjUa% zAE+x4dH(3~ZBg6l-hWU8TkZAHL%=%F9d13Xjz9H*o(SL`il8L^nhhBhhD?twVF@O9 zlaR__?&mCY3m0EoxuO4vi;Dp5FCwu7TWa0K~j;jDUCa}?#3(dBRe?Q9<$0N}K zWgW&yNAIYgY=TaAQvo#Kb2W-&*BdUL2ag~lj03|^eae)VDDNpQVR5VkJ-hk_;?)c+ z8V^xzpgdjR9WI>i%J|t59DJ2ae)itaQ6WeBb-baN+}n_cE~ufHoEmKfdz@x2uHfEXl=frYFZ}SBmi-!hWMe7|YsUL`SKTCk^Ry=6%qN257$}}3ud{=Wz5+Z1X z&%}q`ncRT}N*?*)I^q|!dIVkSq-#Frisr}_m9`!W`IMz!-# z-A43LXxWzLbc5f+Cy>F&kg|~#WJ0vD3)v}CWI~@0D1u%h-|>@;IzUN|WkuP|XumqR zS=|;XNB}gW%e)k(O`E^4v;UId=TVmjPNw1?VUcl@Iy|VajChT~jL(WB=Z3|rj02Ut zJTG_@rN2UaBOVrqRjN<7m4kZNTY zK{go?pQEfoSUWK}p=HHMrgom`QhtnV0g2tlgpyP9nBbXEQlJrz+G@0pedpZ{vnX6z z{?HyDx;}0|Tz#xiej(mz@cDHj;)=}kZv~X7&AYEvK1cw26{9(5b2-S519#?Moc@0I zh)Apd;riIo+TY--XJJzaBxJ}+C<(*ek`TR6c^)NlL~%#M9eHB>xI4#5w4xUn-x{1) zSwW$YUJ$z6W4h_Lx?y>*L}kD+89A26?cpOqipa>e56w4oz12dC!AnhT`F9amS$sBPi{ zKnrLEQ#d`rbgx-k47d@GnZNb)a%oxG+Ku-hfcM=RY**k`Q(9oiK8_$d3`+s8{ncw1 z&upC-Q8|L?s&AgtOvlgEB9PbDkIvHj!hrKF^=1L8Q{s!S@&hQN8ud29%fa1;gEyIe zew?T=ECNo4`S#RLd0u^pzk;d0elRSYYC5dZYi$+B(k7Zm6|!-daiad}bopTNry_Xr zlsfHdD7q{(dRP49*myqg!kh|T7I$%g9o~%ZRxpnL+O8 z(!P3;a3l|KZOkNc*T3#SRo~w4vdQ)it9ar{%8jahzJ=t$i7ECI?wF?;8+psye)PQ` zDX~b(23CH8n=JFSW^ltP;x`MOW_RE;=v0~hl7rIXLoLBws8u$i|2xLiE_f3plC2!I zPt;3gf3UZ8e~<3%+JxjGk$07Bz6e4TQJ4vW=R>XvABY*3K?+M&2}()3gXrT|9thXE z{1fa$PUz$tqM7)*?iMTLpPcEOflD|CU&_K(f&vpp5n|S9GADmQ3YV>2Dlr~R&;9Pe zLLsY%d={9-E-M)>YTbL&BcXmp12dWEH_+?i%A=I4!tT;X;Ct|PFhz`+y|eUxSxy(L z5h-}R51+36gp@~`b9^lfuGC^GIz0_Nv|jTA-y@(UP5_|_Z4v|v2JBlC)!5CO%c?pH zwU**`HzACLmKY@ODsIeA+3(JUV?WwlN27gi7RH(Z*VIUKIdmGF?9BuVPPJnT@`UlmL30lGi zZ=VR8TAcmP%y)0%--z!F*Nn*|oOMXKbyFW8zL1>26W~}wFYOEV71!~^G5nBhH2wM^ zDl!pqqdSq_!BFUF<$zm7wpbwhFhwwh>uC%BB5MW8aDzpIoHPcMU_fJSXbq|8xIw+m z4L{{B8K*04PA3nIxCZhCsHqhC1*BSilv4`_O(5CFxh4N^M5}zue^Q7xWbt3XU?16N%bq8kO5IVK0h8I;RSed9xp`L*{Ao;;p91@ z1oe8+aJZOwt|f^Wh5LMz9VYvw{Z^Or(eHyJ_Ax?7|NSuR{y7zZ&Lnrwu=S0&ec|6n zvf#}qbctJXF7NW0ucRefpEH&JvT}1`F%R2@TJbv_+}*z0diFgmQ2tFxbm7Yq#qB?S zx4NdZ9)2xV>|>tfzc)AfWx|gJM!>8IA zwU7yoDT8;&R6{@7slXZeR)E67Ox(F0|NUC3o z-oxoEDFGYvAk6{2>De<_z}o4pZmzC-(ErqQE&fcefBZXgo5+|;SgocVMCFp)(m1xz zu(eSn38#&NA2y>RYjJW*SS2U7mTWFZ4JqP;5>9Mx70M--tdbNb9mRgn&g=L42R_f| zc|OnQd4E2i=Xrmguh%*BWGb>B_2ozeHBxB8?H8MGrFsGLqwwe{-<4$l;>!ufschY!lbv>4l5E`Z(IS;Z z)x#ghyixO+<)G6tt_w;Llu0*VdUxo%#=>WFfwS40Jjr{aw*EJ+K2d2wK40naTMb!#U1z|^3?b3Vc|G5e(%(`ynh;+oM0?)T2xxcWaKAn{@KkH>rmz#;0@mWBb5$iK@t9CE_Hb-;OrJ8{|t~BLlRB zLttEW*|^j&SXm~?L2NL+%c`1}otx1_(A=3bgt_3Y{g$g67e=M_2?WQi81wZ3c8&w1 znXbFYi_kg1-;J#vkaOEaOm5j<2DO*bzqR)_n9!tf&)b;}ENsq^?Be=$txNNk?^f=6 zHYcRJ;)y9GD#YK$9TO7YM*zA>P~#)K`0?LB*gwEqY)gT#PxJ{875p2~_yXd!V)n-7 z2`sq#*}0;dGoWY-veoD`6LwSGS18?t9TjL>VjKY)=VR;lGeWEL5G44PR%fIW`$Erl z>PINj9@@C)zx|hJV~M9U-6S4_g7pqPmqr4vX!Z*;QRl5Lrd+uXB#(QM)hA!XrM|FnNixK_BE>wW}IQ#Ig(bU=m>hGBvcNd zH&}#3mz0bV^bMgqbl30f9)VG|Kd)5|vAJ{-_5&P32{penaH9%Mb5<`s=DuHiCkKnp zW5u(2OEAYSUVe7%#9DbCe-FLMp>P7`2wI&WQ|y$6!WQVKisdyym}RIH7jL?8r(U|b z;p`7}k_Ol!Fdr*L-MI5k$*b3aDckR>vR|i(7995{Ru3$QwlL0JjIk*N^dz>NRY-Kz zPWKCx`$?Y}u^%{_Wk9L<2CC1()~&r#io9AphTw``blMt_A^>0Wse*G~7`(LhIQriI zq7Uwu^D6<(RwWjq7(gft1C*F&H3)1o6Tj;wl$D) z*yoi(#JsswSnh1>KeyNBlkVyi#I9bp*_yjd8(c> zYO{4kL{g#+jC!G63D;YRO4Z6hmoA2zvGjhC-xCJ3!J0Q1`ec^QUR_UWGWy%9j&G^1 zlt2{E&lm5jx)w|`w)yL69vR|-jaynnG!39`IDX{a1gc1->FbQjz#FLZxgH5E4CY^E zI6&_~4uE?+1$wkgObM#5w%KD)f?p0cKuX8hX0Q-9ICP&6ZT zdaauM)NoP2 ziMswkEBiiy->f7|J;~}YFPQM!wjop&N7u%WF8g=BG-3tP9-6R*>*Ue-fL3d}%|i1& zZ!{{0qzs#$LKVqSZ135)sjmRrv+ly8Qz4G2qS*1h6ALn2v1IuwchA340))nYJ23{r1eSo*dgZ%>UM7m^#q>?;o zDO2@&O=U@|BNmOBUWJoA8kOa=*!5pUL~x?N{v31fjTYBFUyDy;vJQ5rqfiiD)+%G` zZ#$~fv|WApPe&3%X7fYamKn1cN-9U0hF1_dP|AxxPBjCt^4CczA3^M7vKRy<2&_P> zX}|V>^kH*xiHUjIDX${S@ooM9M|-UJn+uk5vIVHf8Dt?|fc_!UA$S~=44ptZ{dM?-{opSp9^%)A`?b1Cyt}_O z-dGuz23eB(uj-}i+HS8c0fMj~!G`o(3pe{mz;6onR6c9G=^-&L$`I*R2+mrsPpFPM zXV_aKP|g%GpRo7tF)l$oJ-<&n5|v>nnt^ad0J(5l1swXxYPA2+%hbm10cw*B=H@59 z2nz;helW0qI=RwvBlJ%@nb`jnq7@fBWo?YEfziUlEkfZp#y(3AotKAte+JXB3nIMb z1=Csc(idxn2z`Qh!q5WWix_ONb75LTGr-j#+g4`Alf!y@mx%~bhUj&g3EjwdlHS#d zaPon2{sZhknSL||8F$&p7p*desS+H*2we!l9ct5bXcE-lA!D>wFG|~$tmJ-pT`CdR z|1itLGg;WE 0: + warm_start_index = generations[warm_start_generation] + else: + warm_start_index = 0 + return warm_start_index diff --git a/pymead/optimization/pop_chrom.py b/pymead/optimization/pop_chrom.py index 740a2555..0dbfd5ae 100644 --- a/pymead/optimization/pop_chrom.py +++ b/pymead/optimization/pop_chrom.py @@ -1,3 +1,4 @@ +import os import typing from multiprocessing import Pool from copy import deepcopy @@ -86,7 +87,7 @@ def generate(self): Chromosome generation flow :return: """ - print(f"Generating {self.population_idx} from param_dict...") + print(f"Generating {self.population_idx} with {os.getpid() = } from param_dict...") self.mea_object = MEA.generate_from_param_dict(self.mea) if self.verbose: print(f'Generating chromosome idx = {self.population_idx}, gen = {self.generation}') @@ -139,6 +140,8 @@ def generate_airfoil_sys_from_genes(self) -> dict: return self.param_set def update_param_dict(self): + if self.param_set["tool"] != "MSES": + return dben = benedict(self.mea_object.param_dict) for idx, from_geometry in enumerate(self.param_set['mses_settings']['from_geometry']): for k, v in from_geometry.items(): @@ -437,33 +440,49 @@ def generate_chromosomes_parallel(self): self.population = [chromosome if c.population_idx == chromosome.population_idx else c for c in self.population] - def eval_pop_fitness(self): + def eval_pop_fitness(self, sig=None, pool_sig=None): """ Evaluates the fitness of the population using parallel processing """ - print("Evaluating chromosomes in parallel using multiprocessing.Pool.map_async()...") + # print("Evaluating chromosomes in parallel using multiprocessing.Pool.map_async()...") with Pool(processes=self.param_set['num_processors']) as pool: - result = pool.imap(self.eval_chromosome_fitness, self.population) + pool_sig.emit(pool) + result = pool.imap_unordered(self.eval_chromosome_fitness, self.population) if self.verbose: print(f'result = {result}') - print(f"{pool = }") + # print(f"{pool = }") for chromosome in result: if chromosome.fitness is not None: self.converged_chromosomes.append(chromosome) n_converged_chromosomes = len(self.converged_chromosomes) - print(f"{n_converged_chromosomes = }") + + gen = 1 if self.generation == 0 else self.generation + status_bar_message = f"Generation {gen}/{self.param_set['n_max_gen']}: Converged " \ + f"{n_converged_chromosomes}/{self.param_set['population_size']} chromosomes\n" + + if sig is not None: + sig.emit(status_bar_message) + else: + print(status_bar_message) + + # if self.conn is not None: + # self.conn.send(status_bar_message) + if n_converged_chromosomes >= self.param_set["population_size"]: - # if n_converged_chromosomes >= 2: - print(f"Converged enough chromosomes (at least population_size = {self.param_set['population_size']}." - f"Closing pool. {len(self.converged_chromosomes) = }") + # print(f"Converged enough chromosomes (at least population_size = {self.param_set['population_size']}. " + # f"Closing pool. {len(self.converged_chromosomes) = }") break - else: - print(f"Haven't yet converged enough chromosomes. {len(self.converged_chromosomes) = }.") + # else: + # print(f"Haven't yet converged enough chromosomes. {len(self.converged_chromosomes) = }.") for chromosome in self.converged_chromosomes: - print(f"Chromosome index {chromosome.population_idx} is converged. Setting it to the population") + # print(f"{chromosome.population_idx = }") + # print(f"Chromosome index {chromosome.population_idx} is converged. Setting it to the population") + + # Re-write the population such that the order of the results from the multiprocessing.Pool does not + # matter self.population = [chromosome if c.population_idx == chromosome.population_idx else c for c in self.population] - print("Done writing converged chromosomes to the population.") + # print("Done writing converged chromosomes to the population.") def all_chromosomes_fitness_converged(self): for chromosome in self.population: diff --git a/pymead/resources/cascadia-code/Cascadia.ttf b/pymead/resources/cascadia-code/Cascadia.ttf deleted file mode 100644 index 7f2481256bc2986f0852172428e6f6c9486b0192..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71776 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%0D7akAkJ$?6!rdPv) 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 diff --git a/pymead/resources/cascadia-code/SIL Open Font License.txt b/pymead/resources/cascadia-code/SIL Open Font License.txt deleted file mode 100644 index 29bc7d45..00000000 --- a/pymead/resources/cascadia-code/SIL Open Font License.txt +++ /dev/null @@ -1,44 +0,0 @@ -Copyright (c) 2019 - Present, Microsoft Corporation, -with Reserved Font Name Cascadia Code. - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. - -The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the copyright statement(s). - -"Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. - -"Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. - -5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file diff --git a/pymead/version.py b/pymead/version.py index f07c9dd0..01b7c8a7 100644 --- a/pymead/version.py +++ b/pymead/version.py @@ -1 +1 @@ -__version__ = '2.0.0-alpha.9' +__version__ = '2.0.0-alpha.10'