From 58bc13e8b66e0d28b6d2d28361bf13b7b9cc04b5 Mon Sep 17 00:00:00 2001 From: Yan Date: Fri, 16 Jun 2017 11:14:47 +0630 Subject: [PATCH 1/8] add auto_print field to migration --- db/migrate/20170403151731_create_order_queue_stations.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/db/migrate/20170403151731_create_order_queue_stations.rb b/db/migrate/20170403151731_create_order_queue_stations.rb index 6ad93bb1..6c327b8e 100644 --- a/db/migrate/20170403151731_create_order_queue_stations.rb +++ b/db/migrate/20170403151731_create_order_queue_stations.rb @@ -9,6 +9,7 @@ class CreateOrderQueueStations < ActiveRecord::Migration[5.1] t.integer :font_size, :null => false, :default => 10 t.boolean :cut_per_item, :null => false, :default => false t.boolean :use_alternate_name, :null => false, :default => false + t.boolean :auto_print, :null => false, :default => false t.string :created_by, :null => false t.timestamps end From c40a2c78e7ef58974f74e6361d41bf31e680b658 Mon Sep 17 00:00:00 2001 From: Yan Date: Fri, 16 Jun 2017 13:44:39 +0630 Subject: [PATCH 2/8] oqs autoprint developing --- app/controllers/oqs/print_controller.rb | 12 +++---- .../order_queue_stations_controller.rb | 2 +- app/models/printer/order_queue_printer.rb | 33 ++++++++++++++----- .../order_queue_stations/_form.html.erb | 1 + .../order_queue_stations/index.html.erb | 2 ++ .../order_queue_stations/show.html.erb | 5 +++ 6 files changed, 40 insertions(+), 15 deletions(-) diff --git a/app/controllers/oqs/print_controller.rb b/app/controllers/oqs/print_controller.rb index ecbc94e7..9fc2a2d7 100644 --- a/app/controllers/oqs/print_controller.rb +++ b/app/controllers/oqs/print_controller.rb @@ -6,13 +6,13 @@ class Oqs::PrintController < ApplicationController assigned_item=AssignedOrderItem.find(assigned_item_id) assigned_items=AssignedOrderItem.where("item_code='" + assigned_item.item_code + "' AND " + "order_id='" + assigned_item.order_id + "'"); - # printer for each stations - printer_name = assigned_item.order_queue_station.printer_name + # order queue stations + oqs = assigned_item.order_queue_station # print when complete click print_settings=PrintSetting.find_by_unique_code(unique_code) order_queue_printer= Printer::OrderQueuePrinter.new(print_settings) - order_queue_printer.print_order_item(printer_name,assigned_item.order_id, assigned_item.item_code ) + order_queue_printer.print_order_item(oqs,assigned_item.order_id, assigned_item.item_code ) # update print status for completed same order items assigned_items.each do |ai| @@ -28,13 +28,13 @@ class Oqs::PrintController < ApplicationController assigned_item=AssignedOrderItem.find(assigned_item_id) assigned_items=AssignedOrderItem.where("item_code='" + assigned_item.item_code + "' AND " + "order_id='" + assigned_item.order_id + "'"); - # printer for each stations - printer_name = assigned_item.order_queue_station.printer_name + # order queue stations + oqs = assigned_item.order_queue_station # print when complete click print_settings=PrintSetting.find_by_unique_code(unique_code) order_queue_printer= Printer::OrderQueuePrinter.new(print_settings) - order_queue_printer.print_order_summary(printer_name,assigned_item.order_id) + order_queue_printer.print_order_summary(oqs,assigned_item.order_id) # update print status for completed same order items assigned_items.each do |ai| diff --git a/app/controllers/settings/order_queue_stations_controller.rb b/app/controllers/settings/order_queue_stations_controller.rb index e8b9bbe0..408519d2 100644 --- a/app/controllers/settings/order_queue_stations_controller.rb +++ b/app/controllers/settings/order_queue_stations_controller.rb @@ -71,6 +71,6 @@ class Settings::OrderQueueStationsController < ApplicationController # Never trust parameters from the scary internet, only allow the white list through. def settings_order_queue_station_params - params.require(:order_queue_station).permit(:station_name, :is_active, :processing_items, :print_copy, :printer_name, :font_size, :cut_per_item, :use_alternate_name, :created_by) + params.require(:order_queue_station).permit(:station_name, :is_active, :auto_print, :processing_items, :print_copy, :printer_name, :font_size, :cut_per_item, :use_alternate_name, :created_by) end end diff --git a/app/models/printer/order_queue_printer.rb b/app/models/printer/order_queue_printer.rb index 9b3f5205..57a819c9 100644 --- a/app/models/printer/order_queue_printer.rb +++ b/app/models/printer/order_queue_printer.rb @@ -1,25 +1,42 @@ class Printer::OrderQueuePrinter < Printer::PrinterWorker - def print_order_item(printer_name,order_id, item_code) + def print_order_item(oqs,order_id, item_code) #Use CUPS service #Generate PDF #Print order_item= print_query('order_item', item_code) #OrderItem.find_by_item_code(item_code) pdf = OrderItemPdf.new(order_item[0]) pdf.render_file "tmp/receipt.pdf" - self.print("tmp/receipt.pdf", printer_name) + if oqs.print_copy + self.print("tmp/receipt.pdf", oqs.printer_name)*2 + else + self.print("tmp/receipt.pdf", oqs.printer_name) + end end - def print_order_summary(printer_name,order_id) + def print_order_summary(oqs,order_id) #Use CUPS service #Generate PDF #Print order=print_query('order_summary',order_id) - filename = "tmp/order_summary_#{order_id}" + ".pdf" - pdf = OrderSummaryPdf.new(order) - pdf.render_file filename - - self.print(filename, printer_name) + # For Print Per Item + if oqs.cut_per_item + order.each do|odi| + pdf = OrderItemPdf.new(odi) + pdf.render_file "tmp/receipt.pdf" + if oqs.print_copy + self.print("tmp/receipt.pdf", oqs.printer_name)*2 + else + self.print("tmp/receipt.pdf", oqs.printer_name) + end + end + # For Print Order Summary + else + filename = "tmp/order_summary_#{order_id}" + ".pdf" + pdf = OrderSummaryPdf.new(order) + pdf.render_file filename + self.print(filename, printer_name) + end end # Query for OQS with status diff --git a/app/views/settings/order_queue_stations/_form.html.erb b/app/views/settings/order_queue_stations/_form.html.erb index db7ed5fd..bc76f044 100644 --- a/app/views/settings/order_queue_stations/_form.html.erb +++ b/app/views/settings/order_queue_stations/_form.html.erb @@ -4,6 +4,7 @@
<%= f.input :station_name %> <%= f.input :is_active %> + <%= f.input :auto_print %> <%= f.input :printer_name %> <%= f.input :font_size %> <%= f.input :print_copy %> diff --git a/app/views/settings/order_queue_stations/index.html.erb b/app/views/settings/order_queue_stations/index.html.erb index 03da3c23..287fb10b 100644 --- a/app/views/settings/order_queue_stations/index.html.erb +++ b/app/views/settings/order_queue_stations/index.html.erb @@ -17,6 +17,7 @@ Station name Is active + Auto Print Print copy Printer name Cut per item @@ -31,6 +32,7 @@ <%= link_to settings_order_queue_station.station_name, settings_order_queue_station_path(settings_order_queue_station) %> <%= settings_order_queue_station.is_active %> + <%= settings_order_queue_station.auto_print %> <%= settings_order_queue_station.print_copy %> <%= settings_order_queue_station.printer_name %> <%= settings_order_queue_station.cut_per_item %> diff --git a/app/views/settings/order_queue_stations/show.html.erb b/app/views/settings/order_queue_stations/show.html.erb index 1a80c2c0..e92ed0bb 100644 --- a/app/views/settings/order_queue_stations/show.html.erb +++ b/app/views/settings/order_queue_stations/show.html.erb @@ -18,6 +18,11 @@ <%= @settings_order_queue_station.is_active %>

+

+ Auto Print: + <%= @settings_order_queue_station.auto_print %> +

+

Processing items: <%= @settings_order_queue_station.processing_items %> From 841f74b4066ba9ec1e547a6d7afc4732143e09c6 Mon Sep 17 00:00:00 2001 From: Yan Date: Fri, 16 Jun 2017 18:22:18 +0630 Subject: [PATCH 3/8] update footer in req bill --- app/pdf/receipt_bill_pdf.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/pdf/receipt_bill_pdf.rb b/app/pdf/receipt_bill_pdf.rb index 2d67989d..524ee7e5 100644 --- a/app/pdf/receipt_bill_pdf.rb +++ b/app/pdf/receipt_bill_pdf.rb @@ -229,7 +229,7 @@ class ReceiptBillPdf < Prawn::Document stroke_horizontal_rule move_down 5 - text "*** Thank You ***", :left_margin => -10, :size => self.header_font_size,:align => :center + text "Thank You! See you Again", :left_margin => -10, :size => self.header_font_size,:align => :center move_down 5 end From 0a496f227446325ffa7723438f3324279aed9a8c Mon Sep 17 00:00:00 2001 From: Yan Date: Fri, 16 Jun 2017 18:55:14 +0630 Subject: [PATCH 4/8] update order for oqs --- app/jobs/order_queue_processor_job.rb | 4 ++-- app/models/order.rb | 2 +- app/models/order_queue_station.rb | 24 ++++++++++++++---------- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/app/jobs/order_queue_processor_job.rb b/app/jobs/order_queue_processor_job.rb index e92faa36..5b3423dc 100644 --- a/app/jobs/order_queue_processor_job.rb +++ b/app/jobs/order_queue_processor_job.rb @@ -1,7 +1,7 @@ class OrderQueueProcessorJob < ApplicationJob queue_as :default - def perform(order_id) + def perform(order_id, table_id) # Do something later #Order ID order = Order.find(order_id) @@ -10,7 +10,7 @@ class OrderQueueProcessorJob < ApplicationJob #Execute orders and send to order stations if order oqs = OrderQueueStation.new - oqs.process_order(order) + oqs.process_order(order, table_id) end end diff --git a/app/models/order.rb b/app/models/order.rb index f3ae798c..2ea76a98 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -199,7 +199,7 @@ class Order < ApplicationRecord #Process order items and send to order queue def process_order_queue #Send to background job for processing - OrderQueueProcessorJob.perform_later(self.id) + OrderQueueProcessorJob.perform_later(self.id, self.table_id) end diff --git a/app/models/order_queue_station.rb b/app/models/order_queue_station.rb index b0619af2..062c2c65 100644 --- a/app/models/order_queue_station.rb +++ b/app/models/order_queue_station.rb @@ -8,26 +8,30 @@ class OrderQueueStation < ApplicationRecord scope :active, -> {where(is_active: true)} - def process_order (order) + def process_order (order, table_id) oqs_stations = OrderQueueStation.active + dining=DiningFacility.find_by_name(table_id) + oqpbz = OrderQueueProcessByZone.find_by_zone_id(dining.zone_id) order_items = order.order_items #Assign OQS id to order Items oqs_stations.each do |oqs| #Get List of items - - pq_items = JSON.parse(oqs.processing_items) + pq_items = JSON.parse(oqs.processing_items) - #Loop through the processing items - pq_items.each do |pq_item| - #Processing through the looping items - order_items.each do |order_item| - if (pq_item == order_item.item_code) - #Same Order_items can appear in two location. - AssignedOrderItem.assigned_order_item(order, order_item.item_code, oqs) + if oqs.id == oqpbz.order_queue_station_id + #Loop through the processing items + pq_items.each do |pq_item| + #Processing through the looping items + order_items.each do |order_item| + if (pq_item == order_item.item_code) + #Same Order_items can appear in two location. + AssignedOrderItem.assigned_order_item(order, order_item.item_code, oqs) + end end end - end + end #Print OQS where printing is require From b029cabeba1df3ae66da93e91ce466ce0d8f18de Mon Sep 17 00:00:00 2001 From: Aung Myo Date: Fri, 16 Jun 2017 19:04:25 +0630 Subject: [PATCH 5/8] update show detail and order --- app/views/transactions/orders/show.html.erb | 9 +++++-- app/views/transactions/sales/show.html.erb | 27 +++++++++++++++------ 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/app/views/transactions/orders/show.html.erb b/app/views/transactions/orders/show.html.erb index e1127296..903ed0f0 100644 --- a/app/views/transactions/orders/show.html.erb +++ b/app/views/transactions/orders/show.html.erb @@ -8,6 +8,11 @@

  • <%= @order.order_id %>
  • + + + Back + +
    @@ -75,11 +80,11 @@ -
    +
    diff --git a/app/views/transactions/sales/show.html.erb b/app/views/transactions/sales/show.html.erb index 5f4e8f6e..1e5cc41a 100644 --- a/app/views/transactions/sales/show.html.erb +++ b/app/views/transactions/sales/show.html.erb @@ -8,11 +8,24 @@
  • <%= @sale.sale_id %>
  • + + + Back + + + + + Void Sale + + + Complete Sale + +
    -
    +
    @@ -29,7 +42,7 @@ -
    +
    @@ -53,7 +66,7 @@ <%= @sale.receipt_no %> <%= @sale.cashier_name rescue '-' %> <%= @sale.sale_status %> - <%= @sale.requested_at.strftime("%d-%m-%Y") %> + <%= @sale.requested_at %> Sale item name @@ -85,7 +98,7 @@ <% @sale.sale_taxes.each do |r|%> - <%= r.tax_name %>(<%= r.tax_rate %>) + <%= r.tax_name %> <%= number_with_precision(r.tax_payable_amount, :precision => 2, :delimiter => ',') rescue ' '%> <% end %> @@ -226,19 +239,19 @@
    - +
    -->
    From c7efcb85d39532b514a920748e0266d1928fb570 Mon Sep 17 00:00:00 2001 From: Aung Myo Date: Fri, 16 Jun 2017 19:19:33 +0630 Subject: [PATCH 6/8] update sale --- app/views/transactions/orders/show.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/transactions/orders/show.html.erb b/app/views/transactions/orders/show.html.erb index 903ed0f0..f55cec28 100644 --- a/app/views/transactions/orders/show.html.erb +++ b/app/views/transactions/orders/show.html.erb @@ -51,7 +51,7 @@ Qty Unit Price Total Price - Option + Status Order By Created at @@ -67,7 +67,7 @@ <%= order.qty %> <%= order.price %> <%= order.qty * order.price %> - <%= order.options %> + <%= order.order_item_status %> <%= order.item_order_by %> <%= order.created_at.strftime("%d-%m-%Y") %> From 9f3acad10d29c6d461c86a8b5b344331a0080a81 Mon Sep 17 00:00:00 2001 From: Yan Date: Fri, 16 Jun 2017 19:26:21 +0630 Subject: [PATCH 7/8] update order for oqs --- app/controllers/api/orders_controller.rb | 2 +- app/models/order_queue_station.rb | 3 +-- db/seeds.rb | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/app/controllers/api/orders_controller.rb b/app/controllers/api/orders_controller.rb index 08847f6f..c383fafb 100644 --- a/app/controllers/api/orders_controller.rb +++ b/app/controllers/api/orders_controller.rb @@ -31,7 +31,7 @@ class Api::OrdersController < Api::ApiController @order.customer_id = params[:customer_id] == ""? "CUS-000000000001" : params[:customer_id] # for no customer id from mobile @order.items = params[:order_items] @order.guest = params[:guest_info] - @order.table_id = params[:table_id] + @order.table_id = params[:table_id] # this is dining facilities's id @order.new_booking = true @order.employee_name = current_login_employee.name #Create Table Booking or Room Booking diff --git a/app/models/order_queue_station.rb b/app/models/order_queue_station.rb index 062c2c65..d6e21c64 100644 --- a/app/models/order_queue_station.rb +++ b/app/models/order_queue_station.rb @@ -10,7 +10,7 @@ class OrderQueueStation < ApplicationRecord def process_order (order, table_id) oqs_stations = OrderQueueStation.active - dining=DiningFacility.find_by_name(table_id) + dining=DiningFacility.find(table_id) oqpbz = OrderQueueProcessByZone.find_by_zone_id(dining.zone_id) order_items = order.order_items @@ -31,7 +31,6 @@ class OrderQueueStation < ApplicationRecord end end end - end #Print OQS where printing is require diff --git a/db/seeds.rb b/db/seeds.rb index 56591e2c..07e5746c 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -147,8 +147,8 @@ admin_employee = Employee.create({name: "Waiter", role: "waiter", password: "111 admin_employee = Employee.create({name: "Waiter 2", role: "waiter", password: "22222", emp_id:"222", created_by: "SYSTEM DEFAULT"}) admin_employee = Employee.create({name: "Cashier", role: "cashier", password: "33333", emp_id:"333", created_by: "SYSTEM DEFAULT"}) -order_station1=PrintSetting.create({name: "OrderItemPdf", unique_code: "OrderItemPdf", printer_name: "EPSON-TM-T82-S-A"}) -order_station2=PrintSetting.create({name: "Order Summary", unique_code: "OrderSummaryPdf", printer_name: "EPSON-TM-T82-S-A"}) +# order_station1=PrintSetting.create({name: "OrderItemPdf", unique_code: "OrderItemPdf", printer_name: "EPSON-TM-T82-S-A"}) +# order_station2=PrintSetting.create({name: "Order Summary", unique_code: "OrderSummaryPdf", printer_name: "EPSON-TM-T82-S-A"}) request_bill_printer=PrintSetting.create({name: "Receipt Bill", unique_code: "ReceiptBillPdf", printer_name: "EPSON-TM-T82-S-A"}) crm_order_printer=PrintSetting.create({name: "CRM Order", unique_code: "CrmOrderPdf", printer_name: "EPSON-TM-T82-S-A"}) queue_no_printer=PrintSetting.create({name: "Queue No", unique_code: "QueueNoPdf", printer_name: "EPSON-TM-T82-S-A"}) From 2cf9c6947c397e899f6be408817d1435501ff805 Mon Sep 17 00:00:00 2001 From: Yan Date: Fri, 16 Jun 2017 21:06:33 +0630 Subject: [PATCH 8/8] print for oqs --- app/models/printer/order_queue_printer.rb | 8 +++++--- db/seeds.rb | 4 ++-- dump.rdb | Bin 18287 -> 18163 bytes 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/app/models/printer/order_queue_printer.rb b/app/models/printer/order_queue_printer.rb index 57a819c9..dae1ad53 100644 --- a/app/models/printer/order_queue_printer.rb +++ b/app/models/printer/order_queue_printer.rb @@ -8,7 +8,8 @@ class Printer::OrderQueuePrinter < Printer::PrinterWorker pdf = OrderItemPdf.new(order_item[0]) pdf.render_file "tmp/receipt.pdf" if oqs.print_copy - self.print("tmp/receipt.pdf", oqs.printer_name)*2 + self.print("tmp/receipt.pdf", oqs.printer_name) + self.print("tmp/receipt.pdf", oqs.printer_name) else self.print("tmp/receipt.pdf", oqs.printer_name) end @@ -25,7 +26,8 @@ class Printer::OrderQueuePrinter < Printer::PrinterWorker pdf = OrderItemPdf.new(odi) pdf.render_file "tmp/receipt.pdf" if oqs.print_copy - self.print("tmp/receipt.pdf", oqs.printer_name)*2 + self.print("tmp/receipt.pdf", oqs.printer_name) + self.print("tmp/receipt.pdf", oqs.printer_name) else self.print("tmp/receipt.pdf", oqs.printer_name) end @@ -35,7 +37,7 @@ class Printer::OrderQueuePrinter < Printer::PrinterWorker filename = "tmp/order_summary_#{order_id}" + ".pdf" pdf = OrderSummaryPdf.new(order) pdf.render_file filename - self.print(filename, printer_name) + self.print(filename, oqs.printer_name) end end diff --git a/db/seeds.rb b/db/seeds.rb index 07e5746c..56591e2c 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -147,8 +147,8 @@ admin_employee = Employee.create({name: "Waiter", role: "waiter", password: "111 admin_employee = Employee.create({name: "Waiter 2", role: "waiter", password: "22222", emp_id:"222", created_by: "SYSTEM DEFAULT"}) admin_employee = Employee.create({name: "Cashier", role: "cashier", password: "33333", emp_id:"333", created_by: "SYSTEM DEFAULT"}) -# order_station1=PrintSetting.create({name: "OrderItemPdf", unique_code: "OrderItemPdf", printer_name: "EPSON-TM-T82-S-A"}) -# order_station2=PrintSetting.create({name: "Order Summary", unique_code: "OrderSummaryPdf", printer_name: "EPSON-TM-T82-S-A"}) +order_station1=PrintSetting.create({name: "OrderItemPdf", unique_code: "OrderItemPdf", printer_name: "EPSON-TM-T82-S-A"}) +order_station2=PrintSetting.create({name: "Order Summary", unique_code: "OrderSummaryPdf", printer_name: "EPSON-TM-T82-S-A"}) request_bill_printer=PrintSetting.create({name: "Receipt Bill", unique_code: "ReceiptBillPdf", printer_name: "EPSON-TM-T82-S-A"}) crm_order_printer=PrintSetting.create({name: "CRM Order", unique_code: "CrmOrderPdf", printer_name: "EPSON-TM-T82-S-A"}) queue_no_printer=PrintSetting.create({name: "Queue No", unique_code: "QueueNoPdf", printer_name: "EPSON-TM-T82-S-A"}) diff --git a/dump.rdb b/dump.rdb index 7202f930a656071a72de3c35f817a6055656ddcb..b21f067994bac5cdd41cbb593e9e26e89dcc0cab 100644 GIT binary patch delta 4439 zcmb_fYjBj+8UDV#WD^LbPN&oU z+j(cd^Pcy8p7(j5^VxIe-=8)2ST~_h*WC9-^*~=H9qGz+9sTxevy3aoKW{K~+%v~# ziQGNT55L974;p)KTc}sAo2$R+nQPMswsOXo&$Zn z7AHR6mhR4;iP+1r*Y^J7<|xOQNEx-Mg{f?8*tR9z;C|EC(4X3jn78lI-V7qXf!aQ(LxX(&JpeYtH_WC$Ox}jc)7h>B#g!;p5ulsoFk}8OZc`ygl3d0_jX= zYG7+WR6gG+*k|)x7=A2l^3)VR>NBrjvDe?5>F<3kG!g$O@f{sz!+Lnm$zUDa5mU>G zV$5x&s7^IMsDJ&9U}N(5P|(;iX&9NuzAL;Gs-i*2jy4o|nsHYQ!*9;x@pyivxzpCj* zb|cC>x-HXz20RF_2nUAZ;}06~Y?HAz_C2)F>$Gap+)>8`VGOWhmSquvvw!t%>gXBh zj^zxoym;l8W6Uc!$zNDlOerf0A1RCSiTEE9Nj+2S)=%8}=8R(Twq&-@58Z&~u>g8x zOaDV?Sx@{2;U;rg%VhQGT-*58T^F>yY~iZCljf+GN+GjX%uO9=W$ax8=d(8D#sl0Y zj7U*v6eTvZqfU%rIT8Ob(eAeWnHx{m*OnS(3&xXrG#XkU%9(eBZ8!57v^m)}-o5K0 zaZmXNl^(OAlK@;Aob&lX^sr~*io#Y)L35e`bqmi9#aY+{p}{A|^!QqkDr zlIq*%Z;)Onh-R6yej;OSF3y`Yk(gkefisL0bcho`%*Beh#I+*9FB2fy`LM)a2w7}CNhFDVM=}T4IW=s?s47!9BbOAyNW4(Xz)B5e| z6EjW0(eFJlqR5XvGz3CA6uv*cJNJT*Nv0SYPJUiEdIG%~bJ@_8I|L0@lv;%u;FM6| zG+04@pc!YO!Ojf47(7u|!VaK{8Aaq2mqc9;IWM=Ug)SLo9>{V2d>zx|lz%5a6U6&6KlZ;Hn-%qr;*sW@KV`o{hh%E@=s3bCL9q@*) z1us7I8yCFSD#7b>!Se%n8?FIw$BeSbP(fw(Vxhrrlr*L(_fmjKp#ZVLpd%pwDd&3RPi3rR3B(JO+mo8}zGuI64-e={kdw4%^wm{~z=%6RFzpgB<|#<|P*{EGO@ zb7ZHZy2ol9V?;n_lq_HQzuysP*L8Qqj@q)!*o2_L>i7qlON-cu@)>RcZhspx!WT;Hrx1{e&K^ z`-(HPz%aWjy%|=z1l|>fVP$z3nsSat0S74`oatI$*f@>>ffxY=KcnOJlX^0etFQ`K zpp~v3E}Flz?0vez$h)isEA;4)9KUPy5ER@!XpiHT9V-@ET4BYoV3tFO2ROI^t7yf(!Ujhgt-_o+?n8n!0*^2S zO`g&y_>}&Mc(cL>I}ePQUKDP ze4jSw+@NQz?phkMJGrz{oJB}V@CZ%AV_1p|jR3wXl~$eJcHY^c53IKI7r}Y@Z>#6d zr#4GVlD5E?wX+PYb_&Q7cwp>VptsfBI9J$F2QNWEb2>M zp0f4D*plXIPNE< zCXJAv3N?5|UyKJmH=omA#_#bNBk=?J?!@;!D-P)2CAN4!i9E06ntN+Kf|2lzkmo|Q zMekiRw;Js^Uvq~KT*OOjp7SgY=vA#7y&v<-dS9!W?rl$JD86da$a+25s?aBa=To~q zR#YtSf@=m3BtwhWfBf@HH3}?Es)MJsT6=4?k#;ZX*N?B=5S*%i(GORJEqZ>&o#Eq2 zePL~^-kZ*3E{$lUh!`RR9R-uAPqKqpZds?W8BYR_D*4NaOMblM!e>d>cF<}z1L N$vN*ly{GZ~zX47x65{{> delta 4413 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 Kzxvk5p8o+G914X1