! diff --git a/project/target/config-classes/$c4c02c4c8e274a076c1d.cache b/project/target/config-classes/$c4c02c4c8e274a076c1d.cache deleted file mode 100644 index 050f36c6..00000000 --- a/project/target/config-classes/$c4c02c4c8e274a076c1d.cache +++ /dev/null @@ -1 +0,0 @@ -sbt.internal.DslEntry \ No newline at end of file diff --git a/project/target/config-classes/$c4c02c4c8e274a076c1d.class b/project/target/config-classes/$c4c02c4c8e274a076c1d.class deleted file mode 100644 index 54b2af5046c5673981740a1f6caba2cf82a13dba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 600 zcmZuv%Wm306uo0JF~*qi3MqL>q*UpPI=H3;(pEBMkSAoO|Y;Ig4}W*PkCh0l vyRMj>N*E2E%xfg^YT6$5$5} Nb+|HA3 zBlJqe&(F$DMO?^rhPs062^OKfx&D-A4%#=El~j$Kc*ZXYlpj7CVy$^W%$EW4H7oLa zLA+dJB&9pUu1cVw!)R=s4|`Pt_l9@NPSc=5Mus$Ora^{O3acD}L^qsq0;y@ZTDttq z^O2M%t049k{DT*Hj?c{?2xAs|VSw{U{+|@oL4X8)1OS45=!jTARzSR6(l^L{hy2%n ZM1&%u02H if(x(i)>=0) q_ff(x(i)) else !q_ff(x(i).abs)).reduce(_&_) - val pat2 = (0 until y.size).map(i=> if(y(i)>=0) m_ff(y(i)) else !m_ff(y(i).abs)).reduce(_&_) - pat1 & pat2 + val pat_a = (0 until x.size).map(i=> if(x(i)>=0) q_ff(x(i)) else !q_ff(x(i).abs)).reduce(_&_) + val pat_b = (0 until y.size).map(i=> if(y(i)>=0) m_ff(y(i)) else !m_ff(y(i).abs)).reduce(_&_) + pat_a & pat_b } val smallnum = Cat( @@ -87,7 +165,7 @@ class exu_div_ctl extends Module with RequireAsyncReset with lib { short_dividend := Cat (sign_ff & q_ff(31),q_ff(31,0)) - val a_cls = Cat( + val a_cls = Cat(0.U(2.W), Mux1H(Seq ( !short_dividend(32).asBool -> (short_dividend(31,24) =/= Fill(8,0.U)), short_dividend(32).asBool -> (short_dividend(31,23) =/= Fill(9,1.U)) @@ -101,7 +179,7 @@ class exu_div_ctl extends Module with RequireAsyncReset with lib { short_dividend(32).asBool -> (short_dividend(14,7) =/= Fill(8,1.U)) )) ) - val b_cls = Cat( + val b_cls = Cat(0.U(2.W), Mux1H(Seq ( !m_ff(32).asBool -> (m_ff(31,24) =/= Fill(8,0.U)), m_ff(32).asBool -> (m_ff(31,24) =/= Fill(8,1.U)) @@ -137,43 +215,37 @@ class exu_div_ctl extends Module with RequireAsyncReset with lib { ) val shortq_enable = valid_ff_x & (m_ff(31,0) =/= 0.U(32.W)) & (shortq_raw =/= 0.U(4.W)) - val shortq_shift = Fill(4,shortq_enable) & shortq_raw - - val shortq_shift_ff = Mux1H(Seq ( + val shortq_shift = Cat(0.U(2.W),Fill(4,shortq_enable) & shortq_raw) + val shortq_shift_ff = Cat(0.U(1.W),Mux1H(Seq ( shortq_shift_xx(3).asBool -> "b11111".U, shortq_shift_xx(2).asBool -> "b11000".U, shortq_shift_xx(1).asBool -> "b10000".U, shortq_shift_xx(0).asBool -> "b01000".U - )) + ))) // *** End Short *** }} val finish = smallnum_case | Mux(!rem_ff ,count === 32.U(6.W) ,count === 33.U(6.W)) - val div_clken = io.dec_div.div_p.valid | run_state | finish | finish_ff - val run_in = (io.dec_div.div_p.valid | run_state) & !finish & !io.dec_div.dec_div_cancel - count_in := Fill(6,(run_state & !finish & !io.dec_div.dec_div_cancel & !shortq_enable)) & (count + Cat(0.U,shortq_shift_ff) + (1.U)(6.W)) - //io.test := count_in - - io.exu_div_wren := finish_ff & !io.dec_div.dec_div_cancel - val sign_eff = !io.dec_div.div_p.bits.unsign & (io.divisor =/= 0.U(32.W)) - + val div_clken = io.valid_in | run_state | finish | finish_ff + val run_in = (io.valid_in | run_state) & !finish & !io.cancel + count_in := Fill(6,(run_state & !finish & !io.cancel & !shortq_enable)) & (count + Cat(0.U,shortq_shift_ff(4,0)) + (1.U)(6.W)) + io.valid_out := finish_ff & !io.cancel + val sign_eff = io.signed_in & (io.divisor_in =/= 0.U(32.W)) q_in := Mux1H(Seq( - (!run_state).asBool -> Cat(0.U(1.W),io.dividend) , - (run_state & (valid_ff_x | shortq_enable_ff)).asBool -> (Cat(dividend_eff(31,0),!a_in(32)) << shortq_shift_ff) , + (!run_state).asBool -> Cat(0.U(1.W),io.dividend_in) , + (run_state & (valid_ff_x | shortq_enable_ff)).asBool -> (Cat(dividend_eff(31,0),!a_in(32)) << shortq_shift_ff(4,0)) , (run_state & !(valid_ff_x | shortq_enable_ff)).asBool -> Cat(q_ff(31,0),!a_in(32)) )) - val qff_enable = io.dec_div.div_p.valid | (run_state & !shortq_enable) + val qff_enable = io.valid_in | (run_state & !shortq_enable) dividend_eff := Mux((sign_ff & dividend_neg_ff).asBool, rvtwoscomp(q_ff(31,0)),q_ff(31,0)) - - m_eff := Mux(add.asBool , m_ff, ~m_ff ) - a_eff_shift := Cat(0.U(24.W), dividend_eff) << shortq_shift_ff + a_eff_shift := Cat(0.U(33.W), dividend_eff) << shortq_shift_ff(4,0) a_eff := Mux1H(Seq( rem_correct.asBool -> a_ff , (!rem_correct & !shortq_enable_ff).asBool -> Cat(a_ff(31,0), q_ff(32)) , - (!rem_correct & shortq_enable_ff).asBool -> Cat(0.U(9.W),a_eff_shift(55,32)) + (!rem_correct & shortq_enable_ff).asBool -> a_eff_shift(64,32) )) - val aff_enable = io.dec_div.div_p.valid | (run_state & !shortq_enable & (count =/= 33.U(6.W))) | rem_correct + val aff_enable = io.valid_in | (run_state & !shortq_enable & (count =/= 33.U(6.W))) | rem_correct a_shift := Fill(33,run_state) & a_eff a_in := Fill(33,run_state) & (a_shift + m_eff + Cat(0.U(32.W),!add)) val m_already_comp = divisor_neg_ff & sign_ff @@ -183,29 +255,406 @@ class exu_div_ctl extends Module with RequireAsyncReset with lib { val q_ff_eff = Mux((sign_ff & (dividend_neg_ff ^ divisor_neg_ff)).asBool,rvtwoscomp(q_ff(31,0)), q_ff(31,0)) val a_ff_eff = Mux((sign_ff & dividend_neg_ff ).asBool, rvtwoscomp(a_ff(31,0)), a_ff(31,0)) - io.exu_div_result := Mux1H(Seq( + io.data_out := Mux1H(Seq( smallnum_case_ff.asBool -> Cat(0.U(28.W), smallnum_ff), rem_ff.asBool -> a_ff_eff , (!smallnum_case_ff & !rem_ff).asBool -> q_ff_eff )) + valid_ff_x := rvdffe(io.valid_in & !io.cancel, div_clken,clock,io.scan_mode) + finish_ff := rvdffe(finish & !io.cancel, div_clken,clock,io.scan_mode) + run_state := rvdffe(run_in,div_clken,clock,io.scan_mode) + count := rvdffe(count_in, div_clken,clock,io.scan_mode) + dividend_neg_ff := rvdffe((io.valid_in & io.dividend_in(31)) | (!io.valid_in & dividend_neg_ff), div_clken,clock,io.scan_mode) + divisor_neg_ff := rvdffe((io.valid_in & io.divisor_in(31)) | (!io.valid_in & divisor_neg_ff), div_clken,clock,io.scan_mode) + sign_ff := rvdffe((io.valid_in & sign_eff) | (!io.valid_in & sign_ff), div_clken,clock,io.scan_mode) + rem_ff := rvdffe((io.valid_in & io.rem_in) | (!io.valid_in & rem_ff), div_clken,clock,io.scan_mode) + smallnum_case_ff := rvdffe(smallnum_case, div_clken,clock,io.scan_mode) + smallnum_ff := rvdffe(smallnum, div_clken,clock,io.scan_mode) + shortq_enable_ff := rvdffe(shortq_enable, div_clken,clock,io.scan_mode) + shortq_shift_xx := rvdffe(shortq_shift, div_clken,clock,io.scan_mode) - val exu_div_cgc = rvclkhdr(clock,div_clken.asBool,io.scan_mode) + q_ff := rvdffe(q_in, qff_enable,clock,io.scan_mode) + a_ff := rvdffe(a_in, aff_enable,clock,io.scan_mode) + m_ff := rvdffe(Cat(io.signed_in & io.divisor_in(31), io.divisor_in(31,0)), io.valid_in,clock,io.scan_mode) - withClock(exu_div_cgc) { - valid_ff_x := RegNext(io.dec_div.div_p.valid & !io.dec_div.dec_div_cancel, 0.U) - finish_ff := RegNext(finish & !io.dec_div.dec_div_cancel, 0.U) - run_state := RegNext(run_in, 0.U) - count := RegNext(count_in, 0.U) - dividend_neg_ff := RegEnable(io.dividend(31), 0.U, io.dec_div.div_p.valid.asBool) - divisor_neg_ff := RegEnable(io.divisor(31), 0.U, io.dec_div.div_p.valid.asBool) - sign_ff := RegEnable(sign_eff, 0.U, io.dec_div.div_p.valid.asBool) - rem_ff := RegEnable(io.dec_div.div_p.bits.rem, 0.U, io.dec_div.div_p.valid.asBool) - smallnum_case_ff := RegNext(smallnum_case, 0.U) - smallnum_ff := RegNext(smallnum, 0.U) - shortq_enable_ff := RegNext(shortq_enable, 0.U) - shortq_shift_xx := RegNext(shortq_shift, 0.U) + + +} +/////////////////////////////////////////////// 1 BIT FULL DIVIDER////////////////////////////////// +class exu_div_new_1bit_fullshortq extends Module with RequireAsyncReset with lib { + val io = IO(new Bundle{ + val scan_mode = Input(Bool()) + val cancel = Input(Bool()) + val valid_in = Input(Bool()) + val signed_in = Input(Bool()) + val rem_in = Input(Bool()) + val dividend_in = Input(UInt(32.W)) + val divisor_in = Input(UInt(32.W)) + val data_out = Output(UInt(32.W)) + val valid_out = Output(UInt(1.W)) + }) + val valid_ff = WireInit(Bool(),init=false.B) + val finish_ff = WireInit(Bool(),init=false.B) + val control_ff = WireInit(0.U(3.W)) + val count_ff = WireInit(0.U(7.W)) + val smallnum = WireInit(0.U(4.W)) + val a_ff = WireInit(0.U(32.W)) + val b_ff = WireInit(0.U(33.W)) + val q_ff = WireInit(0.U(32.W)) + val r_ff = WireInit(0.U(32.W)) + val quotient_set = WireInit(Bool(),init=false.B) + val shortq_enable = WireInit(Bool(),init=false.B) + val shortq_enable_ff = WireInit(Bool(),init=false.B) + val by_zero_case_ff = WireInit(Bool(),init=false.B) + val adder_out = WireInit(0.U(33.W)) + val ar_shifted = WireInit(0.U(64.W)) + val shortq_shift_ff = WireInit(0.U(5.W)) + val dividend_sign_ff = control_ff(2) + val divisor_sign_ff = control_ff(1) + val rem_ff = control_ff(0) + val by_zero_case = valid_ff & (b_ff(31,0) === 0.U) + val smallnum_case = ((a_ff(31,4) === 0.U) & (b_ff(31,4) === 0.U) & !by_zero_case & !rem_ff & valid_ff & !io.cancel) | + ((a_ff(31,0) === 0.U) & !by_zero_case & !rem_ff & valid_ff & !io.cancel) + val valid_ff_in = io.valid_in & !io.cancel + val control_in = Cat((!io.valid_in & control_ff(2)) | (io.valid_in & io.signed_in & io.dividend_in(31)), (!io.valid_in & control_ff(1)) | (io.valid_in & io.signed_in & io.divisor_in(31)), (!io.valid_in & control_ff(0)) | (io.valid_in & io.rem_in)) + val running_state = count_ff.orR() | shortq_enable_ff + val misc_enable = io.valid_in | valid_ff | io.cancel | running_state | finish_ff + val finish_raw = smallnum_case | by_zero_case | (count_ff === 32.U) + val finish = finish_raw & !io.cancel + val count_enable = (valid_ff | running_state) & !finish & !finish_ff & !io.cancel & !shortq_enable + val count_in = Fill(7,count_enable) & (count_ff + Cat(0.U(6.W),1.U) + Cat(0.U(2.W),shortq_shift_ff)) + val a_enable = io.valid_in | running_state + val a_shift = running_state & !shortq_enable_ff + ar_shifted := Cat (Fill(32,dividend_sign_ff),a_ff) << shortq_shift_ff + val b_twos_comp = valid_ff & !(dividend_sign_ff ^ divisor_sign_ff) + val twos_comp_b_sel = valid_ff & !(dividend_sign_ff ^ divisor_sign_ff) + val twos_comp_q_sel = !valid_ff & !rem_ff & (dividend_sign_ff ^ divisor_sign_ff) & !by_zero_case_ff + val b_enable = io.valid_in | b_twos_comp + val rq_enable = io.valid_in | valid_ff | running_state + val r_sign_sel = valid_ff & dividend_sign_ff & !by_zero_case + val r_restore_sel = running_state & !quotient_set & !shortq_enable_ff + val r_adder_sel = running_state & quotient_set & !shortq_enable_ff + val twos_comp_in = Mux1H(Seq ( + twos_comp_q_sel -> q_ff, + twos_comp_b_sel -> b_ff(31,0) + )) + val twos_comp_out = rvtwoscomp(twos_comp_in) + + val a_in = Mux1H(Seq ( + (!a_shift & !shortq_enable_ff).asBool -> io.dividend_in, + a_shift -> Cat(a_ff(30,0),0.U), + shortq_enable_ff -> ar_shifted(31,0) + )) + val b_in = Mux1H(Seq ( + !b_twos_comp -> Cat(io.signed_in & io.divisor_in(31),io.divisor_in(31,0)), + b_twos_comp -> Cat(!divisor_sign_ff,twos_comp_out(31,0)) + )) + val r_in = Mux1H (Seq( + r_sign_sel -> "hffffffff".U(32.W), + r_restore_sel -> Cat(r_ff(30,0),a_ff(31)), + r_adder_sel -> adder_out(31,0), + shortq_enable_ff -> ar_shifted(63,32), + by_zero_case -> a_ff + )) + val q_in = Mux1H (Seq( + !valid_ff -> Cat(q_ff(30,0),quotient_set), + smallnum_case -> Cat(0.U(28.W),smallnum), + by_zero_case -> Fill(32,1.U) +)) + adder_out := Cat(r_ff,a_ff(31)) + b_ff + quotient_set := (!adder_out(32) ^ dividend_sign_ff) | ((a_ff(30,0) === 0.U) & (adder_out === 0.U)) + io.valid_out := finish_ff & !io.cancel + io.data_out := Mux1H(Seq( + (!rem_ff & !twos_comp_q_sel).asBool() -> q_ff, + rem_ff -> r_ff, + twos_comp_q_sel -> twos_comp_out + )) + def pat1(x : List[Int], y : List[Int]) = { + val pat_a = (0 until x.size).map(i=> if(x(i)>=0) a_ff(x(i)) else !a_ff(x(i).abs)).reduce(_&_) + val pat_b = (0 until y.size).map(i=> if(y(i)>=0) b_ff(y(i)) else !b_ff(y(i).abs)).reduce(_&_) + pat_a & pat_b } - q_ff := rvdffe(q_in, qff_enable.asBool,clock,io.scan_mode) - a_ff := rvdffe(a_in, aff_enable.asBool,clock,io.scan_mode) - m_ff := rvdffe(Cat(!io.dec_div.div_p.bits.unsign & io.divisor(31), io.divisor), io.dec_div.div_p.valid.asBool,clock,io.scan_mode) + + smallnum := Cat( + pat1(List(3),List(-3, -2, -1)), + + pat1(List(3),List(-3, -2))& !b_ff(0) | pat1(List(2),List(-3, -2, -1)) | pat1(List(3, 2),List(-3, -2)), + + pat1(List(2),List(-3, -2))& !b_ff(0) | pat1(List(1),List(-3, -2, -1)) | pat1(List(3),List(-3, -1))& !b_ff(0) | + pat1(List(3, -2),List(-3, -2, 1, 0)) | pat1(List(-3, 2, 1),List(-3, -2)) | pat1(List(3, 2),List(-3))& !b_ff(0) | + pat1(List(3, 2),List(-3, 2, -1)) | pat1(List(3, 1),List(-3,-1)) | pat1(List(3, 2, 1),List(-3, 2)), + + pat1(List(2, 1, 0),List(-3, -1)) | pat1(List(3, -2, 0),List(-3, 1, 0)) | pat1(List(2),List(-3, -1))& !b_ff(0) | + pat1(List(1),List(-3, -2))& !b_ff(0) | pat1(List(0),List(-3, -2, -1)) | pat1(List(-3, 2, -1),List(-3, -2, 1, 0)) | + pat1(List(-3, 2, 1),List(-3))& !b_ff(0) | pat1(List(3),List(-2, -1)) & !b_ff(0) | pat1(List(3, -2),List(-3, 2, 1)) | + pat1(List(-3, 2, 1),List(-3, 2, -1)) | pat1(List(-3, 2, 0),List(-3, -1)) | pat1(List(3, -2, -1),List(-3, 2, 0)) | + pat1(List(-2, 1, 0),List(-3, -2)) | pat1(List(3, 2),List(-1)) & !b_ff(0) | pat1(List(-3, 2, 1, 0),List(-3, 2)) | + pat1(List(3, 2),List(3, -2)) | pat1(List(3, 1),List(3,-2,-1)) | pat1(List(3, 0),List(-2, -1)) | + pat1(List(3, -1),List(-3, 2, 1, 0)) | pat1(List(3, 2, 1),List(3)) & !b_ff(0) | pat1(List(3, 2, 1),List(3, -1)) | + pat1(List(3, 2, 0),List(3, -1)) | pat1(List(3, -2, 1),List(-3, 1)) | pat1(List(3, 1, 0),List(-2)) | + pat1(List(3, 2, 1, 0),List(3)) |pat1(List(3, 1),List(-2)) & !b_ff(0)) + +val shortq_dividend = Cat(dividend_sign_ff,a_ff) + val a_enc = Module(new exu_div_cls) + a_enc.io.operand := shortq_dividend + val dw_a_enc1 = a_enc.io.cls + val b_enc = Module(new exu_div_cls) + b_enc.io.operand := b_ff + val dw_b_enc1 = b_enc.io.cls + val dw_a_enc = Cat (0.U, dw_a_enc1) + val dw_b_enc = Cat (0.U, dw_b_enc1) + val dw_shortq_raw = Cat(0.U,dw_b_enc) - Cat(0.U,dw_a_enc) + 1.U(7.W) + val shortq = Mux(dw_shortq_raw(6).asBool(),0.U,dw_shortq_raw(5,0)) + shortq_enable := valid_ff & !shortq(5) & !(shortq(4,1) === "b1111".U) & !io.cancel + val shortq_shift = Mux(!shortq_enable,0.U,("b11111".U - shortq(4,0))) + valid_ff := rvdffe(valid_ff_in, misc_enable,clock,io.scan_mode) + control_ff := rvdffe(control_in, misc_enable,clock,io.scan_mode) + by_zero_case_ff := rvdffe(by_zero_case,misc_enable,clock,io.scan_mode) + shortq_enable_ff := rvdffe(shortq_enable, misc_enable,clock,io.scan_mode) + shortq_shift_ff := rvdffe(shortq_shift, misc_enable,clock,io.scan_mode) + finish_ff := rvdffe(finish, misc_enable,clock,io.scan_mode) + count_ff := rvdffe(count_in, misc_enable,clock,io.scan_mode) + + a_ff := rvdffe(a_in, a_enable,clock,io.scan_mode) + b_ff := rvdffe(b_in, b_enable,clock,io.scan_mode) + r_ff := rvdffe(r_in, rq_enable,clock,io.scan_mode) + q_ff := rvdffe(q_in, rq_enable,clock,io.scan_mode) +} +class exu_div_new_2bit_fullshortq extends Module with RequireAsyncReset with lib { + val io = IO(new Bundle{ + val scan_mode = Input(Bool()) + val cancel = Input(Bool()) + val valid_in = Input(Bool()) + val signed_in = Input(Bool()) + val rem_in = Input(Bool()) + val dividend_in = Input(UInt(32.W)) + val divisor_in = Input(UInt(32.W)) + val data_out = Output(UInt(32.W)) + val valid_out = Output(UInt(1.W)) + }) +// val valid_ff_in = WireInit(Bool(),init=false.B) + val valid_ff = WireInit(Bool(),init=false.B) +// val finish_raw = WireInit(Bool(),init=false.B) + // val finish = WireInit(Bool(),init=false.B) + val finish_ff = WireInit(Bool(),init=false.B) + // val running_state = WireInit(Bool(),init=false.B) + // val misc_enable = WireInit(Bool(),init=false.B) + // val control_in = WireInit(0.U(3.W)) + val control_ff = WireInit(0.U(3.W)) + // val dividend_sign_ff = WireInit(Bool(),init=false.B) +// val divisor_sign_ff = WireInit(Bool(),init=false.B) +// val count_enable = WireInit(Bool(),init=false.B) +// val count_in = WireInit(0.U(7.W)) + val count_ff = WireInit(0.U(7.W)) + val smallnum = WireInit(0.U(4.W)) + val smallnum_case = WireInit(Bool(),init=false.B) + // val a_enable = WireInit(Bool(),init=false.B) + // val a_shift = WireInit(Bool(),init=false.B) + // val b_enable = WireInit(Bool(),init=false.B) + // val b_twos_comp = WireInit(Bool(),init=false.B) + // val a_in = WireInit(0.U(32.W)) + val a_ff = WireInit(0.U(32.W)) +// val b_in = WireInit(0.U(33.W)) + val b_ff1 = WireInit(0.U(33.W)) + val b_ff = WireInit(0.U(35.W)) +// val q_in = WireInit(0.U(32.W)) + val q_ff = WireInit(0.U(32.W)) + // val r_in = WireInit(0.U(32.W)) + val r_ff = WireInit(0.U(32.W)) +// val rq_enable = WireInit(Bool(),init=false.B) + // val r_sign_sel = WireInit(Bool(),init=false.B) + // val r_restore_sel = WireInit(Bool(),init=false.B) +// val r_adder1_sel = WireInit(Bool(),init=false.B) +// val r_adder2_sel = WireInit(Bool(),init=false.B) + // val r_adder3_sel = WireInit(Bool(),init=false.B) +// val twos_comp_q_sel = WireInit(Bool(),init=false.B) +// val twos_comp_b_sel = WireInit(Bool(),init=false.B) + val quotient_raw = WireInit(0.U(3.W)) + val quotient_new = WireInit(0.U(2.W)) + val shortq_enable = WireInit(Bool(),init=false.B) + val shortq_enable_ff = WireInit(Bool(),init=false.B) +// val by_zero_case = WireInit(Bool(),init=false.B) + val by_zero_case_ff = WireInit(Bool(),init=false.B) + // val twos_comp_in = WireInit(0.U(32.W)) +// val twos_comp_out = WireInit(0.U(32.W)) + // val adder1_out = WireInit(0.U(33.W)) + // val adder2_out = WireInit(0.U(34.W)) +// val adder3_out = WireInit(0.U(35.W)) + val ar_shifted = WireInit(0.U(64.W)) + // val shortq = WireInit(0.U(6.W)) +// val shortq_shift = WireInit(0.U(5.W)) + val shortq_shift_ff = WireInit(0.U(4.W)) + // val shortq_dividend = WireInit(0.U(33.W)) + val valid_ff_in = io.valid_in & !io.cancel + val control_in = Cat((!io.valid_in & control_ff(2)) | (io.valid_in & io.signed_in & io.dividend_in(31)), (!io.valid_in & control_ff(1)) | (io.valid_in & io.signed_in & io.divisor_in(31)), (!io.valid_in & control_ff(0)) | (io.valid_in & io.rem_in)) + val dividend_sign_ff = control_ff(2) + val divisor_sign_ff = control_ff(1) + val rem_ff = control_ff(0) + val by_zero_case = valid_ff & (b_ff(31,0) === 0.U) + +// val smallnum_case = ((a_ff(31,4) === 0.U) & (b_ff(31,4) === 0.U) & !by_zero_case & !rem_ff & valid_ff & !io.cancel) | + ((a_ff(31,0) === 0.U) & !by_zero_case & !rem_ff & valid_ff & !io.cancel) + val running_state = count_ff.orR() | shortq_enable_ff + val misc_enable = io.valid_in | valid_ff | io.cancel | running_state | finish_ff + val finish_raw = smallnum_case | by_zero_case | (count_ff === 32.U) + val finish = finish_raw & !io.cancel + val count_enable = (valid_ff | running_state) & !finish & !finish_ff & !io.cancel & !shortq_enable + val count_in = Fill(7,count_enable) & (count_ff + Cat(0.U(5.W),2.U) + Cat(0.U(2.W),shortq_shift_ff,0.U)) + val a_enable = io.valid_in | running_state + val a_shift = running_state & !shortq_enable_ff + ar_shifted := Cat (Fill(32,dividend_sign_ff),a_ff) << Cat(shortq_shift_ff,0.U) + val b_twos_comp = valid_ff & !(dividend_sign_ff ^ divisor_sign_ff) + val twos_comp_b_sel = valid_ff & !(dividend_sign_ff ^ divisor_sign_ff) + val twos_comp_q_sel = !valid_ff & !rem_ff & (dividend_sign_ff ^ divisor_sign_ff) & !by_zero_case_ff + val b_enable = io.valid_in | b_twos_comp + val rq_enable = io.valid_in | valid_ff | running_state + val r_sign_sel = valid_ff & dividend_sign_ff & !by_zero_case + val r_restore_sel = running_state & (quotient_new === 0.U) & !shortq_enable_ff + val r_adder1_sel = running_state & (quotient_new === 1.U) & !shortq_enable_ff + val r_adder2_sel = running_state & (quotient_new === 2.U) & !shortq_enable_ff + val r_adder3_sel = running_state & (quotient_new === 3.U) & !shortq_enable_ff + val adder1_out = Cat(r_ff(30,0),a_ff(31,30)) + b_ff(32,0) + val adder2_out = Cat(r_ff(30,0),a_ff(31,30)) + Cat(b_ff(32,0),0.U) + val adder3_out = Cat(r_ff(31),r_ff(31,0),a_ff(31,30)) + Cat(b_ff(33,0),0.U) + b_ff + quotient_raw := Cat((!adder3_out(34) ^ dividend_sign_ff) | ((a_ff(29,0) === 0.U) & (adder3_out === 0.U)), + (!adder2_out(33) ^ dividend_sign_ff) | ((a_ff(29,0) === 0.U) & (adder2_out === 0.U)), + (!adder1_out(32) ^ dividend_sign_ff) | ((a_ff(29,0) === 0.U) & (adder1_out === 0.U))) + quotient_new := Cat ((quotient_raw(2) | quotient_raw(1)) , (quotient_raw(2) |(!quotient_raw(1) & quotient_raw(0)))) + val twos_comp_in = Mux1H(Seq ( + twos_comp_q_sel -> q_ff, + twos_comp_b_sel -> b_ff(31,0) + )) + val twos_comp_out = rvtwoscomp(twos_comp_in) + + val a_in = Mux1H(Seq ( + (!a_shift & !shortq_enable_ff).asBool -> io.dividend_in, + a_shift -> Cat(a_ff(29,0),0.U(2.W)), + shortq_enable_ff -> ar_shifted(31,0) + )) + + val b_in = Mux1H(Seq ( + !b_twos_comp -> Cat(io.signed_in & io.divisor_in(31),io.divisor_in(31,0)), + b_twos_comp -> Cat(!divisor_sign_ff,twos_comp_out(31,0)) + )) + val r_in = Mux1H (Seq( + r_sign_sel -> "hffffffff".U(32.W), + r_restore_sel -> Cat(r_ff(29,0),a_ff(31,30)), + r_adder1_sel -> adder1_out(31,0), + r_adder2_sel -> adder2_out(31,0), + r_adder3_sel -> adder3_out(31,0), + shortq_enable_ff -> ar_shifted(63,32), + by_zero_case -> a_ff + )) + val q_in = Mux1H (Seq( + !valid_ff -> Cat(q_ff(29,0),quotient_new), + smallnum_case -> Cat(0.U(28.W),smallnum), + by_zero_case -> Fill(32,1.U) + )) + io.valid_out := finish_ff & !io.cancel + io.data_out := Mux1H(Seq( + (!rem_ff & !twos_comp_q_sel).asBool() -> q_ff, + rem_ff -> r_ff, + twos_comp_q_sel -> twos_comp_out + )) + def pat1(x : List[Int], y : List[Int]) = { + val pat_a = (0 until x.size).map(i=> if(x(i)>=0) a_ff(x(i)) else !a_ff(x(i).abs)).reduce(_&_) + val pat_b = (0 until y.size).map(i=> if(y(i)>=0) b_ff(y(i)) else !b_ff(y(i).abs)).reduce(_&_) + pat_a & pat_b + } + smallnum := Cat( + pat1(List(3),List(-3, -2, -1)), + + pat1(List(3),List(-3, -2))& !b_ff(0) | pat1(List(2),List(-3, -2, -1)) | pat1(List(3, 2),List(-3, -2)), + + pat1(List(2),List(-3, -2))& !b_ff(0) | pat1(List(1),List(-3, -2, -1)) | pat1(List(3),List(-3, -1))& !b_ff(0) | + pat1(List(3, -2),List(-3, -2, 1, 0)) | pat1(List(-3, 2, 1),List(-3, -2)) | pat1(List(3, 2),List(-3))& !b_ff(0) | + pat1(List(3, 2),List(-3, 2, -1)) | pat1(List(3, 1),List(-3,-1)) | pat1(List(3, 2, 1),List(-3, 2)), + + pat1(List(2, 1, 0),List(-3, -1)) | pat1(List(3, -2, 0),List(-3, 1, 0)) | pat1(List(2),List(-3, -1))& !b_ff(0) | + pat1(List(1),List(-3, -2))& !b_ff(0) | pat1(List(0),List(-3, -2, -1)) | pat1(List(-3, 2, -1),List(-3, -2, 1, 0)) | + pat1(List(-3, 2, 1),List(-3))& !b_ff(0) | pat1(List(3),List(-2, -1)) & !b_ff(0) | pat1(List(3, -2),List(-3, 2, 1)) | + pat1(List(-3, 2, 1),List(-3, 2, -1)) | pat1(List(-3, 2, 0),List(-3, -1)) | pat1(List(3, -2, -1),List(-3, 2, 0)) | + pat1(List(-2, 1, 0),List(-3, -2)) | pat1(List(3, 2),List(-1)) & !b_ff(0) | pat1(List(-3, 2, 1, 0),List(-3, 2)) | + pat1(List(3, 2),List(3, -2)) | pat1(List(3, 1),List(3,-2,-1)) | pat1(List(3, 0),List(-2, -1)) | + pat1(List(3, -1),List(-3, 2, 1, 0)) | pat1(List(3, 2, 1),List(3)) & !b_ff(0) | pat1(List(3, 2, 1),List(3, -1)) | + pat1(List(3, 2, 0),List(3, -1)) | pat1(List(3, -2, 1),List(-3, 1)) | pat1(List(3, 1, 0),List(-2)) | + pat1(List(3, 2, 1, 0),List(3)) |pat1(List(3, 1),List(-2)) & !b_ff(0)) + + val shortq_dividend = Cat(dividend_sign_ff,a_ff) + val a_enc = Module(new exu_div_cls) + a_enc.io.operand := shortq_dividend + val dw_a_enc1 = a_enc.io.cls + val b_enc = Module(new exu_div_cls) + b_enc.io.operand := b_ff(32,0) + val dw_b_enc1 = b_enc.io.cls + val dw_a_enc = Cat (0.U, dw_a_enc1) + val dw_b_enc = Cat (0.U, dw_b_enc1) + val dw_shortq_raw = Cat(0.U,dw_b_enc) - Cat(0.U,dw_a_enc) + 1.U(7.W) + val shortq = Mux(dw_shortq_raw(6).asBool(),0.U,dw_shortq_raw(5,0)) + shortq_enable := valid_ff & !shortq(5) & !(shortq(4,1) === "b1111".U) & !io.cancel + val shortq_shift = Mux(!shortq_enable,0.U,("b11111".U - shortq(4,0))) + b_ff := Cat(b_ff1(32),b_ff1(32),b_ff1) + valid_ff := rvdffe(valid_ff_in, misc_enable,clock,io.scan_mode) + control_ff := rvdffe(control_in, misc_enable,clock,io.scan_mode) + by_zero_case_ff := rvdffe(by_zero_case,misc_enable,clock,io.scan_mode) + shortq_enable_ff := rvdffe(shortq_enable, misc_enable,clock,io.scan_mode) + shortq_shift_ff := rvdffe(shortq_shift(4,1), misc_enable,clock,io.scan_mode) + finish_ff := rvdffe(finish, misc_enable,clock,io.scan_mode) + count_ff := rvdffe(count_in, misc_enable,clock,io.scan_mode) + + a_ff := rvdffe(a_in, a_enable,clock,io.scan_mode) + b_ff1 := rvdffe(b_in(32,0), b_enable,clock,io.scan_mode) + r_ff := rvdffe(r_in, rq_enable,clock,io.scan_mode) + q_ff := rvdffe(q_in, rq_enable,clock,io.scan_mode) + +} + +object div_main3 extends App { + println((new chisel3.stage.ChiselStage).emitVerilog(new exu_div_new_2bit_fullshortq())) +} + + +class exu_div_new_3bit_fullshortq extends Module with RequireAsyncReset with lib { + val io = IO(new Bundle{ + val scan_mode = Input(Bool()) + val cancel = Input(Bool()) + val valid_in = Input(Bool()) + val signed_in = Input(Bool()) + val rem_in = Input(Bool()) + val dividend_in = Input(UInt(32.W)) + val divisor_in = Input(UInt(32.W)) + val data_out = Output(UInt(32.W)) + val valid_out = Output(UInt(1.W)) + }) + io.data_out :=0.U + io.valid_out :=0.U +} +class exu_div_new_4bit_fullshortq extends Module with RequireAsyncReset with lib { + val io = IO(new Bundle{ + val scan_mode = Input(Bool()) + val cancel = Input(Bool()) + val valid_in = Input(Bool()) + val signed_in = Input(Bool()) + val rem_in = Input(Bool()) + val dividend_in = Input(UInt(32.W)) + val divisor_in = Input(UInt(32.W)) + val data_out = Output(UInt(32.W)) + val valid_out = Output(UInt(1.W)) + }) + io.data_out :=5.U + io.valid_out :=1.U +} +class exu_div_cls extends Module{ + val io= IO(new Bundle{ + val operand = Input(UInt(33.W)) + val cls = Output(UInt(5.W)) + }) + val cls_zeros = WireInit(0.U(5.W)) + val cls_ones = WireInit(0.U(5.W)) + + cls_zeros := Mux1H((0 until 32).map(i=> (io.operand(31,31-i)===1.U)->i.U)) + + when(io.operand(31,0) === "hffffffff".U) { cls_ones := 31.U} + .otherwise{cls_ones := Mux1H((1 until 32).map(i=> (io.operand(31,31-i) === Cat(Fill(i,1.U),0.U)).asBool -> (i-1).U ))} + io.cls := Mux(io.operand(32),cls_ones,cls_zeros) } \ No newline at end of file diff --git a/src/main/scala/lib/param.scala b/src/main/scala/lib/param.scala index de31826b..f83a2b50 100644 --- a/src/main/scala/lib/param.scala +++ b/src/main/scala/lib/param.scala @@ -156,4 +156,7 @@ trait param { val SB_BUS_TAG = 0x1 val TIMER_LEGAL_EN = 0x1 val RV_FPGA_OPTIMIZE = 0x1 + val DIV_NEW = 0x1 + val DIV_BIT = 0x4 + } diff --git a/src/main/scala/lsu/lsu_bus_buffer.scala b/src/main/scala/lsu/lsu_bus_buffer.scala index 937e7f2e..435aca04 100644 --- a/src/main/scala/lsu/lsu_bus_buffer.scala +++ b/src/main/scala/lsu/lsu_bus_buffer.scala @@ -445,11 +445,13 @@ class lsu_bus_buffer extends Module with RequireAsyncReset with lib { buf_data_en(i) := buf_state_en(i) buf_data_in(i) := Mux((ibuf_drain_vld & (i === ibuf_tag)).asBool(), ibuf_data_out(31, 0), store_data_lo_r(31, 0)) buf_cmd_state_bus_en(i) := 0.U + buf_rst(i) := io.dec_tlu_force_halt } is(wait_C) { buf_nxtstate(i) := Mux(io.dec_tlu_force_halt.asBool(), idle_C, cmd_C) buf_state_en(i) := io.lsu_bus_clk_en | io.dec_tlu_force_halt buf_cmd_state_bus_en(i) := 0.U + buf_rst(i) := io.dec_tlu_force_halt } is(cmd_C) { buf_nxtstate(i) := Mux(io.dec_tlu_force_halt.asBool(), idle_C, Mux((obuf_nosend & bus_rsp_read & (bus_rsp_read_tag === obuf_rdrsp_tag)), done_wait_C, resp_C)) @@ -462,7 +464,8 @@ class lsu_bus_buffer extends Module with RequireAsyncReset with lib { buf_data_en(i) := buf_state_bus_en(i) & io.lsu_bus_clk_en & obuf_nosend & bus_rsp_read buf_error_en(i) := buf_state_bus_en(i) & io.lsu_bus_clk_en & obuf_nosend & bus_rsp_read_error buf_data_in(i) := Mux(buf_error_en(i), bus_rsp_rdata(31, 0), Mux(buf_addr(i)(2), bus_rsp_rdata(63, 32), bus_rsp_rdata(31, 0))) - } + buf_rst(i) := io.dec_tlu_force_halt + } is(resp_C) { buf_nxtstate(i) := Mux((io.dec_tlu_force_halt | (buf_write(i) & !bus_rsp_write_error)).asBool(), idle_C, Mux((buf_dual(i) & !buf_samedw(i) & !buf_write(i) & (buf_state(buf_dualtag(i)) =/= done_partial_C)), done_partial_C, @@ -479,6 +482,7 @@ class lsu_bus_buffer extends Module with RequireAsyncReset with lib { (bus_rsp_write_error & (bus_rsp_write_tag === i.asUInt(LSU_BUS_TAG.W)))) buf_data_in(i) := Mux((buf_state_en(i) & !buf_error_en(i)), Mux(buf_addr(i)(2), bus_rsp_rdata(63, 32), bus_rsp_rdata(31, 0)), bus_rsp_rdata(31, 0)) buf_cmd_state_bus_en(i) := 0.U + buf_rst(i) := io.dec_tlu_force_halt } is(done_partial_C) { // Other part of dual load hasn't returned buf_nxtstate(i) := Mux(io.dec_tlu_force_halt.asBool(), idle_C, Mux((buf_ldfwd(i) | buf_ldfwd(buf_dualtag(i)) | any_done_wait_state), done_wait_C, done_C)) @@ -486,11 +490,13 @@ class lsu_bus_buffer extends Module with RequireAsyncReset with lib { (buf_ldfwd(buf_dualtag(i)) & (bus_rsp_read_tag === buf_ldfwdtag(buf_dualtag(i)).asUInt()))) buf_state_en(i) := (buf_state_bus_en(i) & io.lsu_bus_clk_en) | io.dec_tlu_force_halt buf_cmd_state_bus_en(i) := 0.U + buf_rst(i) := io.dec_tlu_force_halt } is(done_wait_C) { // WAIT state if there are multiple outstanding nb returns buf_nxtstate(i) := Mux(io.dec_tlu_force_halt.asBool(), idle_C, done_C) buf_state_en(i) := ((RspPtr === i.asUInt(DEPTH_LOG2.W)) | (buf_dual(i) & (buf_dualtag(i) === RspPtr))) | io.dec_tlu_force_halt buf_cmd_state_bus_en(i) := 0.U + buf_rst(i) := io.dec_tlu_force_halt } is(done_C) { buf_nxtstate(i) := idle_C diff --git a/target/scala-2.12/classes/dbg/dbg.class b/target/scala-2.12/classes/dbg/dbg.class index 775fe41a66e2a8d7a27b2c01c8f64919ee6cf54e..8bc7621459ea726b07f19b2e8b45b78498522403 100644 GIT binary patch literal 277258 zcmce92Y6J+)%GnbZP7?VLKX;wZGq@T4G t;*?$xHvC*74_sq AJR{@5InVX1JkdXmm0&KAIk`>BtPG`_Atg>z^9V zL^Tug!$Z9__!rgkbgjaY@5-E>8XC_eC(e)db!8?plTj_IYjNbeW}+`WoYu9=J0wvv zo*5X<^i9@u6T5q8a5OzRHJ;h1Yk9rrCo>cJg1mgaaO6a~CD~@qF-uBj=f%uuBw3P7 z_LVG-_Y~^Adcuqk6`Fa*enT%PX-S?aSzOW+Wq!Qa%ri%I$sY&*yy6cLf1LT}z^{n8 z )`=%FSm!mD}XzCmeo{;!FHRPCn<|@}-V^ zMZ$%@+>vime2IUaBj4lZU+(bFyZH+peno)`{}PAa bO?%T7rDTOEFro4>>1+jd3roeuxJl9%<;#e7-6MT}qa zl^qhl$<06H$oD9|te0c1{N4OshhI@F^DkLWct(kDv`ixZ^KSmQ!>^d7 Xmaxt4!=k7>3t(bw*6O}ck@dfeucsLOZjq#-{j`c zbND@O{^bt;yqmw!;a8Y0{7aaR_Epj3=C5%0J&G^!ta0)=@0PE3 G03H`CSgbBHyL|{SLoL@rS4$ z4>6zg*5l?MbNJ`o`Sd#ZRJi MK&)isWez_jGI 2$@q zlY`~`jZ00_Sdzb>JZ&`fZd)VHuBQB3cP6XSD~&aYx;-Z=8_x8U??rwqjAboVB_#)v zN9M=l6& >*g4do+V{bvn81_Z@#XoD!l^yyg8>YGfEeii-R@u zn+MF!juWF5D+UJ3tLG+-D^4C=Qhg$pZy4KKDoRS`=|y>Yt1n9?*PU7!kDuR#_vy+% zI+$!po{Z{<>(Q$-zjBZR9MxHjdt&4r$?H+RoYCiiSO z)kEc_obs+Hys)(9P;I8|@(W9f=QZ>W>#<&l8!QMHjXfAK7@ky}aze*rD3d zROzZ{i`f!07nK#3EYywB{F0W{hw6_H)vr1yU~iijifu*58ZsrzODYyRdYao_UU^nr z-gsv7`pAY6iD%Wek%Jq?dIq*swWRZ%_inE`Fw#>y)w7@QNL=M3J?nvc#DyzAb9f0o zUweFKGo_DN=}((=RR`7_uASI<`GxYrc?}bUW08ZSsC|9M*^Z+PCpI4|JGW}y2GU2V z(nq`|8MX5rD;3*nD)I{Q4#btd^X67X8b-TsntgEOQ0+u}e)Zf!GvBPuYg<}T)vD+9 z#nb5p^~YO#I}Wt!E%VR{mTyTH7v;r|E^N_T7MKg#2S+O!&$O3!B$HLM%nk8$NnvW; z@ofvmAnbKy5cO8l&h?f|ml(xlk8>Law(T#e+7m}Bxvr#Xv1yt+kYCyW|E5J~=fF2V z!T92Zv%&A%ebb@?YY6uui@$4j(p3DO+LI~DuOOah&Ms?Og8UBUtzPU&w^5~oeI+B5 zZuWt(qqY4#YcA~HRf&9Co#$0DU$%SbdHGUD&xPCSkDMK@ylNn`qhs4@!rARg*V^3Q z+I(UEXl28IxfuTHQ0?SUe)YlCdOq3X`r>1CQ#*}B(ja^4gr1Kzpq|AZZ#*(vZ*A^V z&yCr;%FYfi*w{N%9+{nX_>?Z$i+UOCLVX^p9XM(v_85m6`%}%;%f>1jk7vrSnuGTo z-L`3R+wP+qMmFzQb+)iwFCI*YZH4oi2L?MMlVmUE)fLNDS2ScY<&_(XcaeRe{I=%4 zZJig^@2;pnGdOVJ% qISJ>Fj3h!cCfi`=Z>;- zokwfWWy&Y#B(3y44HKD7W#@)3Zzg;aZ`=OLa~%uFFNi&a--)B#t<8O{rPc5s&6DXH zr9I00mL>}(+w!Zo?K;{pIoNW&Y#&tqn!*zJf#F8d>vf&7-5B$|@hTJTZj|(ga>e1g zvpaXJYOI;J(OBxp<*%tgeU?`qEWEtLSnTjsI~9#1hxM}d^_AOeDmI=Oq;_(2 k(`D^E{p5ItyCLJ6dM>mcgT{3xgbuykgEbU<9 zB n|bL!XN(>L-VGh{nQW^^= -q+}%I1z#Z0rYKcYT$$CMvh@K3dm5RD^oy**H0I(<1aM`elLq$`a!W*dNJl zE*jo8GPil4wN&VRs@{fs;J *{y+)b^o%)~~K? zfZcSEz4o@3mc #mtoor)$XS$oEKA`9M%XV4%gx;zwIWG5j`;y5yRlas14y_wY=CvnRS8VL< zllHC`kpEq6wL`Rbv_rCY@&i<^Y@h7E8qiJ}j>8`v*mXpoMg3_9+V#$x=5HH4+<<(C z>Y(?*O!=y_!xfFg@E2*)+pZm}4q!Yma-e)Nx>%2rUm8HW8rWRa-?%2 }bz=v@7!4YbSP=UszvwWPO#n8vekE8x^EitNi)YE~TFz-Mpi6 z``FyZa`YE++>tkdegflxWr;l{Lr1S3+qPq+Y>%9OgC$>OR+Z4WV`}I6$lNNkd2;Bc zMF&?`HdUF6*$>I~ujfy;!H$)G*#o Otw9 Egt`h}%qa~n<`&0miCN4x4QTME0nUimlFH~ds& d2m$j ?`!wT?YX{u8}eJg_5**^KWB8_hJp6{^RN%#-# 2u($8_F z#|YHID`fvD@g8yTayw-|3%u|<5^uc=Z%IJDvb_|N|7y8@>+1O%sJ$qh@W1dEb5y+V zM(K|W?R-l+sGk*Xy{y)wlWlSwC*KG4hIZh*-yD4l>&x~d!ToCVV*P3n>}Bb$GWhj| ziJhI5F_(Uf<-vUPv;J|!1^J%S^WpaeAO5Q@lWLaZk>jmJl?O(SHdFpV{3>%-#WMJ* z-gb;<$Zj^H|6Pr70=3^DelkzD?QZwc+TLwNu+yWCeU0t7fbn-dje}-;#z|zK O4b}|JZ)Z9 z#eR$W|DFwFLpv^@U6Ea1C|^naf6;}(qRX34^|1XOUxfb6HGY8pR~=k)sILEjvhTXU z@rkrY_;cYNPc+sXYaD1TI&zl!8S|)n{LwIZ-TGB?@cV=MCD@NE9mef7G(Ie^X1|)B zY*~Gzd8)N*)rK+rz8NVm!}zCRiraCCvD(4ojH8a#PGDT>evhHnL#t4)%>zU9dlKWU z683K-S7J#0F~6dUerMtL5s&kX`QCVy*%V(ovS8yxYf<$E?hnQ3h3;_>k8{i2 *UHY7h 8+Skgwvc}@en|rr)(fC=7laJ!}QeNFf@~ezsywuy) zS-q^Lr+y0k#(wU{<{vDqoNuhYNPa_lVvlE>sQN|Be;inLsfQhmzyb+ooV1N`oI`o`9> W%8f$_mKIpc~F`d#kopNvF_;p#6gQ_s1*<~exs_sH?1>_;&^T|jc~ zelGvKYkaBvL{g?lzenR7PA~f%=!wT|8_o~$?^8AIv*T4}n>`P)q?qurK4;tW4?ARk zsQe20rJE+AvyMssA^WAx&0DsQ@$XqIwANc|t8M2_4G;AVO}37WoEjR=>^?O)G&VX> z?Txk$rza+&S|Ju%!_!5zVqKdZkXY9)vr?W)_g$AB%v86GjSW{vwNhOx_C1PfWmvJ5 z&vmWZ_po|kd~AfCWzwU2$2x|vl$;)pYIAh0Ea-`@T^W=?`{<-A@jP9dMTy;9*SlJX zZIJ^*{gWr6+5%lG^73?TQBY~!ljB39gRTOvgqA3!?*UYy7R;-w)1zaf)pb#Ak*+O1 znLd-Q8BUK5V(I+M*maqjU75)fWBuFHqy58~iRzBAvFoNzMYYAi94;Ewmg-tQ%j;T+ zT5Yc$KhrmS-HHBjRL2S|tlLqbbVT|G22um32GbB)t!oA2XKV&wd&Dvjsl{Tx6v 3+|XCO5(nV!s`>g>n+Q15ss?1!n$sQWot8=l7|dabkt7AYkQ`$zi5MkmL|hEwC2 zL8P4MP51YYXC@|UnK5gkw{Idf(c3#UaXxi+oN_NwtjzfM*tp^e kVf6+5JO!uVVEMeIxzAmqzl-T%5DxXs;SMitBlQK~E|$zxmh325VzJcDI+m zYz^>%5$`sXF8U^F>~;kzs70Ap>Ar z9U30ScAeqW#L)F p zJTf~)%gm&p+v1fAlY-LEjGmiRU0O;1$PhU+?mNP?mdaEbsKZzY$A8JH$9j-Fg6a4qPIgQ<7ZTVJt8*% zqV04z-M@N-WRO!sfgm~c2y(NWF@hyn=E~3-KR~j?HFmK?FLR070~^Sex(6thaJg4l z4PPK#sD?b2V2M{SQw^DdmhF2}$t_#DQrn>gC)TkW?<${lbtQXJTiUMOyB!rooNe17 zob2A7g5d~@(cOLs6&Rx^lLak%Tih92G0vD`?u-jbx@B*2TWag>jxB(0$2qq$iqoU| zRD0)^wu2IY5|fNNiC-pDaVp4(*ZZE=r@YS_e9s%?^B5J&2#Q+vwRdbuCAYW0Soh*x z6N+)L9j$(r9Z7X2_qOlHbFjKo*LLkC)4B`miC@(ZEfrBmbyV>oW_Gzr}5y2 zrt#o|rtyGe8V|l_8V`fmX}m_5yc=IzXR@WE4G06cz!<;<$^b5K25^BifD5bvT%Zl$ z0 zSKGGs-JKSs?&Ov(o0d(PGm f3fo(gt=rpD^`s sp@qTN-HP@^_aR3uvK9dpnkrTj#KP-Qy(-S`&JMh-^ @p z@H!B%^u{rML;3P}#_5!mOKF#tb5^ViPHbDe6jc__w6yp{`__H1Z)ML`MA@?ymG)fH z-U)m5`Efsw{EnYTe#g&i2;h<5@yn6l@$<;<_<7{V-8{#SPv?>!pUx#eKAj7k0bC#r z;F2Goo&)*u>0I*TZZ7#w^5cG`rb;?cJT) z*WH%7wqsv6utYn$_tnG8VITm?u^TI*?8b^pyD6d=*=T1A >i}t-rakX9pt!CbCiW0x3o~y)rJAzUbJ{MOo|h1)rJZb&8kSK7;9p0`>wXG zR7cx3 dV)ZiD z&j2|)ym7gUV||9h@)+})=c &v&LqCx=EdHJBEi>cf{i>EYJ& z@NhTgjG{WA#Cyla@Ka|zeM;9}>_!kWE9(Be!n3Vzjwj*X^QSW558d!pQVZZlq3_oZ zB=mjy!Qy-!y+L03)T!a~n7_tLU+V3U_^^JYRMYgM_{BdkG} 3dDCrwPq`a0~YRjy~DpVY4-WSG|~c77f55`m7Xv-n_Uk}F= rj zj?ho(rxW^^J`RJ;j85QduB4o48R{L*=-PUB{=TH4xlZa+*v6orfoWp;M%T8vGvXI@ zz4`x7&gXP&tKX+zj}ZlQd19=;HQje21M6StubXK`j)oHDG!UP6@$$(%`ZSNEa~+l! zZ&ZJ3P&0-ncOyhp6%J~8qlb@=!wyGN_-UJo>Cf^e##5CT)bzyY4BSN_s-!_pmqs_? zmPS-bgPJal4#X{usFDUXT^e1BTN+U%4QjeHP5Zbi5m6-#YPxijR~k_z4Qe)33AYN% zi=xLZ?a%b3CWog|H2uue?J@oJXq>J>>mV0XRsk{~BN)pZE2EK9eJZ2W*yu1mP )1|)!Gl=O{_XJp%=)hNu=!*PAfSFmGC^?|lj55w?i z*RdIT6i~3wX6hZAAu=EV%)nEEV W;CY%#Fv3%F(f*@#0H 8hqA3aVtTfH8h}#J@4SuK0TWL z(rbOSPjOWOkpT&OwZGP>eIf%ApgINB`WP0Z$A>UpFlKo{u6633$bc+-b-&iBdm;l8 z`09SGQ};v$B=FV!TBq)b3`pRs`?XHp6B&>I6)ZO#$W`E&QRUNtV+v~nO<}Fi6ew<0 zRG=xWMSaUwC;gr(b-Axp$2>@UI_h<>0c l}+AG9VA1#jJBIhRA>fK8soBSPYQ?349i_&aoIG0}}Y(!LgWi zffln4cHnNy6t^@TXd>%;CPHy5L7<7OL!Em{aLj=oO@D{=s9|>kimMWc3`pRs{Pj-d z6B&?zD&IBWUGLO1kpT&OHND=cX(9s>_-cB+Q`1BSB=FVrdZ(s|3`pRs>Ge)c6B&@e zSJUgAnkF(Jfv=|5J2g#YKmuP)uXk#i$mt0heKk#SRntTUB=FUAqf^sF1|;y+bfZ(# zL zpgQf}cY`0-ptJa4dkxfCN4Z z*x* ;oy!i04oc& 7Q-R)cTy{VY zgUUfw7u$27 h8Pw$qJz@-?SSSC?KHu5Ky!lLa$I&m z4};3_+X2lJ+T{e>0nH40%W>HOJq#+xZwEA6XqOXg2Q)wEEyraC^f0I#RJA=PCcg-Z znTP$^xJ-lQ5QDPun+DAy+HiwSL(U_*`)Xp?X@X6IW&%C0NDM0t(E-?KGB6>RghtY- zp|O}b 6acF-<2*i>jf(2Lb&D)ca@99V-~*`uW-`UECsPWp3k84t}M z2Ib;69-26`(FPk2O%>*26My>LP|UpGFVkg6Bp6gC48!}jE~}v##-KEQtD%WS8)vZ9 z(EOpd9GBJ5!+>&V3el5>7*;t%2c>}_c+ %{2z4@!JGVG1}OIZGt8hz2&& YzH(O=`F`)2lOzg9KRjV z45eL8upQ8xq_-TG9niy|a{P8c^OSZu!FE71liqS%c0dn<%JJI)%~smw1ls}4PkPI7 z*+KB+Wj)PR@}{AYbPPv~doqwuRiToe4z#}3XB3iQrwKHQ`dXh+NQRvz&?xF_eMTV} zcA7w=sIT=Ig=E-i0*#`+)@KxwVW$Z+iuzigQAmcJCeSGAYkfu`8FrdLqo}X-8HHrn zX#$O+zSd_Hl3}O8!|2F$U3{iNIW|&T2Re8^qgNu>|6I4s7MXTw1a_zgBo~oIk?I01 zhO=Sttu-#FfE{<>HwoQZflajqxT~Tb+s^5<5eO`6Uyg5sXwS89JwU;Q%d9UwH$p^2 zRz+49X!#NBoQO|Zk~p2ifhW(La1f~@CK9$V@?7fVX(JCxCL;Bb1}Y6Elb@a#9;0I% z20irLv%cI3Y)pFSk`{AV$=Z{dK%l>Nf_BJbHIfs6Oql4YpA3o ze(d#PH_%`vHAqJ+lr3vN yvYiUU z=T16mDl#xUbP9W^Wl=b$V0fxOQ-dE;slF5G(b3HC1gbcXWRUYBZ_a_zBGMVzP5EC7 zS40pUY*?*XHXRTq;JjiesM0BDdIAyI8`(!C>__F%ciOGV4s3n5KO(R{)IQ{6{dYgr zRwV;%g@e}mkU?P(k;9QA1Qj1Gh~7!m7ryU4k)FV(1Q$1SWlF}WJ~SG4A{3Q{!OP?# z(i`ccg8Q+o BFg6Tc=`>!ohzxQPfRn|_LmL=u5sBMzh+fB{XcO|a22YHu*IMOk zzn5q)`IJ8$iee%QRj!p8UU!|NS#L((nA1ko%a2DU=;bHzqT^>WXK)$>KHM0ZJde)| z=$Mx%P4lLx*f{egJ$t$+-t;_Yg^v~R^}H)9*+B7`yqARpH?nGOLgwRVddH!)4Bjk% zY+yj1JA-q26ce(yaOO{g8pqF! 7O( zQku|3Vp5a7;zZ=tk=M}s-YS<8MhAulr^eIx_9iuWR@bg`-h )JRxW2R!pRcU`;Xzm%2JR0B%24ItndHDiNJJD=X299ncDgMIvTB#}}G zzc#9EPe8Q=WEobRPXQwG!N`ZGPVSU#%Ta%d=JCi~+O-4@>f|1-lY4D(1}DX{Z158C zG`m-2+1cgLw1YAhk&j01rx*N~MC>?d436X%p4MnNK#%PnWs$?)8EP#)`B0OfYR4;k z@Zgp4sh>I>W@A__`byd;A`e79O>c=0Tq^vz_GbptQ^S+h_ WxBshxWge>0>fe#dc>ZB0u8nek^-Ab#x9+RPundPt+0G9ojo7!=FRMIfciY<1abK zUrBXYC+y(MHBXinpFqA#dpG6zTgbT1>+xp#d(QL^Qte30C-LB0NPn)@5j{eCkM>^5 z_Ad}}AMNAK_phAq-{5=rL?0U6yDJD~;V>Vey-#~T<@Qh7t3?MQW;~T6BL9{d@v^sOB ap`g!U( 7{e`I)2<>sEUL>@?GW8On{f()Y z3GMGpy b?iczjramt85~e;W^irlC5c+JUJ|pxpramY1%b5Ct(94 RUpuWa?p|FJS6BLcg4;?+N`1roJ!qE17ys=v7SpNazch`iamN zG4(T{S2Ohsp)Y3YS3+OH)Nh2ol&RkeeHl}~7y5Fh{wVYnO#NBtE17y+=&P9eo6uJ? z^$(%1Vd|ekuVL!nLa&unzAp4Src9yNGnFUw2BxAyU&~Zn= (A$}65c&?L)(L$lQ;kCJV5&*zyO`Q2 z^iHO(R=t`$H^S-H 8XgNSzKEc6NFK{A3X!7& zS6J$bi%2;Vf#~Tpy-U8LB^3IKB; _r<{bj2m~ z+QtVp{{ILo-Da1w(r$LbO263&D-CBStaO~6u+nmN!b;DVs%Sb4tTwyaBhf7FmqfF) zUlPsIen~V-`z6sV?UzKev|kccdJXbheD XAtjYWdGW#2KHmk@Lg zYGlESg0m0ZWVxVz*L4;r3k7*q{}G*+z~`K4cnN&=QHPhn$49%d&_y*&OB0t8u?Hy^ ztpw+=P|ho;yXA91)fu8J7Svx^$A`9WVVR)elO;pP%du2oB{>I?ve23UGrP$7q?{n= zHPlg?_43$K77MC;C1#&y%924g=a#fa4wsU%h7LiF%bg$Bi=5KA1W0*ODuWDiomQr< z15_{l?$)`gEE$4THcffxD2oP-6cqv~%1tE;CHUKXkin^psnttGg;YBCw=A|iz?f84 zt`lBaHmKbwS$-9(-h+%?3Ci vXmAxHJGWI|R7e?vY$3tsjGP#gQ{+YU;p@UKir%rkivqh;FJ~Y5 z%T;vIq8z&nbQ1Of!JJKC4Jw)NUdeTwFlQC$7yYLUXD=Eu_;jDEOS1+cgHOL`$l%j2 z8Z!9wi-rt7{h}d*Prqo$k0-b2C4W3k7Y_OHG+j94$J2CSrQbm3<+26F9P;C7dd?v~ zo~8?j{CJu!9P;DIElj@$LVi5?MYFVD$~8;-CDAPHmqfF)UlPsIen~V-`z6s3y-qug zn*GA%0b>yy9ZiQ+vp|qbqqC*?yk?dOa%q-KxJ$F7sLPZcM3CPnA#(eC05;17jq`kR zt`Tfd7eLbLxNOccsBe-&&MDd~802=R9j?uyLE3Z9+-8}ek%Z?cZWarg>$6Vi4$sIw zxH}w^yF0vCVNO?fG1Sg!-?Bb~+)}`y;EXJ&^1Ww;vs_S5Y#$-cB0)9oI$8YUns5#r zzc?oEIpi!CG_v*|PtKA-O-`L!9xi~<5et-JA>Z2CqAms$+Ev=sSjW%*F1DVy9?P9C zLffQmrib76K9t+pgm#UVq=!EgS__N)SZJ-x`>D{jFz@F=Yh&t{Lfgtue=W3aO#PqG zw)4~939X%Ze-PRZ=KV=%JDK+vp>;6zSE21<>hD79Wa SIB%sB+A%E!twk3I?Ko3d;ZJM5#H$ioA5)8j*3Y?Mg+Ig8QlSlSX;|SO zWC|<%Cz!$t{}5AH;Xla~R`{=D3M>4>oC{X?N0`D2|0qAj3jY}Mu)=?esjG!{nklUC zk294N+5}UrLYrg?EBsTO%Qm5%VG1k!XPLqZ|2d|x!hfDqV1@sBrm(_)13$$I{{`k@ zh5tsTu)=>6Q&{1@nJKLBKZR2q71~po!V3Q_Or?ePG^YB5_H<5x75-;1H7K-aGKCfX zXEB8p{%13V75?XNTCDItmnp39KaZbch5z|XVTJz%Oksupg-l_E|3yq;h5yA&-6*t| zFohNVmvVkj723;~dYaJwhbgS^zntZ;!v6~9VTJ#dOksupRs0ky{I6yTEBvov3M>4# zvK&_UU&|C$_+Q6QvBLj)=3#~ZHm0z`{|2UBC$u**b(_~tu(mj2XHiaGKU*nz3hYUkF*`g+>)g-!X^H!4oslHLm6GgR|u zEORU;H#IplT+@{qY#XH_tE15mAp_e5`krESw?BGUJbGvJZnU)gN9pyjrE!*(nROR# zG>U_*OYK}NwoLxfc=W#L{kXRldxxe;*caxit9zlv%IL=vNbw1Lv$0P^KShPkk3N7V zpZ^#YkDYt2{gYd;?b+D@=#BYyFw2LyS|R$m1m5TKs2l4oNLA737cZjXx@!20gIxGm z;IEnb+C`*msX|sdm1`Zo-;S$#`_gos^4|0~?nG!i*O!sED@UW>z_w%y3U@)#=r^%* z4^r~(0p4xqWT|dmh<-cza3cDx=p#bkjoTrh8tShcF}_hF8hsSz$k$WoT9f-?19jzw z`vwNZa$lC9SR(p^=wk`}mgo-^vh>shHYC%AJ*P<9k~fOzkE1_HL?4R&)TQT^p~;D8 z6x#v|d4K=4;~DI^gbDr H^q~d^Xqu@SJB_-+7e4U*yEiU$4#U)6Jt~3eVL)r zfw7uyNp=j4qWSzbro{=93zE8KqMi1wq51tG5&d2CkJxoMG{QGs)1@3s+zG-|@aO1X z5`gr0R*>3(E*izA!7D8I7r9+K8vTc^RoPABB2rQ#|BOeUi2e%|O0U(2Z$8$${Ln=b zwtDXJR>l+4VtOL_M9jb*O$(k^FdB=Xru)ZI>gJL?t`EX4UJvxrPJ8s`==$W2M@zB% zSTqs+MGWJOe%Y#G2{d}NpVh7kykrBy2I0KZQ|V!(n-}0B<;AvW!ur!>BZ (Zd@URf?QcCYK8*fmr5FrdiL>KFlQ|XZoH8wX9{Zec;#(%7X`KS{6JzTfrB1PmM zktfj5W0zxq!D+9=kc5*hM4^3j{ji8tM=MDR8-bq5@4VFA2=V!1G`3vV+Ap?8+xumP z?{f#AQ{|V}564!bmx`^z%VYPntPX^Qwq+5nXsmYno5`z8Nf&4MeHt)`;`hO}qvtVt zd|#?#lfBFpVUewz(ac#&dIKlD3S%fvx=H9S U>y>^TJb+2Q+oE7?;n1VeN!QtYr z?eX)e>Rx;!r)$?b@AMzzR$ljp*ah-9H`2#}W2x#ieW!5DDaPCU|67IL9D7P4wj%aa ze8fZNNajnA4Z@()A~^=at0Oe_z@e=~=yGYhrq01Wo`dAJQ4&kq#`EH_=f<9opE+C) zFQm`=T;JJRBUKuQQnvW8d+(St7OjZA7-P}cOJKS!BK9)MV{Yt!@DrSKdxfrDe=)^* zZO$9}kCn<6h(7043A`SD%RGw#-AXz}#X22`b8ofma`v#?ZI}~a>W%pF!ET9;FfO?! z*ZNX+t#5JXh>uO=&DXeDnnYf~BDdo=8|U~Aq2JE-d c3-0 z`$g>AG5mP=QtS~-S+Ux_i|HwT=|_eB0e;^f2>ouRen^IeUm73g=ucd&k03>3KLcbM zEKX1>60u*v#~{To6S1Gi9-(SL@5|Ky!k`mTIR?U@vrah%!k|-3IR?U8VR#%F>L1RC z*k4#r*wFnk2J|;fb1-_0rCrWUc22hT{^NGXy=Ls@*gr{m7>E};{u;ll`!gc0$v2PV zy8zY)CHe2VaRw1L;}NJho<~UV1InPITv>4-yo!S+WAapVGO~DqR35ghYjJse-DG-v zQpAgxTTIpVFS2fW#dxXEKPfdFFC#lgcab^G|IehFrGppo^7tIWFc&Y^TNjIC^3e19 zRsFOJo>bt6ZePAIUI||wUy#tMFrA=(nqTWmp?`rX44@4<+E(h22!jr= d9Pmeq_5CG%{02)b`z=31eDnX#Z* z6kA75;7d=swJI8?h5;fq)XVcvwt(bq6!GTx#zed+eih((pGD)CiYlbE1msM5c&J~* zsolpn$CE;TkPB_4m$ZB>5eA)%%dZTg*zP9exVu*9-{f={0)L084oYLSbRrBo^Okd< zSMugSO6{$U#k+<6D5u{?DJ*Y5gfB(C&>v&TLnKKGp>YHeK1rbWan@p*kL&2T(0|Oi zK#>L=a?81Z@TEcb@ -pNwM|S}gs2Z_4uT(fD=v8Nn{!;gZ*nkHq7{ar#!7 zDmry`T*OZyL-0;pym3^;1oI}bR=|av!Hh3c=P(P*)b&FD1;f4|^j|Y|6Z{R_02;|t zFz?P#Z^28^DZKKfh%o4^U5 -jCn8%>=gIOmad^#Zu zq}QeDdK !f&HBUJU{@f zwn~H-Kt0;`KUoq}r3M{O%<7ufj_d1$p|K?H@iXXvVwRlNe(UkeXdl1IH-uqwnr~u> ziFw~u;hVSSCW z`NcGGC}h54Y5s{UnoErTI-y14n4XMd-M>bDpA(Ja`{ev;n)|PY6Xq|( w0e#ot0(gGu6UQ6If;6bUVXDZ%>^2FB?@643-E1YJWbS;~KJ zXvLuQ!-@Pv0%ICX ECUk7rK{IFeLpj88s!Xkf;`Nte2`I4)E2f Vs zcWkQfM0GTQMqg&Xr1O9}!$ea&u_4inrCqs Brl8HnM4T^C-8NRO twosRQJhvVkm*t+~aaO zI58rk?~i_f)G$_@pExxu|4~!Zv?%?-kCjqhlIhNj4`FzCy FrPN%1ovQ(tVR- =iPK@<$$I(Z_nThI-v9ar>PHl9} z^{WxRi{nWsuVfFLFP#R`xrjY+K5=~_aV~KKUiyMOZjDB7_=m|*e&?-IqjHk97Fs); zxT#dr6F1BAlB^2wHDp-_)Q*u4;DEt(;}rzTJfw}|MMS@%x|jAxXh5^fgJ2buM3 zu%1(@nPA0=ne}|IUQnt J`}Oz|^a-(}AhiV5b99 z7&VzE>T6?(*Q0l$p&ABji8sjJwieWzupNa3G0$T+YB}q@b!d1P*7i1cqjnxhD|>r9 zaeIOWMJG_e9nfIp>I69NLgVYLt)=|mLk|(Yk6Cq)qtVZa`dH#al0}2E#9hQ{h$ZeJ z7C2yiSQs7L9PSeauW=^s7e*KJK8_t4>?1K>bBd`4gt3pGenuDvnfjbC4m0%y?Al zi(o(H}5_Cw76|BIXDyCLpPZd*Zu&0WtT4C^7PeHvfUdwN@Rv5Q2 zwO$xJqhGK=7;j}>voPMy)K$W`gQ-ozcsEnm2;+TBwFu*bOl`qF94>9Eh@EDj+X1w_ zR1*LiJHxCFuy&Pdg~WPR?Ah?|1=oVLXIB1WrCJfV#$BA>K4IL;)B$1K$5fBh`}$bH zVPWu0TES7tYK#@6guzok1!-!UYhwj{!r)nxf{ZXe$2klN sWA*W~yo+*q!v+T2l@mHpvD~x|Ig~fsAv7TRu9ZgKV7(1Gn zdMS1^F$Hh?BBtPNU(D32 QmvE 1}m)v|A*}ymk^E? z{0?1MX5`f5c?_Q}nK| xl z^F_2&yG&>zo?uo2tb$UloLDQERRmUXsWyjL?aV3#Yj&wNmsnlQLU$q1T~rXOhgtK$ znqR8Tqj#9YRcgI<%h isK(wy z*@natVP3_&Wy0Ld)Cys?FttiL+q#%oBg{5t)e3VvQ}x2!$<$gBTU#3w>#-w~^W7lK zPJY-d%sot9CCt4{ZNhF-mb*rn2bkA_eW%RZBI3tnV-s7Ugl(nTd}?fmSZs%gr}!ay z7J;6nk{+h`;kCTjC8v?;@KhnXkY#+c=mtUz_hMq7Fnd|{0F5s&<=o#lIgH^F8iIRL znz+zhk2r)WYjGGW{{E*?fv$)zFqd<2{WOmyQYcRx6UT*_;bMA)d4j2aa{oNGPvLCU zsKAdX+?kZ7*>ju=n(jX@#0hvYF(`(F$>Sk`nOl2e{4CDR%?LrWpm?QGVe+^~ppnoL zpL}aNHB^Xkers61iLq)-ObL@mM&hh6&oLadeu IdDVBK1(!DvPNQD(g!tlLVp#l-pvv)%;O zn@hDN#QGIm$lJiWy;NID7IFi>_5Y%(t(tTntsNEbgs(`C(=RY*+CzGRE!aOhb!s@% z-@Y3b@ow>+gm{;DFQ%%j-(P;IsCYj-EH7h-50XkhAkg(ag%RL~1b+6*+P;UM-7Cze z@w1N*hODF=)F&}14T%R>;?u%>KJz~-%oj0*`A{8}|3#Mgk}zM& z{I3Y} BSx$*t|;>JpUyg7LU;Dd l^MgMKlh@}3`m6}ue Ap`hiRcH%nwMh!aV$3#V!Nve-edJ zmWv7VPJWm`+Z)c{iQp%N!n}u{6jNSPI2c$Imhdyo0Kz*V?=oS2goVn%Iz2Wa3g@y& zg)r~uC)j@%k^ATh7m)e 6x!q=eBohX@({l8 zs4#heUYLSW7cSwo^J*G{KsUXtn?CHSqtX2!+5@%$TcIe-@bdv-^4Pu*lVf?%9_jC- zFnO3?h(0JGnJIn(_s#?M!c!u` uAR?DB zb(4t9W$Gy+GM}kiMC5X&o{oy8D-q?21`!5be8@2n23=#wF%Sk_R>(0B23 IV~H^6E;)WiSm?$$ju95R|BYjWg>H6}F(M4QvyEefg>Gi! z7-6A%);LC3=;URN5f-{9jbns`Zaw1|VWGRtI7V3LrZSEZ7P^m&V}yln7n3m}47xXr zV}yln2jduFp}W2~Mp)=ZFOCrwx}S? ~ju95R2a98bg>JZ# zF(M4Q$BJWwg>I$d7-6Bir#MDf=q4$S5f-{HierR@Zhzt!VWB&oI7V3L#wLyt7P^;- zV}ylnS&}g#47xvwV}ylnN#Yn`p*xQ_Mp)=(BaRUkx~GU^goSP+;uv9}yM;JLSm*{J zju95R4~SzROnGN{ls6Cp4dOtd;-C-*4iyK5IFP6~D8zw9#X%tsG%5}Xao|yLP>2JO zii1KNm{c4T;y|V15+7}F *ic5U7 z(?i82KHBu5;u0V2 O|NEj_Ea#7C>iDlYMn|K>PRW*xb56_@zPnX9 nZ zK63ghF7c7uS8<7t9KVW7eB}C7T;e0=ui_FPxqlUx_^1O=afy$*02P<`$oF%cD6@{b z0Tq|{s3TBuiI2Jh6_@y^Gf;7fkGcaDm-whdP;rTmx%M_^4A*afy$*1r?Y0s6XI1 zQDz-=4Jt12QRkrI5+8LBDlYL+2chB;A9WEbF7Z((q2dxBbrUKs@li*i;u0Tq6)Gv9NqYgvGB|hphR9xbtPD8~dKI%49T;ijSL&YUN>N-?h;-k((#U(!K zK2)6W@jY_Xe@F^(3!kJAx9~{{aSNZM5V!D23ULdcq!738NeXcbpQI4C@JR}B3!kKB zSNCJlnwMcSyx3Z;YmEWRsn%j`rk}+y#pW!8swGH!zS5f9V$m&55z(UW>e|Z!vj1 ej{GuP=m(8$Td3He;ML#V1PN}x62=l`6?xDfa z^yJid20xTq<@G0p-IM9Q>vpA2?WN^x?2@3b1UsijdNbpSQ`&)#GKcr$au||O%vt>6 z*QUqQBN_bCn85T;JMIS?m*3815KZt$hgcm&t`%K8Te^Q}VhEWeM@Ppd<%gaSoP}*3 zllbkIKE-*0Rosmd)9s_fz(V^kFiR#mfUi|)h8DrUe0-gkr jR zh_eM`h?50mh;s#Gh*Je*h%*Ibh!X{5i1P$wh|>gQh_eJ_h?4|lh;syFh*Jb)h%*Fa zh!X^4i1Pzvh|>dPh_eG^h?4_kh;svEh*JY(h%*CZh!X>3i1Pwuh|>aOh_eD@h?4?j zh;ssDh*JV&i1Pqsh|>UMh_e7>h?4+hh;smBh*JP$h%*3Wh!X&0i0}Vph_C-;h;RR8 zh%f(Ti0}Soh_C)-h;RO7h%f$Si0}Pnh_C%+h;RL6h%fzRi0}Mmh_C!*h;RI5h%fwQ zi0}Jlh_Cx)h;RF4h%ftPi0}Gkh_Cu(h;RC3h%fqOi0}Djh_Cr&h;R92h%fnNi0}Ai zh_Co%h;R61h%fkMi0}7hh_Cl$h;R30h%fhLi0}4gh_Ci#h;Q~~h%feKi0}1fh_Cf! zh;Q{}h%fbJi0|}eh_Cczh;Q^|h%fYIi0|`dh_CZyh;Q>{h%fVHi0|@ch_CWxh;Q;` zh%fSGi0|=bh_CTwh}%*$z33;P4ec#x4{z1p2D*i=Ly;kFFp(iH9+4p~3y~pi_mCm( z _U_g2X8gDU)x3hz|mT`Ig=h4-lNUKM^=g&$GjeJcE@3h!6p$5i-n6@Eg6pH$(e zRQP}jKdr*gsPMBY{G19uufi{=@QW(^k_x}9Lfk(g-w(G>$Pjl=$PhPA$nZfGenW*1 zsqmXB{FVy8t-^;@_=pO>qr&g1@OvtJRE6JH;SW^!m sqoh-{EZ6#PldQYLcS+%kB}kmj*ua4j*#IWRrn_r{#k{8QQ_k%{HqH8 zroz9g@E sPIY^ zR;h5I3KyxcT7`>MxI~3ZRk%!r%T>5Sg)3FKN` _s&I=6+f=w!h1*oP zU4`u`+@ZpqD(q0 JxYBXLqe!vFc9!h6Ag}U7AHd!`}i;|EE?O)%Qj9TZ(=T zMn2X_HSJu{FYxzD 3CQ%_ykXc|bki2K9n4P}q<)qoCgE z0resq)QiJFVQ*NrpmH+wcY8p+)CTpkFi_Zu_9TLOxee+SVW6;4?MVdnDjU?R!$7@e zhCzM6Q+>DEpk5mW>UG(Jx-A!%@C6U3H`t)w7zXN1*@Jq^e-7%cHmJ9Sfx@zIwl O(mgx?b!7b*ByLt}sw{XAdeTO?g4xV}rUk4Ah6S2X$XAnwsU& z)JJVl_lJS{*bIZZ%meD 1NG_bL47ut>bt@N>T@=z z&xe7+E|Y9qUrsi4r3cg(ZBSnd1BLx9*@F6NE}E+LfclyZ>g!>k9?Tw8PMTWm0rd?V z)I(vQzL`C!Z|9<^ iagRAB2H= zY=%Lt_kjAL4eCc>pm0b+wyp1{x!BZJ52&Bnpne_(3OmcP1(nP1K0W0D^-CMnufjlK zf7^_LI_?4W8ynRBg@M8@yKF)IK9}n2_kj9?4eF0!p#C(&piX)~{n-ZfmoQL|&oHP{ z9#DU^LH#WZ)Zb?q)T9U0KWtD>gn|0!41@AcFaFC0_3sc+boj)K8oFnC(a %?6b`lR4(0&=JDu8!Uk0k1`1n#vjvsY zRFD@`p$)1i3>0=BX9>zE$-$%hG*xPYnjHqJENf7DPSxk>`;5zMP~~Bu=41^jH%)m# z&9y;Qgn^ouH7Gr&Nwc)4_06|IRfd6DFvFmFJ)kbPL0u6B>dLG^84GhUbkESmSY(5$ z4g<9~Yf!mWpBK~;8`RP;P|LCgWvs|WQ$wEWTWNz@6$T1l`DW{ yrv b61c z4Fk0=Yf!m$GcWQ~-+mj^fiO@9vj&x0^?5<{*q{!DfjXQ$sGOXq7t|3O)X^|d$Fc^M zn@f19r}|PhsN-Rv(lZR| !Z&f1{Pg@M9Ba9L_9H<$1ZPxW1IgSsIM z)P<}; c@pxHkDz~AF7t~X1P)`lh)Gb+q%B}kT*He8@vq3#Q4Ae8S z29;a&c|kqX2KB5kP|waDR8FnW3(DR*Y=rF{rlS;R)TZw6RG+ $^3q^}Tk6L4C{v>UB1#*N1_+EqhQoxrC2 XR8BVa36D*^ z(+2gfFi`K#8dPpJ ~E-5Cbz zuB<`j)*(OSv8lUlQ1^s^x;JZ3xoOG^>ccjukA#7`FMCiqwLUK>dzZBlw#%9hY0lE4 z=k~+F3(DSQZG`QzremU?L{RoFYa?uzHJwzQC8*pC{hJ;`|BP)@pAECA&t(lNH$(S= z`n(P53t^zXm_4YR4BZRrOE#!4hk^P^)}V6hX1t)jYJ>V(7^ts5sh}RTL46|()I-^W z%4O@f_AQU0f71r_tuRpE&Ki{QNG?Adyr8~ggZge5sPAPBDmRz#ZI7lNwLyJ94Ac*@ z29=vj@Pc~G2KB=*P(R8ZR8B6z3+l% zAKeJsk50EGWC(SI-Y*3Gff% WdH&v0eFZis5eBO8Nd;A8gDMUKHS0+QRbqoG4FfehdrePyNMH zePuSN%fdjFXALShL-&H3V}qI-1`5{^W$6-f^HW|>^K4M_!$4JL4NA}HC)VSh>RVug zx;zZj71@KzX$QyOJ)o|%K~;r;T9`E`vpSdGeO^$DZBR?XKrPK0RBqkOzdf2-W`kND z25LptpmJ+{UQqVVeKTz5KHbkXqpi;iYK^U_nlMe(W(_K*z7N;*xXv^)>ugZ &C8f{P;!a(6lteLbay~zWr*#@;S4AfOmDyXY% zP@BR)ZJuFJ%^po%V}nYDfogeDLABbTwuFIdn_*BJJ(}8TgW47bYWtH4s@(>)BMj8e z83uKgM^ha(s9j;8I-gWfyKPX{hJo5M!=SGAXsXKw)g1 `C_SeGjM_b*j@zKpVW4_v7}O3As6HE1 ze;BCD41?O~0X1NQ8Vmz P0gQ>eU`iz1Rlzk}yy&eNsWa%m(#8VW3_< z!=PT{(bOw!P_GOF^{OWo)T?b!uL%Qn>kNas)uXA`+Mr$+2I}=sDyZ9RP;UqW^~M #08bd~`GHd~`GW^U-qy^*#@%uh`Z1)v)UO+6-5p=R;QW>o%wd!$5sw zhCzAmn=v1 0!(pHvnPE^L@_@2;?wesd_s#5g?&oIccX~kC zJNM17o%?3?JNI(~b(aT}y>s6T+qrLMzjHq~P Xu29=wpyr2qgP(@*&in9il zo2EYP(bOy(R7n`9(yT${rYSF|**2)MFi@9e4JtQHea54yavRi~Fi>-|29=wpyr3#< zQ1ik-&CeQCZkqb6M^lwHs0Cr5F3%cNZkqCfy21u^<;6kik*df-TxU<0G}qwzWV%*4 zZ^hk_C3N|+;ks*iiF{$f0+FSWWq7VfmPb~oX~1UOxJ-90=dYN5ccg}HzMr1DoF!Ch z$VTW6ZC%~ZjL0lxSsSUFmgUO3BkO_z1!cL}pXK^U zt)naEuev+Z5)6~>sD_CB=23og$=jrDMpkr3b=)8wL^er1v_`f}FQM}8$c}7Fp!>Y3 zI-`-Tk)2KnZ75-@ETJQ^E3kw;|FsgjBHgM4k9iyjE?|0H5^&o*81%tNkIK?*uE&CN z^q6bWPoNAVatJn-iX5MY3pSPs&Sg5TG^)(Tm6pmJ2+nfoKgjZAaF!$gL6)PDv1wJl z5@tIUoac12Jw kZO6V8#GKK@>E&EGa}E#UH0T Pt#&6=2x!1 zJMzNdB37`B?J#1IXRGEMi#!Jux!PFdxhTy1f9zccd=y0&pGhv+yEHcRfsh0UEtF6~ z=p8~r??p O`py&ajh>8_Zv3z#T_hzom?9Fag z52^dpuy_BP|C={&-g`4UJG<-l>-$-gB7>oz3Pn`-kv46SPScjk>-BHiVsC#4Oq!a-Gds z9<7!PraNr!$t4Q<_y$w7R??^)wo~RBb=r2uZIKpWP-;>&afj{f>oA?#Y5RzNq{;+G zeM$dCI9z8&s=D1A+s@lQmI(aRCGc|)_~}0s_=W9DiNLR20xyHWum7RIZ*1R61YU6o z{1F6R`G*33vi(mY@E4cB-$CFn|4`r`wm&5T|7HS1FbMqnp9u^J3V}H?^LyVsuyVHT zy%(WZO`Im+&S(uN#O7}yHg{qK5b{w-NJywVdH6(^%(k5}FWPqo;u48ok~wsU-IPP4 z9a3_bIdZm?9AS=}BPB !7!sf`krR1XK$gfDr#m$lTNXaG4 zkzbXPW6Y8FO3AV2$or(^cyr`jDY=X}@_s2f!5sO3lw95%`Jj|s(H!}Zl$>ae{F; ROvTTmCBP7`z`AuofDdxyWrR2Ki$j7AQ`sT=QNy!b( zk&jEsjm?oyNXbpjk>8e*o0}uQBPF*qM?NVfr
ch{#i VZUsCc4bL79J z{Qu1MQ zCu7a-5X>u{m DhVa%m~~GjrrJQt}t($YrJEugsAX zq~wd{$mOKu%jU@CrQ~nTkt;~aSIm(sO36Q%BUh4=e= ASC^85%#mwI$u@K3no@G8IdUy2*=~-UEG37TBiELa zBg~Ogq~s`b r%CN-k=S+(1e$ZjRhgN-klJ+(=4}F-LAJ zCC8d0H<6O#&5@f*$z{xun@PzD=E%*Z 1>zgCDmy#QrBX^LJ8=E4BHj!?> z3bFtD?N^~q aCZWJ|fof&qwZB^OyZ0FkM3kwpU# z*;+2LcmN{P@F9X9Dv9ka*-(k zi0mmBSvLTYz2qY62OzSyTx7!lMBX76**E}^edHpW1|YJpTx9bAMD~-5Y#D&a{&JD2 z0f@|yi%bhZ Pl-0Fi^_B0B^ia $ zxyZ=@h@2u9IW+*0Q{^J>2|(oCa*_82Ao3o$$Qc2MoF*5U6@bWl zxyT&>h+HNYnG=A><#Lg`0ucGQT;%QmL_Q%GxhDXTPs&B^4M5~ma*??Kh+H8Tc_09h zPs>Ff3P9vDa*>Av5V=w=@<;$8SII@b8Gy)V ?YyO{>+)hevE3KJ5;G6HN_EK^?Dfu^T%^jrV_EPd6T5?Az zxr3DamzLZ~O718n=V{5ErQ}XBvVyhbE>d!5DLGh6?kXjBk&;8S OUb>Y 429of4}h50sJzNXhY9 z@*pXBpyYLBJCrh7@(?L`u#}vjC1*;>L!<`tdr{g*DS4=rTv1!|C@DEp>LiI;@)#+3 zn3P;aOCBpF50{dwX~`3$ {lsr;OuBjzYlafbC$;n#sOeuM^w5w9I zhyiiIWCnY!4k{_0m$4kk6uhCm1 zB~Or&TWV`wEG18rl2f(hN2KIQ(ymI=l9x!ylci+87yCUXB~Ou(+i7clTuPoQC3n!0 zS4hcsOAXdZOI{@<-yGXUJx$4%nIH+HCIX=t|hx( hf?w*QgW7-d`?PUBJJndTJi-cd8w4__g2j>q~u4X Pe{p&wKe}DB|j-8 zFVT{Jlaim3w)s&l`FAOKg_OKZOa4Pjep;&b<63f_l>Cge<|j2|jHKk1QnL1)r#M7P zUL_?zqpi7-l>Dreyh=-!tcR)1Y^9ZF{m$HTlr J7n;@ftwhwF{ zy2(S~#j5o6qw$Ho+Z}+{3Bv0h3nadR>i16Escg))ovnOu9SW^{aNmnCFxyZu6hmMB z$X)>%iGu$`#S|3OQc*VZ3!c2b@$Q#F7PMW^trA`cNvo_(tK5=p`}C?+c~Q4Ycx5E5 zvJS0sYqss{t5)Urx>dqUC25t_Xq7Ky+pb)-Du30j5?(t=t4yX sZu4%cI74ayCqY>59!NEW40?VC*~-xY*%uFbCiQQ%3=6+Bu6=# ztGuO+g1fljjZt>kD#E*j>HCaBu(Cr{LHuz&@ox*_Ps+tl%uoEgUh$`qgT3T8)203M z?JDOeAM8@jRStetIiI6kSce?#tK=wO?t@n3DqpLGw=3ViqFm`+Ncmo!s>bb9e#%jP z%~gH}c)OC9V~3{ynrjcqu{(H0?cp9pF|tF{mQbATs4a(r@=ysB1aYe JzJqk5q-H<6Ur@er;z3-zi*52Vld+pJB z?JcAh;97jIQH#MezMj8|ExuQ1aS?Bei@IApT-M@Z-WHFC7E}LBV=cCmkYHbfqEVJn zi%JMBit+TJc*xbG9^@Dy6)tya+u--zZ%tF~=SUf2HBCEc}&+NO60fy`q0l*b{T@ zP^#)SXh#v0fGT*sryBL13SMu~dQXUgYADKEiak-W!w24tp70vA0=Q8%X4JyqMoDg? z){(WOrfy4;LBAADOX^;mmOL%Aq@K4W^^IE6K({50pcPFtEopXbTC!GXNpo*YS{SvY zrKcr9y-)%A9(P xYt1pIDnHwXKoV zTzlsnd-oiBFCmQY@Pu(N3Wpq83W8}Unuw;raW^`Oj(daac@&z5O6dkyFip+&R0yj) z)D_v>3EY>&6#=t*O24HjmlXRT_#dJbs2xx!N9E~STt@^O8=_cV*#iG=#nI>m=16Ja z4W%Hs`!GiegW&GV9BB%&+xr1#Lqkxky+2^V=r~{*fQ6!6sI+|mU?J3#WJzGK$KjBC z?6eQn@irmvzGRel#j(@dVF8bwFL?uuj-8pzE_Cc1<_<9F*g4$W-kvaa(~+d=cKe-> zA@1 =BQ%VCn hUh4g8yyEA$r-i*;!Ms+S7G6?I>o=X77J8e0Nz-)ybDm3_ZoOqq zf8MK`cAmH%TD%ed_<7=HoiM%1^TZ#S*7S6P&J(vV_onm2t?ra5ohQDa+maWd6)$O8 zl6`Gj@~6;}9B)f@8ntAXZcBDUEB0twviF*_1P2K%+2?IZu2D<&+Yh+XOGpz)FAi8W z`U E7 zkq62ahLWBk_XB9uIruxT#_{3`sO9y=u@<=}w4az6+He82s=hdWXoHdlt)C5wYD`~1 z?W!;Nb+JjU^h+KS=F=CX^JzA!ixPVpO0=KnXWzI$G@7elUZd+2{gV8c1NNGvUvjp$ z(+dcl{uyhnLSRA;=OkYcg*$t&6FWP5psl4IuW<}jt*BogIEJRps@lk)IB!f QRgL9?)PI_R%1S=18!jy;JGJT%Ivpz?5&DoLX z45_te8pck2a1?Ul0zq$LmF331kl^6N%Ki<@jSXPD`j+NK91qj6?*OymNSKaY0W28* z4A}R8h2oFl)aM7lLV`X6>_@=tLB|362{1UZ4*p6uYX8rZSA!MEtFXEg^fY*lJFkiX zQ^?TQSPuNvoe#NAFQl5ygoT8l@MJ s`?RjF!Ox= L|wHps__AUlJdVFi(6q6ck0nNV(#R4~=gYH*z6=-z;w01&SM`SRok~Hyp2B zv!(OGsu?Cm0m`%%=OV;tWDp#T7@dU(Y7?X7l-V??I3n4 XPkV*A zR0+fOvIKUT{rf9lSBZS<;&NVbqbh{iUvVLw=;XYT`Q|*aM@yPcdL@lKmQL?9(~Xj< z!HT8O_a%*H8baTfGztT%!=HRVlvF$Er;TVRy-_SZSif{3+CE`Q7^4=|EpFE|Z@g|v z2NkSI4KXTQ!PL9f20`XozH$_ik0ObDt76n@`ofNhC1dnU3cV0x;IfWF-gI12@K+fA z?5p9Ap0U7`0islh&r)hb-P#?5*Rzz-80VWdmr`kSJTpUDJ6%>O N?ZyOe#3h1?;^IMlaLJ$yTr&6#925L2E@>-+V{AX-k|E)^RLBE3HsnPd7kUql zXY(GooB}$AIuhu-$JPVpJ>}@UC*%mSJIVuQ3&}>YjtYPUhdv5eMZiKsXQ0xKN`S#a zyK+S~KT7n>k8J%wK`0iy&6N!3y04gB%bGfW0G^|Y8m8L$5G<><*9}2CtY`YpG0Upm zbxS&uSdOa6{;e&t8tby`Y$hR8VfKustdK3;qq{fN*YQvFj(WL{dO40pIgaKsGbE_3 z_0<&2kf3(dEeU4eT9csG(Jg6*br?-2Ca8n-iwj94!DuPScS4mQ*od7_xz@5AEsb)u z HJpipXIl5rt@1l)A_BO>HJpCbbc#mF29x2=C>eR22QGyVLhdJQ0Jg--n`Zb zE 8-D(k@1r6wO06%D3CEFpO38Wjcq)yBAF z>w^1gq$aK^nRebvM$YStt4e}id|XL4J$Tj^C2^H#TD3$Y)%@oTiKgQ!(R5rTnvSbP z({Yt(F0K;&;tDNBE759LuS~$TaEcIDXm!4Eg%;))R~2DpqY{q8iJrIusiBSzG_KGh zh^vk?u5b#(RVNx(xGcm~XIESWEs@1l7f)OTopG-QX6nUNRg-ZAS4X(frmE? 6|fi)0{C>_djEBE$caY_>a;Cu~Nfytkn2tu~Nfytkf_a zD>Y2VN)6MoQo~%V)X>HXM!#bRj_}3^Th@yZV#K?wSCnRaTos(Z8rp)B&|9#K_di^N z1wlM4iAO*X^khNs8w5cw8U!#x$acp#dV3vywQFZ-P+gb9!)3i+y 4`DZSiV%mjMOuKN3X%|j0 z?ZPSMTsXzwg^!^R&_{v`qmSe+?7HfcjLP8J=yjapaa|}L>gdZ{_b9k-Key}FmF4RG z-fR1sttN+rttRKBTTO5?R;6nnmu#zvBf~3xJ8Y|?+kP9c9mtM>ym;@)%wV~X!HR`z z13gAXQ8`r6Yn;k->u*KDIN~`o-8c@L4dH)o-!D$}TB;&gY6!Db5wO%ym!(hxnWZv4 zK_0x`JzIPq&aQ^D)nUiT?T)cIj`8f@Nqju_VQVi2tIOW>&_^u<=R}_6CP)vCDeyNE z{_f@l_BC2;g)=S3G_kb7rCMLq_Z8} Gf5yB~b3gBikN8Epii4RD`L z&Xk=^N}DjiD6I)i7+|pB*f9(GVUDUX&j7WFZllG8i~&Ylj`O@dH$dp$4_<_8T9t8q z4EqQ1W&8*J+Z%9nA0cj}8*uzp>)n3y&OEsC#a}Il`#QXV3Ht_NH131?;=bq%?uUNG z{c$YLz!&fU7OeDiuMq_6eKc5cA_VJP8m#zln3m21%!V()wDf+!=+)= NcmaHThOi2b`nWYMKoGvPj12swASdjsWB|3Gn{@i`Xo z^$jr`)wOLJqSn*b&X)~_2&%c`*x_fPp+;8;ebR>d2b3#kLPKEHeHqN5;X`PS V^;TKsB%)VDg9smAIzL%1-Osr74&mcrT1TCYE|JCD}t`m=j+f-OQ6gdHRZ4@L{{ z5L^xq#S?I*cNkd GfftT2>xJuiuNYx^&>10g zwblzan)Jev|HunRn)AYuf@->6ILe$Cj{3J=2v>x7(~dUnd!w(q?~MT88wtKQ3Vd(0 z;Cq|AzPH)!dtb;h;1-YXVY~Z|zs1b==-g$ScQ6<$7~V4x+0G5)J9PYlH`HC`hTFS@ z%HU-a7$u>`sF^oHVRn~?n(0QUZ^U6i8b d0mWss_QC<1!Fh zEHltfuYu0MbqE+q@Bm+M!i}8{xUtihhbE}i_4CkdHaP5crMg$xm;LNtm{{{7GW11g zFBwcQ9o7>Bt9rW7uK^Q{c7(9qlkR!jVG|ubQ8n5q@Aa;Uf@-Y8^I%6_w9w&j`;OlJ zJ86ecK!>pFeph 8=v1Mys}vDaAR>G>&C-ZC=8cHAj3VN=DFaOtboLnN6)t7GZNfnJnlsS7LS -t`)2u`8!y)tgfnc|B;RptHw7PR>B5O&BQ4Tu#jrD)Wq- z^lb8dKKINr8nu1?I7>2e(uvy#+9{g1v9tY0zCd!iYvMH%Iw%V*!n4phJli|?(T@7i z+fnD-p{~k8{UcKyHCM2mr=vdRI_gss9W~GBB;9A)c|v8n9d*CCj=KLJchvm 3Sv=`2 ~wsaxXbYq{QV4nza_$RHWJ`D8;(D69C^9Q>Fm&RP%t+q zEZDUf(ro~>Ie(=j%nrLOvqL}jl%yK-rdM0ANw<4x3`*M*vqLX 0GURJPyLLv%IbYcs^w zYCKn?i+G7A3aw95%Lt`u>%Y-0oz5;G_>`ihzvD|Q2We}X`n9Hw#>muk-}6L4skUq= z607- mRzMJ4s6arCYi)+q5j2 zCr`I@7k^_aShsXnc1y7!TM5=J-OXPUB}BJ$cb2|H*@|xI9+J`y-O@cJnuP0??&WW9 zB~rI^Z%OF_x~1=sXcEnrX3pzblJW(7A5AR~B1$1Yo+MNB^-p(75i`Vo{`pKPmgt*} zgh`%R<6bBXE96SKzA2xYq1J+ElCMsN6%`5^+$l)6bDa|k=XVdDYw Bn1PfZD^*3MHX+VP&9a;r8mV z1ZL)N0uOA03d)mku7U^>;j17gtWvfT%Tp^eY9xtd)T$(sqehV^4K?0n`vRl@E1pCO zaK%-kdWtJwb4DCuus=GiIyB)t_mB;Bh|w(sY|niCXcEn;uSuf0>I;&Bp6czqC5Nc` zSDftJzImwG;Qm-{A2$^2uiH0aDcMSy?O_d|R~mWJa?_sF;_%h$ #P zcdzElVd=q0C~9yKgl|Ho!JbmugalU;+Hy^xkz9xrVwP`D3UQV%ObUA~&+b;`wmhgK z3@6x}?uLut++7PGv8Jy1?VerqP^t)&a_euu>~h>9qzKc$BPqh^Uz8MO`qS%z@Gy|v zLSda<8-+OSMzX1jJQX|G703F;NHHe7D=EeaFHVYkjl;X;NVSH3E8qqgur?ut3G7Y? zC$I!5p(D`1&q1Ihy^T}{=<2}Vs-ccl4U+uqY^6My*LC5zeo0c2DczHl kVfqC_Kh;w4;@yN*|-!b#nkOhN^$DOl31yYM;UAqp*ldP z#gRBBun&pj1jdtiZ~I*?*3ZwyMzix(Ll-MeN;BaZq% EIk?*IPnxB^Xeu5|MIp)CQ z-5|Nb)7Iz-t#7gpA+FllBiaClCsDG~UEj~_F>7Iub?qGjO<3NwcPJd5=-OL>!&6;* z+u`tZ*WN1JjtpsgB{&>>P!;dRY4}NDKRxUE$?p5b`=B+?A`hA^JPzjra0pl}Dx~uJ z{m^~vR74)6bSnpFvBp)ErwQ~5xhIK517H7^Kst_ut>q>|w79`7F#LW&C~2^B2vU=O zQ|78sy1wITivOB1-;}xe aJ8C~8TAJLF;Z z?{A-Z`P)ab8N%1q^YXQi`1q!IrtLG&w0-88w$EJE=&UeXNpXh*?*a1-H@{{pbs-~c zgh=(b?E^-7xx#3(cJzow4;Y+fIY>^}Ru+HTT=C~i0=&u(7;gyGRd+}}p%S)TrtY1( zET6hNjMcqISA_6n1+b02e>)24^}_ ;UmyLkq88 zh4`K=?V8K_O*g4@gIf{#yTGBO{{7;1IJamBR&bxYY~v$&p}}$v9ZC7MpJ=quuogIb z5uW_IP;IB{26paTl*-kgfKlxmQ|%AI-(g<&hmE`+CZkPVJztfu2iAriA^b{QHB!yj zqs&8+ND}M$H%SuL^VLapUpc<^Mfvx94N`+iJVt785^Iv0Orq~Z*>8#;jTV{i`9+3( zlC3n?>G{R~sOJ|O)}rnC#io0HaXvlYl4^e({@~iAZ&L6`K0TjGhfFn|It`3xtaodX zTC6Wll3H9}B$H&mFMKsDF YvNe zG?(UW@^Md-Ym?fn$)`wduE{ARMc(AcOf~s!Pm`Od@qCvoGu`H8rrZ2jK5cFTZH8;$ z?40a8Jx}_Sos+fW;4ge|2Uj|%L+UWAd`0STR;f$s`of$!Og&PMmAgplapmfh`o3~} z`&Svcq-!8(KpHTKmq`OoVnfo9?+-Zj@mti0Myu2=x~Y^u<)eGTGN;`=3C nYh7o#p7Yok z?`2!i+2(!_dDstKy(gc1Q`Q(f!6)p0Vo7?LRp%^J2)@;72i=l1__~2j*ZO?%H<#1d zJs0Ss(Q|4+5a3xyr6 qp19s KZj!7%7m8m4vXE$bz)}%En7ff1n< kUR%IQS=kq7C`? zL^?@lb%&62uI@IZjix6glfw zD;3g~Yh^pq&SPQvtZIme_M|;4=OFF5avewqUpd~>HyUmcV-h=(j!a@W>Bvd!L^|bf z-;G8=FL?S!qud5oxWm=D&ZINbC6aXJbm>C6h`NLq@IRy4WH8xuUpVPXx-#j}q$?-A z8|fyu-6n%H>0X5IPP#LRg-CZ!Vh_?oPomLQ=xn7gj3Ka!8eYUTVuuso%4UDxPv8YT zNl#X9Nz#+6w-@OpuXnq_WHT%!ad&u}uc85o?DZJor9(q_N6InUV@@Y*!qO_d--xZJ zhL`3p(M6*iqrC7sEWN_Iif2SC;T_S~T5Nb}Vg8t7Fz>O0Bv=dzFY6oqvXw#f`Y(Xx zysNM~)o5YB5lvsoXOSU5JuD8l5nkn><*LKAsvNcvmX7VqVSI+R!~7S%g;!?ZxORnj znb0hEp{lHq;{KMzzS-U1YOrr?-PygOZQ~@cMQ69gJnO(=1z<56o^O;3uM0T{2haKx z;NIDQ*9fn&2jugku4{V;JP?sPnb>DAb92X5Z_=B2WG&L0^T<00yq`k0D6r4yDhZ5y z;jmu-9uEks?7sQYK6R$aoV!mQr(aSyt=^}O)h{Wm>+VzU&@Tz|zf8zrGTY@EjBsw- z^&x$j?P`-gobCFOzH-~;8m!9Fv3 CdEkPpxISbict|*R68~ z$zam!kql1y05ZTU{c9og_Zv)#_{*=+Xn#IKF{HnNWFV`&0U5|uK8OsG8*IP9Q@h-W zd@vczBsL<0If+Ba5Iu=Q^_>B_V5F-HhLWL7Y7;V)lbT5~y+&f|TCy%UU~sDG?t)=t z7?a+N4CAB^C&RtczgC6SrUM2~w-o!}Kt2;w=z|et1gpIT8Nt;)l8lsF>_Gl~Fp7*~ z5?hf`oW#*&w4OxcJ{U~{lH1=BjSlMHqsKP5WGis_GQ29yJc92YGFS()!&ag2)_j^e zWDxM;n%*IUDGPt`IT{@@>JQIW6k3db+CS`94^MJ6D7*%*;cG@0MYx?x(dad!OG`oC zQRFqhdMk^gX R$gTQH!sokk t5uXXSk3MPL89 zw^JRdn-1N{Y66+Sr1vKiIO!9~M2++T66w)sfq{75vz_V`-I8KNIgR!`x)!4*5qOOh zoE#4#lQ@+plgS#Dhe%c4q^pRy8s&^ekLwoI>TIyJ1V){Su2E+Sf!jGi?@Tg<(|anJ zs_F2%$=$5naB??S?jCZFuN-gNQ%26~ve+~-jY%9yrg0MQCHHD9Ch6o;2G4U84R*@t z%Bo9`>0~<7V>Fr0=`n-M@aplk8mAT)TW9cU4OoO>=Ou7jBXVZw_MF@8XOfvrlQCo_ zr%4vcGSDO%J*g|!PE{!sCb?F6DjKcPrD-e}jqcYiD!SY$qX%*dGwD+Xd;I9Ebh67i zXOUUVAa{{joIz%j**>RZ*=P=#!^({(bGUN%k^6k*_^vpuChNBdYM<(=eJ+{Hq)sGr zIjQr=JfBon`~Bp8R&Fx6pDQ%=eY!Yd@2JXgok3U=pX22RMlf$O0zOmt7^HamI9L zoXICNG|vr3XN=B%gk3*pO#8u^eEi@ZS5G`h9%S~ohdjvH<00};{`Pp^;P!fV*exUr zne= D=V+&zjeB8!;B8DtSBaWPq}C(&R(l`Ba-LLOlfv&bWy#3f{j z*8;HnkAJ0dG&*ZA9dl&{ L5H z>a4-Z2<^r2`@~&cXN}grg)4?<4ZK?1)pge3`EKF&^AUd5U`LRcG2hR}|L=AA|6}Aa zX6FaUW1O9rk!4;xyG{)yv#k&F_y6T&Ig|b%S 3OyWZF1Sj!H z@}! M8x$vc8Y5hx1bO&+xV`6E8?J~5q@Z!jGs{YW< zWIrLujz-J$haXrR%AywsVMl5BB3RC2Be>z_&5w*u_vn>CD(VrpDC3YnZ*=Y|T*3Ru zXg>wr*hMQ{>Z#OlN8-n(D?M+}<803rt@JTZrAAMGLZ6tf^kXxX(sf+gQ{hj+^d3HV zmRH4Xwx61=^b<3cJ^_`o3CL6ADHd)|lc%_FTR~QM)5F)Ar`V$lMvqStE+bwrxG3b9 z#XI%|gLkThKO>ebryl|EaAv=!?t{L4^cg}zzhLxU7{P}>HDhF9pY&&H0bMQl9q`fU zGlTb{I6_&+`8V=2qjhefk)Iiz$qS9Vpz3cDrI*@g`z{sHeIMb^`7UMLr}=5U@27dR zkHqznLj3xO;@(sczL8$t@Ls3kuSU=d9-HZ94c}skXCJ)u;={MHOa4!jr -nyMQ8H1!VsHzXdt$hftYp%+k(HeERb-WX7`tM4TEQaqS@JBCxSc%9NnA}< z>q*q#q(rBh?z?l}<74ZJQHKkcS+5wq_ytab=DRNL!Sd}IvWBU>gRJ4yevUlnHM8F- z^7lr|l{CS)Ttx00HfF4~WG$;ThpgpleV#ne)vB5Ees6SVLSf;Wp(jPtD_}5gKr7dg zb*#Q!WF1%Eda|CYPZcgKes6T?s4%}YxBz0wy|pTQ4~-+&)~bhG^ScdX1FLy2*}&Dj zk! &1AE$9PbK08@RapOl1q%!XzFbTR4eZ$yRThT>&Inw))w? z*5VSv&qntU=(zFE1~;{7rR(pGrfUfgyKMXdd4aX`5P5-X={B;>XFE?oIrtZ{pkEAj zBZ!*(VvzKyy~7U+k9h&f2D?3kGwNRq&g#X>1iu(vIs IWx&bu&h-cFAB6*S7^B8%Nv*&iQo%bBy_1NEyRy{oX)xzKONPmgE#H1f5FLBa$ zkR5u``|1wN;`a964OTtqc=#w6s3(1ay3FN7*(95(^&ZLQ)XE__yc0nx*-3V?a;L~n zuG}uN%U6y!e_sB9`Z9T$NjyVd<|OVWyLp4a1oW)``f{G>K+XFXftqJJQ1evdKz-cf zWcEECH+Y4-!dm?yd4+5B9 t#A z(+8gGIrPoizDMwf_& ZV?`(h*S74d*`UZj!6q8p zwGWqKubUH}a1@OlY{|!?KF9)Be3iV)O!z5zl{4X9ve)a1@N5Y`t-^%MXP23zePkb# z^cmU5Ny;U;hLXa?Ti#y@|Drd`v*DK@0&>E?%L)JA&T!YudVfva9RW|0%83YJ4;?uT zU*YZQp0Dr0*GTVIhYDY#eP3(C*CM{JHQ_7W5akl(h=i}D*w>!hBg*#lI2xE|KiN+k z6;Y1t=Nff@9N;|+;>v#j#Ptm3d+s}_e6Cr~An$}flb91xflCM=+TiV4o@@!)A0!8v z_Lay%PWwaTkVbp|tN>Mv(M_35dloCc9W_8OdDj<|)PM6jJ5Q%0326Tsd5vjbnY_kn zf0!KBXz#y)57*bfIuCb_v-Dv<&s(&<(S>&Yj0x9^M)UM7L)SLk>c382XX;lauXE}j zAxA{@Ba-}5GN`ZrAQg}L{M92M=)XNw7~r6!{@a{+ Z(!2)C&&q=eFJiW z)BbJpwy3@T^Gc#|LxYVyZoh|H@;T3GXmlw_2-}7Ra~IzB?~r$x_KnCpoc1TlNsadY zca7ji`P&|DTi~>BWZL!(RfD^7xt#MZd6#M5guKgX{~mcyqrLzBcF;awzmI4pYOlX^ zB>H_LlYZ|cPNsbe;^eeHMNVn7_rHM;H_qSo5v_Rb8=JO$BSXK>R$z37g% npqyBAtJTpB+|qpu0aHAFzJuMLyvA B z&UK%D?IikLAQzZ^ uKJ^zk|QoLPS=`JA)<7vu|Oec1Fv zUknd^QAF70fjb!8{_D#e9V938Uy?6bjrWi*xf;JBU-5A=-McC(q>YXS_b1EKM#uaH z1F!8n8tjS?(?&;wOOC?2DDG(ZVhL{>`ITSb7@Umomr|gl!S-@~lQixK&mu6BKRWWe zgzcYsR-*XlR7c~^!b7LoBcPR4kg|uno*C*jXcu qc1I)FnN8N s4^ufM2N|!m1A~1@?kcn#XK;HS8(W4Fem!pW07qFL4#jy_OWaU9* _aF7$m}4__bgeccaVAM<@Z1Ye) jI9KS)JdIZ&;nLl5e;= zza`)Db>@0B{EmFbN*^HKaiy=2E1J@RhRY4oj@_r>a_w6T9Ir49zbD_bIuDWWxjKI! zKk#+F?$Pi^@*^w#2KkXI{S)~~Q(DmQal?y1UWb3&Peb+|kNW>3|6_F?CI92<{F(gB z*LmEd;V 6OIC&_PIoxhXc`8wb8 zX!r;DgOxr-{@_agN&eK77Bqa)oF6_ZBn?P1j`!iuWyinBU##9U =iTFg=K8T+(n34z&g@cl3xCZdG#)Es6IxA2u8f_ zU}4bx^PGq;w7O5w)kv$m{(`PncZ17o!u0qlquIIdb$(B2dro;C+K8czn6>^Z`blVi z5FkN(`(1g&{S2n{{A7NG!NWr7)Wpr%FLLx3+=Yw0c!k0Gs<62eO6uR};(a7=G!!eU zJyQT%1VejaxP&Vc7wIR#7B)a^8e4!bT+WGr2a$xW_2!tT`RBg7PEtW~2(Uw# !?j4&Ltvr&+*fDDDn{~!G%$hQMxm&*SYB3JudOT5x(!<=t! zyHeUt2h` E-FG)LBN#%!wjBqADkA4#5M*tEblOGub@(V@6MyObL zC!p7o&+?D<_x4mINQtC1MACkV6l#b9BuZL?gZcoh`S5ph;?+i%-+h)`Exb|2)1w8T zt^!OC+U5d+9x5QJRF5c$CD#a}o=1K($cSe0skCT8enCJAO63<~mMo$@HT2r_IjKzx zfxJSju443)P*-6<3QOyvr-^j(%6tD>X 8TEt>0jD1B~uE_XdO8UOcUby{piA;URT+ zgWAG;;|-sAB(^;ot=E<7x~`?u_<_1Kch~zrX%rfvKV@+>p04vpw9>Xc8qGJX&AUA3 zZ? X7RV#chIHFV9&E560Zs&r4QH!({J5)fTTI(` zi)s6AR`t`Pfql2;Z(m7P-D=9dwZOib_k?dX-JUH5dsH00Jhw@j=So2?E5-6$ZTd;b zbFqNLO7mP@h%uY+ip6NWO_1-Iv&MmpI3~Y7{Upeb2PB@C?^?lh&smr7uJxkfoK-B@ zR5yCKGw&CrXWn#PU7BgzkbV-hEdxjyjkYkWY@8F>L^$)_F3jCM=Q(tiT9!#}Mn4IX z697q&N^TBz)}DL3Bt7#k2Qtbr`7P-uL4J8a%1h<9lI7 Z-u>XiYx} zdQ=3YqEwGGNjtNp^66+?iOFw6KMC>^0fAE`c#K$tcSYRQL-5)tKRf0~&k-wwjLJ-Y zd-_R`Uj>jVQu!TZ=iNIEhkWn+W2f}IyDHRGmFdxmeiHPk21qrj9-Sra+$F@N#~+hG zMiP_Xm3|WBR|llJRDL&*Uno-ly!&OTO>2O>8mz7!^pj9mO+ac&>*^_K%Wi2~YJrSe zOnz_rNsylmNU~J^9ZbG>-u;T;bDkVVGh=Ngzc2kH$WH+zg_jR&v#_4+mmT*=&tmHU zyAG4wpMDY~*9D|5FBw*>Ws+ajN)CHZ_bhj>VQACNmCZu;8k`%mS*Uw`q8?~mkF{n1 z{Uo%8X8-z{*0A;W$bo7T;Z$<3(W|}asT<65*=mgcBzLcBcKv&=!E`us2tS_eHMsRZ zau_vPBptn}UQOM*lY~2e@m_VB{(vN$u %q zg#K>~NMlp|pPO(0!$i>A|9t%A8g)N^qa4mP-Tk@wcR%bKFo@|~RsR%C?EYNS-M=py z&C>4?{iUw``FFqMykx)0?r#EJ+=O-iIQmKG{-%I5HP!w5jh?~_Io-EybiZkP wQB d_fEoteBj^pha33m{!I@+P|VptI?& zj5n8l5_sJJ>89m*^*AEv@xhB|W5}$K#UV=-XK2;XhM`U1cyH*!(8X|kC-l?M&lRUK zTUn|sgX0C|C*>E#X^*uh*=xeFy}iGEARLd`&)Gj#oMEY9J;Ux$oZ+G2#llO#ad7y= z@F{TI5&l~E5ycrXBI2Hi>54P5cx0u>DsUVTc~2z$emL@U 57wNlf&c `xnQJirRai!wo6=!^h_>A~LaGV@} zfBXVC9*KWH{zJuCdTZ%@rGa1iROv5EUsRlBx|A7QCR1^ity?y|Y&$p(C_Ap~L^y6Q zd$8QHcCCK2`iIreE6y5oYCKwF zIUG0D*i&O49RI2rRWn*~)|^{&S @aLldqPM!A@ zXT6H`>eYjC_2$)EUJuIEJ5%rLdQh%W>qfmA^--Knn>Fpyv^yMEHr>|rB{+WHET~zC z;%v6Q*~`uLD9+}w&6Apge>H!&`O4<26=w@Oy!;{tj@4T bj#^2 zvlM5mJ+0nq^|s Og)hL8XVtGy_ouq;%r^Hb;H)+*J-8GYNpjzoasZ- zC#6q? Cn$@=CpaV4cMt|v$kE@f?jR&+NtddDb99#+ns24QgODwxBbHQ5Dy*d zcWB$80~~+t=;#=sI6LNae7)nFinG(iPIEiWSDc+|c5cx*6^>WB;4U`B+2wqfD_wq6 zoLy78w(i