From 6d7f229d410d3692d813adf6d3a4c178b7930390 Mon Sep 17 00:00:00 2001 From: jonnymaserati Date: Wed, 16 Dec 2020 17:33:47 +0100 Subject: [PATCH 1/4] Added load feature for .wbp file --- .../exchange/__pycache__/wbp.cpython-37.pyc | Bin 3889 -> 9814 bytes welleng/exchange/wbp.py | 424 +++++++++++++++--- welleng/exchange/wbp.yaml | 41 ++ 3 files changed, 407 insertions(+), 58 deletions(-) create mode 100644 welleng/exchange/wbp.yaml diff --git a/welleng/exchange/__pycache__/wbp.cpython-37.pyc b/welleng/exchange/__pycache__/wbp.cpython-37.pyc index a6a021ec77812f3ee0e530297fc09e05cba9d7c2..9c82308585e8239e7184b665d9287a44c83c3915 100644 GIT binary patch literal 9814 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 5: + tgc['color'] = int(data[2:5]) + tgc['interpreter'] = data[5:10] + tgc['application'] = data[11:21] + tgc['feature'] = data[22:64] + else: + tgc['color'] = int(data[2:]) + + def _add_wellplan_header(self, data): + self.location_type = self.wbp_dict['LOCATION']['type'][data[2]] + self.plan_method = self.wbp_dict['LOCATION']['plan_method'][data[4]] + if data[5] in self.wbp_dict['LOCATION']['dirty_flag']: + self.dirty_flag = self.wbp_dict['LOCATION']['dirty_flag'][data[5]] + else: + self.dirty_flag = None + self.sidetrack_id = string_strip(data[14:22]) + self.plan_name = string_strip(data[23:84]) + self.parent_name = string_strip(data[84:144]) + self.dls = string_strip(data[144:151], is_float=True) + self.extension = string_strip(data[151:160], is_float=True) + self.dls_kickoff = string_strip(data[160:171], is_float=True) + + def _add_turn_point(self, line): + to = TurnPoint() + data = line.split(':')[1].split() + to.md = float(data[0]) + to.azi = float(data[1]) + to.inc = float(data[2]) + to.build_rate = float(data[3]) + to.turn_rate = float(data[4]) + to.dls = float(data[5]) + to.toolface = float(data[6]) + if self.tie_on_point_flag: + to.tie_on = True + else: + to.method = string_strip(data[7]) + try: + to.target = string_strip(data[8]) + except: + to.target = None + self.steps.append(to) + + def _add_extended_survey_point(self, data): + xsp = SurveyPoint() + xsp.cov_xx = float(data[0]) + xsp.cov_xy = float(data[1]) + xsp.cov_xz = float(data[2]) + xsp.cov_yy = float(data[3]) + xsp.cov_yz = float(data[4]) + xsp.cov_zz = float(data[5]) + xsp.x_bias = float(data[6]) + xsp.y_bias = float(data[7]) + xsp.z_bias = float(data[8]) + xsp.tool = " ".join(data[9:]) + self.steps.append(xsp) + + def _add_survey_data(self, data): + s = self.steps[-1] + s.md, s.azi, s.inc = [float(x) for x in data] + + def _add_location_data(self, data): + x, y, z = data.split() + self.steps[-1].location = [float(x), float(y), float(z)] + + def _get_units(self, key): + self.depth_unit = self.wbp_dict['DEPTH'][key]['depth'] + self.surface_unit = self.wbp_dict['DEPTH'][key]['surface'] + def _get_unit(self): if self.depth_unit == "meters": if self.surface_unit == "meters": @@ -163,3 +428,46 @@ def _make_tie_on(self, target): f"{str(self.survey.y)[:13].rjust(13)}" f"{str(self.survey.z)[:11].rjust(11)}" ) + +def string_strip(string, is_float=False): + s = string.strip() + if len(s) > 0: + if is_float: + return float(s) + else: + return s + else: + return None + +def load(filename): + assert filename[-4:] == '.wbp', 'Wrong format' + with open(filename) as f: + wbp_data = [line.rstrip() for line in f] + + total_lines = len(wbp_data) + line = 0 + + depth_unit = None + surface_unit = None + targets = [] + + well_plans = [] + + while True: + well_plans.append( + WellPlan( + data=wbp_data, + depth_unit=depth_unit, + surface_unit=surface_unit, + targets=[], + line=line + ) + ) + w = well_plans[-1] + line = w.lines + if line == total_lines: + return well_plans + else: + depth_unit = w.depth_unit + surface_unit = w.surface_unit + targets = w.targets diff --git a/welleng/exchange/wbp.yaml b/welleng/exchange/wbp.yaml new file mode 100644 index 0000000..09fb253 --- /dev/null +++ b/welleng/exchange/wbp.yaml @@ -0,0 +1,41 @@ +DEPTH: + '1': + surface: feet + depth: feet + '2': + surface: meters + depth: meters + '3': + surface: feet + depth: meters + '4': + surface: meters + depth: feet + +TARGETS: + type: + '1': circle + '2': ellipse + '3': rectangle + +LOCATION: + type: + '0': unknown + '1': surface + '2': ow_sidetrack + '3': wp_sidetrack + '4': look_ahead + '5': ow_well + '6': complex_extension + '7': site + '8': site_based_plan + '9': compass_well + + plan_method: + '0': curve_only + '1': curve_hold + '2': opt_align + '9': something_special + + dirty_flag: + '4': locked_plan \ No newline at end of file From b7adfd08b6d275f3b2e17d3ab86c0a5f42f201ad Mon Sep 17 00:00:00 2001 From: jonnymaserati Date: Fri, 18 Dec 2020 14:42:47 +0100 Subject: [PATCH 2/4] Added .wbp importing and exporting --- welleng/__pycache__/survey.cpython-37.pyc | Bin 16139 -> 16855 bytes .../exchange/__pycache__/wbp.cpython-37.pyc | Bin 9814 -> 11581 bytes welleng/exchange/wbp.py | 366 +++++++++--------- welleng/exchange/wbp.yaml | 1 + welleng/survey.py | 101 ++--- 5 files changed, 242 insertions(+), 226 deletions(-) diff --git a/welleng/__pycache__/survey.cpython-37.pyc b/welleng/__pycache__/survey.cpython-37.pyc index 2b5e2507aa5dd112dec8d7efee1f1194fd95d2c2..15cb53b95774f45fd8ce44e56b51bb0ed9d91979 100644 GIT binary patch delta 4649 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 Ry!Gk{{dkF96SI3 diff --git a/welleng/exchange/__pycache__/wbp.cpython-37.pyc b/welleng/exchange/__pycache__/wbp.cpython-37.pyc index 9c82308585e8239e7184b665d9287a44c83c3915..f507b6a496dc89cc9dfaee47e651ed1ab36692ce 100644 GIT binary patch literal 11581 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 E8x{_cZ~y=R literal 9814 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.2f}" + f"{y:>13.2f}" + f"{z:>11.2f}" + )) + return doc + +def add_header(doc, data): + d = data.wbp_dict['LOCATION'] + ignored_integer_1 = f" 0" + ignored_integer_2 = f" 123" + plan_name = "" if data.plan_name is None else data.plan_name + parent_name = "" if data.parent_name is None else data.parent_name + doc.append(( + f"W:" + f"{get_key(d['type'], data.location_type)}" + f"{get_unit_key(data)}" + f"{get_key(d['plan_method'], data.plan_method)}" + f"{get_key(d['dirty_flag'], data.dirty_flag)}" + f"{ignored_integer_1}" + f"{ignored_integer_2}" + f" {data.sidetrack_id:>7}" + f" {plan_name:<60}" + f" {parent_name:<60}" + f" {data.dls:>6.2f}" + f" {data.extension:>7.5f}" + )) + # the documentation says there should be a kickoff dls at the end, + # but I've never seen it and what does the other dls refer to? + return doc + +def add_step(doc, step): + if isinstance(step, welleng.exchange.wbp.TurnPoint): + doc = add_turn_point(doc, step) + else: + doc = add_survey_point(doc, step) + return doc + +def add_turn_point(doc, step): + if step.tie_on: + method = "" + else: + method = "0" if step.method is None else step.method + target = "" if step.target is None else step.target + # if the toolface is > -99 then need to chop off a decimal + # this might also be the case with other variables... add similar logic + # if that needs changing + toolface = step.toolface + toolface = f'{step.toolface:>7.2f}' if toolface < -99 else f'{toolface:>7.3f}' + doc.append(( + f"P:" + f" {step.md:>7.2f}" + f" {step.azi:>7.3f}" + f" {step.inc:>7.3f}" + f" {step.build_rate:>7.3f}" + f" {step.turn_rate:>7.3f}" + f" {step.dls:>7.3f}" + f" {toolface}" + f" {method:>4}" + f" {target:>10}" + )) + doc = add_location(doc, step.location) + return doc + +def add_survey_point(doc, step): + doc.append(( + f"X:" + f" {step.cov_xx:>8.1f}" + f" {step.cov_xy:>8.1f}" + f" {step.cov_xz:>8.1f}" + f" {step.cov_yy:>8.1f}" + f" {step.cov_yz:>8.1f}" + f" {step.cov_zz:>8.1f}" + f" {step.x_bias:>7.2f}" + f" {step.y_bias:>7.2f}" + f" {step.z_bias:>7.2f}" + f" {step.tool:<38}" + )) + doc.append(( + f"S:" + f" {step.md:>7.2f}" + f" {step.azi:>7.3f}" + f" {step.inc:>7.3f}" + )) + doc = add_location(doc, step.location) + return doc + +def get_unit_key(data): + key = [ + key for key in data.wbp_dict['DEPTH'] if ( + data.wbp_dict['DEPTH'][key]['depth'] == data.depth_unit + and data.wbp_dict['DEPTH'][key]['surface'] == data.surface_unit + ) + ] + return key[0] + +def get_key(d, value): + key = [ + key for key in d if ( + d[key] == value + ) + ] + return key[0] + +def export(data, filename=None): + doc = [] + if not isinstance(data, list): + data = [data] + for i, w in enumerate(data): + assert isinstance( + w, welleng.exchange.wbp.WellPlan + ), "Not a WellPlan object" + if i == 0: + doc.append(f"DEPTH {get_unit_key(w)}") + doc.append(f"TARGETS:") + doc = add_targets(doc, w.targets) + doc.append(f"WELLPLANS:") + doc = add_header(doc, w) + for s in w.steps: + doc = add_step(doc, s) + + if filename is None: + return doc + else: + save_to_file(doc, filename) + +def save_to_file(doc, filename): + with open(f"{filename}", 'w') as f: + f.writelines(f'{l}\n' for l in doc) + diff --git a/welleng/exchange/wbp.yaml b/welleng/exchange/wbp.yaml index 09fb253..95e403f 100644 --- a/welleng/exchange/wbp.yaml +++ b/welleng/exchange/wbp.yaml @@ -38,4 +38,5 @@ LOCATION: '9': something_special dirty_flag: + '0': None '4': locked_plan \ No newline at end of file diff --git a/welleng/survey.py b/welleng/survey.py index a55118e..b0991d3 100644 --- a/welleng/survey.py +++ b/welleng/survey.py @@ -12,6 +12,7 @@ ) from welleng.error import ErrorModel +from welleng.exchange.wbp import TurnPoint class Survey: def __init__( @@ -512,7 +513,33 @@ def get_circle_radius(survey, **targets): return (starts, ends) -def get_sections(survey, **targets): +def get_sections(survey, rtol=1e-1, atol=1e-2, **targets): + """ + Tries to discretize a survey file into hold or curve sections. These + sections can then be used to generate a WellPlan object to generate a + .wbp format file for import into Landmark COMPASS, thus converting a + survey file to an editable well trajectory. + + Note that this is in development and only tested on output from planning + software. In its current form it likely won't be too successful on + "as drilled" surveys (but optimizing the tolerances may help). + + Parameters + ---------- + survey: welleng.survey.Survey object + rtol: float (default: 1e-1) + The relative tolerance when comparing the normals using the + numpy.isclose() function. + atol: float (default: 1e-2) + The absolute tolerance when comparing the normals using the + numpy.isclose() function. + **targets: list of Target objects + Not supported yet... + + Returns: + sections: list of welleng.exchange.wbp.TurnPoint objects + """ + # TODO: add target data to sections ss = SplitSurvey(survey) @@ -520,7 +547,7 @@ def get_sections(survey, **targets): np.isclose( survey.normals[:-1], survey.normals[1:], - rtol=1e-01, atol=1e-02, + rtol=rtol, atol=atol, equal_nan=True ), axis=-1 ) @@ -536,6 +563,7 @@ def get_sections(survey, **targets): ] sections = [] + tie_on = True for s, e, a in zip(starts, ends, actions): md = survey.md[s] inc = survey.inc_deg[s] @@ -543,6 +571,7 @@ def get_sections(survey, **targets): x = survey.e[s] y = survey.n[s] z = -survey.tvd[s] + location = [x, y, z] target = "" if survey.unit == 'meters': @@ -557,8 +586,11 @@ def get_sections(survey, **targets): turn_rate = 0.0 method = "" else: + method = "0" dls = survey.dls[e] - toolface = survey.toolface[s] + toolface = np.degrees(survey.toolface[s]) + # looks like the toolface is in range -180 to 180 in the .wbp file + toolface = toolface - 360 if toolface > 180 else toolface delta_md = survey.md[e] - md # TODO: should sum this line by line to avoid issues with long sections @@ -574,50 +606,27 @@ def get_sections(survey, **targets): delta_azi = min(delta_azi_1, delta_azi_2) turn_rate = delta_azi / delta_md * denominator - section = WellSection( - md, - inc, - azi, - build_rate, - turn_rate, - dls, - toolface, - method=0, - target="", - x=x, - y=y, - z=z + section = TurnPoint( + md=md, + inc=inc, + azi=azi, + build_rate=build_rate, + turn_rate=turn_rate, + dls=dls, + toolface=toolface, + method=method, + target=None, + tie_on=tie_on, + location=location ) sections.append(section) - - return sections -class WellSection: - def __init__( - self, - md, - inc, - azi, - build_rate, - turn_rate, - dls, - toolface, - x, - y, - z, - method=0, - target=None - ): - self.md = md - self.inc = inc - self.azi = azi - self.build_rate = build_rate - self.turn_rate = turn_rate - self.dls = dls - self.toolface = toolface - self.method = method - self.target = target - self.x = np.around(x, decimals=2) - self.y = np.around(y, decimals=2) - self.z = np.around(z, decimals=2) \ No newline at end of file + # Repeat the first section so that creating .wbp works + if tie_on: + sections.append(section) + sections[-1].tie_on = False + + tie_on = False + + return sections \ No newline at end of file From 8923ae7184f035807fcf59ebf4a4dec1b9cbadec Mon Sep 17 00:00:00 2001 From: jonnymaserati Date: Mon, 21 Dec 2020 14:34:10 +0100 Subject: [PATCH 3/4] Added exchange.wbp, updated connector and README.md, bumped version --- .gitignore | 2 + README.md | 17 ++ examples/connect_two_random_points.py | 3 +- welleng/__pycache__/connector.cpython-37.pyc | Bin 21582 -> 21815 bytes welleng/__pycache__/version.cpython-37.pyc | Bin 192 -> 193 bytes welleng/__pycache__/visual.cpython-37.pyc | Bin 4671 -> 4743 bytes welleng/connector.py | 49 +++- .../exchange/__pycache__/wbp.cpython-37.pyc | Bin 11581 -> 17880 bytes welleng/exchange/wbp.py | 231 +++++++++++++++++- welleng/version.py | 2 +- welleng/visual.py | 9 +- 11 files changed, 295 insertions(+), 18 deletions(-) diff --git a/.gitignore b/.gitignore index 5eee9e3..50d4ead 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ .venv .vscode +__pycache__ + build dist *.egg-info/ diff --git a/README.md b/README.md index 398dcc5..93d5590 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,23 @@ - standard [ISCWSA] method - new mesh based method using the [Flexible Collision Library] ## New Features! + - **Import from Landmark .wbp files:** using the `exchange.wbp` module it's now possible to import .wbp files exported from Landmark's COMPASS or DecisionSpace software. + ``` +import welleng as we + +wp = we.exchange.wbp.load(demo.wbp) # import file +survey = we.exchange.wbp.wbp_to_survey(wp, step=30) # convert to survey +mesh = we.mesh.WellMesh(survey, method='circle') # convert to mesh +we.visual.plot(m.mesh) # plot the mesh + ``` + - **Export to .wbp files *(experiemental)*:** using the `exchange.wbp` module, it's possible to convert a planned survey file into a list of turn points that can be exported to a .wbp file. + ``` +import welleng as we + +wp = we.exchange.wbp.WellPlan(survey) # convert Survey to WellPlan object +doc = we.exchange.wbp.export(wp) # create a .wbp document +we.exchange.wbp.save_to_file(doc, f"demo.wbp") # save the document to file + ``` - **Well Path Creation:** the addition of the `connector` module enables drilling well paths to be created simply by providing start and end locations (with some vector data like inclination and azimuth). No need to indicate *how* to connect the points, the module will figure that out itself. - **Fast visualization of well trajectory meshes:** addition of the `visual` module for quick and simple viewing and QAQC of well meshes. - **Mesh Based Collision Detection:** the current method for determining the Separation Factor between wells is constrained by the frequency and location of survey stations or necessitates interpolation of survey stations in order to determine if Anti-Collision Rules have been violated. Meshing the well bore interpolates between survey stations and as such is a more reliable method for identifying potential well bore collisions, especially wth more sparse data sets. diff --git a/examples/connect_two_random_points.py b/examples/connect_two_random_points.py index 12be7b9..ffe9676 100644 --- a/examples/connect_two_random_points.py +++ b/examples/connect_two_random_points.py @@ -86,7 +86,8 @@ vec2=vec2, inc2=inc2, azi2=azi2, - degrees=True + degrees=True, + min_tangent=0, ) # Print some pertinent calculation data diff --git a/welleng/__pycache__/connector.cpython-37.pyc b/welleng/__pycache__/connector.cpython-37.pyc index 8e492147eb41d36f2297292571772c766f631e00..39dfbfc5f90dc7e94dc668f34ceb3cbb9b2392a6 100644 GIT binary patch delta 6431 zcma)AeQX?85#P7Fx3{;xJAdRHJO0Soah&8FJE`q_w@uxoUBQ6C7}La{+WK&WkS5fTzeNC+XsmntF3iqg_QN`-{fR;U8hKlsht zOU^zVgsq#MH*em|ym|9xX7@Lj*bl$U;s;_eN5kLI&%U1i^^=$5PqT{6Ba|t%ft@p46c|rG6?5r)`;Nf|z*yLHz#d(jXr&hK6lV zONYG{Kzm99jPU3g9Zv_p22Qh4H?|P>*dhbo$Yb))MzZ;3&*bcEAGM-$C^N1@mFev4URX}3Wdodq0Nm0(6knEd$8UR zQTgdm@@REEsLA5#D!(C$;A|rc6z3hVx7BM<@_UMw*FZAdcJRQ;LN7%C_WNe2|77B< z4$05(R&ewcEl%3{l#HJ%8J3c<(F=p?6-5avN`JA%v%p)O@xs9SiL3mkyw5tyV)BwT z+V%ui?1aW7e(QK!LR-`?n&JuhuC<-DFKr0_q=Ahr{iUTd6q%yP)iirdzTY;-oF&oz zX}z)@6tS5=KY>jIQUrzxj1cG}kR;GUpqIb~06)xgQzDlui|s^OOJFyFHUjGaCZcXe zOy%5kzBoJQen%5WK>YXV?e~{va@z}~V#bxF&I$HA`OD5!*k+dA#9Ef#>y)f{6pVg^ z=gV%Un1zNt@|o^?nrg-lkcvU6uitW1S*A?hMMP!oR>FD!QcN5ooD>J(C@_CbdL~~? zllZh-N(V-E%kuhvOdTV}Jp{%G+)iMez;OWIz%oI$i8~0KAaEyvddrA*lE5i|Rg93o zNv>mim)=V5XVz`RcUlhi_Obyv-rHey5usZad-t5I$yJ6ax2z$LiVV-smD5>~ck|iI zbm0BFXyHApYow_U0F29j^}feGDBs@Dy1$i(EdK1^UJlOYe zyUs)0#((51bU8JyA@exnA}3$#TRS}AWaq@WT>AdfG#4MDg_8giEj4PoB!bxw((IJn zy78?6N?F&?+l;9>rfKCdAet#}?%yZx*kvw#s{c<6_u-z+eU(}m4}nE&BTzd<6&NZ+ z=sfF>@@f?MVe;{8sl4o9l~1kmrp=Y5N`3N;iyu#pFljy)`?Ik=1+^yqyM9(wD+ctTK1ljlw@kx`*g=ABCTb&!#Z<27rl)hoDfj*nv6rSOp#A9NTrr#GrK#!M)JSkE zgS$JOFJ`8ve6v^*Ga^H*R%UiKSLC9b26kq8Iy+sux194sIU!0ybdbys6G#(KmsJ%W zRr=bAMx`%Es~;ikECH1`)U{ICXFq7ENKl*h$=9|Y8k}f2m&=Zfrg^Sdnh6}UvS78sZhRL%oKy#zLS<2f%SBRRObWFySbTq z<>I5@xFmZ=^G8(77}cyPGDVJ^lH01Xd;=MG!UjNj!wIZ3$hXroB~D5CMfvjR?{B4) zS8ZutzbR!0)r$^IlnJ;5R53eG*f{{-;3XHFsw21>u3|vGv*Sqp?kS{SlDF@?ITi<& z(gh_tw5reU9Qg39gkG(+s;a7rD5yM%`v_2at~CJa=)@<9MqX7O5y~u5vuvMg$46!V zu6=E$-DS7hZFZBr$-dDJ*@kVmRJ7gl+^##-)?t#W*E5g+oGuZrg$nR=G54`$LXVOT z>S6w%BY12enr^c=Gj%a8TXvsoqY9F;{>y>#Yr97`tvmy95Uj7&#I&;})}o7p@}IkZ zUa1u#D=0)yfVn2sH_G{XZ>xV9)9y^J0;c4xlcvL2IBx06WHkOa>O;(I?mDhq28U$x8f>PmSrmFm- zQdZ4gRcz~QqmJ->vW=3aX4}j(Eu$&qFxza>Rlk_Utok!G*|qP$9+d)XLhIyFTI?{c zoE@{7ZRkujr1HAd+QChj_B6Z(Vb2_UcC`i6CfY5P26}d)E8_+_GgJOz-{mpnkf382 zuLhBC;Qpf2D>LepUj%a>DYt-V5o|`6FI@lk%F62(1fw6$h%7{nz-=BWIY!_!1Rf#q zD1lneuhT?jVVE>2w?!PoVo_!R!g;1D8dK0Qqogo)dQqn?>p<;{K zx}ys&x85{)np{%7%hZ@=aoxnjpw&WJ%n*wiy!7<|_d}WNoQnd796p_^PaIza$Aj{( zH+`;|MAs57Zi;+xY|YSW7k0HcDq!_R`O~p>7GLtm{>EBW$4_T2$mPN7!G!$dfrUM1 zFiwShyPV6q`BJegK0ypb^-Z2}Gd?TVTlsNJepOyR*ux@AFCV{Yd`v@Sci;0CbT~&a?RlI$8~1 zQ`Wm|LC3cm^sw^|zD(dP-3zZpl9_M7jDhb0;9NB39gIwLyUcSYb>j7GafWD~<3*-e zl@{_$Bq=AMErhti%|(4a3LeV~c~SJy6&4H@8JP5hrbf}l>WiEmd)ym~$hbT0DF~FF0rP`S^UJ+W;f5&Wm|*uaS(xk6LqV3Ru*O()vZVXHnV7 z?F*s#Ca(#>9SMTF8W!*)-CY&sDdwA*kLSy$kXIae(`_9Uii%WB>>`dX0;aB?!$9K5U4s(BBsQmIr$;Rza2{P;aK zy1LmCIw9WzmY(5af#^2AF$fn!Y2LbVbY-yk&C436w0doQgRUP{0*w+ei|bK&_pLWn zE`i{oJIA?OC_q7EAQ4w1BaFx}5gDe63>zt0_iTLKF%cPIjF3PO8DSL#VK0Qp01dHZ zRU?CVOgH3(&ogdJ>Yk3sh`5#)368gLB#e`E5OUgrO|M!ia1eOvR3kXu27JcCYZ65U zjxAh&Y%!RB^`v6zq@3y@$;@p#E2?v?Ik^w)!L59ruonm{5O|Tm1py_GOSOQk8Q2Lo6mxIz5M>M>3#pxM5M$yvfu{< z>NvN`7ml~q%l#4eC{SuiCCvo%3aA9+$5ifA#-06Ym(;vhoys zRyVhrU8)2q7q3~ip=1BY%Ic1;Y-m4h58hg@Crq7+`sT4$K5(L=J`A1#PeDF^;zxZH zyJ$1Mg@@1bb)hW24e}S{<9D8^tc-E71`|(FSX27a^thoY$cc|*m|}G2;tD&IVuv7~ z2Go}Q?`P5v73XGVKcTLuZ_Z@g`+YX!hvr;4d9ph-4k4;l58gegA64z5xJX#7=5qPH zlh?PBiOcq*HgHtFe=?Q2%eEaGZz1dLh#j{(?Or?KG}IB~v6LcRzl9}XcVfJr!x+q2_~edq2y zr$FCvs7{MYNgJ_Bfr7vmX`vM=rS6A>Xw_C~#UBV-sSWT7YX6`Ts#FQ7>4%^#{mnkx z=UknZv)}CQ?Cj3$%Bdn1vchF@~(?Zg9*zFhGnEBd)PT*CuAc#aKu zc!-D3X+s8&@CvkEUdgM_`gk?3LF?zWJc`!jb$l7x0I%mUv_am$m!l2wM&5)r%o+WS zc!n8o<}0vsgm?2+-iBTUU&GsZ2YQu!CGVtVReTj+jkcP1@i^KVt{>OpYvpdeM+&`# zU67CIPJ{o9k$>M}+?-;cXLcnIoYC@EFb>L#o}Q%N))IcZ2GAVQ00TU9Qb!xa6XG-* zwj$FNHk)DSSMu;lFWM?R)p%%KEuN_D;p|M{0uw*CjfGwW<0oW?(dUI)c%?jLGookypfJcqHHv76AQakJ7vRYw+_Od+XU45K(B?(&9`hS9BogG%I z+Oj@7jF~no2AWnpZDd?tdENlFC3|9SCy%%rbM-`tJv?H!e9PN1cixY^ojtW@bYLIh zQBZVbeY}oZMfpR;&8N7nwEduZO&;+zL|(H=>z#zjUzT~_%`7Z`?AusxgT4>ETJSXR zWl?QLzhDSk`u*!z{p=S1PeO7c8k>#O8eX|PHpv3B7h(_U#b&szSVdqZfldNl1lAMS zK%kw#3IZ(zS_!lPIDVcU5$SYZTt}!n0-FgeBM<`^3R_7rlC~0~*@;Q(Tbj5D$d68} zJDnR(ugm1JNlTt@9AdA_4;tg1DpoZcYm%(G7er2gkLImpHig}{$XA>1s458>r|s9s zl`Fc|E2)&YeS}n!c2kcejWcm0^@*tq`lY=h#+J*AE3S+jBJ36dHxM{X;0S>M0LL>v zniV97I7;9a0>=oHi$S-v;kMZ}cCZeDcYV znaGL6>D(BP`$d$9stMdhK*_O(dTR)fJ1lV&n%W0&uS|EGiv_rsoA?Vp4ew8ATtjRL z4G1pT%4M6KU}{pFO)GX{h!&;+hH6UKd0_+zD255#Df?G`&|Qn}HJDcs71Ol*Zgez{ zyr*-koapq;KGFFu!!4Lx-BBz#@meD8Ay6`{at-AqWaM)DF8Gn-C&f?X@{6pk6tkLE zDfd%8Luzw;Ns*h(az~#S6(=?lK`Q~eAntu3AHBwbPGRbCd9dsIn@Z+aGAdDs(KQyH z#MEzOZ~Wx$0D2-slwM&_za;2_2ClIQx$Qghjri~;<>TruET=6Lcaq~83(3{rm8ZLV zDophJc*rgC-U)-F=(11BJxEh8q=({O#5_4X*|OkwHd|;zmjM^%YlH|1+67MndmCD2 zE%$BFbS<$KSbBPvD|VNx>$qQKRc(45&?I|{e6Z&jTQ7grQ(xS`O%>e{`!l_YK_xN3 zwi~Sq3mMiGeTp>GIHjw6*o4_;YdtW?6q#k5DSg$3cV0sG1!RxRM%!Pn zL9vNV7;I9ko90-@)kO{rh)S4rP?++31Qy&CHOhRP-XKymrGlo) z1?rBdn0JCElz$zTv31SG?HD`N3A$y7@gwOh+VuE@n`GSZ4vIy4_X>5hb`!R8e#uxm zJ7S&g6$kMH`dE~kXcOA*eTs0G<@EY-)+M7GB#X!wHtbtXsmw9*R(fJ_ zLL+2oG;5{BL~bl;rN1U?dQUM^PV}xd$w-I_H_A)BozXHzMa(@Z-|M}1zY1dB(R?bo_zR4`BLAWNCdsOE+~$Pi2PSy_dPdLcOk#3OscY;P}%1c%~JF&C4FTy@c`jS ztAaG*ilwef>71(9FCX5#y`Gs(W}R7YR+*jVPSb08OtYq_ZIo|szEvF^BB>LPV=we6 zgW)zPzfNS+pDk0Ks$1UF;Wl&*O*dHuGjwr8T3gQ6Q-X;5{!4+9ZQZ!4BwIhI#9n~6 zO54O(6|2$3UOBY&m&H<^@ws{CQChKJ7RQqx%{rb`E*}q;qJw({OBGZpJGav6HUg@I zD-(n+)bB}<8gw+HhSkVtw{^Aez`#Z{jA^!EdyyfKNo+*G(pdg=TT4+Na1)~IizSCa z-LuFqu$OxUOX8{2StiOc&|M)>$i20o&r{_MGSjHiRXLc#jQUaPr9Kj&e0uw~tz@x9 zrDNHqRDD!>=IzByW_om{3Qzgdu4PSBKU>-~QWBkzas;)FRAK4z==CperrR;+B8~^Q z6M0%OEMs#4WHDl+qzuU2JN{g}`eM0m=J=B$g>8DFAscJNAp&0@@I?X-6L7;f^~$(V zgzq3ObV0O0(Bora<^zPT3_-IgL^SpDYtOy7lN}`)sE(UIgLsVk{w3L}B%%(d1SsQu z8y4=8AMa`|QZEH5)Xxt{{e5`yRL$D#q^IC17zHoAiPl1&H;L}nk_^CwoPYIm}*AoaV2{++V8Z<^gDTld$s-vz8= z@T8S=SiW5B`!M;4ynTNwGiUGHzr!>CHuTC(?TuHP`J>>DF;p3;-1x+bTDJps(Du)G3L%W( z7$eLM4eK+k5VB2ifN*xm4vw%noYyuGa6(aS+Tc3(%;<$MXuSA55su-Sx_v5dZ9S@~ zQFx}f7>(+-UMocGh{ZC#jNguM4>$0=V{W@f%vmO|UhX@uX96enLPenxm0-xmIy+)l z*p(y{9(=JF!8aH5!giR}&tODia{qa6p~|j;H=6?^nnn>1KUK~tzm7Ap(3%5_(}fK$Dw$VsTz z$T!J3>2hm`H>PYlw4+FI1gQa!vbE3lP_iiaRWS9z3k=xW#7I}RHkDmX+Y4I*XPdTv z&elZZu?!m@#kf9A0@#V1DunMpcz+>V z!xBESg!>a=v)ZtM457*tRkc`A z^t%5c>8TZzuAcsK_%v&mCy%TtzcNpO!YiLTGPeDH%7I!U4@&U^0%erla?e0r`M!^X zFe)L^M z+==E7w39ZXcN;NLx62&Ww6qW1e>E>!M0#s5TjsCuqoK}A4#zL!TV?+v@3MjjqWok^t( zf=j#kb?M%_RGU(h%J1}Wo%6UL)o4>|kp=|djdLOhhpOJ7?6M$b2sCd*kU$gQMphGy z^Mrr~AfkVj`kWhXv;mtSXh+{hg*L#Aty1}o}94H?rr#m#Du=qfE(p|0lYTU5DG zG5^o$>LyQ%x`9)t!rmVPJ1BrO0E&W!vG zXXH6`vs)GrH*%GX=A2piE&2c)>BR~M?HaQk`*y|Wc5TJxtg=?}ZylKrPusA=wR1oA z6JTs-T{{LaB;V-My7t#2clBMEke?GP*{b>~3TeoL4(W&qdPGheIRLp}T!cCK(r^nW z(b3kNyCvq7OYNw$R`EtDn~?*_6PXRv{J5$C7VHJKAf4pXkt_H<8e^SA^gA1D9vL>S zz*Jg-O~@g07%s^v)80RcRDj#hBd9_a-3NV?LiofZZ1UBnNe5?9ZG*#r;pE^R&LYh4&zIAY88+BZKLG5e`9v8TclI2Q)wBw*SP)8ztR&2 x6Z*iUY+2Sb7skSSz-#a;HIF4#{L2=?T+*Wu~-6J(kVrg+B_B*2n+= delta 805 zcmZ8fO=uHA7@cpj$!_*9*(6Pxww5Xt4W)`zYbmr^DdI0wTks@iWs{i1rZ~Gu53^Jn zqPhh8Hwi{?VcvZ6z4vC{$L`kg598Kl%hCxx zZu9W|$+uRA(qABc(8-Nr5aXn#wA40fLI{mSDUa%?(K`ch_!JT7%h|Q zHLDGw@wfKWJgES7%*JeB)NI~o+EAvR>S^0ls*y4O_w;!)NN^qJvU-VM0Gr}gE6FL3 z=SdrY$Vr##aU`xI;c(~^S}Vmd5Rk`j?vfzQ4ZOw`CL^-|k55HGS!3TgL*_^mw6 zJ*xV_*jjlkVAa)<|M1jGZ$Ee+{Rwd9U|&54Fe1Ka3t}Sv6=sB^myea@r_ClI0~#c$ zf|!CBq6s#|iYip>>epaNeAm6)G-^Al`=rF&N~xo`tJOw>fLp=j2(7Cf+@K;n-L}RDBKiV=2&zNTkB%qJOXpCKbdso7M?rc zvW(PsVL(>%2+zeg`z*{K3?(Kg6vY+iJj@F2j7~20wf_t*_FB07?w_29;dogvDRad~ q=jv2%ES$=(t~Hn;{g))jfNV*^iUb+1`)af;q%Nv=v}nrFa(@5@#l6=6 diff --git a/welleng/connector.py b/welleng/connector.py index 1b4fd44..a72f994 100644 --- a/welleng/connector.py +++ b/welleng/connector.py @@ -22,7 +22,7 @@ def __init__( degrees=True, unit='meters', min_error=1e-5, - delta_radius=10, + delta_radius=20, min_tangent=10, max_iterations=1000, ): @@ -80,7 +80,7 @@ def __init__( iteration stops when the desired error tolerance is met. Value must be less than 1. Use with caution as the code may become unstable if this value is changed. - delta_radius: float (default: 10) + delta_radius: float (default: 20) The delta radius (first curve and second curve sections) used as an iteration stop when balancing radii. If the resulting delta radius yielded from `dls_design` and `dls_design2` is @@ -145,7 +145,10 @@ def __init__( if md2: assert not pos2, "Either md2 or pos2" - assert dls_design > 0, "dls_design must be greater than zero" + if dls_design is None: + dls_design = 3.0 + else: + assert dls_design > 0, "dls_design must be greater than zero" assert min_error < 1, "min_error must be less than 1.0" # figure out what method is required to connect the points @@ -369,6 +372,7 @@ def _get_method(self): def _get_initial_methods(self): # TODO: probably better to load this in from a yaml file + # [md2, inc2, azi2, pos2, vec2] forms the booleans self.initial_methods = { '00000': 'no_input', '00001': 'min_curve_or_hold', @@ -398,7 +402,7 @@ def _get_initial_methods(self): '11001': 'vec_and_inc_azi', '11010': 'md_and_pos', '11011': 'md_and_pos', - '11100': 'min_curve', + '11100': 'min_curve_or_hold', '11101': 'vec_and_inc_azi', '11110': 'md_and_pos', '11111': 'md_and_pos' @@ -569,7 +573,11 @@ def _target_pos_and_vec_defined(self, pos3, vec_old=[0,0,0]): ) ) - self.vec23.append((self.pos3 - self.pos2) / np.linalg.norm(self.pos3 - self.pos2)) + vec23_denom = np.linalg.norm(self.pos3 - self.pos2) + if vec23_denom == 0: + self.vec23.append(np.array([0,0,0])) + else: + self.vec23.append((self.pos3 - self.pos2) / vec23_denom) self.error = np.allclose( self.vec23[-1], @@ -761,6 +769,9 @@ def get_vec_target( dist_curve, func_dogleg ): + if dist_curve == 0: + return vec1 + vec_target = ( ( pos_target - pos1 - ( @@ -798,7 +809,10 @@ def shape_factor(dogleg): dogleg: float The dogleg angle in radians of a curve section. """ - return np.tan(dogleg / 2) / (dogleg / 2) + if dogleg == 0: + return 0 + else: + return np.tan(dogleg / 2) / (dogleg / 2) def min_dist_to_target(radius, distances): """ @@ -867,6 +881,11 @@ def get_radius_critical(radius, distances, min_error): dist_norm_to_target ) = distances + ### NEW ### + if dist_norm_to_target == 0: + return 0 + ### END ### + radius_critical = ( dist_to_target ** 2 / ( 2 * dist_norm_to_target @@ -973,10 +992,13 @@ def get_survey(section_data, start_nev=[0,0,0], radius=10): return survey def interpolate_curve(md1, pos1, vec1, vec2, dist_curve, dogleg, func_dogleg, step, endpoint=False): - start_md = step - (md1 % step) end_md = abs(dist_curve) - md = np.arange(start_md, end_md, step) - md = np.concatenate(([0.], md)) + if step is None: + md = np.array([0]) + else: + start_md = step - (md1 % step) + md = np.arange(start_md, end_md, step) + md = np.concatenate(([0.], md)) if endpoint: md = np.concatenate((md, [end_md])) dogleg_interp = (dogleg / dist_curve * md).reshape(-1,1) @@ -1006,10 +1028,13 @@ def interpolate_curve(md1, pos1, vec1, vec2, dist_curve, dogleg, func_dogleg, st return data def interpolate_hold(md1, pos1, vec1, md2, step, endpoint=False): - start_md = step - (md1 % step) end_md = md2 - md1 - md = np.arange(start_md, end_md, step) - md = np.concatenate(([0.], md)) + if step is None: + md = np.array([0]) + else: + start_md = step - (md1 % step) + md = np.arange(start_md, end_md, step) + md = np.concatenate(([0.], md)) if endpoint: md = np.concatenate((md, [end_md])) vec = np.full((len(md),3), vec1) diff --git a/welleng/exchange/__pycache__/wbp.cpython-37.pyc b/welleng/exchange/__pycache__/wbp.cpython-37.pyc index f507b6a496dc89cc9dfaee47e651ed1ab36692ce..eb88bc8528ddb453f728fe79939aa9b09b61ecdf 100644 GIT binary patch literal 17880 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 delta 4893 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 0 else 0.1 + else: + dls_design = data.dls if data.dls > 0 else None + + c = welleng.connector.Connector( + pos1=pos[-1], + md1=md[-1], + inc1=inc[-1], + azi1=azi[-1], + md2=s.md, + inc2=s.inc, + azi2=s.azi, + dls_design=dls_design, + ) + if isinstance(s, welleng.exchange.wbp.TurnPoint): + dls.append(s.dls) + else: + dls.append(0) + connections.append(c) + plan.append(isinstance(s, welleng.exchange.wbp.TurnPoint)) + pos.append(c.pos_target) + inc.append(np.degrees(c.inc_target)) + azi.append(np.degrees(c.azi_target)) + md.append(c.md_target) + + start_nev = np.array(pos[0]) + + survey_data = welleng.connector.interpolate_well( + connections, + step=step + ) + + survey = welleng.connector.get_survey( + survey_data, + start_nev=start_nev, + radius=radius + ) + + # Because of the way the imported file is processed, there will likely + # be duplicate survey stations in the survey. This function strips out + # these duplicates and rebuilds the survey. + survey = strip_duplicates(survey) + + return survey + +def strip_duplicates(survey): + """ + Function to strip out identical successive survey stations from a Survey + object. + + Parameters + ---------- + survey: welleng.survey.Survey object + + Returns + ------- + survey_stripped: welleng.survey.Survey object + A survey object with repeating survey stations removed. + """ + temp = [] + for i, s in enumerate(zip( + survey.md, survey.inc_rad, survey.azi_rad, survey.radius + )): + if i == 0: + temp.append(s) + continue + if s == temp[-1]: + continue + else: + temp.append(s) + + md, inc, azi, radius = np.array(temp).reshape(-1,4).T + + survey_stripped = welleng.survey.Survey( + md=md, + inc=inc, + azi=azi, + deg=False, + start_nev=survey.start_nev, + radius=radius + ) + + return survey_stripped + + + diff --git a/welleng/version.py b/welleng/version.py index 1d9e7ac..47e46d9 100644 --- a/welleng/version.py +++ b/welleng/version.py @@ -1 +1 @@ -__version__ = '0.1.9' \ No newline at end of file +__version__ = '0.1.10' \ No newline at end of file diff --git a/welleng/visual.py b/welleng/visual.py index 05fa5dc..1b71474 100644 --- a/welleng/visual.py +++ b/welleng/visual.py @@ -37,7 +37,8 @@ def plot( Parameters ---------- - data: list of trimesh.Trimesh objects or a trmiesh.scene object + data: a trimesh.Trimesh object or a list of trimesh.Trimesh + objects or a trmiesh.scene object names: list of strings (default: None) A list of names, index aligned to the list of well meshes. colors: list of strings (default: None) @@ -49,6 +50,11 @@ def plot( meshes = [v for k, v in data.geometry.items()] if names == None: names = list(data.geometry.keys()) + + # handle a single mesh being passed + elif isinstance(data, trimesh.Trimesh): + meshes = [data] + else: meshes = data if names is not None: @@ -62,7 +68,6 @@ def plot( "Colors must be length of meshes list, 1 else None" meshes_vedo = [] - # TODO: if inly a single mesh is provided then drop the need for a list for i, mesh in enumerate(meshes): if i == 0: vertices = np.array(mesh.vertices) From 2289d2ea16d363477ec466e23469e8fe3e9d5d0c Mon Sep 17 00:00:00 2001 From: jonnymaserati Date: Mon, 21 Dec 2020 14:39:41 +0100 Subject: [PATCH 4/4] .gitignore fix --- welleng/__pycache__/__init__.cpython-37.pyc | Bin 509 -> 0 bytes welleng/__pycache__/__init__.cpython-38.pyc | Bin 513 -> 0 bytes welleng/__pycache__/clearance.cpython-37.pyc | Bin 14068 -> 0 bytes welleng/__pycache__/clearance.cpython-38.pyc | Bin 13941 -> 0 bytes welleng/__pycache__/connector.cpython-37.pyc | Bin 21815 -> 0 bytes welleng/__pycache__/connector.cpython-38.pyc | Bin 21919 -> 0 bytes welleng/__pycache__/data.cpython-38.pyc | Bin 4176 -> 0 bytes welleng/__pycache__/error.cpython-37.pyc | Bin 9549 -> 0 bytes welleng/__pycache__/error.cpython-38.pyc | Bin 8913 -> 0 bytes .../evaluating_clearance.cpython-38.pyc | Bin 404 -> 0 bytes welleng/__pycache__/import_data.cpython-38.pyc | Bin 2439 -> 0 bytes welleng/__pycache__/io.cpython-37.pyc | Bin 2402 -> 0 bytes welleng/__pycache__/io.cpython-38.pyc | Bin 2434 -> 0 bytes welleng/__pycache__/mesh.cpython-37.pyc | Bin 10724 -> 0 bytes welleng/__pycache__/mesh.cpython-38.pyc | Bin 10831 -> 0 bytes welleng/__pycache__/survey.cpython-37.pyc | Bin 16855 -> 0 bytes welleng/__pycache__/survey.cpython-38.pyc | Bin 16275 -> 0 bytes welleng/__pycache__/target.cpython-37.pyc | Bin 1546 -> 0 bytes welleng/__pycache__/target.cpython-38.pyc | Bin 1570 -> 0 bytes welleng/__pycache__/utils.cpython-37.pyc | Bin 7517 -> 0 bytes welleng/__pycache__/utils.cpython-38.pyc | Bin 7613 -> 0 bytes welleng/__pycache__/version.cpython-37.pyc | Bin 193 -> 0 bytes welleng/__pycache__/version.cpython-38.pyc | Bin 196 -> 0 bytes welleng/__pycache__/visual.cpython-37.pyc | Bin 4743 -> 0 bytes welleng/__pycache__/visual.cpython-38.pyc | Bin 4706 -> 0 bytes welleng/__pycache__/well_data.cpython-38.pyc | Bin 4174 -> 0 bytes welleng/__pycache__/well_utils.cpython-38.pyc | Bin 6757 -> 0 bytes .../errors/__pycache__/__init__.cpython-37.pyc | Bin 213 -> 0 bytes .../errors/__pycache__/__init__.cpython-38.pyc | Bin 217 -> 0 bytes .../__pycache__/iscwsa_mwd.cpython-37.pyc | Bin 14071 -> 0 bytes .../__pycache__/iscwsa_mwd.cpython-38.pyc | Bin 13140 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 293 -> 0 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 297 -> 0 bytes welleng/exchange/__pycache__/wbp.cpython-37.pyc | Bin 17880 -> 0 bytes welleng/exchange/__pycache__/wbp.cpython-38.pyc | Bin 3943 -> 0 bytes 35 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 welleng/__pycache__/__init__.cpython-37.pyc delete mode 100644 welleng/__pycache__/__init__.cpython-38.pyc delete mode 100644 welleng/__pycache__/clearance.cpython-37.pyc delete mode 100644 welleng/__pycache__/clearance.cpython-38.pyc delete mode 100644 welleng/__pycache__/connector.cpython-37.pyc delete mode 100644 welleng/__pycache__/connector.cpython-38.pyc delete mode 100644 welleng/__pycache__/data.cpython-38.pyc delete mode 100644 welleng/__pycache__/error.cpython-37.pyc delete mode 100644 welleng/__pycache__/error.cpython-38.pyc delete mode 100644 welleng/__pycache__/evaluating_clearance.cpython-38.pyc delete mode 100644 welleng/__pycache__/import_data.cpython-38.pyc delete mode 100644 welleng/__pycache__/io.cpython-37.pyc delete mode 100644 welleng/__pycache__/io.cpython-38.pyc delete mode 100644 welleng/__pycache__/mesh.cpython-37.pyc delete mode 100644 welleng/__pycache__/mesh.cpython-38.pyc delete mode 100644 welleng/__pycache__/survey.cpython-37.pyc delete mode 100644 welleng/__pycache__/survey.cpython-38.pyc delete mode 100644 welleng/__pycache__/target.cpython-37.pyc delete mode 100644 welleng/__pycache__/target.cpython-38.pyc delete mode 100644 welleng/__pycache__/utils.cpython-37.pyc delete mode 100644 welleng/__pycache__/utils.cpython-38.pyc delete mode 100644 welleng/__pycache__/version.cpython-37.pyc delete mode 100644 welleng/__pycache__/version.cpython-38.pyc delete mode 100644 welleng/__pycache__/visual.cpython-37.pyc delete mode 100644 welleng/__pycache__/visual.cpython-38.pyc delete mode 100644 welleng/__pycache__/well_data.cpython-38.pyc delete mode 100644 welleng/__pycache__/well_utils.cpython-38.pyc delete mode 100644 welleng/errors/__pycache__/__init__.cpython-37.pyc delete mode 100644 welleng/errors/__pycache__/__init__.cpython-38.pyc delete mode 100644 welleng/errors/__pycache__/iscwsa_mwd.cpython-37.pyc delete mode 100644 welleng/errors/__pycache__/iscwsa_mwd.cpython-38.pyc delete mode 100644 welleng/exchange/__pycache__/__init__.cpython-37.pyc delete mode 100644 welleng/exchange/__pycache__/__init__.cpython-38.pyc delete mode 100644 welleng/exchange/__pycache__/wbp.cpython-37.pyc delete mode 100644 welleng/exchange/__pycache__/wbp.cpython-38.pyc diff --git a/welleng/__pycache__/__init__.cpython-37.pyc b/welleng/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 006a7d5963317d1d8c9f8a731242e1fbd536df3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 509 zcmZvZy-ve05XYSsXekW{34z$Uc1d0UA;gD33@jBw@)9}DsWo!!$ab1`=4p5%)Rl=> zV8TS_hJmwuzq|WecRKkxjz`2Bd;7@FB0@fYlVCj`T={DY?+Q{xlF+DS57|fVAa{{_ z$N_SQ+((X(2gtE!G$YgAm!CwQrZGKkKuS>agiBzCDGr+fmgp#GLen_JV2n2OFr>CN zOIUYu?S!;+9OM%0qI~3;vbd~E>`iR=(2E}{f j9_l>B@mpq@P{L(dQmr?`i&7W0giHUS#GZOLjQ%@6csi7W diff --git a/welleng/__pycache__/__init__.cpython-38.pyc b/welleng/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index ec297e43bcbdbc5f3854f58eca2a1ba6e2489a91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 513 zcmZvZu};G<5Qd!=XekW{34z$Uc1d0UAtXQ`29~Nq@)9}DDK&EJ%65|Wk$9Z0U71)J znK03%>A+dO&v*anPAAX9a74U)2b<(7AmsBe*teb!?)|m5wq%l?wQ2>%3a#jMn`oNbNLXH5mK1eHFLu(3FPO?9s?%lH z(J_;Q+uK4b1>9-#K}_GT*tnm0ywC;2?^-eEn{aJ->0JCadz?HNy-f8genD+=kK&VX j&t)3p_#Kl(DB+SMTCTUln?h%$gj@fq#9n$g4E{U6yqT1q diff --git a/welleng/__pycache__/clearance.cpython-37.pyc b/welleng/__pycache__/clearance.cpython-37.pyc deleted file mode 100644 index 5843fb80c32bf90e81cdcf1c760a57693e1feea8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14068 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 diff --git a/welleng/__pycache__/clearance.cpython-38.pyc b/welleng/__pycache__/clearance.cpython-38.pyc deleted file mode 100644 index 563c6cb5a43bf43ecda7a2740ef118fe1a7698aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13941 zcmcIrTZ|;vS*}}GSNHVv%+Act&R%S{*Us9#an`Y&gkX%l$=d5n?7{Y~?a&}EKqNpQ%#c8|2*C?N;(-T1LPB{AB2pnFB#?r6$O8l-oY>3v z{inM6vb)4lM33sPbFXvx&wu&OnP+Baiw1t*`sm-*zxJ?U{0k%FKO2$bc)~vd@eSYX z7&Q}bt7CQTnr-Sdr{*Bd?&P{|&6PB#lka*pPr|uQp1U3 z?#|WbB;D)GclXrxbQfw15-)TXyGykt(|FkMi~h{ZhCg%3s_pel{_M*}Z5gR$e-5d0 zNZp6nyuSyrJ&3LN<|(7P@D}=OtX9p$>Gf3?Z?C@@wYshC0AcqN51v*5L%F8k3Zu77 z6s|gndumIa3oa%LtzHzU&3>m51@%y;mBLP|nZ>+r<7`lG_Rm$Vq`3Ofv-PN7f8_Cx zB}EX1k;HF47j!yL1mQ-Ly&3ba=p(|PdpEYu4AJjT2yDV*p84b|v1gLO2EU+H)n_~!@K?~&g(A6WnXH@@?C zfAjHwdSLyXSHJs@-+Jkr4>Sw9v`~f}JSXsk&x6EfY}Ad|0ySeB)QTNYJI;Y3w3Cay zUDGrWa(4}R=VLd{?^+V}VxwKyWgA75V9b=*jI5K@IEuM1R?^?2y;js}bg)X5M&&#v zFX*jTvO!h)XWBtCI#$feKZ((H1FTh;C4C_Kjf$~#6x-K_`su@u zo;vZ|sgE75X4Qv1IlU32RVrIy;8&u4rP=5-x5yHe2${{{R3E#l?n5mUP?cfhcT^5{ z!2@*+r?nXdhbw*LNy=v6H#+qu8SL=bs8p~Pr~s>YZ#v@9NLH(*q>$w&Zhvhp45Gw5 zn|NVsz1yg7HWKSpH!0WGgQ$MCzgchf{NO_3NgNfEq7F6uRx2q;xEGuY6PtM+NL`{c zx?zb_3yBj3oi#NFZcy_idq@^Y7C{p0X@#es6!<|u*o-zV8|o(Hy#4H*8~tu@XS?5P zL>pktzG`ko(VfqodZ_ZC>TjOuU%2zJG_P_Z&3w2OJ+gJ?&UE>+_h`a5FJe3xSSza6 z%lJyT1Y)eXX8LCrP0uV@WpjHWZ%)2GqHM`wNi-v*W3vEDhhm=uf*#5dR}B9s+Ky4 z!cs$KNRtZFIEoM93Az0Y3}$;}tosw|dHq4GplW37m@$W7wrxDly1i?*bEk~U<|;aS z3rZxphEk1-iP=lcAhDx!eqx?Z`yyR6de8- z&LqmG5#gk^P2W6QP%Ao&$+ddRk-g(YkSfS^FJT0`lsR08d|LXX4kOhYE1j3pmX!9i zRN3xioAS{$5hRr}eHBy`*nTUl_>HJhX@!+d)jx+7^zYyv$F6RLcU1b^yXRYo>$D(i zDHR%FU}2yOSi!t zpwQy4So>KDd@>bxr{ejkI3@ac{lZinQhy?UW-4An+-%PZEi*6e$J|(WUWeCpkEI7` zDfxODmM`x&(o%b*#RY6#v|6{)t*baS)v_!`Vz+wD#BOZ2)a^)BRg$A1iG40;st+(U zM=4aNSlpzl36q&XslKXr`+m?#3SrbxQT@Wj?O_nipV)q|o;X_&Pt`^BJ~k?XlN_S* zB;Mj;#C)C{}_pp+AAu+LQx7A0O^b;VLP0dG?wqvqnFQTh> z!ViKNX3;EKmN`H52XRS`GE47RZu-t4?cXQFCgl#szgjI)==Pv)>vbp*&cIfO;ZnW+ z;#Q-hbF_59#IC8E@nMl^ijqT-pB1|`#^}=N3ezaYXYqtA=H)DN_~(AFc*JwOyf-Ih znj#xfhCiAr9v)%y&mtg#k22g6k!KB@2vR(DM1os`9AZukDIVKocb|XuD>g!u@L-W) zeBkPmv8^{oT0f8Wb20LEAiVg;uf+K^(190w&<)P2FxX|NhQ@_f_|_HtQjx1}LkHFS zL0~Mm*4AonbE_L}brbg-xTtxyTBy0A!tYAocc<@rgol!xWY&sW%}Wb2I@~zZKNr-} z$eEziKVK{8oL+E#Y_==-b~2l;XI)C1MUoaU=7L$aj+)EXAxqIFZQ_~uQB@wtBR1i< z#R|LBrqzl!ELY#fJLl(p4{z5m_(i<){)}J3+w*7rGTsG$&Y#D-=?$pnE%ra4BUmC67N$tE2&!5%ht;OMvfBAeVokqJ4FValQ_z-a+uET# znh^^Wl4oZ&wOGsPdoF#?^9_AODYD?(i)Z@TJN@cinf&6PjUbR0@lBfEQ*oY?DWGRjOv?x_*S8a zgv5rC3BPPDwK;0{spUlt^te-ehKhaULO_M@aNUYqE(aYAujmBmG zQ~Tu5YAQ5`4#CuxlbJe?=?E#u4G$95b|Bwe!@Xiz);pf(ne(=n{vE>GF_+B4lIJ?s z54Pvh<;g5q>agLD>qBSK#uHNFQ&zn!3jaalk~uKfjnDBhUNv4d*XUkaFMF}cJTSPq zW8tx10|V|jyNuhffx#JGw|41BJ8z%PnCPJkk!my}aHRM@vY-{cpcyApUxt-6xHv(h zxlz%kWF^E>w)(vhhfSC(90L{ODURVjkahI`g%1s20{S!uAZhp0hyYE)l9Gn8(W&&; ztuI(FIxuoA5y6U+0wZfuv%_1rj(t!)hPQhKa%+1Td8<3FhqokxQkaSm#^l2TX{}PY*60Ttx)m)NK_n>T9 zt&SdKqi)n^@9_<~CN+1wF&`L~StZ!Mr3UT4R z^^0GUz7?f!h1f-3dT~Lh+nz%^bL?LjF)jQ`Z0^j*PDHK7*%*#qX62F%)W%zLh~>O^ zXsYC}KQ>Ag;^L?j^y@;jxU(ck71v~eq6Plu-scO0nL%kVJ17t42J?eGgN4DOl=S?( z2&lB=U`bL7Q>lBS<#;A8#j|lao{Q-La5neBcw371#(QMd7KAR6!s;(eY)ZvC$+li|oqMCb#3IUn~N-aD&!NinQ^v6U}#R$lL zj)szoj*iGEP`Iq4Fl@^#9X4ea25g#zVV7oMcPyMA3wsQ&7qpD1np(&ev};MT`; zq|8(IGVP~GC|fg8qNXIEqRjYLJYs{pCF{S%C!l{Y{QKVav7s)aG?>)s?@1UsXkR9e z_JK^^!f^6r#msbQ)>~9)T9S)Y>oY1LAr(g1;s3-FQr1INzFWL<)oQ)x52_d0BwNy- zx!wogp8R0yOR76rkXMv1YqGPqCM)vBp)H6KUY1F6oMXXGXJ!Wpl_i$d2BVaudf7Qoi3j6L!0p7TuWj{Y$&)>R$VMd*YnIrm5v%8rAPgoG#$ip-%!g zq<)vqxqCeAZasqQPTeHqD#c!eBvX9wIMV(KPuK%7fJ+?#{&z(1siHWN^WS&#hs`q7 z)bd1nNzxaPUNMhaM=aMYmYnY%nkzca54^mlLq}A;*TxhuvJT#o?(5Y_^$H&qKMS*G0!VEpl0}CBlh!AR);KjH@X76EjTm~X~v}0e-o#LBQt=$95Uyv?U~_ZU<+O)uZU^L`2P(7t~MTU$qJ1nSyv(zJ47^W z0X%aN%pn{Z!8Cc@dgDge^llsWJ!<9PV9EiKVAqA`j1L=68BZIZOj~5z(&~GwUmVqs z+#P~=1>z;Iz@u2x(BUxdF)n>8p(IVE(yr+j_8ER*8Q-oG#O=aN6>Vd{Z3)!bgNPRt2&ZM?MsTAfp?2#<+PE~olg zlIKXc_B9V+9>rHsEA|>ap4&n4CT04LnHw4=Wx9}K@jM`YxYH128~yG286f`fwv#+i zKb$Fs$=p~fs;yU3yV{9@?&dUy{0zErgdB1d0Rtjx8C>E(d_mm2v*4B|Vvad)%wKWs zWo!F}ArDaxXMG#G#uHq{Imsjs)kun8!Ap!%!&^XK_mZVeH>?qnE^rtcppPw4OO~JQNWPzYHth99Y=Q0Or6n=Ii#*RXd48QX4`BDCP``U$(`~Q7<8! z*wm0ylAap>IH!wh-L>2++jm_(5n~v^54A~t#2%|(#dp=`N!}p2M)yvRcdt65mFj~m zyhS27vZ2Hfjm5)X9p*tWO>CDgT%EwY%L9cv?9@|+I)X|# z8p(z%8oV~c?UgDPQRhjP!WE~PQRDIBuuPIgn0>9GKZPn!aOhgh!d$hAX6BA+_zBj} zRin#x1(#=fS70p87{3EMp4btD838h8J4Qwf{CDCbI)>NNw^i%uaP`MaxG4H8X3>9-4X)a z1f_S24(TK}aQqVsg(`xeoxnRh1cKECuL~6!xgXXS_!|D&kgs!^uUS~#Kq6-PCmFg{ z&z?m_ojv20GR*D0<8mtl8ds~c>V7uy0LgKZn@QRvkCV{SQnV`+RfpoPSLA=ip(}o6 zj2A>iRG9WK$T>W6RPLGHJ>EX=DQ_0%D*L@M5XhpGXrjc#k7D*Xo{%I1{TBr0Hv#)= znBM_>PoSR{RW#7=ra*r_1^PXI53I4JWR{m>SgY``i#($&{?5np>sm# zh3*l$AaqgalF+?Em*vjOKD4<{eNj>b^_L#tf`vAUlFgnzp-ML|xU%e5zH}2d7 zoX2P%+|_qtDm*#x0an7~egs214Of01Zy~GIn@0${Fd3{&Xm$nI{2>;ifY%3u!hBMZ z97s7DZK+97?jWVJb4W0P-^{0fO|H`!$5XB=xo zV&fVEZ=3Kvn|_CPSYYq~H<7o-;~9bb2U-(oU*h>lwIpf&#PIV^GZ5tclA74o{&-eB)ub1CL`mD zAgV@^+whJ6pbjAvQ$32(RU5Zeu=ut75Hfc4^#z!vpF)0O`qOh*NAj0BhunUyWnI~R z|KyBhNbnEUA?z~^!bLnkI{vLbjcV!)iBB?GW_IzbSr-M~R=>j{w~*XM@*v3uNsC14 zN-GscDNw(}2FeHk$F`hz-CT-e@4L=uukX(vMH{iDJ@ym>L^+jV;h4L z4WaTFQyEq~R3GIJU3{q}f

@jfG@}MpOJ%q_|&s73&9XetT-3 z#IoQJCb*Wuie}jfJYj4PH7h_rYFI%0^0qNsJis-1m50cN90J%cJcbkeJZ2G=*Z_7W zt`Ft_Ef)a7L#(%F;PJz|@QHz3GNiKW}~ex6pqU>5MXeaYNeh;fW8?Uds(`i`S# z-S@MGdKbO6;&R$+wmO4W=fD@8ma^?CV1BP&_v*0enc;9pyeKU-!W`L1eI#Da zLQ8=Dm-q2lW*_D!4?2&OC9I-+ndw;hm7V=K62Tz`!Uqs8r{RMLrx#V*hY(&$({I?> zAKe)5^K+NbH>q_Ka!c`^wPC!1_}(<{X66Y$ETVm*eb@)iBFFu=#16-g)LReYBu`p; zA42W`KI7GgyOr}BxMGWYuZ>D(V^lU8VWr>14OfMm2Ip}vR=xr|0=HJPR;cJJ zxSvqr6>Z!G?Q|}VF58AUJm%di=E%jp(IK+NGOb!EwMTdbDO9u#aF>yOrdUHvl|<2p zHC$Z^E?_kHjKD=F)i0sKYW3KdpDL2^0Fsj&Zd1cbIfk$XtBKDk%0?wZ^A8cKEw*}a zR#USI7i)U!9sR}HBIc|l!ruQP~+uqA&9k!TzaVt<4)kP*yhibj{ z%M5*vZKZvsUb)U9w%%g6rX2aUGA>qL5R@J-I{90%Apk9l#4^d6$6KIp&R)V;+D_sY5G( zzdiFXt{($+x#BoWDCt`B_V5&K0hnINJZ63bXfUA)v~F)7oU}P6Y~UtYV)&yqMJrJB z>HP?dFmh-cM-Xy{civ!gI1>nY4%#Lc+ZjTR<6k-;+h57{;iIGDBAO$@rWNcueHFig z%OAXc-&Yr9v+C_Nx_Hk^AwyQru7faf4DqO7M(H^pz>d;T5%5(( z;68`D3%Pbt4mM_dmj@d>){w)S{PyRv342Cvcr|(=GVxz6T0FAfGL86eg`vnE{dgpb-n&fm+Dj!q9Cbx06&! zXhaLTHC$LRQvZ~x0}%d)Lb|%*s7@{HAEU?-F6=S_M(%)^soa9tgx`0)dE9HHo_^P+~qN)kSXOGb^(y4C=HfKs(w*leK;=e0H~;bY+@ z)*iY{^v3c;+Ogqw)c5jaKFP-V^h-2Z5z!>K6}38{An>Zhd{J%UInX_l`=EjkNms8m l%EY@*-v_>*yEUZh#D8Ewpo-A5Rw(kU@~6C+@@I_h{{lAN1>*n! diff --git a/welleng/__pycache__/connector.cpython-37.pyc b/welleng/__pycache__/connector.cpython-37.pyc deleted file mode 100644 index 39dfbfc5f90dc7e94dc668f34ceb3cbb9b2392a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21815 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 diff --git a/welleng/__pycache__/error.cpython-37.pyc b/welleng/__pycache__/error.cpython-37.pyc deleted file mode 100644 index 88d2c5299e3379cbd7b198f100e40d22a632b86b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9549 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 qn@|2(blB1nJ)0SwTlnD15h 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 diff --git a/welleng/__pycache__/import_data.cpython-38.pyc b/welleng/__pycache__/import_data.cpython-38.pyc deleted file mode 100644 index 2e3e35be943aee6cc7cf154f2958d508f416066e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2439 zcmZuyTW{P%6rLGhce6>8(549#6e00o(apA{Py|tF)l{?y_Mr&{SuK`hPc}|`+0Hmk zHu55*@R|pn;URtGukaJ*m8bjyBtXD96K}fR;*sa_jc4Zgo9~?S_4IU;!1LJtA^5&Q z$nQ89e;5qzz$?FnDkd>aiH|KyX~uj;No>UCkHj}(E4HCEV<&c@wcqJA@`>%_Zo3cHi8N7Zy%gmJK6h~3Si*o`RS_2WWo!Fvy0 zSwdBk3Ji+bF&ol~?$9CYk)cr;C+y6q(x})GT_Z>I1*If`5?jBpp;?-hf%wyvCv0d9 z?TS|R5*a#`9ot~yW@%MUWgg*|c4h0nF*KjusZ21{>27$`Z^U6421T9@UNI5bGT~iE z6PKatfr(ES(YzD#0(e^jgW(9XqCc@`xE(wF7anEq^E8Fuw`4y}N{=bFa!ue)zY^g< z^XEoqyU2KFr^v%{JItd(M0;h~`DXq8@|r06o5exri+XPPUOoAFQa;$*?BLcs?{%bz zI!V?qL>Zvr z65`y`L0Qu(>kvLq!u!7Z8X?Y0l0nRE?T@?PpL( z@=d4+Yf;-U>7v0X`^UCssmom2WHU@$g4xKxZ|VmZ;h9>2P0(fu7d%;FdfWgNf*xb7 zLv)N|6V&z_=!sR}AWLM&D9s(~h>5F}5xYy|#2(?ORKOZF*2HgXY^ui0F|1W%(_`37 zja?YSW@~J244bd9H^#7wHFjwXTd1+iBkUPiU9os^3B>&~StS(%Aun~khGJi>Df?j_ zt?{0+?;a-D8XJ$-6zwW{U)eJ0W#NOm{jzTFp3VWM`nFC{E~glgJkxiwBo9Qf51sI! z?f?=M=@|kYf$>2sV09T+>fs^|mvD%8C-9O_(Urto*uy&%SFnd-7jI(^JxsiVJyeU9 zmFIx4lBo0>Ny!DCE>$y;NscZNab-OZ(><;nknbiJQkjoBWh%fMUgcBBXEhU>^z4V*L&} z7%brmNd>}$IAp-Zkr>4^LM)9yC_G0TjetPUk%mT4mZMcufM5)7b$#~mrohYd*?I

S!K7i2# zcWNpNcX=T7(g!dvQL2P4&?cP)tX|KcM`X z({7FOpFI6aorV$_?aL578j?X$N+1%8PoY(A5M&{^esJiYi>EWnO>Iz3 zyVz=D!s$bDl{iOI`XOxUnHb diff --git a/welleng/__pycache__/io.cpython-37.pyc b/welleng/__pycache__/io.cpython-37.pyc deleted file mode 100644 index 9523973a5363bff089691e80bc133a5159d1b8f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2402 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 JcYNy8{{Z5*d6^ra{ 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 s%$KC)N%1Am6L;s5{u diff --git a/welleng/__pycache__/survey.cpython-38.pyc b/welleng/__pycache__/survey.cpython-38.pyc deleted file mode 100644 index 1c218cf7e288f3a877c79c6063993dcaef8e1abd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16275 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 diff --git a/welleng/__pycache__/target.cpython-37.pyc b/welleng/__pycache__/target.cpython-37.pyc deleted file mode 100644 index c77325e1dd459802774f2b5d8b8298c2c62295b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1546 zcmZuxTW{P%6rPLi^?EOfS_*`#K`PRM=&F^F5JJ!rmQ-9q#a3$B7t8fb9d8`l%*?jQ z%6TDq%|Ad09{ERTo{)Gz`3pR8j=j5zP-isXoSAdx?D%}&>=%PUK%m8Ee@5SWg#3+* zb>m>%g`wXA5Jb?N%qYw(XGeU-DcK`}3+J2&=Zwu9L8oNoUP3I{A5rV=W-7^Lg6nm2 z!MF=UzXc$hY%?ah!V&H{opIrb&N+chK4c24_b^teG>Ss7byFo}@ei2L{`x%WwH6t| z+=1~84E-yBpn~DGQs=a9h;W6MGSNw?@S%4_@Cz5c3w}DN-MWA1>5mN+{WJPAHLULa z#(yVgXn}VJtV52E{_uow({_x`;M7<4;f2ZREDED|? z7O^>qi=MLs7w)c{dzrbvcrtztWXK}j%%+j>t?I=3QIr*# zi6VRi`h5U$gHh}rhd~{>&9`aDJh1=Yms{;qxV6ra;G4jPZxlJ&g`o{VP3Aa2taFy~ zQ=GW~A*;$bDB-y)*bYX3VCNmdFPu}5^xUr*$ai%X9uJ3gP_sD*ciyilKBEhG@vEHy z>~z*UAZmZV6-pm2Fmfyh(OIf2P19=AHI-M zhCxW*6*iH7>paclRK1I)r%I5IY)MD@Avylzv|gGvEVmG1e7DL=6N%WwAHhw=Y+~&Slz=87$X&$*qJL)}(Y!F39rC8)>_oL{iMVz-D z^$x~=fPnJ50wFGuV$7(qy1q|n+k=~p2Y$jW7Dpg3R#et`CPk^58sV`kshZ3o>{f9aeJ8@Cx8dip&>#o(O&Kn-j9 zKRdsWbCkfl3DP0c--3UL{)RRr<_!aM8wb#9IG_)CNE|dCV6X83!zKXiH$A{X69NvK zKHx}<;M3MlKMAA7xSy!xNE)g1()9LnEKL}k$qEA1$@|gLY`wHCwDo0C#8`(s?zeh(zjZ?Z9SEUe6HJ?UL8ZJ#?Cb8Z1Jt7blW;g>an8&h)}=}qOiWF z8~PxrWmHxs%FAeS@9zEG$?52cs>*D6y#4W-xjIzZdw(P!%d3%AhE%9F~%dywJaW~ z4LsyC2saU)MR*S3d4x@b7Z6@VcnRTUfT`Dg#5CC3{ql?52VZ^nD^ah4D-v@Zzj9Z$EvCyR>#|)E_~6>!nv25d-I3ePoNpH%$BQZX}ndR*dUJc zGBQPR^e>`uUM$7~4zt8DfcO|y2^Q3q;t_R*(?9~oTZ2%fF z!wICFvCKKc)e%5wRU3{}p1Fc;VgwL(<_qVNp8>UJLBoK?i@k7(9MHpt&49qOK|}F6 zUBVw=VHtwOzqSCmgZ+*$1318#TL;Kzsj@Wfs*VQ+V&QUy&`M)w-MY$4pht3?Bk|t2 zc6I*I|F)K45VmoptH=Y(9~DWaUPsYW70^g_%|{wQa{T*rUYfPt?jXYWUR_is7KusT z1yv(w2wkUP+ob^d!=HM70G1o{20L9}^kcbcf9$p=UI7jn6gGV9A_0*3acsjlKB~mL zKzR_y-_Mhx^QhM_{w)L~;tE8lVv{kW#-Cmg5W0B&3g2mc@DjJ29|74|SzG>Cib}P0 a!i_7*+T0P?Z16#MkPopP8gmD9!2SjEePq!9 diff --git a/welleng/__pycache__/utils.cpython-37.pyc b/welleng/__pycache__/utils.cpython-37.pyc deleted file mode 100644 index 70bf68a0231d90422e661216d92d2ed9359471fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7517 zcmcgxTW=f372erhE-#WOS(YXFQfHwCg$OW`lk}1bu4~7!odk`V*iM|taoIIzNv%Zg zGP6rrB93_^%DhOaxO`SSPxWR7DPBAesdF0A<+!Y5oQexdk5h4;`W@?WR`obL=n<{b z_*so4LGoY}#dw0`svL|5-(oyTISUvG^){G`x$z!Os~%22M-QbVJ(QlShdI^5+*5ie zrYnKf*=Ntt_l%NuW*{xfZ_V=({wBWAf4R(P{0lVKgVEBu4d?7U#(q!Z)_dA*?L(?N zSlLCyr(>-3)>*ZFh{w}sY2FqGlH%#hDY}29i+{wLNoAAY*L1D6=$F&jE$E@)xudatpu$aP$}2p-l_ZSHoWP1|V&elzK^;~<^t0DZdcm9fU2U;j!S-J@YBnP}O< z>qK7Q+sndjA-3b%QDFC0qaCQc>xK5CO&24+WP3jMP}L1>9z60Z)iE7t0G@9PhkK46 zj_c?2ysxPrTDH3w`S}R_#s;s|@_O zEw>(xblFI|JRpqMt1Zluto4FTtD~^9_1kp0AaWZujvDt z6h3s6aEB&wz#NUti)yzsy}0rP3q}u zm~4{GvPI;T@y@ViV-7jx(wnG}hWT$(+?Ziil+3Vson)2K(qtD{@6>>5tPFZyub8BU z@3h@oO_pl4cEGzWici*RpLCs8QX(!vH#HF>!7Aku7zzI&jiF!_n98{+a!B5-Q%KJQ zULrKt@rJ)c5S!v+q&;DHVWwl&)c4sw`&jSi`j%gawSF!p3S*$$h;z#AYEMj}0&uSR zL-|IUUr_mGQoj$`Y}k zt_MDLd<1h>w;dlwvgaWVQ{mV<*wleY-NIp)fck4gC*U9F2HsNkI5Eeg)|kvq?sXHx4kZBZd)D=F49U=>UD;a&_ z6K|`s5r=pU4#uy(S{X`DswaN1QV?eV0+~-8hY3_6bpYeP35OjB*yWE#qUOZ}iQ6PUV{5 z+&Kk5f-{SCsNK&=~YIvrQRv|@=0Dk#S@aG?sGu4KMsJICS=6@H6G%4TXa%Z9jx zRGmyIJq5g(v6M)}z}ptvf}td=eW5=w@HO^zaBY;Sl)0}X&cxf`ye8166aIj<9I&Uy zrb3@dwRw)`KEuhbf%6{EpC0BIgPa8zU$nIF=E;<1ZSqtD{ZNUOT z{IIx&*t#N*B9CaLl%V-LRN=c6yiNgG-4x+qeV}n*L*XX^M6lz@oZ?|H+&`pR-=p9% z1wWwR3IeI`?hS49Vc3_*>^eRubofV94vDO3(-+ueLTdD7c9FfNi+7M)2O!i#j3T@F z_!APqy4nGR^$3<1s57_$G@A;Utk1@Bb7`(lxp<8jc2|8tHgJw-AQXsAB(brwrZG}q z)l&7bmy`rEm6VpK+A2@U0(D9I!MACsy=V1t^8&nEy?-jhmw{bjJrX!YHQ?rK1a_A4 za3Xx@Mvq+Ax7TlcpjQ0NA6**(n35Ilg&?gsg{jnG9+J@DXKe>E+V|VMO4}|0W_svV zM_N)u(S(!moT;4jbCQct$V|~l{xm^jK7k)Gf`kYt4nS-`megUR*7CMfYimj?8PE`F zGN*b!jJPR6T&CBbAuXh zAe?is`)cLx4pBfC5VYd(`{N64CyV|6S!=R>^gt7=E2mW@Gxuus)hd6w#UeP7{-YcQ zP3ysqBXDC-ckQ-A_bu+o-2n>MaNVLTvYL;ia~R+TH6(j`S9I0EoLJ})HI5NJCI;=@ z-3}-_Sd0#DFa+(wgBUvY=xcPV%u0i4_i6sHrqP{+}G zh~?lwQf`y!agl zKXd8eK;ZQa1N)vzhPf7){?Xh#&nLOWO>kO(1%ZphjK)TTSW2Py7iD~I?81T8qlA!$ zUbBrm52w||ffSdb&JlCIo8Dp*eeVb`2@m(5baCsA`YZMGmJUu?23`7OJ`Rj>iA(bBqx`I!Rc37*FJ1fGR6AvhZwt9jO zbz$)qk~kR>2qbePdnnnF`vygP)zpROGXPA{g#%a!TQWqQgc#|CS%uxKu)FkMk~u~C zlkUj&imMdRNm0?{1hHgk6o!Y~=8Q$4lEZ>;!06+S&Ph z=bf2n-uIc|`_t1U4bNYX{=NQ3ThsnQiSfro;u7Aljeu*MwY7D2P2)N@9%$V7L|@nW zF`nmz2W;IyIsRJNx2f|YFQLTb3w(-~5zFyuUU{IcTl_em;j_re^F@Ay&mmUeNBKO; zik#ihswei)qqf$daQrclxP&*f5xCHXYtVtwA9~i&r@>7~Gk6YCELnKR^Dphz6hsO%RkX0cXhksfQC>=QPyVvC#i z%PBoJG-DHCF3useV#Y0=|5QJr4f2Sa+*0vEtY`T}#E1E%*vRsy5Fh53 zqx{1H-eO#ei;LPWLmaX6TiRvw8aGvWIi8~OMQvWA?_e6aQ?a#6`j_Kr=wD8xUeHi7 zot9J(pHXFndj?unc#%?Z<%D*M>dg*Qym$&y=QX4&aYe~E5*L&nN8&v7JJI8u>Tzz^ zBU+{L6BZ8#V6lRX?&Jsf?G9!dv#C_PsX^QwpW zujrwet^`(Rmpwz@V@lewp|mK!xxh>KoBCY;^*Ki4KTdN!94)QeXwFVy?6s!M;OYf#VZ+Th@9LUXveW09>$}2?b!F-cH6!i2-gm2i|#CyvX<{U!s&!7S(*fP_=?^3!pIJU{W7;5 zA)FmMXxhzo;6&j>RjU4u>p-l_ZSHoX4clo4ekmZ%#0DXF$rHRI#-}qV`-J)SA znP}O@>qK7Q+vkMaMr_NqqrmPjM_W*N+Y9ac8!kqC-u8U%p{g6&Jh<;yYZE%q06gCo z4)+{CoYc?hd*4t$wCwaS_6gN?me&G769nbHh88{Fi&pF~5(o6Y;zbyueKxVRXKA_4 zHeEM5OB2D#0Czkev$EmZB!rfb;yh@z-Ig7?FxFl)4hBJ1f88V*{iXN)dp_n%HLcm* zHdYzAyex8|I zWH+VR4Z^TGD^1L5Q_NtT;s^zE6da{s9>Mx_vT5rWWGmWOH#@xkvI<{W&tc3+s1H&Y zJf-OKiZmm))5WatZE1F#@ZKX$EJ55C*Oxb7BbGM8-Zx_qGd%k0Z(;WaOMvv+ry>A3Z}EY<6sfcM%IFW2iI z_ndZ8BFq{s$IsbrYknZnMixc z@WR-~tflX=UG|Ya$PFyN5Nm^6Ohm{)xe@1-^VS}kL@3~*^ZW9RG{2zo&7}SS)JMch zem*Y5Mde;{gOWd|@(OW&loyvGZPR*~Cl`B4gS%nQhuGiB09_7z*o_EAvtc_vOl{vo z90td+w_q9qkvfiF}y;>bf zPpT*0v|13yfCQOO-H><@DX~bwaSF~+p#_iUv|G}Iwd_=_!j>j%grgjwQJ5*KD_D!{bjBJq3YeZCCa$!y%kzb;x%P?Ki_r z=42pqVr35zd6V2O5ul+Do)GN}$Fxs2mh~ISK73Z58<|g?RpLs5)_jkEP&E~36;^>< zH{5W#u7YaS5>-@CE^O$G6+~Uhe95*B#ULvD9*vas)Mn2-DVgFL(hV}J!>52qW;P`f zF;KV3HeoUeai8lC4SbDV9o!vdDrN5Kh%@mvIJ5~2>V!gIE(Zkav8gaO2pP3v|*N#ui|}kynhZ z7;D?w zcLq0rXH#L54cJ6(F3r^`7q1b+{;DsC2W|!!$OU3kNo=C5WsKEVwN!oVCMCg4C8Z^* zw#rkoKx5K=@NF4t_gMqnTVkgl7cB7}$|l@CnSXl81B5?E5CM9)q{H%ym0xO2+z)d7K_Ox> zuJYcX5;KBXj!n=46Oc5yxod3Z2Bv@ZGcZ`n+0}ogsg}3~oNO7J1PkXRe1KZNnD+Hw)7NdIw0gQksO%MrMVXt;LA zp?e&6>`nrOE4ao{mRZe5(m4!qlNyrUy(xO?z)!sNfEtGgpAdug?sgX>9-PXBwI>;B zOc^B})Ang_PcJ2$(N+aF-p73>S1eSl+s{-{di!J3msCGEF}7+lVHXLOWEbi59M%xD z0M9$$#zBe=6d#3$2HX5h17~35vtxY|O!c?=$AFsJCXbASiyJ(Ml<9wDNPX$NWS(RZ z?ja1UTC$($)F(?9=%%a@bh;P+Lw(ZL#d%ljpFzEP6x5;o(uH<_GeUR~kzwW0c0Zs$ zxgw?iSwxinCrA2!1}=lU#{F80>!>SkQt$xnD5ianX$s~@eda|t4qH2iu@mV)EaCW_gSfb%1NRExG z2|`045w|H&-e(dX(&&3#kRRgwL#WiL?ne|PP{9aOsQipF6R3 zsbrLEf$Ja4&GUScOWXwK1=tNZH_UEqG>N4Y`hQbq=gKx5Xd_A}dFZt|xc_k4JseDN z&FUO5?Zw}WKI$Pq(jgHOqmZQJjDbEwzARiw?)fg#sKQwU1--IUdhz73(hG%?rEisv{1*dyOospf diff --git a/welleng/__pycache__/version.cpython-37.pyc b/welleng/__pycache__/version.cpython-37.pyc deleted file mode 100644 index 26ee395e785cb33185ebbb8ebd5d4352396503df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193 zcmZ?b<>g`kf|c9u#ESvx#~=<2FajA4KwQiLBvKfn7*ZI688n%y*bMXx^$ZRCG#PJk z$H$kY78Pga=f%gbWGG?+Dg+b1Li988b5r%R^79f)G7|HW^NW&8OG@;^gIyI|it-DR z@+g`kf=$WS<3)k=V-N=!FakLaKwQiLBvKfn7*ZI688n%ySPk?H_00V=8E#mBE?C}IMt0~5bO^fU5vQ}wg*^Abxk67!Pti;_!AO7z2nT@_r4@(Ysk yEA+jfath8+N%zbWkJ2Rl^3!4Yfe8pz;=nO>TZlX-=vg$Yq~_m;nIMZ8Z4+ diff --git a/welleng/__pycache__/visual.cpython-37.pyc b/welleng/__pycache__/visual.cpython-37.pyc deleted file mode 100644 index 5af165ab88b1c4962fa4638647fd7dba0093fb7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4743 zcmbVQ&5t8T74Pb9w?D??`P|P0)F33*XfvCvA_&83ll=^dHbb&AWTjSu({|N(dbZu| ztuD{lR{O$)3(_LEAOS*}IdDLNoH_89)Cq|TBXQuIOZdHN+w9C9K(tk#ujzr*{&9zg=V{J7n+RgUTL+#v6huXa}6q&9o8TCZA zck@8-RF@t_2|6pCG*0CQVPAW9q)ZPp?e2)7I%VL}WO||1IuJ68(xlbu5a-!vqw)?? zhK;d=6)~&;0%dM7`+sIk&Ah&ZDxuaZA zZ1lKC?s4hFLZ8Piuw+}!vaYta+?{Mh8`4rrn_q z`e+2HZBC+&5ej>(*uIUQb7ad~#X;uQzS;l#))AYObH<&gwp7Y9{pAztWyxF9xfRU& zFt@rGnS3j^rsJy^U(MMOLyqxJ?M$f}caPXlal+tNm0y5jA2D76?_cM3F?!va*vaLB zQuJWv7nteM%&s-54F94Q^70Y8Z+-fwPwYu`Qp>Bn3?Bbf_2b37w%<5mlZ9EGm#;uF z^wg70Ro`FA=adt+YtvPGZqsN`>gVUo>2|qihA{T*6(e;`W#NkT->#A3no$X@!j#sSNMlA?DvKAcT?#<8$_LW zTKg(-2cW^O1CovduZi z49h0n%)iFPZa9e5roWXYqB$R4?8$6>Gx@q7C0q>sFpj#3;J!+IwI}8r&EAmLr9GhO z^ckP~e=lohlWql@4gbAeY)S^fV^Q?^QDy`narQ)l3>{Ii=Y<5mj}wifLf#O^SBMB* z%n4lgQ%sbHQ6|o4Q>=KNmDzxoRew?I4#gAt93&TM8_C3uE?m#2bzEUKv2*)Z_A__; z1&`Krw7v1VW=}OcIOpQNtlgr6=%l^=?VH4nJe_BaFZbhAZQP2}P8esmQJD?e8o#zh z$L;q9u%9;0$V3maq^b7iU_}h2>DVPj|M465C_w&~N!R^1{Qu0G#!fdJMp^XPzrOnF zl(atm3Lo@wa3O-)E{XSH8YL?54kB?l=<6yhXis&eK*)&00|B#=rzFG9xH63{KH|FF z?rNvqy{Wwpw2@)31STly?rp14EP{#@nNXnWg&8S25W0*=-o|CrB^9YyG{2^6kT1y; z0v)K+8>dU=qUh2#-4|Wy3PeODN4gX#(E~i7P15dDG0Jp#dONj)t<;S>Stg_cR(Jp; zA$3(G0}@aPZ6|$Q3Z)F88l+HB2hd}olO`Qd5o?7cV4zt?ySs7N)gJkqgln%WRIA-4 zDO4*2h>;XN&qZ+U@~ERE9ltJr{NVBSdq3K0UO+Egi7uH-ioG(Ys7tXyJ!KV2u*|T~ z6!a*79_!+@%>eDD!wxkL91?zmhPel#^M=W9 z24x(0D-nmmLUCZNw6C&r#;jek+N+qF?IW`;Ewgo2VaraPRU8+!RRD$xtFwlUn(d-Z zt#$h<^PLK-v4%+vyJFWI57f)->J(Zu9D*3`v^4`9vr>M9)#kU8_KPXgz(DLsEs%MosaLEdcB=0mG)kfP3B2);I)d_OTo6`@ zjvW~$SwEC`gaoTo+KYW&(HAs^kHWTyAE(Oril8w%*B+l~%kMy=puR;;GwK+UW+e2B zJ>B2_hQ8CcVOVriwKqumVdtrK$w-Cyqj3&+)F+~@3y#!h0t8L!`C$hSKTgQD0CR>7_OmmH5vsVq zEpYheNd1QjY|Oi6DAow} zSg3(a&H!rDPe9M?;iduc8|J+~n>j;)R2Crr487P5sM;PG{8s?#Z)g7YLmxXon1R`# zw3n)u)TIvTivJ7jG|@ITgBfFnjfSuYT_q=OWRc{zwcF{1{h%IlzKv}S<=s%?bzYt8 zCx1Yr>V?}c_D$D-2U1tQ;}j6AuCq9za-XKQYVS@{Ji ojoT)Vtt+>R*ZggYl-aAuD(o7o*mb*c!D6#t?MbDyx>C9HZ|zj=%m4rY diff --git a/welleng/__pycache__/visual.cpython-38.pyc b/welleng/__pycache__/visual.cpython-38.pyc deleted file mode 100644 index d491faad01713b0e3be4bd071519b61e0a8223ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4706 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 S7CZUYM0y& zXKiW0MS;o>MbZ2R=`sJOPkbuSC;x;7DAMl?_o`e9lmyS5nKN_d%$zHKzqI5qJgKW++Rb)F+hX z+ys3kuK=#*Sm~|hRlxP!2HeQO$J@*uK*)5teZ{cX8hSf<4RALHH*YVm1K!A&0dM9j zfUo4MfUjc3YqTO@PuMs7u;CVFKZ#Uf1Yx^a$doUYcXmD)qe=Lz5J|77_)_}kh3E!F z&FlK7q30*zeKczCj@rXfdwn??4oT)xz#$fzQAPtBorcl_AeL**pA!$7Huv zv}Cz9TC!d32LV5|<(C*)jB8(EwMX_$mJ7R$mo+tpt*&V6X7Q>X`KyARm;1r}jjw4P zD2OxWV8?Ms&!@ihyV<0B_@KeH5*q7G`*D=qBU{p%muonNq$pIXi;h=VK?=ieH-$Vd zY#5sIy>8Gnf=;IGp=tKgER(CWXlfc{IM4xE7(7N>O0!Bmm~cbLpAlJfTU!4mc#9a^ z0QeAJM&`!MJ#LR)hi`BPxWfmlW2H>|U`{QhqKR7GLq{>iFXvRE0}BNpC?mEnjM&l_ zPO6|wU!+hVDcCh?rOC!bpPyvyLG>8#h!`3}Yo@nv-3j0}0 zpn5f}Kmad;`Sez7eHlfSBAuUPGghPTXBi^N6@a3O_$R|KYnbIN{G2GiAfRIaIsc6E zm(cwqzR{(ayr$o}DBHpMMDf#bJEwZOl!@wJpab zS>cHOi2q{9|G*OQWjU{sKEymr!|G7X%@gIkoXa>DGNy|GeujMv+9$DrnS>FgQ8^sE zei(*wsHSdNNAXPlx7)p%v3yC=&_Tj8QPYZnSUWMkCS>1$u^9Y74=)&^nXW)@JO8 z!P;0?Gdaelpq%*K(DRVRC~M*1z-ylOr@r4QDY60HIu1y35=llOY3CVfwB6`_(R81{iQo6x;cgcCm7AI>X28?K0?%bRi(PzqynGqCOF-oj>RY%%2 z;x<~1LNP{}7;jD~RI7e%4V~P%+|tR-fzwp|eF z+#c#5_gJP~H%fx=3^8N=KnNidmLyRxl*g&;>X3q48DA5G+IJuKA=FU_>9PzH`~(>7 zH^%@WiNaA5o~dhFO=Z`j+<`>%(m%yIO>)y?&E%S>`WVkoqSgroz8UG}1fW?XO?(zY zElKu&siFmC!y-u0BWZrj8tB^S8C%UrLVcL=1;TXP6FhULqc<<4Nf+~gzlKnyN%NLUQ)3#*!+Z)?M9iK_7%x5@hcGyR=+o-f6pE? ztg=>{Cevy0L1`7WJPLUHz(C(+Jzu|@WuYXG(0NDx3bW+f1azsVi$1F53$qIYEDShI z)1km!{?h0;`9JEP`Km|9@5W-&Ds4hnOhrZCVVV9(_Clz4@!f9LRI2=rSC*Mtu7azA zXEPC>f_d4HaU|ba-9Vg=_5bt?$HlqOyVnb(62*MbXd2 zx0Y=S`5UZ7c}6N|SVbl2cYEjMDc{FX(;<)a`YJ-5OF2T%pAl)2gbMqEGL?NutTHM< KR)j6;gZ~1k0nnBJ diff --git a/welleng/__pycache__/well_utils.cpython-38.pyc b/welleng/__pycache__/well_utils.cpython-38.pyc deleted file mode 100644 index 8636e8322f4d23c12f1cfe3d2d263cc98a886be1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6757 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 HSb6?`h68)r diff --git a/welleng/errors/__pycache__/__init__.cpython-37.pyc b/welleng/errors/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 91fa58c21203a36c031760279a3d174989288f9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 213 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 Z+6~u9lGHnxN+bXP diff --git a/welleng/errors/__pycache__/iscwsa_mwd.cpython-38.pyc b/welleng/errors/__pycache__/iscwsa_mwd.cpython-38.pyc deleted file mode 100644 index 5c7e681c058baf36f8ff97d17f1ab911e417d69a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13140 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 Kd02_UYyZEw!^OY= diff --git a/welleng/exchange/__pycache__/__init__.cpython-37.pyc b/welleng/exchange/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 024ff81e26a815c7a10d7b46365992b837845ab5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 293 zcmZ8bF-`+95cH*h$Ws2`HU;qqA`}r2h=L{s5(SoX-sFt#yeE4dF0{OcAEC57AsrP9 ziW^4S*`1wY=4vvLf??l3P0Rc1R}@ryEO^qG$%!Z7s+E|I-kf}ewuP|OFw~6=TaXw3 zAeR`(`j8YgpnTV3B#24b;1mo+Z7`~xjUIDSDaRe`6~8)5X(k`0)#2P2hqW;uB96Gi zAALXT20PF%7%Xvkjj_%|`f+umt|Rtq9Q6IkQ_GWi>*+49b*Wu;sjrRk!ILqwet#Ix OJ9N2)%QKEV@`xV~@>o*< diff --git a/welleng/exchange/__pycache__/__init__.cpython-38.pyc b/welleng/exchange/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index c3a2057a2aa0229b3aa63feecab09e3967c57406..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 297 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 diff --git a/welleng/exchange/__pycache__/wbp.cpython-38.pyc b/welleng/exchange/__pycache__/wbp.cpython-38.pyc deleted file mode 100644 index fc9ecc0a10054b35dab8f1dc1e66c3da787cd812..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3943 zcma)9&2QVt73Y^oilXGNd^wwL*)-ioMQgh$`eiJ#Nn_`$u42Rvf(mE}T0_gSDN-3y z8(UB=n-u6}fkm%D0p+;=%^r##=Gv2hUfV-}uKRmK%2B*Yw-n~hym@bC-psuBd!t9y zs-xh${>4}R-xd_*AH+<5I+z<;VQQo_Ri-gL(z<$6SCu;oGg#?`!b;Dzroq%L zrEZR)t2D+MXk8Uda#H3k4IG znS;8-D$GS~vMQ^gw%81tMQyV=EW9A>$6*w0MnNphZkUBU9n%K53i8@oSz4j5RRK5o zX3(G$_$^ABL66DZ(Vmz|i_^kw=b1|jvuay^hK1QoTYFX;YD4$HOjk37%|2H@Q-}Jn z3jRL$IpQ;QXgpWh{DG4G5q%3qU#aNh=sP3FS;HE}eFpxltzZ0;wy3;RFwaG)H#bysIs4$Hf!<59cOJ7jQ>!fuD_HZ) zP#K+lrKn0<0e24EdE!uCpqeSTxbHNC)sGM2fpmDX$9oUes;-h;;0;3BQy!}<0SHj(~ref#c%wXN}4n&7fjh=XqEWl7>iN!<3Xc7sDN3gdRR z=UrQ=53ckA9>$sfEn3A%`Te+)rCzt6X5LQdk*!|By*vO0ms!}$_Wq~N*oI-_Gejs- z#&Vh3YcYR{Y zCl@cQEZ~40^!bE7bU+x8w1n$-gM-i~&k4DxHGjhlusO`X%$}4EIn%6+ur(8;Xj7P z>)$W$CEaj&KZ%2EFNj+SZ}qcm`SI4ex5ks+PI9<>zmR#i3gMkjcDKK?Oxu7Doz&rB z3p2FC<)=HnrQVUSeZPZ)@O`@9^dX2ctEu1k{oAO?zW*2&>aUH`tU9Zn!4I`&f|~fv zst)n^T~*J4nwqUq8O%)(cxkd)i+pPGQJeC@EtK>=2(Sj2d!X?vXsNPwiD^Iz?a6JX zQypKHItFxZOC4(6U?nLt86lu1QN(J<5al#KH;E9k^BTz50IBP5Zc7;C6JM(QN2Ee0 zpOc?Zi*nsPlynwE!A>33*6gAl%)i;;#J5_sCIVA7N{m2H4akplSrD zBZC3XUn)$O5=sn6riH|ql9=z6Snrh}0laIrti12QiVCH-&$ajIj9lnc3-EuJMK!>@ z!K^78XJn5}J%2@VA%K^=F3Y_kLBblR*qcLIvLA`^o&EE&zf$N|%_!)9Tt(+#4OFQa!%4)9vrSRGf1qr_id;6FqK80q!Gm~lcqp>-Mm zfEs!*=m@!k#?Wgqof*mDi!r zMM){b6x~5!49>p^2??)+L7nSsMLpISd9ateB`qOXsV(s%_x>l_D>RUvmVXL&N`5PlC{qRa^v(SGUqOZ%(Jy}5<$E{!WBz%}5} zyClFjNUFscU?V)pIPsubgVP&o@X6+C@h@Y=D;ocIEq&`6W|4naB)Umgllayqcc4$= z8vi-9enI4yM1BQQpUu6G&@FdMg0?)iSE(fd&H}*s04-qw9dG;Vx7J3BxzHofMo3MUFZP)jo^n)mu@FmixoGmd-0u-k>;`FC(%3x`_Oz;Gi zR8opp+s5CJ{P!