From 381e99543659f4c7c402016994da2bc2621c9fa2 Mon Sep 17 00:00:00 2001 From: liqi Date: Sat, 2 Dec 2017 20:52:15 +0800 Subject: [PATCH 1/3] Code.python.p34 This is p34 Code.python for Mobile Robot lesson from Liqi --- .gitignore | 2 + Codes.python/p34/compound.py | 25 ++++++++++++ Codes.python/p34/p34.py | 72 +++++++++++++++++++++++++++++++++++ Codes.python/p34/tim.mat | Bin 0 -> 2672 bytes 4 files changed, 99 insertions(+) create mode 100644 .gitignore create mode 100644 Codes.python/p34/compound.py create mode 100644 Codes.python/p34/p34.py create mode 100644 Codes.python/p34/tim.mat diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fd20fdd --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ + +*.pyc diff --git a/Codes.python/p34/compound.py b/Codes.python/p34/compound.py new file mode 100644 index 0000000..1d383e2 --- /dev/null +++ b/Codes.python/p34/compound.py @@ -0,0 +1,25 @@ +import numpy as np +from math import* +def compound(Xwa,Xab): + Xwb = np.array(np.zeros([3,3])) + rot = np.array([[cos(Xwa[2,0]),-sin(Xwa[2,0] )], + [sin(Xwa[2,0]), cos(Xwa[2,0])]]) + Xwb[0:2] = rot.dot(np.array([Xab[0],Xab[1]])) + np.tile([Xwa[0:2]],(1, len(Xab[0]))) + row = np.shape(Xab) + if row[0] == 3: + Xwb[2] = piTopi(Xwa[2] + Xab[2]) + return Xwb + +def piTopi(angle): + twopi = 2*pi + angle = angle - twopi * int(angle/twopi) + i1 = np.where(angle >= pi) + angle[i1] = angle[i1] - twopi + + i2 = np.where(angle < -pi) + angle[i2] = angle[i2] + twopi + return angle + +# a =np.array([[5],[3],[5*pi/18]]) +# b =np.array([[4],[2],[pi/9]]) +# print compound(a,b) \ No newline at end of file diff --git a/Codes.python/p34/p34.py b/Codes.python/p34/p34.py new file mode 100644 index 0000000..5c086ed --- /dev/null +++ b/Codes.python/p34/p34.py @@ -0,0 +1,72 @@ +import compound +from math import * +from numpy import * +import scipy.io as sio +import matplotlib.pyplot as plt + +def compSteer(x,wp,iwp,G,dt): + maxG = 30*pi/180 + rateG = 20*pi/180 + minD = 0.5 + cwp = wp[:,iwp-1] + d2 = (cwp[0]-x[0])**2 + (cwp[1]-x[1])**2 + if d2 < minD**2: + iwp = iwp + 1 + if iwp > len(wp[0]): + iwp = 0 + cwp = wp[:,iwp-1] + + deltaG = compound.piTopi(atan2(cwp[1]-x[1],cwp[0]-x[0])-x[2]-G) + maxDelta = rateG * dt + + if abs(deltaG) > maxDelta: + deltaG = sign(deltaG)*maxDelta + + G = G + deltaG + if abs(G) > maxG: + G = sign(G)*maxG + + return G,iwp + +if __name__=="__main__": + #load tim.mat for getting wp + load_fn = 'tim.mat' + load_data = sio.loadmat(load_fn) + wp = load_data['wp'] + + steering = 0 # initial steering + velocity = 4.0 # the velocity of the vehicle + wheelbase = 8 # the length of wheelbase + dt = 0.05 # time interval + iWp = 1 # index to first waypoint + iPos = 0 + rob = array([[0,-8,-8],[0,-4,4]]) + rob_plot_array = array([[0,-wheelbase,-wheelbase,0],[0,-4,4,0]]) + + #Initialize figure + plt.figure() + plt.xlabel('X(m)') + plt.ylabel('Y(m)') + axes = plt.axes(xlim=(-110,100),ylim=(-110,100)) + axes.plot(wp[0],wp[1],'*g--' ,markersize = 10 ,linewidth = 2) + axes.plot(wp[0],wp[1],'c:',linewidth = 2) + robplot ,= axes.plot(rob_plot_array[0],rob_plot_array[1],'b') + pos = zeros([3, 1]) + path = zeros([3,3390]) + + while iWp!= 0: + steering, iWp = compSteer(pos, wp, iWp, steering, dt) + pos[0] = pos[0] + velocity * dt * cos(steering + pos[2, :]) + pos[1] = pos[1] + velocity * dt * sin(steering + pos[2, :]) + pos[2] = pos[2] + velocity * dt * sin(steering) / wheelbase + pos[2] = compound.piTopi(pos[2]) + robPos = compound.compound(pos, rob) + path[:, iPos + 1] = pos[:, 0] + iPos += 1 + axes.plot(path[0, 0:iPos], path[1, 0:iPos], 'r-',linewidth = 2) + axes.plot(robPos[0,0],robPos[1,0]) + b = robPos[0:2, 0:1] + a = robPos[0:2] + c = hstack((a, b)) + robplot.set_data(c[0], c[1]) + plt.pause(0.00001) diff --git a/Codes.python/p34/tim.mat b/Codes.python/p34/tim.mat new file mode 100644 index 0000000000000000000000000000000000000000..e406a8f393510cd5a4bc202c99a836e9e913cabd GIT binary patch literal 2672 zcmb7GX;f2L5)QW5fXXf)2u5XY54q@bvN*C&xOn|xI$lPJ=a6pA{zPL?}n z@3}f{@JB$=gOub849qk&iPT61u-5B6ShpK6;FNWKVXHgnzU~+l8VN95Q}$u%9U%~V zRWhE&@v*_^$fcz#g;26fC#n7(6FW$hs459Wlc;)DT0lHHU9qYr0L)t{-m8Z^pgD_- zr%gb0_c7WJd$Lm zbMiP7bL6VD$ zkoL6qmlissfqvo~FLeSkmd2RqJz?Rdo!zkVa4rmnX8n8cs;hIeySKXc2_#{aze1$G1My0 z-T~@|EONydh3?x+xF;{Tfn85P!KX0>meqEb|GQlm7CC&*=&|EMbf&;UljIw@o526Eu~HyE#=}4vz&KcToKfUTDDDB^~Z|J#WDj7hOQ5$ z`KOuy2cjYZL}o&ujfjpvad*HaN9c!_5AuOhaQ4NmI4#UFF^;&kl>^Y~lzZdMYQsF@P zJ)ea`YJ^f>*uOTU#+eUkKaYGkBlQJ^e)oz$+^6zE)7#NarO+RyEK!T@GZ4XmONUnP zVX}YcX0{~$%?I0CcOU(>M+BTbb?dU?LSXkLNBiufWIev?itiP86C;x|52OVHQTj@@ zqm&18vzGKG9B0B)O$*t*<%Ckt$SPcBzCr{wqowMFX713`l9GahJkTx+FY3Qd2ZM=G zNvcc;MuJ*;%Q`FIyt(D8lgmLz0!i7WJiA9?FES&X&?c$V*AfR6~OP}Y*QQGNI`jdkL7GrDr z0k!)&exShnn6AG0vtSXVtUt6qx}J@Se$H*0a4xY5LYmHx6V>Z!kaD}K->sI3l+uer zf%P2NAIs8mDP;jib$g@T&m!e{tIjuSd0arCS3_n_M}Hs`yrE9>z8!{&9y`5iAObt`+#T{J*@AVC4Lx#&5R)&@ek;2*2hZ0Yb(m);L`8p$nC^^rJrTa< zB>c-biGiHV=lS8IVK^(T?bV?xq57kHEyW4j9e9YAGG=A|W7=tz>Eeg{nFs@~H?&@T~oo8ES z-W})RV3)S)NTD|x*z_%XG{qk&HI;-!WQjdrG91O{c$jmd@OoQ00~4JrvZnt*AnmW1 z%7@c!Ad;T;`=>H47T9hLKXX+GU1#|(V**|A;~cu4UMd~RDb1-7*#c1DEBZs+D!Lx7 z#zvF#_OVySLcsv{sZHJ(hKhMn^t;3`B0KpR1E{%`S}yOn%KqkDj<5ct$x`MUm%6R7 zC&~{i-~YOk<14^%uO?Hf4-XyRy4dR8PL?e7H(@|LnE+@uz zX{&f(Gd;pOUFxEoFU9@_*)tcE`)fnd<*A!zm{`DGk91(qH%F-P&c3!?13D&#S=-B~ zxYsww^Fh2DY`JnZpl))vw_^X+d!Igc_+<_#{L7kaZ5HP_0Cu(V^gvbVub2mldI=oA zW2nR%FD^>llIe`esn)wxq?VxHT(3TKeW6lky|eIIW8#9D3;G7!n|z>zU#}}Y?}E|9 z1tBBKT{*9Igx{Y!vzg#F)uv~Z>4$a`G`(z1HvFlb!3^37sQ7=z=480vIq0vnE9%!^ z+1Ppi20-05o5w$ea8di885gfd&WGgUUjpYfYU7sd)A52zRm`eWEmiSgp`53H%Kzpm zI^TK9+T?FMMVs{J%XtXb21>~5I^re^b7nrV;zhEdYfwlsksxf?z5T%F*buPRI=y^i zD;uSs*e@d!#n3CihB;2(?t5=Opz{|jm~IF~a=!9j0JykxQOzN5$PCZpKl(!ejimRp zasiZWv?#uD6`)aWHxt2@e|Y|__1XsD)xMvie-DIGx!nhF11Yw3@!_kvR*17m`s54( z;LCXrA;D7j^`wafa&{8a6NY79`OQptK93|a`$JH{yUvhVn~o89{-}!=U4@TLa-LM} Xiw@1#)h Date: Wed, 13 Dec 2017 19:09:00 +0800 Subject: [PATCH 2/3] Codes.Java This is codes in Java of mobile robort lesson . From Wangying,201730310146 --- codes.Java/Fraction.java | 167 ++++++++++++++++++++++++++++++++++++++ codes.Java/Jama-1.0.2.jar | Bin 0 -> 32775 bytes codes.Java/Matrix.java | 150 ++++++++++++++++++++++++++++++++++ codes.Java/p1.java | 17 ++++ codes.Java/p10.java | 53 ++++++++++++ codes.Java/p2.java | 42 ++++++++++ codes.Java/p3.java | 41 ++++++++++ codes.Java/p4.java | 43 ++++++++++ codes.Java/p5.java | 50 ++++++++++++ codes.Java/p6.java | 57 +++++++++++++ codes.Java/p7.java | 35 ++++++++ codes.Java/p8.java | 33 ++++++++ codes.Java/p9.java | 27 ++++++ 13 files changed, 715 insertions(+) create mode 100644 codes.Java/Fraction.java create mode 100644 codes.Java/Jama-1.0.2.jar create mode 100644 codes.Java/Matrix.java create mode 100644 codes.Java/p1.java create mode 100644 codes.Java/p10.java create mode 100644 codes.Java/p2.java create mode 100644 codes.Java/p3.java create mode 100644 codes.Java/p4.java create mode 100644 codes.Java/p5.java create mode 100644 codes.Java/p6.java create mode 100644 codes.Java/p7.java create mode 100644 codes.Java/p8.java create mode 100644 codes.Java/p9.java diff --git a/codes.Java/Fraction.java b/codes.Java/Fraction.java new file mode 100644 index 0000000..f30c6e0 --- /dev/null +++ b/codes.Java/Fraction.java @@ -0,0 +1,167 @@ +package com.utils.wycode; + +public class Fraction { +private Integer numerator; // 分子; +private Integer denominator; // 分母 + +/** +* 构造器 +*/ +public Fraction() { +} + +public Fraction(Integer numerator, Integer denominator) { +this.numerator = numerator; +this.denominator = denominator; +} + +public Integer getDenominator() { +return denominator; +} + +public void setDenominator(Integer denominator) { +this.denominator = denominator; +} + +public Integer getNumerator() { +return numerator; +} + +public void setNumerator(Integer numerator) { +this.numerator = numerator; +} + +/** +* 求最大公约数 +* +* @return +*/ +private int getGCD(int a, int b) { +int max = Math.max(a, b); +int min = Math.min(a, b); +int mod = max % min; +if (mod == 0) { +return min; +} else { +return this.getGCD(mod, min); +} +} + +/** +* 简化和约分 +* +* @return +*/ +public Fraction simplify() { +// 格式化 +if (this.numerator == 0) { +this.denominator = null; +return this; +} else if (this.denominator * this.numerator > 0 +&& this.denominator < 0) { +this.denominator = Math.abs(this.denominator); +this.numerator = Math.abs(this.numerator); +return this; +} else if (this.denominator < 0) { +this.denominator = Math.abs(this.denominator); +this.numerator = -this.numerator; +return this; +} +// 约分 +int gcd = this.getGCD(Math.abs(denominator), Math.abs(numerator)); +if (gcd == 1) { +return this; +} else { +this.denominator = this.denominator / gcd; +this.numerator = this.numerator / gcd; +return this; +} +} + +/** +* 加法 +* +* @param fraction +* @return +*/ +public Fraction add(Fraction fraction) { +Integer resultDenominator = Math.abs(this.denominator) +* Math.abs(fraction.getDenominator()); +Integer resultNumerator = this.numerator * fraction.getDenominator() ++ this.denominator * fraction.getNumerator(); +Fraction result = new Fraction(resultNumerator, resultDenominator); +return result.simplify(); +} + +/** +* 减法 +* +* @param fraction +* @return +*/ +public Fraction minus(Fraction fraction) { +Integer resultDenominator = Math.abs(this.denominator) +* Math.abs(fraction.getDenominator()); +Integer resultNumerator = this.numerator * fraction.getDenominator() +- this.denominator * fraction.getNumerator(); +Fraction result = new Fraction(resultNumerator, resultDenominator); +return result.simplify(); +} + +/** +* 乘法 +* +* @param fraction +* @return +*/ +public Fraction multiply(Fraction fraction) { +Fraction result = null; +if (this.numerator == 0 || fraction.numerator == 0) { +result = new Fraction(0, null); +} +Integer resultDenominator = this.denominator +* fraction.getDenominator(); +Integer resultNumerator = this.numerator * fraction.getNumerator(); +result = new Fraction(resultNumerator, resultDenominator); +return result.simplify(); +} + +/** +*除法 +* +* @param fraction +* @return +*/ +public Fraction divide(Fraction fraction) { +Fraction result = null; +if (this.numerator == 0) { +result = new Fraction(0, null); +} +Integer resultDenominator = this.denominator * fraction.getNumerator(); +Integer resultNumerator = this.numerator * fraction.getDenominator(); +result = new Fraction(resultNumerator, resultDenominator); +return result.simplify(); +} + +@Override +public String toString() { +return this.numerator + "/" + this.denominator; +} + +/** +* 测试 +* +* @param args +*/ +public static void main(String[] args) { +Fraction f1 = new Fraction(1, 2); +Fraction f2 = new Fraction(2, 4); +System.out.println(f1); +System.out.println(f2); +System.out.println(f2.simplify()); +System.out.println(f1.add(f2)); +System.out.println(f1.minus(f2)); +System.out.println(f1.multiply(f2)); +System.out.println(f1.divide(f2)); +} +} diff --git a/codes.Java/Jama-1.0.2.jar b/codes.Java/Jama-1.0.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..824d13338e499092e1a45a8fa39d30ea1304cf8c GIT binary patch literal 32775 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 move(List p,double u){ + int n=p.size(); + List q=new ArrayList<>(); + for(int i=0;i p= new ArrayList<>(); + p.add(new Fraction(1,9)); + p.add(new Fraction(1,3)); + p.add(new Fraction(1,3)); + p.add(new Fraction(1,9)); + p.add(new Fraction(1,9)); + + + List q=move(p, 1); + for(Fraction a:p) { + System.out.print(a+" "); + } + System.out.println(); + for(Fraction a:q) { + System.out.print(a+" "); + } + + } +} diff --git a/codes.Java/p3.java b/codes.Java/p3.java new file mode 100644 index 0000000..7d9c5ad --- /dev/null +++ b/codes.Java/p3.java @@ -0,0 +1,41 @@ +package com.mat2java.wycode; + +import java.util.ArrayList; +import java.util.List; + +public class p3 { + public static Double compMean(List x) { + Double s=new Double(0); + for(Double t:x) { + s=Double.sum(s, t); + } + return s/x.size(); + } + + public static Double compVariance(List< Double> x) { + Double mu=compMean(x); + List x2=new ArrayList<>(); + //Double[] x2=new Double[x.size()]; + + for(int i=0;i x=new ArrayList<>(); + + x.add(new Double(7)); + x.add(new Double(38)); + x.add(new Double(4)); + x.add(new Double(23)); + x.add(new Double(18)); + + System.out.printf("The Expectation / Mean: \t %.1f \n",compMean(x)); + System.out.printf("The Variance is:\t\t %.1f \n",compVariance(x)); + System.out.printf("The Standard Deviation is:\t %.1f \n",Math.sqrt(compVariance(x))); + + } +} diff --git a/codes.Java/p4.java b/codes.Java/p4.java new file mode 100644 index 0000000..a107b93 --- /dev/null +++ b/codes.Java/p4.java @@ -0,0 +1,43 @@ +package com.mat2java.wycode; + +import java.util.ArrayList; +import java.util.List; + +public class p4 { + public static Double compMean(List x) { + Double s=new Double(0); + for(Double t:x) { + s=Double.sum(s, t); + } + return s/x.size(); + } + + + + public static void main(String[] args) { + double a=2; + double b=4; + + List x=new ArrayList<>(); + + x.add(new Double(7)); + x.add(new Double(38)); + x.add(new Double(4)); + x.add(new Double(23)); + x.add(new Double(18)); + + List y=new ArrayList<>(); + for(int i=0;i x) { + Double s=new Double(0); + for(Double t:x) { + s=Double.sum(s, t); + } + return s/x.size(); + } + + public static Double compVariance(List< Double> x) { + Double mu=compMean(x); + List x2=new ArrayList<>(); + //Double[] x2=new Double[x.size()]; + + for(int i=0;i x=new ArrayList<>(); + + x.add(new Double(7)); + x.add(new Double(38)); + x.add(new Double(4)); + x.add(new Double(23)); + x.add(new Double(18)); + + List x2=new ArrayList<>(); + + for(int i=0;i Date: Wed, 13 Dec 2017 19:19:26 +0800 Subject: [PATCH 3/3] delete something delete something wrong --- Codes.python/p34/compound.py | 25 ------------ Codes.python/p34/p34.py | 72 ----------------------------------- Codes.python/p34/tim.mat | Bin 2672 -> 0 bytes 3 files changed, 97 deletions(-) delete mode 100644 Codes.python/p34/compound.py delete mode 100644 Codes.python/p34/p34.py delete mode 100644 Codes.python/p34/tim.mat diff --git a/Codes.python/p34/compound.py b/Codes.python/p34/compound.py deleted file mode 100644 index 1d383e2..0000000 --- a/Codes.python/p34/compound.py +++ /dev/null @@ -1,25 +0,0 @@ -import numpy as np -from math import* -def compound(Xwa,Xab): - Xwb = np.array(np.zeros([3,3])) - rot = np.array([[cos(Xwa[2,0]),-sin(Xwa[2,0] )], - [sin(Xwa[2,0]), cos(Xwa[2,0])]]) - Xwb[0:2] = rot.dot(np.array([Xab[0],Xab[1]])) + np.tile([Xwa[0:2]],(1, len(Xab[0]))) - row = np.shape(Xab) - if row[0] == 3: - Xwb[2] = piTopi(Xwa[2] + Xab[2]) - return Xwb - -def piTopi(angle): - twopi = 2*pi - angle = angle - twopi * int(angle/twopi) - i1 = np.where(angle >= pi) - angle[i1] = angle[i1] - twopi - - i2 = np.where(angle < -pi) - angle[i2] = angle[i2] + twopi - return angle - -# a =np.array([[5],[3],[5*pi/18]]) -# b =np.array([[4],[2],[pi/9]]) -# print compound(a,b) \ No newline at end of file diff --git a/Codes.python/p34/p34.py b/Codes.python/p34/p34.py deleted file mode 100644 index 5c086ed..0000000 --- a/Codes.python/p34/p34.py +++ /dev/null @@ -1,72 +0,0 @@ -import compound -from math import * -from numpy import * -import scipy.io as sio -import matplotlib.pyplot as plt - -def compSteer(x,wp,iwp,G,dt): - maxG = 30*pi/180 - rateG = 20*pi/180 - minD = 0.5 - cwp = wp[:,iwp-1] - d2 = (cwp[0]-x[0])**2 + (cwp[1]-x[1])**2 - if d2 < minD**2: - iwp = iwp + 1 - if iwp > len(wp[0]): - iwp = 0 - cwp = wp[:,iwp-1] - - deltaG = compound.piTopi(atan2(cwp[1]-x[1],cwp[0]-x[0])-x[2]-G) - maxDelta = rateG * dt - - if abs(deltaG) > maxDelta: - deltaG = sign(deltaG)*maxDelta - - G = G + deltaG - if abs(G) > maxG: - G = sign(G)*maxG - - return G,iwp - -if __name__=="__main__": - #load tim.mat for getting wp - load_fn = 'tim.mat' - load_data = sio.loadmat(load_fn) - wp = load_data['wp'] - - steering = 0 # initial steering - velocity = 4.0 # the velocity of the vehicle - wheelbase = 8 # the length of wheelbase - dt = 0.05 # time interval - iWp = 1 # index to first waypoint - iPos = 0 - rob = array([[0,-8,-8],[0,-4,4]]) - rob_plot_array = array([[0,-wheelbase,-wheelbase,0],[0,-4,4,0]]) - - #Initialize figure - plt.figure() - plt.xlabel('X(m)') - plt.ylabel('Y(m)') - axes = plt.axes(xlim=(-110,100),ylim=(-110,100)) - axes.plot(wp[0],wp[1],'*g--' ,markersize = 10 ,linewidth = 2) - axes.plot(wp[0],wp[1],'c:',linewidth = 2) - robplot ,= axes.plot(rob_plot_array[0],rob_plot_array[1],'b') - pos = zeros([3, 1]) - path = zeros([3,3390]) - - while iWp!= 0: - steering, iWp = compSteer(pos, wp, iWp, steering, dt) - pos[0] = pos[0] + velocity * dt * cos(steering + pos[2, :]) - pos[1] = pos[1] + velocity * dt * sin(steering + pos[2, :]) - pos[2] = pos[2] + velocity * dt * sin(steering) / wheelbase - pos[2] = compound.piTopi(pos[2]) - robPos = compound.compound(pos, rob) - path[:, iPos + 1] = pos[:, 0] - iPos += 1 - axes.plot(path[0, 0:iPos], path[1, 0:iPos], 'r-',linewidth = 2) - axes.plot(robPos[0,0],robPos[1,0]) - b = robPos[0:2, 0:1] - a = robPos[0:2] - c = hstack((a, b)) - robplot.set_data(c[0], c[1]) - plt.pause(0.00001) diff --git a/Codes.python/p34/tim.mat b/Codes.python/p34/tim.mat deleted file mode 100644 index e406a8f393510cd5a4bc202c99a836e9e913cabd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2672 zcmb7GX;f2L5)QW5fXXf)2u5XY54q@bvN*C&xOn|xI$lPJ=a6pA{zPL?}n z@3}f{@JB$=gOub849qk&iPT61u-5B6ShpK6;FNWKVXHgnzU~+l8VN95Q}$u%9U%~V zRWhE&@v*_^$fcz#g;26fC#n7(6FW$hs459Wlc;)DT0lHHU9qYr0L)t{-m8Z^pgD_- zr%gb0_c7WJd$Lm zbMiP7bL6VD$ zkoL6qmlissfqvo~FLeSkmd2RqJz?Rdo!zkVa4rmnX8n8cs;hIeySKXc2_#{aze1$G1My0 z-T~@|EONydh3?x+xF;{Tfn85P!KX0>meqEb|GQlm7CC&*=&|EMbf&;UljIw@o526Eu~HyE#=}4vz&KcToKfUTDDDB^~Z|J#WDj7hOQ5$ z`KOuy2cjYZL}o&ujfjpvad*HaN9c!_5AuOhaQ4NmI4#UFF^;&kl>^Y~lzZdMYQsF@P zJ)ea`YJ^f>*uOTU#+eUkKaYGkBlQJ^e)oz$+^6zE)7#NarO+RyEK!T@GZ4XmONUnP zVX}YcX0{~$%?I0CcOU(>M+BTbb?dU?LSXkLNBiufWIev?itiP86C;x|52OVHQTj@@ zqm&18vzGKG9B0B)O$*t*<%Ckt$SPcBzCr{wqowMFX713`l9GahJkTx+FY3Qd2ZM=G zNvcc;MuJ*;%Q`FIyt(D8lgmLz0!i7WJiA9?FES&X&?c$V*AfR6~OP}Y*QQGNI`jdkL7GrDr z0k!)&exShnn6AG0vtSXVtUt6qx}J@Se$H*0a4xY5LYmHx6V>Z!kaD}K->sI3l+uer zf%P2NAIs8mDP;jib$g@T&m!e{tIjuSd0arCS3_n_M}Hs`yrE9>z8!{&9y`5iAObt`+#T{J*@AVC4Lx#&5R)&@ek;2*2hZ0Yb(m);L`8p$nC^^rJrTa< zB>c-biGiHV=lS8IVK^(T?bV?xq57kHEyW4j9e9YAGG=A|W7=tz>Eeg{nFs@~H?&@T~oo8ES z-W})RV3)S)NTD|x*z_%XG{qk&HI;-!WQjdrG91O{c$jmd@OoQ00~4JrvZnt*AnmW1 z%7@c!Ad;T;`=>H47T9hLKXX+GU1#|(V**|A;~cu4UMd~RDb1-7*#c1DEBZs+D!Lx7 z#zvF#_OVySLcsv{sZHJ(hKhMn^t;3`B0KpR1E{%`S}yOn%KqkDj<5ct$x`MUm%6R7 zC&~{i-~YOk<14^%uO?Hf4-XyRy4dR8PL?e7H(@|LnE+@uz zX{&f(Gd;pOUFxEoFU9@_*)tcE`)fnd<*A!zm{`DGk91(qH%F-P&c3!?13D&#S=-B~ zxYsww^Fh2DY`JnZpl))vw_^X+d!Igc_+<_#{L7kaZ5HP_0Cu(V^gvbVub2mldI=oA zW2nR%FD^>llIe`esn)wxq?VxHT(3TKeW6lky|eIIW8#9D3;G7!n|z>zU#}}Y?}E|9 z1tBBKT{*9Igx{Y!vzg#F)uv~Z>4$a`G`(z1HvFlb!3^37sQ7=z=480vIq0vnE9%!^ z+1Ppi20-05o5w$ea8di885gfd&WGgUUjpYfYU7sd)A52zRm`eWEmiSgp`53H%Kzpm zI^TK9+T?FMMVs{J%XtXb21>~5I^re^b7nrV;zhEdYfwlsksxf?z5T%F*buPRI=y^i zD;uSs*e@d!#n3CihB;2(?t5=Opz{|jm~IF~a=!9j0JykxQOzN5$PCZpKl(!ejimRp zasiZWv?#uD6`)aWHxt2@e|Y|__1XsD)xMvie-DIGx!nhF11Yw3@!_kvR*17m`s54( z;LCXrA;D7j^`wafa&{8a6NY79`OQptK93|a`$JH{yUvhVn~o89{-}!=U4@TLa-LM} Xiw@1#)h