From 510dcfdd413c579376db5aa941cd5645845fd093 Mon Sep 17 00:00:00 2001 From: chasing <282692248@qq.com> Date: Sun, 16 Jul 2017 18:02:14 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E8=96=AA=E6=B0=B4=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/coderising/payroll/Affiliation.java | 5 + .../com/coderising/payroll/BankMethod.java | 8 ++ .../coderising/payroll/BiWeeklySchedule.java | 18 +++ .../payroll/ComissionClassification.java | 28 +++++ .../java/com/coderising/payroll/DateUtil.java | 99 +++++++++++++++ .../java/com/coderising/payroll/Employee.java | 56 +++++++++ .../com/coderising/payroll/HoldMethod.java | 7 ++ .../payroll/HourlyClassification.java | 40 ++++++ .../com/coderising/payroll/MailMethod.java | 8 ++ .../coderising/payroll/MonthlySchedule.java | 13 ++ .../coderising/payroll/NonAffiliation.java | 7 ++ .../java/com/coderising/payroll/Paycheck.java | 41 ++++++ .../payroll/PaymentClassification.java | 5 + .../com/coderising/payroll/PaymentMethod.java | 5 + .../coderising/payroll/PaymentSchedule.java | 8 ++ .../payroll/SalariedClassification.java | 14 +++ .../com/coderising/payroll/SalesReceipt.java | 21 ++++ .../java/com/coderising/payroll/TimeCard.java | 19 +++ .../coderising/payroll/UnionAffiliation.java | 17 +++ .../coderising/payroll/WeeklySchedule.java | 12 ++ .../src/main/resources/employees.txt | 9 ++ .../src/main/resources/salesreceipt.txt | 9 ++ .../src/main/resources/timecard.txt | 9 ++ .../src/main/resources/union.txt | 4 + .../com/coderising/payroll/EmployeeTest.java | 119 ++++++++++++++++++ 25 files changed, 581 insertions(+) create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/Affiliation.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/BankMethod.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/BiWeeklySchedule.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/ComissionClassification.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/DateUtil.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/Employee.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/HoldMethod.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/HourlyClassification.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/MailMethod.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/MonthlySchedule.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/NonAffiliation.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/Paycheck.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentClassification.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentMethod.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentSchedule.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/SalariedClassification.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/SalesReceipt.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/TimeCard.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/UnionAffiliation.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/WeeklySchedule.java create mode 100644 students/282692248/ood/ood-assignment/src/main/resources/employees.txt create mode 100644 students/282692248/ood/ood-assignment/src/main/resources/salesreceipt.txt create mode 100644 students/282692248/ood/ood-assignment/src/main/resources/timecard.txt create mode 100644 students/282692248/ood/ood-assignment/src/main/resources/union.txt create mode 100644 students/282692248/ood/ood-assignment/src/test/java/com/coderising/payroll/EmployeeTest.java diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/Affiliation.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/Affiliation.java new file mode 100644 index 0000000000..091165a2af --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/Affiliation.java @@ -0,0 +1,5 @@ +package com.coderising.payroll; + +public interface Affiliation { + public double calculateDeductions(Paycheck pc); +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/BankMethod.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/BankMethod.java new file mode 100644 index 0000000000..a7b0dd9436 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/BankMethod.java @@ -0,0 +1,8 @@ +package com.coderising.payroll; + +public class BankMethod implements PaymentMethod{ + private String account; + public void pay(Paycheck pc){ + System.out.println("转到银行账号:"+account+"。备注:"+pc); + } +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/BiWeeklySchedule.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/BiWeeklySchedule.java new file mode 100644 index 0000000000..943b4ae757 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/BiWeeklySchedule.java @@ -0,0 +1,18 @@ +package com.coderising.payroll; + +import java.util.Date; + +public class BiWeeklySchedule implements PaymentSchedule{ + private Date firstPayDay; + public BiWeeklySchedule(String firstPayDay){ + this.firstPayDay = DateUtil.parseDate(firstPayDay); + } + + public boolean isPayDate(Date date){ + return DateUtil.getDaysBetween(firstPayDay, date)%14 == 0; + } + + public Date getPayPeriodStartDate( Date payPeriodEndDate){ + return DateUtil.add(payPeriodEndDate, -13); + } +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/ComissionClassification.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/ComissionClassification.java new file mode 100644 index 0000000000..e8ef651b11 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/ComissionClassification.java @@ -0,0 +1,28 @@ +package com.coderising.payroll; + +import java.util.ArrayList; +import java.util.List; + +public class ComissionClassification implements PaymentClassification { + private double salary; + private double rate; + List receipts = new ArrayList<>(); + + public ComissionClassification(double salary, double rate, List receipts) { + super(); + this.salary = salary; + this.rate = rate; + this.receipts = receipts; + } + + + public double calculatePay(Paycheck pc){ + double totalAmount = 0.0; + for(SalesReceipt sr:receipts){ + if(DateUtil.between(sr.getSaleDate(),pc.getPayPeriodStartDate(), pc.getPayPeriodEndDate())){ + totalAmount += sr.getAmount(); + } + } + return salary + totalAmount*rate; + } +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/DateUtil.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/DateUtil.java new file mode 100644 index 0000000000..0b2c6aad54 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/DateUtil.java @@ -0,0 +1,99 @@ +package com.coderising.payroll; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +public class DateUtil { + public static final long SECOND_IN_MS = 1000L; + public static final long MINUTE_IN_S = 60L; + public static final long HOUR_IN_MINUTE = 60L; + public static final long DAY_IN_HOUR = 24L; + public static final long DAY_IN_MS = DAY_IN_HOUR*HOUR_IN_MINUTE*MINUTE_IN_S*SECOND_IN_MS; + private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + public static boolean isFriday(Date date){ + Calendar calendar = new GregorianCalendar(); + calendar.setTime(date); + return calendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY; + } + + public static int getDaysBetween(Date beginDate, Date endDate){ + assert(endDate.after(beginDate)); + return (int)((endDate.getTime() - beginDate.getTime())/DAY_IN_MS); + } + + public static Date parseDate(String strDate){ + try{ + return sdf.parse(strDate); + } + catch(ParseException e){ + throw new RuntimeException(e); + } + } + + public static Date add(Date date, int dayCount){ + Calendar calendar = new GregorianCalendar(); + calendar.setTime(date); + calendar.add(Calendar.DATE, dayCount); + return calendar.getTime(); + } + + /** + * 判断当前日期是否是当月最后一个工作日 + * true: 当前日期是工作日并且与下一工作日不同月 + * */ + public static boolean isLastWorkDayOfMonth(Date d){ + if(isWeekday(d)){ + Date nextWeekday = nextWeekday(d); + Calendar calendar = new GregorianCalendar(); + calendar.setTime(d); + int mouth = calendar.get(Calendar.MONTH); + calendar.setTime(nextWeekday); + return mouth != calendar.get(Calendar.MONTH); + } + return false; + } + + public static boolean isWeekday(Date d){ + Calendar calendar = new GregorianCalendar(); + calendar.setTime(d); + int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); + return Calendar.MONDAY <= dayOfWeek && dayOfWeek <= Calendar.FRIDAY; + } + + public static Date nextWeekday(Date d){ + Calendar calendar = new GregorianCalendar(); + calendar.setTime(d); + int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); + switch (dayOfWeek) { + case Calendar.FRIDAY: + calendar.add(Calendar.DATE, 3); + break; + case Calendar.SATURDAY: + calendar.add(Calendar.DATE, 2); + break; + default: + calendar.add(Calendar.DATE, 1); + break; + } + return calendar.getTime(); + } + + public static Date getFirstDayOfMonth(Date d){ + Calendar calendar = new GregorianCalendar(); + calendar.setTime(d); + calendar.set(Calendar.DAY_OF_MONTH, 1); + return calendar.getTime(); + } + + public static boolean between(Date d, Date startDate, Date endDate){ + return d.compareTo(startDate)>=0 && d.compareTo(endDate)<=0; + } + + public static String format(Date d){ + return sdf.format(d); + } +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/Employee.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/Employee.java new file mode 100644 index 0000000000..75fbc04ddf --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/Employee.java @@ -0,0 +1,56 @@ +package com.coderising.payroll; + +import java.util.Date; + +public class Employee { + String id; + String name; + String address; + Affiliation affiliation = new NonAffiliation(); + + + PaymentClassification classification; + PaymentSchedule schedule; + PaymentMethod paymentMethod; + + public Employee(String id, String name, String address){ + this.id = id; + this.name = name; + this.address = address; + } + public boolean isPayDay(Date d) { + return schedule.isPayDate(d); + } + + public Date getPayPeriodStartDate(Date d) { + return schedule.getPayPeriodStartDate(d); + } + + public void payDay(Paycheck pc){ + double grossPay = classification.calculatePay(pc); + double deductions = affiliation.calculateDeductions(pc); + double netPay = grossPay - deductions; + pc.setGrossPay(grossPay); + pc.setDeductions(deductions); + pc.setNetPay(netPay); + this.paymentMethod.pay(pc); + } + + public void setClassification(PaymentClassification classification) { + this.classification = classification; + } + public void setSchedule(PaymentSchedule schedule) { + this.schedule = schedule; + } + public void setPaymentMethod(PaymentMethod paymentMethod) { + this.paymentMethod = paymentMethod; + } + public void setAffiliation(Affiliation affiliation) { + this.affiliation = affiliation; + } + @Override + public String toString() { + return "Employee [id=" + id + ", name=" + name + ", address=" + address + "]"; + } +} + diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/HoldMethod.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/HoldMethod.java new file mode 100644 index 0000000000..d1f4b48a4d --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/HoldMethod.java @@ -0,0 +1,7 @@ +package com.coderising.payroll; + +public class HoldMethod implements PaymentMethod{ + public void pay(Paycheck pc){ + System.out.println("转到财务处:"+pc); + } +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/HourlyClassification.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/HourlyClassification.java new file mode 100644 index 0000000000..9cdce41184 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/HourlyClassification.java @@ -0,0 +1,40 @@ +package com.coderising.payroll; + +import java.util.ArrayList; +import java.util.List; + +public class HourlyClassification implements PaymentClassification{ + private double hourlyRate; + private List timeCards = new ArrayList<>(); + + public HourlyClassification(double hourlyRate, List timeCards) { + super(); + this.hourlyRate = hourlyRate; + this.timeCards = timeCards; + } + + public double getHourlyRate() { + return hourlyRate; + } + + public void setHourlyRate(double hourlyRate) { + this.hourlyRate = hourlyRate; + } + + public double calculatePay(Paycheck pc){ + double salary = 0.0; + for(TimeCard tc:timeCards){ + if(DateUtil.between(tc.getDate(), pc.getPayPeriodStartDate(), pc.getPayPeriodEndDate())){ + salary += calculatePayForTimeCard(tc); + } + } + return salary; + } + + private double calculatePayForTimeCard(TimeCard tc){ + if(tc.getHours() > 8){ + return 8*hourlyRate + (tc.getHours()-8)*1.5*hourlyRate; + } + return tc.getHours()*hourlyRate; + } +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/MailMethod.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/MailMethod.java new file mode 100644 index 0000000000..19e59fa512 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/MailMethod.java @@ -0,0 +1,8 @@ +package com.coderising.payroll; + +public class MailMethod implements PaymentMethod{ + private String address; + public void pay(Paycheck pc){ + System.out.println("邮寄到:"+address+"。备注:"+pc); + } +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/MonthlySchedule.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/MonthlySchedule.java new file mode 100644 index 0000000000..86f9b7e21c --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/MonthlySchedule.java @@ -0,0 +1,13 @@ +package com.coderising.payroll; + +import java.util.Date; + +public class MonthlySchedule implements PaymentSchedule{ + public boolean isPayDate(Date date){ + return DateUtil.isLastWorkDayOfMonth(date); + } + + public Date getPayPeriodStartDate( Date payPeriodEndDate){ + return DateUtil.getFirstDayOfMonth(payPeriodEndDate); + } +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/NonAffiliation.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/NonAffiliation.java new file mode 100644 index 0000000000..31129fbab4 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/NonAffiliation.java @@ -0,0 +1,7 @@ +package com.coderising.payroll; + +public class NonAffiliation implements Affiliation{ + public double calculateDeductions(Paycheck pc){ + return 0.0; + } +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/Paycheck.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/Paycheck.java new file mode 100644 index 0000000000..81af0d4d66 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/Paycheck.java @@ -0,0 +1,41 @@ +package com.coderising.payroll; + +import java.util.Date; + +public class Paycheck { + private Date payPeriodStart; + private Date payPeriodEnd; + private double grossPay; + private double netPay; + private double deductions; + + public Paycheck(Date payPeriodStart, Date payPeriodEnd){ + this.payPeriodStart = payPeriodStart; + this.payPeriodEnd = payPeriodEnd; + } + public void setGrossPay(double grossPay) { + this.grossPay = grossPay; + + } + public void setDeductions(double deductions) { + this.deductions = deductions; + } + public void setNetPay(double netPay){ + this.netPay = netPay; + } + public Date getPayPeriodEndDate() { + + return this.payPeriodEnd; + } + public Date getPayPeriodStartDate() { + + return this.payPeriodStart; + } + @Override + public String toString() { + return "[开始时间=" + DateUtil.format(payPeriodStart) + ", 结束时间=" + DateUtil.format(payPeriodEnd) + ", 应发=" + + grossPay + ", 扣款=" + deductions + ", 实发=" + netPay + "]"; + } + + +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentClassification.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentClassification.java new file mode 100644 index 0000000000..f2bf2e26e9 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentClassification.java @@ -0,0 +1,5 @@ +package com.coderising.payroll; + +public interface PaymentClassification { + public double calculatePay(Paycheck pc); +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentMethod.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentMethod.java new file mode 100644 index 0000000000..5e549916b6 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentMethod.java @@ -0,0 +1,5 @@ +package com.coderising.payroll; + +public interface PaymentMethod { + public void pay(Paycheck pc); +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentSchedule.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentSchedule.java new file mode 100644 index 0000000000..500d72404d --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentSchedule.java @@ -0,0 +1,8 @@ +package com.coderising.payroll; + +import java.util.Date; + +public interface PaymentSchedule { + public boolean isPayDate(Date date); + public Date getPayPeriodStartDate( Date payPeriodEndDate); +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/SalariedClassification.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/SalariedClassification.java new file mode 100644 index 0000000000..d7c556405e --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/SalariedClassification.java @@ -0,0 +1,14 @@ +package com.coderising.payroll; + +public class SalariedClassification implements PaymentClassification { + private double salary; + + public SalariedClassification(double salary) { + super(); + this.salary = salary; + } + + public double calculatePay(Paycheck pc){ + return salary; + } +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/SalesReceipt.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/SalesReceipt.java new file mode 100644 index 0000000000..18297d3fc5 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/SalesReceipt.java @@ -0,0 +1,21 @@ +package com.coderising.payroll; + +import java.util.Date; + +public class SalesReceipt { + private Date saleDate; + private double amount; + + + public SalesReceipt(Date saleDate, double amount) { + super(); + this.saleDate = saleDate; + this.amount = amount; + } + public Date getSaleDate() { + return saleDate; + } + public double getAmount() { + return amount; + } +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/TimeCard.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/TimeCard.java new file mode 100644 index 0000000000..2aadeabb48 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/TimeCard.java @@ -0,0 +1,19 @@ +package com.coderising.payroll; + +import java.util.Date; + +public class TimeCard { + private Date date; + private int hours; + + public TimeCard(Date date, int hours){ + this.date = date; + this.hours = hours; + } + public Date getDate() { + return date; + } + public int getHours() { + return hours; + } +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/UnionAffiliation.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/UnionAffiliation.java new file mode 100644 index 0000000000..c9021baf0f --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/UnionAffiliation.java @@ -0,0 +1,17 @@ +package com.coderising.payroll; + +public class UnionAffiliation implements Affiliation{ + private String memberId; + private double weeklyDue; + + public UnionAffiliation(double weeklyDue) { + super(); + this.weeklyDue = weeklyDue; + } + + public double calculateDeductions(Paycheck pc){ + //简单实现 + int dayCount = DateUtil.getDaysBetween(pc.getPayPeriodStartDate(), pc.getPayPeriodEndDate()); + return (dayCount+1)/7 * weeklyDue; + } +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/WeeklySchedule.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/WeeklySchedule.java new file mode 100644 index 0000000000..b9788bd18a --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/payroll/WeeklySchedule.java @@ -0,0 +1,12 @@ +package com.coderising.payroll; + +import java.util.Date; + +public class WeeklySchedule implements PaymentSchedule{ + public boolean isPayDate(Date date){ + return DateUtil.isFriday(date); + } + public Date getPayPeriodStartDate( Date payPeriodEndDate){ + return DateUtil.add(payPeriodEndDate, -6); + } +} diff --git a/students/282692248/ood/ood-assignment/src/main/resources/employees.txt b/students/282692248/ood/ood-assignment/src/main/resources/employees.txt new file mode 100644 index 0000000000..6f2535dd25 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/resources/employees.txt @@ -0,0 +1,9 @@ +1 jerry china hourly 0.0 20.0 +2 tom usa hourly 0.0 30.0 +3 herry china hourly 0.0 25.0 +4 lily uk comission 1000.0 0.01 +5 merry china comission 1200.0 0.02 +6 lida japan comission 800.0 0.01 +7 kerry china salaried 5000.0 0.0 +8 jemmy japan salaried 8000.0 0.0 +9 jim usa salaried 7500.0 0.0 \ No newline at end of file diff --git a/students/282692248/ood/ood-assignment/src/main/resources/salesreceipt.txt b/students/282692248/ood/ood-assignment/src/main/resources/salesreceipt.txt new file mode 100644 index 0000000000..c9105f4a20 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/resources/salesreceipt.txt @@ -0,0 +1,9 @@ +2017-06-30 4 3000.0 +2017-07-11 4 5000.0 +2017-07-14 4 4000.0 +2017-06-29 5 2000.0 +2017-07-02 5 3000.0 +2017-07-15 5 3000.0 +2017-07-01 6 4000.0 +2017-07-08 6 3000.0 +2017-07-16 6 2000.0 \ No newline at end of file diff --git a/students/282692248/ood/ood-assignment/src/main/resources/timecard.txt b/students/282692248/ood/ood-assignment/src/main/resources/timecard.txt new file mode 100644 index 0000000000..995a2d20d5 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/resources/timecard.txt @@ -0,0 +1,9 @@ +2017-07-07 1 9 +2017-07-11 1 7 +2017-07-14 1 5 +2017-07-08 2 10 +2017-07-13 2 6 +2017-07-15 2 7 +2017-07-12 3 9 +2017-07-14 3 9 +2017-07-16 3 9 \ No newline at end of file diff --git a/students/282692248/ood/ood-assignment/src/main/resources/union.txt b/students/282692248/ood/ood-assignment/src/main/resources/union.txt new file mode 100644 index 0000000000..c15a30d749 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/resources/union.txt @@ -0,0 +1,4 @@ +1 +5 +7 +9 \ No newline at end of file diff --git a/students/282692248/ood/ood-assignment/src/test/java/com/coderising/payroll/EmployeeTest.java b/students/282692248/ood/ood-assignment/src/test/java/com/coderising/payroll/EmployeeTest.java new file mode 100644 index 0000000000..2bd6757ae2 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/test/java/com/coderising/payroll/EmployeeTest.java @@ -0,0 +1,119 @@ +package com.coderising.payroll; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.junit.Test; + +public class EmployeeTest { + + @Test + public void test() throws Exception{ + Date d = DateUtil.parseDate("2017-07-31"); + List employeeList = loadEmployees(); + for(Employee e:employeeList){ + if(e.isPayDay(d)){ + Paycheck pc = new Paycheck(e.getPayPeriodStartDate(d), d); + System.out.println("发工资--> "+e); + e.payDay(pc); + } + } + } + + private List loadEmployees()throws Exception{ + List employees = new ArrayList<>(); + Set unioners = loadUnionIds(); + UnionAffiliation ua = new UnionAffiliation(5.0); + Map> tcMap = loadTimeCard(); + Map> srMap = loadSalyReceipt(); + String employeesFileName = "D:\\coding2017\\students\\282692248\\ood\\ood-assignment\\src\\main\\resources\\employees.txt"; + BufferedReader br = new BufferedReader(new FileReader(employeesFileName)); + String line = null;//id name address type salary rate + while( (line = br.readLine()) != null ){ + String[] fileds = line.split("\t"); + String id = fileds[0]; + Employee employee = new Employee(id,fileds[1], fileds[2]); + switch (fileds[3]) { + case "hourly": + employee.setClassification(new HourlyClassification(Double.parseDouble(fileds[5]),tcMap.get(id))); + employee.setSchedule(new WeeklySchedule()); + break; + case "comission": + employee.setClassification(new ComissionClassification(Double.parseDouble(fileds[4]), + Double.parseDouble(fileds[5]), srMap.get(id))); + employee.setSchedule(new BiWeeklySchedule("2017-05-05")); + break; + case "salaried": + employee.setClassification(new SalariedClassification(Double.parseDouble(fileds[4]))); + employee.setSchedule(new MonthlySchedule()); + break; + default: + throw new RuntimeException("unkonwn type ["+fileds[3]+"]"); + } + employee.setPaymentMethod(new HoldMethod()); + if(unioners.contains(id)){ + employee.setAffiliation(ua); + } + employees.add(employee); + } + br.close(); + return employees; + } + + private Set loadUnionIds() throws Exception{ + Set unioners = new HashSet<>(); + String unionFileName = "D:\\coding2017\\students\\282692248\\ood\\ood-assignment\\src\\main\\resources\\union.txt"; + BufferedReader br = new BufferedReader(new FileReader(unionFileName)); + String line = null; + while( (line = br.readLine()) != null ){ + unioners.add(line); + } + br.close(); + return unioners; + } + + private Map> loadTimeCard() throws Exception{ + Map> result = new HashMap<>(); + String timecardFileName = "D:\\coding2017\\students\\282692248\\ood\\ood-assignment\\src\\main\\resources\\timecard.txt"; + BufferedReader br = new BufferedReader(new FileReader(timecardFileName)); + String line = null; + while( (line = br.readLine()) != null ){//date id hours + String[] fields = line.split("\t"); + TimeCard tc = new TimeCard(DateUtil.parseDate(fields[0]),Integer.parseInt(fields[2])); + List tcList = result.get(fields[1]); + if(tcList == null){ + tcList = new ArrayList<>(); + result.put(fields[1], tcList); + } + tcList.add(tc); + } + br.close(); + return result; + } + + private Map> loadSalyReceipt() throws Exception{ + Map> result = new HashMap<>(); + String receiptFileName = "D:\\coding2017\\students\\282692248\\ood\\ood-assignment\\src\\main\\resources\\salesreceipt.txt"; + BufferedReader br = new BufferedReader(new FileReader(receiptFileName)); + String line = null; + while( (line = br.readLine()) != null ){//date id amount + String[] fields = line.split("\t"); + SalesReceipt sr = new SalesReceipt(DateUtil.parseDate(fields[0]),Double.parseDouble(fields[2])); + List srList = result.get(fields[1]); + if(srList == null){ + srList = new ArrayList<>(); + result.put(fields[1], srList); + } + srList.add(sr); + } + br.close(); + return result; + } +} From 0d0ebf008b1c39af64b5583995a79750b7a5f830 Mon Sep 17 00:00:00 2001 From: onlyliuxin <14703250@qq.com> Date: Mon, 17 Jul 2017 15:20:00 +0800 Subject: [PATCH 2/3] fix bug --- .../src/main/java/com/coderising/dp/builder/TagNode.java | 1 + 1 file changed, 1 insertion(+) diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/builder/TagNode.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/builder/TagNode.java index 7763ee9d0a..2ac26ad7b9 100644 --- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/builder/TagNode.java +++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/builder/TagNode.java @@ -19,6 +19,7 @@ public void setAttribute(String name, String value) { Attribute attr = findAttribute(name); if(attr != null){ attr.value = value; + return; } attributes.add(new Attribute(name,value)); From dbc9dd25e9da989526667681f54e6cfbef7241ad Mon Sep 17 00:00:00 2001 From: onlyliuxin <14703250@qq.com> Date: Mon, 17 Jul 2017 15:21:15 +0800 Subject: [PATCH 3/3] remove unused file --- dicegame.png | Bin 15130 -> 0 bytes shopping.png | Bin 12840 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 dicegame.png delete mode 100644 shopping.png diff --git a/dicegame.png b/dicegame.png deleted file mode 100644 index 1c1a40821ae9979ac0ab745a54fde3b2c9a462a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15130 zcma*OWn7d|*Eb5|paV#E2t#*=gmg=Hhk}$K-67rGAtfT+ARQ8t(%s$N&AE{Ke%|-P zdCu=}&6jJ~v-jG2ul%pIf)(T>kPz?@U|?X7q$EX^U|>KZFfg!U5D@ToV28FoLd=`(@!WtW6Nddtek*Dr&~{k6TvuC~KO5eym47;E88`y~CPqc?x&AkwWP zjNpDTBnk_KE;D{1x87}oM+f`VJ_dN27(1Fs+&A0IeS$NkK~Yq!yFBJRd+W%B;? z`r9%b2nzG``GbBXV8{`;^85yEg}0WzI6K2cc(II*$mQkx04L-o2s}gZMp=Au%=NfM z=zd->5a5F=3X>iBQWaYT4i*NODQBaID$6MCNKC7KrnTV6#b?bApvK?tly1u8WJ z^lv0{5Da~?P&}Nf5DZul1}qF|jqw*0Lj5<=O9)&`(f)v|`C$nL`9>XQ9~O9osG`;{ zyzY&DrwBuyM@fO1>rIs`h18!`hVh01(?c=-Lsyb0OhW&U8K078N`ydVMnaSj*yp8# zfu*IY;dGyu_5mC8_{gAw{vCw@I_#I8GAr>3+^22Ni~V=ob$kW_nq@!#&!{lQ6cz0u ztS8z9p^`8O^xa^R=d~!&t`ensDT{W$O6U05d0kCG+|vgQWB(mW0EQQZc3$h?X_x=t zRg@Iyks-}kiHRDxhB9IhuI?O)(;C7*I#6+d-PB47BmdiKt0%--I>3YN_CutO6PcGI z-L>}%uC2u%AAh~tqdJ{|DZXlbmmEmeuFftWfJKZ~LY(&!WQNhY^>L=du+M6WE?#bX z5dRM)y3Z4}t)jqTJtt{Y1C=}-h z)oP2;m)B2+w;CG_e~nHf^14Kv=x-@AMZfxRc9mPu9%8{YeGLR&@$TvOvVlqelFqZoSyo*w_X{7X0lFs%2HTm5y(b0|fg_ z@9-1t#_Bwc!-|X(kwhWHZse6XsGW$q)igZ}4Nx~@McVTa1a&lP*r&^wCWRp;E+2b! z?(KJ6<}vcUO{^-#frdeEy=+6e>lI4ieGLBNXPGGy<>UM4!`;SE%1=acxs|-e^R(Ld zq#-WZG3;a90w(Uq-KLoYOL^A%6SJOoR;^N9CeG^9*pwsQFpwjDO_odI4z0^ZV!I1L z4^|fRt>6fR%a5XZ!2`*o(<7E)Ot9gEYU%tzImC85dDjQMkN?66TlQcq&GkGqT;e8@&~Ke9aj@fqx>!aXySC zmf&D7ern{&hK*ISUfaHIt1Z^V9#ZD(Ob+N7YHHZCp2m>KZ21kT_V~zFTQ*9vQjEZl zA*Nfg*D$MO5X?lF8>7zR+t&$%^A)ev5L7_kdw}5edA<=6dDa!50Cr6n{>}IN_Md-R z=8+T|zvelNItajV6ttqo9)3~~&_X~N(QQ2Vs(cpJ!YOYn>v+8Vm6lT=oxrAT*BM9; znqlDD3dh^e>fVR_jMH=|?DH9?CnlNzxz0seuW~7!O+GfQ{A#{Wg*DwG9S}mLUd0yq1kJ$5V#^ zKIFG|PV-|uO%ix)N#$!vBCL?LbeMOLT#e4g4089^rEI-U?t-44RQ&rO?>Q0G%|NDv z8x2ppj;YAwU4gxD49@$D4i6+J{sbO5NJ}5GN(?5Wa5x^^&nS+HCo!e~#2B+M{zhu; zOEhKwjqa|@wb+~ku_&51`t7gy8K-$p)m(z~@WVwO1_{c}sM<`Pu9!It zhF)_AYr^z&n&~22`FgDIPU=*fT~mzFYw}Q$CY;~`D?=hXt8L^w4Iv)qz430ZU7mam zzNO7oD3_HM{f&kO)d~i{-hiz%06iH96td%#7-=@0u2Up!#?h-0Mrq>ff$IS~&yGrF z&MHC?`ou&QvKQ-hgYLs!iD;L<ajG)C3 zd$McZ!suQUbVk+LLr-KzkpW7cyFdmL?#V(SNWml&MU6)Y|I^hG5Nj*ds>h|ZHFAx- z@BXjgq2ztwkO_W8y=nZ(WkFu^iaGl%ZEEj9J5QBSp7TPg#N+aeenX#oBcf0X{SN|~ zzjjR?XOIlguxWuu#NPDoh|p866-*iUY?qkK;;o0@jnww0y3&f znTf8k|Jmqvq%4fLp+OHQw)oq_!^P8@(uf4I%?ceA%h`S2Gr7S1Q}UFzMk6t@hr3vAGL!R* zSUY*uB^!xsL@N`T`y0D?e_hWb(~f6TgSnK|DYDYPEi@sbb-z62e6y0ej&l+Fsm}4D zD3#st?CYQ_)D5_b9PrP@^lsB}ewFPpr_J>@4-e-*|NKeYT{z2}r*J#Vw)<-`Y!st* z*(gI<%uTM`HRw;wJ~h?6^;d^R9_I$;CqYV!Q-ADwshlDyz`k~nu>JQv8#}*B#P?tP zl>H{_mO-0Fj7VWNrfo5G7#VOuEO5A`wp#T2C*K!1%}vAn)s8nU5A6$~yT^)74-~6S z<^G^Aw}5i0p-8;8H`j@7OwQ6yxZd&c5u*_F^&U(7F3?aw7G*4RQT39+A=lOAG@*Ri z_q=5wY5dEBidye>?6v4PG99g136nvOt!@)FA;ilo8BAGP@RsxTdL=&V?%~HDjTU*2 zni}E-;-T=9RI(d^gFE@%0heP$TR3U8s1R`$K$Xgn4waSWQE~ocX$J(Y#QD0BuEDgp zWyV&mcsO0Y2%mt{j4b7<(CyU7wfCLA;r>Vd&+14F1uJkOV+=Z8f&-ACiHD?0;kwS` zV63nr4(F=zsqb!sbCd*%A&Fs+G;zg7V z1nwBA2`=zw+EiELaDuZQ3Ep7yN5~+h_kObzu5Q1v<(KU7oA!X+t~qg(AF$pY7^n<{ z9u*$y?UdJs0@IXLs5s9)sS~)&k%daNUhyqr-?5$2F7->`)}UTk#MfpJqy7_R+&J*l zzzIqi>0g`$77}xxU_bwoez`B$Y6Kd+b?w|R;fbAGOf9`rF-52|sL8f-ArDplH6*x6 zw4esKmMiAs;$4Cgf46pgPgpRZzKSgwf9UOlYfTDI&OVSv_@(OuJcxl;?aqHP{i{2# z7EKuNk--R09_Wd@phk82`ZqbVV2s4vCV7g@#$I{83g>rng9WEt6H&-7V{v?t=0^;b za8c0mv8UcN+3@JA&X%xp{*NPBOq8se1(@i#jM<7DbgR`uO z{4IT`Clo;ri@dbtNp*GGJmXv9`{-)Xk{*manmOFE;!$mT+vmbDlF6=<`k!y#=5$5RPYX;KY~m^@L~U$d?Q0jRRZ^aI4X=~fVVb&`gkP(E z58GSyRtP43o%T5CxDUSVIay>?5JsiO_ipv9Fex0{XHv?m#@|~XN-q6A5cRF$JED_T zs9fc@xe7$A5`Bf*kUyQAFYW%~GZ=RWAi3piL;-4NjA8Ut3B#CG;gf{acVSx|NH7re zsQIEk8L}aG70cYmwX?vy)y@XdW}LT%2UQcj$WdGB+;3{vjl*ossy0sx)xMGkFniQ7 z-g8|usE5*r`=!1JjWGMbO9x!NRh^#|<`g<;KUz z&Wuj2j!5Mf@RjexE1Muvoev7Xy6+uFVIrRQNVl@0)US>Ip`(@icO(kMszR`3NWR1z zMLeh1Od?>C{?Wr78_X=9a2fz3op6dEe%uBDZ}ha0;^BzLTB11ck0x|YMw}V}f?2MZ zDFf`mg@n0EE_L7|mX>;qJliif-QO|$1I(l7OSfdB<1f|)4Y0fe?zuKs)0`Q|0B#^k z+rMCO-kzuHjwT0u;<-cc*F|-=A%|9n3wVo3Ibh}c6#oEV-c+>i&3DtruV05Yt-ixk zTP9FjOf8Vs-d@qoSNpOaHVRDJ?)sS4I=Dgx4To?Sv3QDgvvf3^6a6*vk#SH1DC`~; zTggaSMt?1>ZyP{NGPz)2*;uyR*9GBa%~DS-rQCW85`##oZte0zzZ5>&O7V##D(x3B zJ&I+H!)r6X2U6%uUBPJy-&)cSi^}KO(l1JQyH=vM=06q3Wya?$q#kc&sd2M2t8l$R z;^ErS=`fuXsSIX7O`zwDLj?n#h6AWsqK@a%r8ULo;t!<#)FE(Q=jUqu!?cow?qF$z z{$p^F|H(D=8DaGhI9$L=V~KruCryyM5C{BkiM_N^J0d>kFi0o)Gv?KR?i#;iV-IW_unzw9h7Hd=IQyoY5q6 z0&WeOObF+RBU{3^m5%Ohc6jKyU$(NL_T_8xAn`SEc$uyMo8!;{=M9SeZ`|a(3H^Om z2VYO8Pv3fa(g^(tW=l=t3S=dO4c{;3xB{OE=BA%vAElvFAf@NG(Pd^ zdfnHls^nIhUL7FI>b&r6PUv=`Aed-#>mwFuP&DO95-k+sP#H_XQl3eGK?AFl3( ztiJV7HNWqpIQ5*WFSWi#%YWPJpJ3Kss&yaDT81Y4;&<#~#Pr2{*3qhO+}|n3MVv1^ za&mI+H+_+iLD*MX4MDE`LVQYS3X!wp*)rABUvmRH0C#JQtl7q_iM@g8?N{4uRemla zCT*nOUF!$w*O=N{bTXcj9YZ?Zs5cuu)S}^ZCkyesG6jF{{2`ORSM1B9HD2}ZVQ2Hi zt{s>qHJ>+eb!D>5qu>C8$qnw^oL^Pu0OeDLYt-FjU34rE2gRuD2dkETzg9Ncy+ z_i|@HIkXx*z4*xdh)E%U8w+PUd>cW_PjhiH%olXD|91`XP)w1rc+}Xe`<0^Enq6n% zf7G9Nq2`Lm#r{E;je3HU*iF-7KxAZ-IxHrj>4TC5N%{Frv3GW&EOd%61E4ie}KyUzk9Rdc^e2`~bG|N{@Xq zTyn|y;zcdR?3a7bGK(m(WTSAAvY!?CCKI(n8SYiFc^56pT>1!ya`fBjITM_I(GUJk zqc>ss-4 z>WwVF#DnMC>ye2`p&i!q#)*~*3X5zk2MhqKASOfjzI$h(8OG~8W~ZY+SeBGTg_!Nb z91b(VXwGa64`PIMMQHGJGn-D|g(fYYyImo7yi$QI$)#&*N?8Y*mM9iC0q zY9KiA*S9#b3wzgZf`j**p($iR*5cbCNpIg++xUQxtKT>uemTl;B%{i1FHMaTXw6)4|-mFytwQ2PDmtKC4NrBA(8g9iNDQmXd+ZxeF@5p2wGX$X(t%*wQLl4 z`9X8O%uZhNl<)t>2Jc4E*W#@b`AM9aUalxa{VmpD#__#A7_}8@ep=y!_xoa{E z^j|AUi>(sozGx9<*ekldLRNi|~(;)p?s11aK z2n6T=_pAkbeXCXSpr|Ru-WGDs+WY9IQ1=LB3c6A3dm{R=?XG0CUVSk1)>(%_RHjU9 zF!s3e@7}6x)pu4GM&BO4Tgqi>ay)@fMEaV0FaGIYYf;DmU)Y20R6Z@J8Wyo6HEhO; zxm@WUL1jz~3#!(tE~86@?d!Gf;-uGgYB`+GZt;IUB%d(pTC^Yn1BW%O|gaXBV|}?z?+Ch>zm1fE8hU8bj`e0SrFA*tLx~bRC1|zwncC{Sq$sd8t&&wGbI3GJiYN} zu?q93!Bi_;Xi*nl^nhvhrN~REH9TG3r)la`GL$c` zub_#)n;E{?n25bj9T=V;gV*Cqx9_?)Dl@W~RJ~aH9rLMFE>p1rJW*lPQvkD_iZ(SI z^P#iLxK=jo-UV6WigJR$ejx@Xxtu|nG`SpHw$eUT;JX4a55s#KYA0p$~w(S$_AulCBUClK)~h z==AoDxdA}vYp*3Th*xVmyd(iOp}<_FRyTh;Ks&1rH%mUHxKp^OC-=+A!oxnbFTN%rmfeBU&r<#|3lyuj}3vv&6Smwtw73w0=Yn zYJrE~wGlB$Ernrjd){gFUD7!p&(SHbG~C=Q$_^8|_NK6rgHMlC)SWk>{~oI z=AH%r`iwFqpRljx?+7*E_db(AqmckyvBG5ofn?3|>Q|PXHTa)#E(M#HG~d4vM^(8j zToP2cTZ0&+({ulddJPf-j!~^cYtbqBL(hfoi*91@iLl@d^I7YOQU+!Gi>K_xjGX#A z&0nhlDxc8>sVrm_f)WS;|8i|g7{KF_VP0#bf1a$W_#Kn1W;lcczL0GVQWVuftg({o z77zoSUf*H(53Ly)pVvoru#Rg4NC`V8AZ<$9Qkt)M=W z9zrhvMD%JbRXE{CGB18j3u+PwIE>OuE@^mN-Fp2)55fYB!rgZaFIYNP#BQfb3dlS*q;2DL*L0ip>yJ3r^Ei(H49M`Y*(xjYeZ|j*pi)RTqV*^@d9`D7 zGba~u_vFbD8aSvmVw2hOx55l_7_*f(vXl&o*RYtfIfAQCt1(!G>NTeYn{|*SkV0a8 zL5D=^E65IuTV~2x8>w<`4}({9G+@DqfA@|74S5A(O~{hiVfF1uBQS_I)9>XCW?Bt8VMmEXtM^d{y|}T z3GvcDA*^K=zc?RAzHq#JF+t9;MX^3A1`VyC10U{U1kK1(HfTz(DS+!kGuEV0m(@Nz z;k3J|`kr>8w1De>j2VyZ|N8Zzu}2d(rJa+$6><;dal~Zi?>`q}R-7*PLQ)Zn;2Z1p z)96vL+kcp}gFLeSiA6;HX;;r*?Fy~Gfjm+KRn$Yxl%d!O{<-KSj$~yKc&84Xj(w>4 zvJ}v-LrDc5A6*SQB|e&BV7zl*(#=u3)Ugjnp1FWMpLLcfI4vKuvDGbe*P;p&$2ap* zyf_ucEPA6hH#E~AFem-Me}93QAl53gV`km-(mS57I38`H8>}b@-2@L&^|`_U4m~NB zha-iGSuTJPYCBe+MAWP8t#5_}%i$jC1}EZ|*w^dG9cfuL(@(tjl^g~esay1TE%!o( zD{NkY5r8Zt{cJp6Q_I#}W^#eHWl5pUpG3>E(zTR7nuGNww&03W0hZGBxV*WCP!uFb z{+kK9UPTEsvy0PD^DDf*-$FHuQgMNZSdtFQu?t=s?}L=qTrZtBMT^^s)|x{vob)f` z9FLA|r)yz%t&}Wm9cl)AOKu=`4Luid?8aAw6x;sjVQ{)`)+o}iHp4Fdb0gb~+A^Jc zX0@oQ(cT<`U7}Lotjwye=VwyRibv{)q46bW>)-^kER2Q#5~J{{4izhQiF1<&o9?gl zemib(qaYQ9flY%sjHPHA6dXjE1Z;{e7HJv=C6oIj%{xrRkwxY1#3{A`Z=PN8t^65l zo_E7k%B?oAATv~eR}#b*y4&4BxQ@uhBK@)cABCV#fv}es3!u)!@@c96r9P8HkSt%6 z8U0f?!1Pdq*MLwO79fQ9{0p1?&?Seo$9W3FMI3~me=bN3TXY5KjLD?9efRbCUvzJ% zf)VJ-Uwv(6v1yN8{-q&yN4Eq{tllAUKNblvqtw?!sQxb&YibZ66YUsSU?mCwCdgkA zH|~6b$2#*&;?SRvu@h(21W1f6qK^BNnYs@frl!J?)6iZZg+!JYKFJRYQZC>HI zNT_6DmjoBRwL4jKB;o4wUg`;06afV{_UjT#$9 zD|hbpByL6{fvB6mrxi$yTD?CqZmJJCvY6)!HiUt}AAhO^=n;H>KuAfm5;UMZNUF%k z!#Eua4Wx51qM`jxD{9+o&azzO^dYi~GtH1@pfF4_)Zl6DsaLSIdaso>6X>_^u^)80 zS{CN{2R0+^k8E0c7^2+cXZ4+-C;~e=|0k}UvL3U#A7>QM2J)tOCbqUtB*v3Z$<-Y5 zw?8j&(z3m4dAT0=Y<`p+Z^%0jHCLP4E1llijPYxb@qPDdNgeS4P2{U!SZl-9mvfO-m!BR??pwuQ=juv{N6%_I)tFvy^{2^#Q%rsRLUdHVz8 zO#xQI*HyVM9$x=Y%Q+Xu=aCe|KiyHl9bI5jyxe|towdjnJ0WEs|E(l-@uRBc0!g93 z(XvEoAx`?d@YV!8&X1)RPh9vz5au(EZ*^J14O<3WoKWGhSHUD?6Fh^ z<<)=C9a3+PBHgu68Vf~neE2orkh^;K1wQ`xWp>c^MGtl3zqqpRy5JvxHW~vKy|2`E zp?F9{(E!l=_R`O9^(Bljdy?SvT@NsZgD`NZ5)GAYprUF&eEOl#y-sNo%*~lrpGBTSij{ zlDExlkU+-hK=ncLc>+nXjj??h>qR|+eu2mZJ)`~=zhZM_!I|PREr<~iC_$(+xGd1Z z#qtNgJhqBSdvax_S9jDJxrA{r!PA;i^sw`Xq&Frp=lnNDV-zuZUO85@rGcUcKiLP{ zXj69KoQDSw@d+|?dqUxtpak$Rc-OSYd}xmG>hh-Dt{j$Cp`J-Sal z5_^uWv*#gPh!?lls$v=r%kq#{zYBww|G{~t=W663~}Tb=SE@FOl=b{YNVUs6u<=HiH4{GFSG!N5wdi zpD*NYz^CTow85b*Q|>>dCf$SptQWJ8Sf*fl0C%;WdK8rBhOqH~mAvtWYm1(1Yco;) z2Lqp^vN55IM{)D+mIY zWzfUs!J*TryBHJ)miAtL=y9h7d}~ag9!4|TocE!kEykZ!)-0W#-3t7yZ7oCvi?61r zRS(E=s~lM_2^9qa)lvyj*!)B9?_i0fn%-Zg7lK>*q35F?ydrQeK<&%Buk2E~?G8CM z=WFlFa)-sV&Pe86_Ev17C!8#z-5XST#$m{xQ-yot222Ti)8-HL$?u+=o45PX`2S%_ zrA2x1?z+c_?6>CI?`UCx1g63DLlP9dBT;5$1(iH3iXFZ~HBw3Lrtqjo*1D$D>p1-5 zX3=H-$TdmZ!b11`hnoRrwA_9XP(v4^CvmKDAqxc(rG<5intc}rh45DP*V~j>wYo9e zA1p+t?d9`mJ0}cZgs8L&ptUgG=MV#|2iI@tkrWA)hUxS+1GK)P+MYMrp{l7bv2v(r zo$M8_D^gIN5(i;oE_iA(bD_tjPBn9Q$7=x&j0d?|Z9RWWe^x_#k)q9B5QX$a8r~uX zuY8TbUqk5d7vm`8iq<<6mTh_AvSzR&*9-i0=Ol$Q{Xl){{)iQe7Z`K|T8>au(c>WsyOMvAxP>g;h8x90AD z{6KTMGGkV;ywN@+`E(77ua$RV8R(3z8{OQsXr?g(-4Q~C8VmSv<7so>Bo`TrQ4-Ix zk|4d16ITrpkF`GU&7W$J-{ox+{>erXE^COI2e3#akhgg;D*6S`xK_q(GiS(^WW7 z9W-hSp+pDueLgClZUZ$^JfSW*`p)Wf5JB0*xR=8=A&Li0^{=fNvD}yjSWRd7s`W!4 z>xQqeJr*BR`O*)`;Lij!fcg(wkduIH*;N!%vZxINz0aWgY?EoE;Nl=MzFsk-U(;2# zuvFIBSbV(CaXI-gwzxw@1)?S6(cHVfS9E>rQ> z^O|1vbFkh5-1u^%hZHg5pVm~61l@m;x{0)=Pk5O%oQ{Gk8<0-{I^4f-x0U29)m)*% z9qmhIizN;@CQc~AJr7d?BpX-A>vepMq131b%4F#$%;xzEolxD{K8vC@CPGI{+Z6CdHd7(sZ^jxB*Kn;S|su<*otX7bP_t%Yt@mwzMf-e^| zcmcwjm;WUMkBSBECoh|CPBzdakzk#U6Nw@h9w9F?^I(VsEQ{I1n-dW1FL!k$OWT+* z{=rSJcxvyk11jmNemAV<#`VKIEuZXAUh{x8r~)de*HzIa9#+|#_6L-Ggq~8|b@WG? zsa}~;@QS}RY7lwZoEpsw%Iy5e=oM>2J5W;J;+>MpN~x64oGBI7x-m-vUXxk{)+bfiknZ_aVbbwT9A3ge(#8kP%~ zc%hlYSEn00tLH~^$Oa?f$&Gq?!Wq-29x7&&XgQ>-Ah4~7L8%988Y!PISzsqhiyl{AHpUJyc0Is!;y@xhCt!>X!WQR#{h-alg51Fn{?CnY<5S$(p%ny8mA`?4E6>`;Tp!hiycs zzTzHfikg3hlW&Tl4x3%pkLk7RN21)CRyqjctrF+2Xg7F#OB%ygl89{gisOT9J`No7 zeNf$_s}PI^6^5shV$p>B`F)FGrSCbQbM)XeJ*qYGH>PH*C9LkGC8TAotrX1f>vauO zbZIxs326M0U42F27Z`^U(Ui-;r`=$2L@hs8PB5sp?vyw%pViXS^Co;s#)N5PhrXA# zrlp(Q-C$Ge8z%q5`N4$^zv)@(q>Nrv(+`t8c_<&%bLyvwCpn~I6}~B}&g;(Cv1a&d zltfJA4N&Ew$0!A=6pWB3v)=qg-EDaY;d-HsA&4^IzqE%$3@056zTRL z8O|PkutQoBr6cmqO+M2r+U?DjyJdOX&w=hCZ7j}#)icX(Uw$HAx3h~vl~G*l4}X3y z+F`i391JeZ)%UEHK?CwqZ!9mFEz+v<5wX6T|E-VvlqEr)-HtQm6&60ffv1RK@P=yQ zx8J*RSDVJUqgh%}og=wai0v|0jT60pdhl3A=@;B%;q96=j>o@QsyQKL6(N1+Dw;H% z?l^SkKX_E6eAsCNs}rZ=>RO^y`dcp}=#l2hcZDCXJ zzL(Q+rDTwxdmoZ`Ha?oGe)cVKZX|nsooC@@J%K(R=drUlBj43B_%oB!LpN{Z89$R= zJ{||v)%AzF%bIPM2ALPUk(M+e59;asGDHB3ehjaV`A6Uyu41XbQ9!ZwZb!2a0M#o! zSHs>*D!IqxUaF@|ILJ@(6wz-5ue%_gCHY?_4)^IE3K*D(~4tqZ0% z!xtgOS5$=fipd4X<08*z(!3|kV(*AL$CsE4R9F5b(xbresLkq{|K(Fd(8}(%jO{7B zt_i35UnFJUAD;;^V^X0(ij<>hD0A}vQQ45*n10IuG>wAyNmW>Q4%Ya{oi>i+&RLd z&J}7jbcI~HYDA}hQ$Lc2PuDaMcj>160TsD_)yS3qRbeO*G!Y#Ol}cGV2(fX)7jCKF zl=ksuN>R%g!t^X1Yy7#1+me}tbm`>6%;LH3p-?k=${( z>(zNdQ=PjeCV%3i?baUt_XA8#e65uqd*Mu?oLH+GiYy3iMLpzaubAX_hOdhr z6=CBFbsjFtj~eyP+J?)82EylWMzkUi$j(c{JUf*Tv>tmBo0i1D-C-PG=Vcl-r4^qbc)*C-#aZDAai@e>5{aCLm9B=f?#3vAF0H^fMJmk$iPN~F93fO7m;s>8Qj6%d}xyPzYOF*v9itrVQ+K}v*fm@HveI4 z^11D|JKIBoo+D`$Vi^(@)D#3>eBImk~D`hV)d(f zI0q*<#%ZhWK#bD#T+1%kV~oy)`??bMju+naXhFNTaNHGYZ`TF$O?90Uv_#A8r>mM1 zy5v0s@QPQDTo~-;v1~H}(}-1)BT6eXzp@da9I@04iJuBkqpu-6n^%S#s>8opr5oqvsgY}ip5EySGc=8($Ikj_lsXz+pI(`hx z>-^%YAfyyv6!E1nKmSrX2WQz+Z3+x10G)X-W|))JQ?e?nF^ltgV{>37?FQVMm8e%w zLx7KuATm8(@$HhF;QO3TPZ6UIWl ze~+R&MF~7tzC{a|=kW!v?!C`hh!Q>87_a>1-Ju-%>UUO|m)BQgbjcgHSJxG~qBa^e zcr0tr>H-EujufAZf3>cWoJe4tQDfJkoNC%Pf zlKi%5lyiA4aX-^@ThT9TS1_Q=AXgjYr_5A$(qFQ@nCfCq<&LGwH0yupU~l94b(k9; z!ldTAx`?3_=e&DWfnWVtPJ40e#ao*)1YewBioL3T_{G1kP$+wGZ6o~l>Po?Z77f`S zDXUaYxBaR_IHp)jjk}cTVr3Bh7U|7 zg&6~S<`b5_t8^^_`3~YD=A=8h64?tMzdnAe2ti>YM7VuUEY^eD(iMwex^O3=kV?Gf zO93inVtj=$Cz6KPXrshdN9sv=?FnkLK;LqwKNLGsyQ-AL+F#O8rMtCIDPwm>r27p= zOpdcf{XyT{q^lDUrPR}Me9ebj<9`-f`w(rrE zEN4`xHTKN(-t2tj>f4_Yr^e0sKtC5X)VqL>Ye(hEH%}$nIKO~M_FWW{>L`(pduO1l zq87K1t*3PCz5Cks*~&TfU7lEcw@0t)fgI&s9Zo`8hzw5oyBAHbm>d|w+>=*@k~}|B zQ{CX3b74*xERDcCbx(Pw4IH|CExq!Hv;ulRFYw}ILMO<4gpFDi!{!|N1lEs_y8mi|6A*g zN{tO5hAX<0`t+XE3=j)x==R~8wZ4?#l`_jF65V&;?>nCwtoNuwbJd`5;0f}mt&$WD z2SIjHAcaBm767XF#c`BNWR0FR8!8)+FHZ6n1`4*H7U~7^EJ`mU_MWg<81P4+@)w&; zA?U?F10$IX(B9h`{pNXSKllNw@|`SUvC1(2^1pNl@QWA{=8VCXua9z%zD$17luylh zH81u_i1(KT!v1bXUP*_0!5nzRuG|w*RA*Mn@4Gc&czBPuS z(>L|`Etv|a7yZBgX)XP0-i2AH9H=_-dg_itu6p(KqzR($!_x8l_@Vtzhu{BK?;g;x znExx2?)em=fHR4L7k)l38B!SOr)2N{d%K~RHtU{KG{?)QLO7>kq9Ne12Wfr*N(8Wr zX#Ac{JTp?lS_(^J!6{wF1Qz|7*{q25YQ2V*N80gMnj)ONRcd z4i{`C2l)1XCmCqdY{t_xeBuPB|G#aT-jA<%!!KXqm{lag0Dn?qa-t=|20s4}bU^xH diff --git a/shopping.png b/shopping.png deleted file mode 100644 index 6ef672f5f9b500242c3cf915dafc8d3ba40e84ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12840 zcmeHuc{r49*!RtZWGg+9h>{_DQ6!?0FhgqWI~hs|S+W~SRMue-vOQU|hKKA^3S+X3 z7P4p0Hul|o*RAJy-}m{x<2&AezvKAcKQhOC-RE`Q*L7akd7i&>>G{nY>TCy&9e^N+ zO;h6<27(xFLJFgu*y|2msbe)Akjp3+2;=)?nV(gzz-YeIvoV1U7=S259c(7m>?*C zk$D?Dbesqj06)is{%6wvQ-U}{#>v}qLQpZ!54R!A)orrN1qd2C>^6E?D68m%2sp9< zjZ^G{Qt8`STD79OPAz&6WaYQ%v~Hm}Y$G$mpwJPd1+JgL>)GIz1cV*n9bJ$Mv6}t$oYnToJKJYNM#p+s|OiHDD(b^*E1&()yFVmJYXa) zts%G(skMgb4>L26)(1Ee5@lqT@g=Aavo{dQf9#QT z;5&`nla+4;kw7wxZ0BYyD9+Vh7b--+O(&i@*HP^B{DT^*l{9-q6zIm|t5 zxE8g#leL`0%LNlK`T>HHB3J>#I^`Rrkn8@I%dHQ{K<%6(vv?kf<{H9^D10~3IzHN) z0jR6h<9`q1IK3*ky=lAKYZGghat1L;@f&ntWyfV_bQb3ppRWzhr@sBDtk}e|ZR+MJ zrmli3WrK(n9cLSM3EPhdv!C<=RYVtt+UMubHVN#C$c$X@ip#_?Ml~GRmW7pn5Y@!G zrMuXBtDIYwbvrvvd1WCs=}9Q5Ri10T+NiE^(On(hNL?h6<2PA+l-|*ef;u8iZo`Ke zs7t`u{_SEFWc_hlpR*Oa8MMJ%O6$uV?w!!=Za#N%Ag#uGqI&-R&ZGJOoIlM%YRvw9 zV}vfvIn8_j6D5_Li4#Ds#P5gJt>aNarV7;WZjIzPS23?_cK4#(|m*WP$h+t94Bay9;Hj94V^nuiyr z^7A2{-TeHYnO(Q{gHxypCvsHl3HIG8w_IJDIJm!Ep|&kkRX;jR>gKmwWhHK(KU+6p z8)I4PCq(FX4ulPQ2z8!%4^N5HRzHfh?<7J)&l9`5J~5 zuJczgiY~kq5AjmbER}oZ{Oavp%4g#@yzQ%DL=~}^IN4fZzg1-^jh%gAyjbJR1_^Hc%8Xl%W?%V=$fQLCk<;})K`oxMxONg+O=`o?

xvJxqg))u90|)nJRBX0jeA^G$v)Sf=w{* z4zecRa{%Xy|Ee=Kk{S|!ZZMMLI%+Im%WSfpRISU0^|4hjMk2cGZrF@eO{|yk*(xZ^ zmAd=^4Q)*#tPWFN)}LUyXX3b`Dz7+E(?1s8!dfoYZeKpLYG0YyQ^E^TkNeJt^lLOI z3(F?Pnf8yijjR6FSxfrLEox43##20+ zFRfwBO(K*}#+bxcCr4>Qm&JWOLc&o9Ww%@P0}dF+B8}Wz@Ema-Da^gAj=Ax_uDW!b zO<3@Aq1nhFpl+4H@7AsqHxAqUW38)3nP)3&i%2IcoXUA?quwTyTbD6@+7a%^1|vb} zZsPo8vE%uqMSVEu3m zMcq*5jIgZmI5uCye!@jo4W%SLZIt1LY^c>!5#sJduViV>X13ffNd#^rAeq|At9)v9 z>1Jai_Bx&t%gQY}YvA}=<9V!YrBAK}iMrX2%$~};crwO2w z!dv@bQUF5tMOctRGNz&LIqp;L?~R7{)%FJK`>G`sDyVSH&{BXO%XPfan`Zp7VVGe z`P*5>7PPn~`eR^;ohrE_{Z%ki5c!SpmlTE`lKU+0U}Ro3f?^yeDYwsk)%@*mdrFna z>0#yxvfeJ{Gh#JY3~FHhVuJK81Jg3+=s;wnV?{O zh~`h@V_ye8rkttjy-%Y@Tis!G<#!&`;gqJHuBK!72HJM(>R{^hleR~Ff5me`#hP{c z4Pq1)4%?YSJxfmuFK+z<4C-_S0-9`TPu(g#4cP0#Iz0N4QWo&Kk=Ug|HzgzGV`r5p ze+JTq-g)33KvprndBIOJS->8jl(^z4;2xnEmBr#QB*;>t=mW3@uAEQiQD;(ae2MRi zZS-ZRj}-inh%>@Yq?ezKKDf)(@dO^On$I4MZU|Y5*s_>aP^7Niky6~=aP7Mb+g{9WpmWH`Ay*#ije!=20yl)@h)L_HR zi304)O|w^oyR?>R$Pc5V>!JTvD8QlsxA8O~!d;VN8ck zO6t}SQ-IUx);T2!ZAT=+Cr;5=`vyXO%)K&t*y4>Es=d1HEB9uzGACKxY~QZ2ah0M= z)}!yP2e$hc-tasjuWu+MXXL3IS#STY)cdf)0_fE0x-uJwhL0(*3ocI5FXJ^cQ1;uPIYc0OY14q7{jra?y}F~7;g->x6@I()r3Hm4exjJ zg!gB4LUJSJy}rrheyJ9<-K_MCW4WlebjxWpZ4KKFkmBAgR-}A2kb!C>QuSh4Kf{)4 zU`SBPQuKLs>N)B8$m2_Ytlyt-7>IPoQB>~9P_wD|F4TXt6JzotJ&X?BJfV-L096Nn z=AN#Vy55*uE_$?#KH}!Hu+yB-7Gwaw2AwtpqWIcQQu^#f$uUPM(8+rD?~cl z*OCNvl=*&$B!v|bknf_cAuF1%<%D=fcmWn#KejQN8l_o4?!VD21f?CRtL}PN_7*sb zK`~2~EL#h47sD{RUoBm$Cd<|gbkyCWb=9n;G!lu>Y~ z#Sy**8)aqySRbvW--=7Ah^7nRAaTDQ8+`{s9F*(DhW0@~^u=r&KlCyHGpS9ERgqfY zXQ1+vmPv5%_+kb71b7L^ zjRX2HE5^Ip-En1~|7N8R1YgW^?2mFmNmsB%-WX{N>~pp-jT}^5z&=PPvF>ws$T) zhW@CG$EFkeB~W~JhGCSR)61$-!pAgvECVdjOfT^Ge3 z7?~sj8ib-m;W4y6yr<)o76&yG^3&0@)R^g`f4_iNxRsH#@vy+iVr@;f8Hjh zRT`UDHJ?p*TlZ=ncn`?v4~sGF z){o>*8Mu6`)sjnPEUOvG8SJk&uE-dUc@wjyjIWzCTfC``M$c#dK>r0+`+)pCAKr^e z_Pm$=W)q6>(P{ac31aj!SL+=1ZVP)=YJA4inanEJ$^_XY0K4(1V8B=AiEZYH)Yyf{Z zUFv%7e4c^#T9?u|NjHTICDdJatkz(DCz^W3M#cuD7r@`+3hH=@cES&EwF0jCoHP6Z z0IzgRk~D_Ca5M(1WjBM8^3$@D5DQ6pNc{{aC<0R0?c>T~)KHe9=$je)mKQ4@A{!Lr zlYnPJjy{u(NbrJ1f0QE98l8nPwHLM0QWg)E`Sz-B;AW#m6yk_zI4KNX)Vn|RtE9DU z@f2?I)jvevbCX3HZZ-nwf4rp|Aeba3QW&h^S{-NlY4~P^9YHuZc^L**`WT>$v`+yIL>lc3X*$7Uw%ylaC;~8~B zf77JaY{s(s)=H=&5o_2-cnpjtK}O`tk{kM%mgM+LiSSRuNu!zbnJ6T>3r4`TiLdU# zZ0x$O_D9R1 zj!h~ts?{sPzDtb?M;S6fL(JZ}n)Y&kC3Tftj(e6hCOMzk!fIS%@g|maS+ys}%^iYL zUMD9K{B@fYBw4V}?;2Vx2qO6jW8!f5074b0=Cba2QS%9|t+sj<+RoaNJg)$Ofs)vj zQ!@wvJTlZMx^fh`{La+&wez_P?sy^DH|B4m520hb>Q_nAg{QN0}gn3c2L+QGlL*+8TEN z-GGQL%SI!VKu1yP;5P5>@Unc1jQuxzje#jaBv-WU@fcvWCDbF&OC8T4;&kFPOK*rT zUgZ{jnO$n4o~Bsm#XAE;Cu`7MqHL_Q1Fx z(jW>cRVXg+7DETU)TEu0>K}`vrNn}$BkPAl49E0WW$Mv!TjP)KG?slvfS}mX-prd6TSYRiFD}B_;#QV`W68W% z-BVf9q=w3uAe#e6MEtYNc!UyE_$Ana_F;F`X+4rx9`~N6U@W|IQ89k4J89d(*p18% z6|+D1ma&{J?)GO>4Q_#DD=Cm>gDb-6aA}mb?e2ZrkgFfWulcG;=SBS{eRL?|R+b;g| z{~(jZYzC!eC{bJ`?<71%>ZDW_DFx~_1LpouFW;)I@+7oy6&6~-SH@QBQ6yv;NPIMwmk#5K!?!wr_s+YUf{rV1*%_*(-^gbsMR$ zR#}N2Fn?L7!vE{~3w(}wgg(=*NG-Y;toYldF!Y z(?ca|5U%WrNV?$eKL#&l?19Co-&~37bBdp1A!>zsQ+}g8HM*v#iA+61rA_NlyB@@; z8u~oS{&m|Y!RrUIl6I~#$qVh??LMkhmjO1a{p38l>efz9W}1RmI=nnPk;r!D?dN?> z{Z+M6cZ70)xH-1_i`KSA?rfD=MtB-rZ?TRLNLD_o%SirI)4C9}clgg3@5i~l{>Ppx z#&df=H>@J}G+5?+KUu%Kp25nn!()`coyp@JvSRH=)8u0F5^vfBJ>_Jmq`ygEh=kz{osf zIYW7bL$2`khC-Z(laB4ym7NO}w3XdY?Af|{E7n8p&r1~es=u_F%MNlJZ~um7h60}6 zE#{9YFVmP}84WJN9(^Pwy&PKPrrF|mQ~BwyxhGODEOEX^27DS)83?2&J5q>^p;4y( zGR%eJztZ>${t#~K)u~t7^^Uj$hdr>><3PKbz~1>+kk;c%W8|sj*nVr+KDyLJ7xW zlV-xXII1qr=ndF7Es9{LB$XlJfn_5dR4Dk)t3C@n28oDeC9;npSC7^IhbdX9IR~Oa zHd6SWTeWyoEbsNCwqZV2tzrg(raSCvg=+6ff89$)CC7Pz`TnE*l9=1J#&d9To-4D} zTmJ`eeJ}5aFim>^Ab*bKt53wew zV$(wjz+EKXxPR8(T%4!7#tg)%I;4|gJXWQP0@2kw0?(@-P%UvjTDztX=eOpG{WlAR zFt-_uf5KljNb4~%^6o}4%8AAsk%(lMcNT9PVu+Ta+^&QNz|xmDLy&lvlcaR=Of0L@ zWvNM2Fn9D51DVTDjKK&I29mw00~Y*>L)7LFzWC!CiDF4zTGD-m++h{ zq!KPrlPEqW`MrwL9YG4KXch%2;6#@!6l3?Z_o>UN@{66FXTl8;Ot$&#+wsi1o2f^S z@@-tCW@D6AWP`qs&44tO1d9pm1`^%OouY+3OvWXJn1Cpq2!{=2h)ryqUiAyv>?;#W z%B)-Jz?NTZGnCocTo)j1E4WMRTSR3_fK-!}?Xe;cbc3Smqn9TYL0qdW#C?kdrJm z3jsnEI7yB4W49w#Z$6eVhT+VB8dJIX6#h;#yH8AB5jH?RNnl;pD08D;MIR%8-Sodv z-#$dm9^r`Wc1mWa$&Ho4*RWQvQZy8fMFQk0K?~NJV8AQ;;|xz={eejl!$2Bg{ScIW;O>5h+!*V)ETk`tO@Koks>S9RW$A>pXu5$BJP~(p|CqVo!S!i9 z+-dXUZ(Fuia9iO^3wgtTUR-J#i}udNkSNO-2Dol#qEbk_a#8O|2*tl|Xi}8TKuNTA*@uXG|NkPQysn6Xx*Fr4b zP~X+4s-eiFhaocGfG&ez6Y6H%;pvTK1?TfQW-Ti^Fmr5DmFNBqN03B?gFUJ60(1(f zD`$W4ig%oyzw0;zuO~U0xtKQ`YGg|cO()ve#v{iT3=E!3Q7)Kvx+44h>VtSwr zj#C-z;Q@KeTgR?QLZn)x6nyPuE1ys71q%Ae>ItV=kmM_MA;5Wb$R{h$rioKqjAw}D z+|tKt-k!&12O+4SWB9EPvv@3PM~>3CU}pK~fI%EUQXNv41j03*O=Y4?7u|qB=_`k` zM*+DnPxy&hjd!`&0O8Se0~snvRU06n0CDeYCNaxh=-3_dVM)wYV8N^s`SFZM2-t;I zlK31FK-(AmcsnE`7+@ojXIB{a1{#s9E10JSqphos2*_D2Qe!JR1ndad^4Wsl6i#@( zFX$t{ESDJ`+xt$P#^YN^gm2=Vg|azql$|HYXKM&$h&@=F@?AL_G)}mK^9oGB%8h>5Nk{Z|B}y$+M4H7H{siBsjKw0cjBJ zgw4dvh=$OrJKj;isZUNF8kQjCMhB{mbsUzlKdAr?)Z1(|^VpFKkv72nu4&ZaPp9~8Aea~>z%RFAiAl3<$u~n z78{aOjlC|d|F=a1d;O5HFBiqgkG~WmvwEwNkRH}g$nA=e?L)`9V`B?s_jc~A{uA)= zD$zkAlJMj=SgWhT{jcJ91Sd_g1qDEmKse5pocc(Fye)7J+AT-}8E0gJywk+$Y4R`r zrYisure&)KRYvED@qkd>;!RRKc{bC86yQ*a^b+C+{TYA*HQ*Y^35fAbW>y`poV0jT zt7l7YZC;{YgP^0YwSz*CHY*rO5Uu=3@4JkroG~4Ljgk+MC;u|VK~Uq}!^4`ICZF_d z>s@$1xsP3y4_qT7sQZ6Uoj^LozKf0Y?hi62C-)I@eKq)>FaZrZ`an?P)cd@>BE?~u z=aDT9R8Y%@KgJ;BegrO%oD-H^&rxEH1UL2Uk84JkF@~;{;vVN!9}U%(Y<>fERxs+R zFKCFzsJhrJVFd<|(~e^xRs}2!kuI%l<~W?p&S?Am;NV_NwRT~9eyu%q5NA8yX)Rlt zW%3@>&&eknnJ%oxnaa+^2qr={`UpvG3?@KyY7Ff zo)zG8m)-o(9LV)8dE!K`gX({>6T?sAJM`7o&KlC~E_19-SVGRun`>JIG~V4gC8i!b z*+na*W4}e9|J;ltxKL{8yZz2$`-)t?<3NXu>l~u-D-_f0#OGK>*jHMhp+G zMewf2O7`HmN2mZ8kT*ooXAkyd}WI_Z4wU zMcBwdVe?jbPqY%R4hTK}zB+i!VHdO-%0V+FJp1=&e&0Tti^}4t!PtW5Ww;+f_=5~* z%?rXKDS6$DkBy`MF?u_?7L1Bl+{*a4I?C*I{WoniXFV7NU@POJ@YqQ&5bnSnK136} zbLXx}RmF>$#!ifC(m`jgC+#Pr_fKb5c~$lSWMsr28^W-+)qFvP{OG`f7X4L>ZSP{4 zlJuUatkpDaVp$zD3-jZ}e4_4*=l*6fjXDA9EPLr7e%?6sG3(#M^HD}}gtrysDa$Ct zg1r}i3Q#=wA}cfBF_ft(dF23%qCjlO@I%lN0v0kK_e}0&OkB)JMCH-h@$Yc4&|(27 z#)1auM#!YTt5?wxNbg;#Pp$76$aG;*hb`URD&Ej*Ll2;SBL#@d!JCnS3v z-+oIKdRh1O=@Y$&WpY9JC15^{hKPvXA4*7B+&uI$*YwvD2T+oL@n>By*TH9_ACUC4 zE9J)8T;ATfvSu)tmhWVs$KO3obs~j-nh9nvxkT7&FRBZ>e(-{+n81OA&`ExEkxUdL z+&5pUypnwxUks#=Oh&K%#YQ`6*F^IVbX$LH;B2c`<-| z6#Pz7H8pc&ew`}8)`p_wL2FT2Fi`}Vv5FZ>$^Rb93cL%E!`JN3dq_kd;S-#Mh7Pa^ zQoWe-V_DBgik}DNd+6YL;H-unC#MQqYqpBJwz?0p3OVNr2}CLR0q`e!r)m%U zaa`gfZV6oiO%UxQcP%pTL~=UQj5CzF=sVo8*;vZz=%z3h9GYpS4dRh#y6e(gSwjV3 z+0_$jBhkY6c{4rFU)V6)9XQke&`^iVO| zrmR&H=Q#inqs%_uY&0P#?sdGSX2~K}B}Gf)fAx+ngM4a8A6yxMd?Qj=?_R--hq&0a zf!;THQt}?^4!PSL@Tf)w`-oH?7YL*PcV`AvbiJTc5`A7CFJ=JRRCt%Ip>~b9*-Vu5 zG(fg{0S29=_51Fg;o+=^=5Uhjp(MTnQF$w8$tpZ*S%2EuH2^N{nSy zI<2?{AC(~-;22~r(ATN`v_m46u&H~XQ5+7)w5z0ss+G7eRM%bcKVmqR*F5T)3FGSYld<9pfPJR7cS5V`ysPmlr)ht8V!8Jy!fDxVKh zxf?#?cz(7EBWTBgdA(d+W&qt`PEO_6o(R7pj8mefjz3D8;PG$ZfI2P~93dKCoe-v{ zHJ5`nLZYvUctB}TTLH)uSUUjH!IOY>8G4VkamMnEQ-QcizI6`fdiLp40K`>H7w`zU z*KEUSts1TS3}>SHD#wVHtRm)&yN*6_Y}?T)hJwJFOQ1Z!yU9utad2WMkD2FPY=5{Q@0}0Zy;0>5pnGOJHtm8&AVW z9hX)Oj(S-X_wS=F(|8VW{$A$g86%6;HJO}0s!H-p+!;YXDnEF>eHYIOYSVjZ557xW z#CJlsjNQ%~TZ*&732N{h)G3IJi;3O4rni1b1Za{#=1=0}{k2s9D5oARMPXZ%zbJ7EZa<2p^KGkxrsK>W`CDbfZA7d_|qv# zY=C;5m~kRp2C4~VXC2aHE~(XfD+3CwX&eYo3rKWDkqHMrZv)z5c#*6^-RT%f&L~Cl`$B*YDkVj-`jWVMf@C!?tg49$0R