From bd72e6a621510eeed2536c8b78ce0b7a9e0b3cf0 Mon Sep 17 00:00:00 2001 From: Nicolas Bally Date: Tue, 12 Nov 2019 12:49:15 +0100 Subject: [PATCH] suite --- .../admin/i_websites_controller.rb | 11 ++ app/models/i_website.rb | 12 ++ app/views/admin/i_tasks/_i_task.html.haml | 17 ++- app/views/admin/i_tasks/index.html.haml | 6 + app/views/admin/i_tasks/preview.html.haml | 113 ++++++++++++++ app/views/admin/i_websites/preview.html.haml | 83 +++++++++++ app/views/layouts/admin.html.haml | 141 +++++++++--------- config/routes.rb | 2 +- .../20191112110616_add_token_to_i_websites.rb | 10 ++ db/schema.rb | 3 +- public/logo-olwen-technology.png | Bin 0 -> 10667 bytes 11 files changed, 324 insertions(+), 74 deletions(-) create mode 100644 app/views/admin/i_tasks/preview.html.haml create mode 100644 app/views/admin/i_websites/preview.html.haml create mode 100644 db/migrate/20191112110616_add_token_to_i_websites.rb create mode 100644 public/logo-olwen-technology.png diff --git a/app/controllers/admin/i_websites_controller.rb b/app/controllers/admin/i_websites_controller.rb index 5e10e70..a222430 100644 --- a/app/controllers/admin/i_websites_controller.rb +++ b/app/controllers/admin/i_websites_controller.rb @@ -12,6 +12,17 @@ class Admin::IWebsitesController < ApplicationController + def preview + @i_website = IWebsite.where(:token => params[:id]).first + + @i_tasks = @i_website.i_tasks + + #render :template => "admin/i_tasks/index" + + @preview = true + params[:no_detail]= true + end + def index @i_websites = IWebsite.joins(:p_customer).order("p_customers.name ASC, p_customers.id ASC, i_websites.name ASC").all diff --git a/app/models/i_website.rb b/app/models/i_website.rb index 4c2d8ab..190375f 100644 --- a/app/models/i_website.rb +++ b/app/models/i_website.rb @@ -8,4 +8,16 @@ class IWebsite < ActiveRecord::Base self.name.to_s+(" - "+self.url.to_s if self.url?).to_s+(" - "+self.prov_url.to_s if self.prov_url?).to_s end + before_save do + self.verify + end + def verify(size=16) + if !self.token + s = "" + size.times { s << (i = Kernel.rand(62); i += ((i < 10) ? 48 : ((i < 36) ? 55 : 61 ))).chr } + self.token = s + end + end + + end diff --git a/app/views/admin/i_tasks/_i_task.html.haml b/app/views/admin/i_tasks/_i_task.html.haml index 04c11b9..9bbc895 100644 --- a/app/views/admin/i_tasks/_i_task.html.haml +++ b/app/views/admin/i_tasks/_i_task.html.haml @@ -5,14 +5,23 @@ %tr %td{:style => (params[:no_detail] ? "width:30px;" : "width:150px;")} - -if i_task.done - =link_to admin_i_task_path(:id => i_task.id, :i_task => {:done => false}), :remote => true, :method => :put do + -if @preview + -if i_task.done .big_icon.done =ic :check - -else - =link_to admin_i_task_path(:id => i_task.id, :i_task => {:done => true}), :remote => true, :method => :put do + -else .big_icon.undone =ic :check + + -else + -if i_task.done + =link_to admin_i_task_path(:id => i_task.id, :i_task => {:done => false}), :remote => true, :method => :put do + .big_icon.done + =ic :check + -else + =link_to admin_i_task_path(:id => i_task.id, :i_task => {:done => true}), :remote => true, :method => :put do + .big_icon.undone + =ic :check -if !params[:no_detail] -if i_task.urgent diff --git a/app/views/admin/i_tasks/index.html.haml b/app/views/admin/i_tasks/index.html.haml index f8413b3..ffff0e7 100644 --- a/app/views/admin/i_tasks/index.html.haml +++ b/app/views/admin/i_tasks/index.html.haml @@ -63,9 +63,15 @@ .i_task_project .right =@i_task_project.admin.name if @i_task_project.admin + + =link_to ic(:globe), "/p/#{@i_task_project.token}", :target => "_blank" + + =@i_task_project.name    =link_to ic(:times), params.merge(:i_task_project_id => "") + + :scss .tasks_menu{ a{ diff --git a/app/views/admin/i_tasks/preview.html.haml b/app/views/admin/i_tasks/preview.html.haml new file mode 100644 index 0000000..ffff0e7 --- /dev/null +++ b/app/views/admin/i_tasks/preview.html.haml @@ -0,0 +1,113 @@ +.qi_header + %h1 To do + + +.qi_row + + -if params[:i_previ_id] + -@i_tasks = ITask.where(:i_previ_id => params[:i_previ_id], :done => false).all + + -elsif params[:archive] + -@i_tasks = ITask.where(:done => true).all + + -elsif params[:urgent] + -@i_tasks = ITask.where(:urgent => true, :done => false).all + -elsif params[:no] + -@i_tasks = ITask.where(:done => false, :i_previ_id => nil).all + + -else + -params[:all] = true + -@i_tasks = ITask.where(:done => false).all + + -if params[:i_task_project_id] and params[:i_task_project_id].to_s != "" + -@i_task_project = IWebsite.where(:id => params[:i_task_project_id]).first + -@i_tasks = @i_tasks.where(:i_website_id => params[:i_task_project_id]).all + + + + :scss + .i_task_project{ + background:white; + font-weight:bold; + padding:10px 20px; + margin-top:10px; + } + .tasks_menu + =link_to admin_i_tasks_path(:no => 1, :i_task_project_id => params[:i_task_project_id]), :class => ("active" if params[:no]) do + Non planifiées + + =link_to admin_i_tasks_path(:all => 1, :i_task_project_id => params[:i_task_project_id]), :class => ("active" if params[:all]) do + Toutes les tâches + + + =link_to admin_i_tasks_path(:urgent => 1, :i_task_project_id => params[:i_task_project_id]), :class => ("active" if params[:urgent]) do + =ic :"free-code-camp" + Urgent + + =link_to admin_i_tasks_path(:i_previ_id => 1, :i_task_project_id => params[:i_task_project_id]), :class => ("active" if params[:i_previ_id].to_s == "1") do + =ic :star + Aujourd'hui + + =link_to admin_i_tasks_path(:i_previ_id => 2, :i_task_project_id => params[:i_task_project_id]), :class => ("active" if params[:i_previ_id].to_s == "2") do + =ic :"arrow-right" + Rapidement + + =link_to admin_i_tasks_path(:i_previ_id => 3, :i_task_project_id => params[:i_task_project_id]), :class => ("active" if params[:i_previ_id].to_s == "3") do + =ic :history + Un jour + + =link_to admin_i_tasks_path(:archive => 1, :i_task_project_id => params[:i_task_project_id]), :class => ("active" if params[:archive]) do + Journal + + -if @i_task_project + .i_task_project + .right + =@i_task_project.admin.name if @i_task_project.admin + + =link_to ic(:globe), "/p/#{@i_task_project.token}", :target => "_blank" + + + =@i_task_project.name +    + =link_to ic(:times), params.merge(:i_task_project_id => "") + + + :scss + .tasks_menu{ + a{ + display:inline-block; + padding:4px 8px; + + &:hover,&.active{ + font-weight:bold; + } + } + + } + + #i_task_form + + + #new_i_task_form=render :partial => "admin/i_tasks/form", :locals => {:new_var => true} + + .row + #i_tasks_results= render :partial => "admin/i_tasks/results" + + .projects + %strong Projets avec des tâches en cours : + %br + -ITask.where(:done => false).where("i_website_id is not NULL").group(:i_website_id).map {|i| [i.i_website_id, i.i_website.name]}.sort.each do |iw| + =link_to iw[1],admin_i_tasks_path(:i_task_project_id => iw[0]), :class => "project" + + :scss + .projects{ + margin-bottom:100px; + .project{ + display:inline-block; + padding:5px 8px; + margin:5px; + background:white; + } + + } + \ No newline at end of file diff --git a/app/views/admin/i_websites/preview.html.haml b/app/views/admin/i_websites/preview.html.haml new file mode 100644 index 0000000..8c9f809 --- /dev/null +++ b/app/views/admin/i_websites/preview.html.haml @@ -0,0 +1,83 @@ +.qi_header + %h1=@i_website.name + + +.qi_row + + -if params[:i_previ_id] + -@i_tasks = ITask.where(:i_previ_id => params[:i_previ_id], :done => false).all + + -elsif params[:archive] + -@i_tasks = ITask.where(:done => true).all + + -elsif params[:urgent] + -@i_tasks = ITask.where(:urgent => true, :done => false).all + -elsif params[:no] + -@i_tasks = ITask.where(:done => false, :i_previ_id => nil).all + + -else + -params[:all] = true + -@i_tasks = ITask.where(:done => false).all + + -if params[:i_task_project_id] and params[:i_task_project_id].to_s != "" + -@i_task_project = IWebsite.where(:id => params[:i_task_project_id]).first + -@i_tasks = @i_tasks.where(:i_website_id => params[:i_task_project_id]).all + + + + :scss + .i_task_project{ + background:white; + font-weight:bold; + padding:10px 20px; + margin-top:10px; + } + .tasks_menu + =link_to url_for(:no => 1), :class => ("active" if params[:no]) do + Non planifiées + + =link_to url_for(:all => 1), :class => ("active" if params[:all]) do + Toutes les tâches + + + -if false + =link_to url_for(:urgent => 1), :class => ("active" if params[:urgent]) do + =ic :"free-code-camp" + Urgent + + + + =link_to url_for(:archive => 1), :class => ("active" if params[:archive]) do + Journal + + -if @i_task_project + .i_task_project + .right + =@i_task_project.admin.name if @i_task_project.admin + + =link_to ic(:globe), "/p/#{@i_task_project.token}", :target => "_blank" + + + =@i_task_project.name +    + =link_to ic(:times), params.merge(:i_task_project_id => "") + + + :scss + .tasks_menu{ + a{ + display:inline-block; + padding:4px 8px; + + &:hover,&.active{ + font-weight:bold; + } + } + + } + + + + .row + #i_tasks_results= render :partial => "admin/i_tasks/results" + \ No newline at end of file diff --git a/app/views/layouts/admin.html.haml b/app/views/layouts/admin.html.haml index 4472c63..581d44b 100644 --- a/app/views/layouts/admin.html.haml +++ b/app/views/layouts/admin.html.haml @@ -19,78 +19,79 @@ %body.admin - #right_bar - .element - =link_to "/" do - .cat#big_cat_clients - =ic :"home" + -if !@preview + #right_bar + .element + =link_to "/" do + .cat#big_cat_clients + =ic :"home" - .element - =link_to admin_p_customers_path do - .cat#big_cat_clients - =ic :"address-book-o" - Clients + .element + =link_to admin_p_customers_path do + .cat#big_cat_clients + =ic :"address-book-o" + Clients - .element - =link_to admin_p_customer_sheets_path do - .cat#big_cat_ventes - =ic :"shopping-cart" - Offres + .element + =link_to admin_p_customer_sheets_path do + .cat#big_cat_ventes + =ic :"shopping-cart" + Offres - .element - =link_to admin_i_websites_path do - .cat#big_cat_web - =ic :"globe" - Sites - .element - =link_to admin_p_documents_path do - .cat#big_cat_documents - =ic :"file-text-o" - Documents - .element - =link_to admin_p_payments_path do - .cat#big_cat_paiements - =ic :"eur" - Paiements - - -if false .element - =link_to admin_p_stats_path do - .cat#big_cat_charts - =ic :"bar-chart" - Stats - - .bottom + =link_to admin_i_websites_path do + .cat#big_cat_web + =ic :"globe" + Sites .element - =link_to admin_admins_path do - .cat#big_cat_preferences - =ic :"cog" - + =link_to admin_p_documents_path do + .cat#big_cat_documents + =ic :"file-text-o" + Documents + .element + =link_to admin_p_payments_path do + .cat#big_cat_paiements + =ic :"eur" + Paiements + + -if false + .element + =link_to admin_p_stats_path do + .cat#big_cat_charts + =ic :"bar-chart" + Stats + + .bottom + .element + =link_to admin_admins_path do + .cat#big_cat_preferences + =ic :"cog" + - -if @admin_space - %script - =raw '$("#big_cat_'+@admin_space.to_s+'").addClass("active");' + -if @admin_space + %script + =raw '$("#big_cat_'+@admin_space.to_s+'").addClass("active");' - %nav#admin_nav.navbar.navbar-default.navbar-inverse{role: "navigation"} - .container-fluid + %nav#admin_nav.navbar.navbar-default.navbar-inverse{role: "navigation"} + .container-fluid - .navbar-header - %button.navbar-toggle{"data-target" => "#bs-example-navbar-collapse-1", "data-toggle" => "collapse", type: "button"} - %span.sr-only Toggle navigation - %span.icon-bar - %span.icon-bar - %span.icon-bar + .navbar-header + %button.navbar-toggle{"data-target" => "#bs-example-navbar-collapse-1", "data-toggle" => "collapse", type: "button"} + %span.sr-only Toggle navigation + %span.icon-bar + %span.icon-bar + %span.icon-bar - #bs-example-navbar-collapse-1.collapse.navbar-collapse - %ul.nav.navbar-nav - -if @admin_space - =render :partial => "admin/admin_spaces/#{@admin_space.to_s}" + #bs-example-navbar-collapse-1.collapse.navbar-collapse + %ul.nav.navbar-nav + -if @admin_space + =render :partial => "admin/admin_spaces/#{@admin_space.to_s}" @@ -98,24 +99,28 @@ - %ul.nav.navbar-nav.navbar-right - %li.dropdown - %a.dropdown-toggle{"data-toggle" => "dropdown", href: "#"} - =current_admin.firstname - =current_admin.name - %b.caret + %ul.nav.navbar-nav.navbar-right + %li.dropdown + %a.dropdown-toggle{"data-toggle" => "dropdown", href: "#"} + =current_admin.firstname + =current_admin.name + %b.caret - %ul.dropdown-menu - %li= link_to "Gestion des admins", admin_admins_path - %li.divider - %li=link_to "Se déconnecter", admin_admin_auth_path(1), method: :delete + %ul.dropdown-menu + %li= link_to "Gestion des admins", admin_admins_path + %li.divider + %li=link_to "Se déconnecter", admin_admin_auth_path(1), method: :delete - + -else + #right_bar + =image_tag("/logo-olwen-technology.png", :style => "margin:10px auto;width:50%;display:block;") + + = yield diff --git a/config/routes.rb b/config/routes.rb index df88189..7883e45 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -7,7 +7,7 @@ Rails.application.routes.draw do get "sitemap.:f" => "public/seo#sitemap" - + get "p/:id" => "admin/i_websites#preview" diff --git a/db/migrate/20191112110616_add_token_to_i_websites.rb b/db/migrate/20191112110616_add_token_to_i_websites.rb new file mode 100644 index 0000000..04d1443 --- /dev/null +++ b/db/migrate/20191112110616_add_token_to_i_websites.rb @@ -0,0 +1,10 @@ +class AddTokenToIWebsites < ActiveRecord::Migration + def change + add_column :i_websites, :token, :string + + IWebsite.all.each do |iw| + iw.save + end + + end +end diff --git a/db/schema.rb b/db/schema.rb index aa3a5c6..d53c7ba 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20190722161039) do +ActiveRecord::Schema.define(version: 20191112110616) do create_table "admin_admin_roles", force: :cascade do |t| t.integer "admin_id", limit: 4 @@ -464,6 +464,7 @@ ActiveRecord::Schema.define(version: 20190722161039) do t.datetime "updated_at", null: false t.integer "admin_id", limit: 4 t.string "state", limit: 255 + t.string "token", limit: 255 end create_table "image_contents", force: :cascade do |t| diff --git a/public/logo-olwen-technology.png b/public/logo-olwen-technology.png new file mode 100644 index 0000000000000000000000000000000000000000..08b87e924945ee38816291db3520575053ff8f04 GIT binary patch literal 10667 zcmbVy1yCH_n)cxC?!#b%ySsaE*8v81cL)v%5-dpYAPMdg+$FdZEI1)}@BmBhz28^6 zTf6_>`lqU=&*}5L&#ULH?w*NNe0kp~N2Fii zXI+`G+PbtbG4KF`8IU53#7~$5&Db~%I7c%8X388BZ#N}e_XowvVfZB`z@DIC7k;Q; z`a(6l`2;OP9N^kJw49xgTQC%Y2Y}Sl%3~0lB5i(39Zd_xA(BX<)nh?;TL}2Y4hE;f z%Gm>|49pI8eoJ$g%WJVr9G*9J001qJ3s9Pr$ZiPv(6b8ys;UpB4dA|2MH>Y02yMwV zBThkO9f@LQBf?e$fLuy>`#8 z?4B~)z^nD!!q1)@ARUT}zsoRSE0}7jSOu=i?z6?!0tmpScBzn%e4Z~IgmUA=3W;f{ z&#kfZitABQlwOw4wT@^A`Qif5LhX|or8V2UtYi;s*E$rSknbz&pDwweaaCrY zRf{oI=LW>|7;!xVv)Hv{=wWM+Y>x`JXiZosK3XSxoyH_+eZos_^qMj7+rmLv@jn=e ziA08AOTkgssmF*6PkQrsOOy%6h7zN@1H+>+4-*u^iP2NBX;A2H@sx(u=kSP7If;kW z(dopl@>jkf)lnmcTMVm51d0H{Vf!UuNO;VF;dKl~Ouc|MFJrYl5HP|uO z<TV84Y2fy^l$X_^qnfm zws$=;s_$_uXjk&5$CaWg*aJ#(?ATYbF^l02fh$;2h7v|S;gnJjGt|Fag+i}O9)UAD zRXtse&(nQGT8rntxgyDn*+gGG9))J6#;3l>%OdWI(|@ewEw`yE%uT7jeAAiHfFBui zm!&vf>a8{Osc%lvUVI*z+AGGsa6%oaY>>UPaH9uU%3uVtQU_6?4nL=x{G4o6HYjf6f)u}?|{OZdx`s6TLDNdaI1)B;!h zd_Jt$Ev4n0BC{4J>=;JXh?Q(YbliV7U#=U%%i|tGgs1mHw6CaC~px- z2GeagNo?}oP!1Xv6rT7_m0cekIbFiu}>4o4j4 zA*QciaSPThyhT}rJ{Rv)F>a1wT#;-hlU(6Gnc50HQze1UV>s3d#XyM-#5`i?F1##3 zNw1coH_Uf|au)|%ERO;f9u2=JmeCeTQ-o@v^M*4OF_js9&b2Q|(0X6S_c`2OzTS@8 zP$6In#uGnBO8Fr67rH;SiL6Tj*+J1Sx_h=Y#Sm+fnhJvxmJnSY=A5*?tp2Q_&*n}R z$50AO6G&sdY5lSz%(qC>puH3CkC*;luKFl}38_*5)4cuhLe*fkEz~#qw#`b~s z_;%}cK~v#VxQ&R@UaTF4%gfvPyR_f_Pn=JzPiUf|q5-1f9UA`b9R~hs{=!$U4%X%a zN?ksmmaxxI6;)50ee5#ml6{VPLW6^Yvk5m3SAlEn0fh^N(;)hwuajnxU~;_WOC_D) zso-U+znK-eX?n-opE@+8$cQ))rgL4kmw`E}AWOH9hlU1tnr9S|mDA`XC`A z_G4yn=eu>!zD|JSMq;Dz4cxR*b5V=jmz&HES3!y==CM(~%-=V4HpQ*BuO17>K$J(% z6>PCPtEWDZwvt}JY&~(>6PMMUZ?tzJDm$t)LN9V7 zwkB~nc8PGB(N=Z9f~Y6EQ>TboD!6wa(XdHi&uV%(>=R-z-qv3|Zp zTKNRx*1(-gfl>jev8BjX(f0eHjaROU85w7n;Onvojrk%AoT(EOvo23m+Fp z3P#?fxRkV%*lHST#cK|ITqy2TL{m0OUq~0@2=c!_L@!78lhdMS;O6zv+AE*_UZj`c zOtmd)y`E8SX)^eVGQj=Ayud&U+;;rno1xR(?yMv}$WcV%makjot&XmzuBvXS46Om3 z9|$A8DoHFIVKjY&(i+K{eJnT?FQZ;$-|ggVHEtENRl$@lB%LU&ne9|HIPhujH=Ash zg*;5Nxm1r>@h2`bzlIu@?>oI{Og{4>I^SfTW0@Jexj4U;fC_CLHBwfLD>d_`TkJch zS6MNcs@Q^s8NFssM(9)0QYKa0vg^!8`;udlsY+(F=(LPVmsPVxk57Ij9Uj?WbJtln zOn7D(2-OGa?o_bW-_>8*JPQqZOwh`I#Z{$o4ZS}OGTtan0xO$<&(DI#X4&0>0LXy)u_CroT^;KM$zdx z#+3r48#`gAYHf!^y2>ucy=NY(7BS%bXtBoh#5Df7X>@6{WImz%eZ`Z0nvqwrP=mjG zyw`YG7Qe$s2ev8XSn~kxqu1+!cAn8gErvb$4s4WaEz7l7Vr|?rOuj~rG zG?)7ZgVt6j<*oE0FX^KnO@=Ne?eVK6%h$dS8OQq}=nu7@){BB4F?$j&a+W?V-wmnZ z1-G>^Tk9P;Z>(Jfe7K(b$@|S{L4rrc?!fV@lcU3^ZCi~?f9Jwp=w637)~(-V@R!GV zB!3G1z@(6xU*?Mi$1O9+(?06dV4R3it2E9>5(^nE^O5usYVoiV`S&U;LF!)Iut zv?JseG9y1RG^+L}#v77w7g%1NU#?7N-46hu0y1+jL^jZgtpL{hFi*C}xkvzD!xzT< zN34sDpkp>Voc^Z7zN;Hx%og1aMj4yPptm=4A>P39jnvrYkYakKyg(t z@BjdaaQ_@IHhD8IPaz0{cG~)$`l>2ImM%_g5Gxl8D4Va7>kAqH5E1uvg;+X3J%JWb z8#`xF(CL>h5YWy_6r{(i%Ax8i4YjpX@OOu5`M=V(^mninv;v8X0Y!X;UI?6^o)Dm~ zlcTeTkgq7{AG|^@<3E?#LBM}NJRL+ql7AEe^;Ok@(k|{$ATJvqt0gCo0FYmhjgyau zgPV^9$i=}a$j%|a&dJTn!70SSC&bGS{MQHcqRrjPT1Zny?q9lIW}+ZlPfu4Nc6J{h zA2uIuHWzmrc1}UT7Y;6VE-uy=1gnRivnRxt)!BpQF9sQ?ho!rntEZidGw=^1#KOhP zQxx=K=|5d?a{Zgu+2dbfdI=c2FT|Cdla1q#OaA~`S^kZ4^>TOohjJ@RcBmuN3F_?W z@q*?28|!N8;_2dH>+-))|GoTQ6ug91RrPNj|D!EVPJgTL@Rap_apPYB`5)09+J3H3 zc1@^|9A^#`X%2LSM#oY<=;TCl7{vAspX%|Nq_ZP)4 z)^Y#C3RP7hMQ0CBh_fYBQAQN>;y9a~ot2O^1PZZ&^6|1lxGZ>Cd0r;0ke32yg>YDL za0>`|B{z+vGn?r-oNCn{>WSLT3B;fTe9+V@jzL5xOfFvEi8F?SULDPdAT5b z+&r9I0)NS?x!b*LFNov+H_x9<_ops|6zn`+GUoTMZJ`Bq``5_P4)~8!5Q13#DREJd z<)7R_tw8^}Z1+D!;NSA#pR_)<&==DGN4ozB^Kh~D^ntiTC2d}!_3zab`~T*F2gLjT zu>ar6;D59Kf2+ZN%YLqxPViqh#6QI>Z6VG!(3iH!4*KH``=18$&)l&8_q6?E?LRf6 zzu+$&?$7Y=*7`E}yE#LhU#Q(*T5r6B8u3eOXI7Mv)b{;woD;CB^A&Nz?J(Hx2 zxT}dJOG&527THSsE`ykU0v$4FJlrEVQFs)+PvU$+>uxM7~FAPe!cGSxZr>Nbh2?8@Z4yzR7MlJ(9NyA zJadTXXae^OF&IS!wuyD0LWhxgAErKZfw#M_yQmwbn|yPLYh6EWrXJ3f+f}%RFv9?@ z9YsV(U=y%ux9M*_yR{hKOj*@Nk(|HEA+10fclgl2Q^6yXAnif{0W}?;NJ#TN&F-(4;}>-V3!54#tl z_H{=Rr9;W4xZEf-!K%v@VvYp9mVB-scjE)Uoav*lqKN?7tp(-Mel@_nl8f6`WE{GM z&r_d+U;iC2Dk-ToH?L5i0|<=%9L=NV54#9phr3BJ1xlp!Fs!F+s&L}j0t}%o5)PYl zy_Sr1kqoet*2ML3OIQbq=|{nsLpdiQxcG6q!z_nC4lEu3eQ1f13KAu-lftAS%K0>| zWhg>;B0it_AyvB?XY=eHDD56-q* z>N*o3%N#(PV&Ou&B|DRiJuTJtg!2b5z+PqC;a=nq+mX=YvlneHowRPe;yj*eSZ+QG zWSnuMFQBubAJ)@A2N7SQ62x6a!l_L>dM7WJo(UAZfU{2MX}X3T zH~TJD4MC#soV|Ha!QRDO6oGP5Fz%LmVe0Vb5mpl4@083@+@~ibTB*^%9b0Yu_q&S) zw8ayV&w4_qTF7B{vAA)cx?_x8hA_SmPzD87vr2N0ve2$7hw6n+lACy#HQ;;7rAzW# z@$K1B?+oyuN^*!-67ws$19=)g&UqiopuyC(KVp-*rjl&5(D8 z4|Yr0icM#g2Yqb>s_$82E2mYaVp*9HHu-G{VrYr6(JV=)C~iC62!Gb(+bgv7u8;`L zR0mYRvB~zj`TY3ySrc;)ZXbwurocSgXQ0t(JIt>#V?(7bj4q)X5?r+qxFo17^XN z&FkfKD#DDp)M}8X>|5xT@5bw*T=A@ z9g*a2vi&Fnuv_P{!xBW7$?Nw2+M7{_1Q2t~O64 zwxeiBX_&R(;FT0+Zfo>y-$?n7p7S6!ea5dRmJJ`W%-xD(64T-H z7q%;rnF8eCLIy?l3owbpk^=+uO{?kZ2wBH&3Vu9aMeSe7#XSiwMed8sMM|r7R)Y)l z<@)_CyN|#fAqBgBkLskG*jYCHoM@8;RI~7#aBnURVVZ#*)U4siUoRl^c33lL@L)N2 zxwy+*gs1|>GgSPK_9KojmCZ8B^94irH2~qP4jKMHekp>ZfcV2XC~17Q6&Jw?Q;Iv< zj?vQNyOtHIw;cTzH_4zqfX}Ku4+b9pnWMmUdVP4HIuOpjVj2%6`qP%tr@*L)0?a$) zbRl97UQLDi8Z=cc)VK(X#Z4GSKhXg}q(Y$uF?_wUc-gTPKiY45X~QPN-+To}zn|4p zabX0QS1UX9s;*UudsHfb?~_DZJqbSVazMlzv{~fh4lnx`KlsLLRZY5w)9oPeT;?h_ zaJVD}VtY*OU+ax5{+EJX3|l6A-j+|AN}61y z*d}~=gEK9-%PZxYAC9t&k|bDaL{3$ED`T8AEL1+^Hp6E&8!U@3-$hywt;+CjH~iSZ zW4}{8PAl}q4mWZNJ+IRcZW$3_v)is+d1A`l_;kCyG4OE zx^}7|uAP&dB*ki%V>Yf)*+eBe46LuvP42BFGwZsV{ zzK`+4(mpPOZYp=kjO~+Fh{%A%8e&VEonL~q-&-Ky zX$H2UBhSq|!bQGasV&yGX25c4Tla@gFmeUZo>a^TA5rgfe&?qr6L5NPFKO9)VX`RM zwalv=qontZC1*>7eh-5Mfz#5l&uKwnD!T8#G8+pgh$f}+5*g4@*!?CG0!n5e87FPs zLn=$_c&eCt&G-%qeWWrF*P?7am}2wrDNhM6AZnt&8EvNsej%rW8zPzfx^Y}H1??8dRny^K-D$|bPEEU~b6tsC|m>fcvt!|i& zCf28-hSGNUZR(caYJROZ-H*s5nlI!zxWIR;r~8-E|&)I-`k$Z@~PDf1)hparp(Fy z-0V+Uq{pSgR2!4&+x8b~Gqw3z^227BL4sdwr%^ItaD6pS&^CE+9+>6MF+hF0TXr^2 zSI&VK=cGZrg3y@3E4L97h+T#9rW)OggHYpY$E&!9ujQ*I%7 zpZ+Ep3&yIg?dOaS+5pbMNd)_1)9TMZcLr*%G=9>IY2VyTo?boQipJN%e~Ph_trxxN+&!nE*hN7`%TRRC$!7jy`9Eh&{-2`>fWFhaV& zz7fcBr1na5(GofOMHjHViz;9%lwqKBCq&~UXe+g5M$E5zIqjo<5*9nM znEl(3(7MT$=~YM~Qk*is65!_9W>Cbrx+X$i*M7hYPm%{n-kRv9`QWlNT(5Wbcc}@Uicec5BG|%t*q=7Dh{} zFNQkI?a(@+QoY76{$~5u3EmG&wd+y6f0p)BGu*v|YTq<4@d*6Whl4nlsa^G!CX0ey z_OYyYb>1xh;74W|B7McwzFb{q0dtbX*Ed4ID)GoXhu3*FE$^DAR|s@==LyHb0R{T9 z7)qQ*Z!^ih6)}9yKCp6|fEzZvfWLfLVi(r4$kXX$a2INnydPlzLl`Ey+{n&o#*S|N zFb)}9hA6C<@bR7L$0}-JREsQAFjYom;Z>O7N(z2d0B!QO%*ZGuGd28LetpTGd}=|r zRFP(->P^ni!ZsG$N>33l^p>>~^)f1;C&8Pl`yTh&cBPpBS-s~KaY)a)jwmwYJdHYU z3p1OfRuJK9;@Ajr4Pd@L^0l-gwT4K1YThB|5Um^2Mg7L>N6Iovis`Q$aK7kYzOp46 z^fOobln{H6rGBY}&#aVBb}o9qHnnlX#q?&0et?*AAMe!lNG;z>#`SKAKv0Q|zO|Q8 zwK+MXiR(I5{e&9;FGj`rxsko&$# zx;{zg0Ix_ zNg5aV%q}9bP-y2&a6jNE@7H$tMak_*K?@B^;Vx4t!F@%kaJGFR=tL69wUEp-L=P%( zEJQ+hpNPSeB{{1;uTP$m1h-R-$ZtQ2S%z3ZnfcxiMP{ZUcX8pB)AYs?!8oSy<}2X3 zl0%1({^jmls6B;nS8SE+HQy1P0b+TCdjRwv9tXoQ=22-*UZTN^(+JrzVjLR0Z zBcsG$F2$md!=dj~K?vDzQiV9NBF-&p=zX^T7KO20>Z1D@XCCnJR171(nLR2g5ttJ6vvYl8T$nwohM!X;^HHSx^&j=klzm%C-tIg~diOBgvNg{sTW8%fd%lM?)MXJp6jO#roB>N{a zbUE(xpks+VQ=imz)n71vRu&EYZHe@7nUVnXOpx1QUD zwmn6ckySIG*WO_wevtDNrWG%cHPnzgCmF?5vH+q+e=&zemBIi9xVw-#52#XUkgZFE zEw!Gx=t2Oj<5R#!=uBV0}417gY85Y_A`!tlpJ~M>_DQ?dpkw z4L1Y0tk^Ah>geIyxyP|@3GsNjdrkUz+d{c;t%=}FHo=) zai_h*nS2{{WT2lI=JcrkY1NkLTjUeVJ&O>``|l+t?!>~N$mtTTNjZxqTverWwOJTz zbZglb1794$%xl@8q6>R3^RWP1-Gj(fYrV!+jRq-h8-0%kfm{aqacV_yZhr+$NK&ko zG7m45;0NP8(N)853TL5oY zEd?nbd~s-4vE3#%d){2U zsRSfdk9P#|VSF>$HSiDnZh`kDeL{Z~8D4=uPO088EM8ru$3*={Iat%Sj`M5!sMYFT z94V2?H|OI`CLdUBpL6^)Ei=y49j*~g&PYdVo1}UD+ib^3kg8uWc_Vn0OeaKxsYx=# zXk`JpYKd}y%a}L(ss#ycKc`ZiMbfNL*ZGEPRWU>;oh_6{>Kxg7gr9E}V4O0$q#>d* zs|&DXtQ=WIV_bXK;dxSRV)%#?hxpYHSh}m!d-LQy{t8@$r?TMm<^sdG`Urw9bCtt) zOyQ)j7&jg;>&(KBT5o-5Cy15S*81~g%Le@UZ5*m-vov9Me9N~0mf^btmsP&fb4gRf zqsq1!)PbR$jc5ztXpOthV~2Rw_jSn|XU%&7@_9G0*koJd;|T#+U<(C34{_>G~ z+!cF>j}?SPSs)niUiLKMH~1!HRi5ePzE$eb;@b%=>2Q9HO%A3qlyMH2a^)|-ttwIb zJ{IS+>$N*oNMv>nZlW}|sSA>2=9vxGPu~n3@E&B{a0uZ&4Z>7OCw1JsE%$qKlD>zQ zar_4o_x&$R^fReuR)WisTRUxBEU`~ugMOW+TSlIEO3a?|&ca4pkB9aTK^m*7gRC4T z$OC~tv$JiAY3{FD%W$7p`6nKiTu!kEzn6VE!6JVP?L#DYOxzvqZwvcrq*wagpXbqL z4fltsw)7Ur#!7&zxM&4scLYP=07}|ulFI6kRK%EQ{tEYjdTd9!uF)~CvG}f$GCDmj8|-q~P&&=B`?3ndMPy=aQw))BXqrIk%%0`F zmgk<;DvN6TP%-4Tp|&Um^8@(oyrpsH!7*wYjOg?5+D8h*vZI5C={1_`Z@+zN{JbLA z4W$CA(M(^MpwMHj1ULROCMKqdHpw^4gGqhs<$Ppg%kG#b9zrH(Fr!5o5xx7$;Dx0d znfhKu1(%v*E@M>dq?B(WN9oFLtC0&gWFGBuq~5ZhE=})$iznq*$Pl=GDbnn9|0!oR zO1_!xhml*V9@=m*IrS=Xw`NWCK*^6>)y@wd#nZVm=VFR6?5&(1PBC(Qvz0E0?#b%H zX;2fl05AX(1!M+(CJ9V)U4ZG58|iOl3=LMI!>3FvJVs$F3|ybw>(2onKkt9MX)@HZ zFE}HPP1djKQN>kO-lpEcCzIPgNu(<>mV!A`!)F(Shf=(+i`9R5d*!twN`SCGDkb>x z@`Db|} zMqYV`U6fRyvBsDT{MoxE7+NkTpOj$2Wsh%Bjtq~7Vi(i4kMm=op;^gwtn_a{$UubvZWjlUc-l> zf@2KCLZNq^_%@LpQ8PC~v*?x46^@GBviNHn&_zWs;dd0NH|nIbXU{y+X(-iOj?904 O?o^b0B~vA39`+ylUp#C8 literal 0 HcmV?d00001