From 3b19ba1790d6035a9e246f5d4ae627bf68778606 Mon Sep 17 00:00:00 2001 From: damithc Date: Mon, 25 May 2020 00:58:18 +0800 Subject: [PATCH 001/164] Add Gradle support --- build.gradle | 46 ++++++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 58695 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 183 +++++++++++++++++++++++ gradlew.bat | 103 +++++++++++++ text-ui-test/runtest.sh | 0 6 files changed, 337 insertions(+) create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat mode change 100644 => 100755 text-ui-test/runtest.sh diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000000..b0c5528fb5 --- /dev/null +++ b/build.gradle @@ -0,0 +1,46 @@ +plugins { + id 'java' + id 'application' + id 'checkstyle' + id 'com.github.johnrengelman.shadow' version '5.1.0' +} + +repositories { + mavenCentral() +} + +dependencies { + testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.5.0' + testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.5.0' +} + +test { + useJUnitPlatform() + + testLogging { + events "passed", "skipped", "failed" + + showExceptions true + exceptionFormat "full" + showCauses true + showStackTraces true + showStandardStreams = false + } +} + +application { + mainClassName = "seedu.duke.Duke" +} + +shadowJar { + archiveBaseName = "duke" + archiveClassifier = null +} + +checkstyle { + toolVersion = '8.23' +} + +run{ + standardInput = System.in +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..f3d88b1c2faf2fc91d853cd5d4242b5547257070 GIT binary patch literal 58695 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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..b7c8c5dbf5 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.2-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000000..2fe81a7d95 --- /dev/null +++ b/gradlew @@ -0,0 +1,183 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000000..62bd9b9cce --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,103 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/text-ui-test/runtest.sh b/text-ui-test/runtest.sh old mode 100644 new mode 100755 From 98c926b822380f5e4372affc06eb55de5968fa8b Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Tue, 18 Aug 2020 12:40:01 +0800 Subject: [PATCH 002/164] Update chatbot to greet, echo and exit --- src/main/java/Duke.class | Bin 0 -> 1516 bytes src/main/java/Duke.java | 38 ++++++++++++++++++++++++++++++++------ 2 files changed, 32 insertions(+), 6 deletions(-) create mode 100644 src/main/java/Duke.class diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class new file mode 100644 index 0000000000000000000000000000000000000000..cae8477e762b9a9fad70bc07b6a8b1cff712ff66 GIT binary patch literal 1516 zcmaJ>U31e$6g_L3NLH055g{Sa&;3s($Ma$sT63`+)HwsFy7lwjcTW4nw}Q_>!Se zRXdVlqV7j>GYy+E-V)7#kU}W@h+(GmWBs+*7v(@iyXA(C{b;vh9LF14wAve@li6GN ziot29G;Yat-}o0Fq;0ukTwQoLNe3HX&0+9fkr}V5Fci@aZ}_oXvv9-3*SN_rd0#1= z=vZ_%q~23I$;22|ZQOG44altG;x@izn94Y%+7HT&mWU!5ySRh9=BV#n+{1liM~CK{ zUFo8V2R0tsST|7~kv2nx&N>qItod5D^bpk3It+CaEklZ`QnEeOON_6|&nYXK?4<}R z4j!Y%u*x|79>r2>%2>j~F0cD?SFSh)-`?x;J+Uu&SEW2j!%#(XhllbmrDrx2ZCO=O zOXzK1@6jsJBGL)N<IYtumt)1}2xj3(uqR0K(FH&U^zii9jjlK6q)UY5C<=0Ayq3*HH&NYYqx zt#~5ie$Ix|x#b4|HypV3L%BjyvlxuBd258!;{-==w(!Js%O>5Qqc-uQebtuzYtXCF zx@c(?cP%`p7OyMSPCE>4&9r1S5J@7baK8+a=*Q@__hY&OflL;9j+Nug29P1gt!_t- zFdw|Ey`HWNYU_uniXdqCT2?H4&v5COzERv5&VAet=P^mol=&Cp9!1Pxme$7fZ{%@;=BAgcd-;vGC@dcu-~eNPzx93xr+F#+7U={||`ReMtZS literal 0 HcmV?d00001 diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 5d313334cc..5cbb82c988 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,10 +1,36 @@ +import java.util.Scanner; + public class Duke { public static void main(String[] args) { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); + + // Initialise strings to separate messages from Duke + // and commands from CLI + String servantSpeak = "Duke:\n"; + String masterSpeak = "Your Command Sire:"; + + // Introduction at the beginning of the chat + System.out.println(servantSpeak + + " Greetings my Liege.\n" + + " Why have you summoned me?\n"); + + // Initialise the Scanner object to get input from user + Scanner myObj = new Scanner(System.in); + String input; + + // Start chat + do { + System.out.println(masterSpeak); + input = myObj.nextLine(); + System.out.println(); + if (input.equalsIgnoreCase("bye")) { + System.out.println(servantSpeak + + " It was a pleasure to serve you my Liege.\n" + + " Till next time."); + break; + } + System.out.println(servantSpeak + + " " + input + "\n"); + } while (!input.equalsIgnoreCase("bye")); + } } From 1c0d3e017051fa7a8722572e2dbaf759d4045301 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Tue, 18 Aug 2020 18:12:00 +0800 Subject: [PATCH 003/164] Update chatbot to add and list input --- src/main/java/Duke.class | Bin 1516 -> 2057 bytes src/main/java/Duke.java | 28 ++++++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index cae8477e762b9a9fad70bc07b6a8b1cff712ff66..2da39c90ea3adcdb416a7bdcc30e0cbe56ca4a70 100644 GIT binary patch delta 1130 zcmY+DT~ixn6vuy0vdJ#XLLoHRK!d2zCcHFQl-g8VX{(k>i!Ih#TCEF7Av7kiSvvN@ z$%WM!@5CKvQSWs80DcH>yse{no~0ddcjr9k<$qrHIe)f(*irxO z-{z0NG49wLBx8}a7;0gdk%XwnY@Xz($+*@$Wn=QR$%KtfMhnNZ`5BAjHr?bCD8?+F z)yn5I=42~_oYLfZlgR`T&S>@71W{hpE-#re&Y4WD&(0a=O3Qzm=~B&ixW=6J?o&kP?-m`dbHm~dg;6fml45_8D-Jh#%fV&dVSz%h zs=97k2=)@U92T|1k`_u1%iI>%vun4DQgoQF>{b?YGxN*E1z$?IKE11)^}SMM@q{9= zTiBFe^jyE{1^3i=w9MPzHdUuO7%#4_x#gN7nc3sN6EyfMGF6YQNGOSKl^*yjx-;1w zY&edGaV49%6msptuL!TZsy@`JCU-x+I)!QdmKFZjS1KHn?XPCpU3 zJ@W5`J}OdLP9hGWqyw|xWRzt zl8T?`&Rc>>##2_4N5T;I;%amI51ph=+a{@0EG794T-BjcMw3*C+DYHDvAv`lii8c# zb3phOX~CA}+DOQomd!XsFQYP6pk=PCZ delta 623 zcmXw$Pfrt36vcn9opz?f0Bu3Ag+h^nv;~Tyfb|cGSOrDJ#+VQ{1skk1ttqXED>rUT z+~_QfpTM;eYtn_T-1sd_bZ6ohFz9`g_%b>7p7ZWIciw$3!oRwT-wr#Ufkp1vL>RV6 zSd4@iB^ebtWi!E~$#Jbr*_fm?WVD>Mn6`;A6Gf4V;$zO_gvrTQ&$mYB6?U=SYV4E? zm1XCIZGlpLb;y;jM+Qx2zDP=r_N_2z!FQF^>lZa%C(*zXOpXtCsQhP=sH zhjW})MD*cYt68b$iaVuRt=w?9z_PZx=x~V@UDv1ZZ$B+NTxQkcibX-YTy?*z;Yips zsFrHGxni?XsqMOxzIp#O)(-CbBFa55((X%t!7)`*ma-K~Q|@LU;l45AmdUy{y6OHf z((1O`6ZmLsDkj|Dff4s-AiExx+3DqzQONZK`-LSWDv5#2C)9gM6h{Pup6DmU0E3e2 z(y#alNZfX}f{AAzFs9oCXWH0#Lr9yhm=Sf_biXAkJlmlMq~aYzn#PO{y`J#D?C%%d z&*$}9pj&cFI)tRR9#}+vZGe userTexts = new ArrayList(); + // Start chat do { + // Get input from user System.out.println(masterSpeak); input = myObj.nextLine(); System.out.println(); - if (input.equalsIgnoreCase("bye")) { + + // If user inputs "bye" in any case, end the chat + if (input.equals("bye")) { System.out.println(servantSpeak + " It was a pleasure to serve you my Liege.\n" + " Till next time."); break; } + + // If user requests for list, display list + if (input.equals("list")) { + int count = 1; + System.out.print(servantSpeak); + for (String i : userTexts) { + System.out.println(" " + + count + ". " + + i); + count++; + } + System.out.println(); + continue; + } + + // Default: Add input from user into the ArrayList + userTexts.add(input); System.out.println(servantSpeak - + " " + input + "\n"); + + " added: " + input + "\n"); } while (!input.equalsIgnoreCase("bye")); } From f8c455f0be04a8838946d86f5a4fcf6210d73157 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Tue, 18 Aug 2020 21:59:42 +0800 Subject: [PATCH 004/164] Add ability to mark tasks as done --- src/main/java/Duke.class | Bin 2057 -> 2897 bytes src/main/java/Duke.java | 39 +++++++++++++++++++++++++++++++-------- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index 2da39c90ea3adcdb416a7bdcc30e0cbe56ca4a70..f1a030f05a85d7012eb2954b458e060fe29f6d1c 100644 GIT binary patch literal 2897 zcma)8S#uOs6#i~9nVvL_z(4{cpp7ghED4(|69lsm7|eo90K=l*%v>@}X1a&&JAqNe zeZ_qRMJ=Cr@&T+G6sjz$eDg(rhvkD+zF1TVo_jkX6EbBv$(-qX?peQc&h7il?dv}Q z*ov=AJdDjTJQBl}Mp|!+6MKh=N3qkuF2#Awgn>>2T_#LyR*P=6-4nxZ6YJ3%2g8mS z_Nqlnk$ol}N1u}JH!xtL8H0-KSLBH}>X0@t6i2<%Iuu7lxij(PENsBAB1htAz%eC# zTx~oRM-M7q7KV3^bAxMHAG7!m#uAITFZQs9ou(A;vg z?<61R?RoBwwx^}$kJMH))Y2bu~QREorc6pu*q|b}}Lgu_|FeeHphLaY?kT+1U z;KE~=rz0y#C*PjVaMu;Sg(6NVS3bl1sohTB=jA>pkQM?EaaAbwBV}Qsgz*?oGc;s9 zSJ)QLplsn;JZIpnh39e3!V7qj;27e;n1z?nYT;#N;uXjkUR43T#;|+}qLiBzX9i1h z@I;qaa!h$C}EpCd*^o2mGRb7ecn$Aw+?N_J2x6bRF-T@bsd z;0p_UOmus0hRef_%+XUIxhn&PRV_7IY$j{6qSFIoFp4V7JT+@mEko3+b*hu6(n`6- z(qvi;izbxFZ1slf@t7;lNHrM@3tC!hMHCgMN<2?FOmiI;sH61=L#M_oCGFEZu(@5# z3m%kwVN1^rgg=4QbP$J}eBM@`ZRr$58-MNOVaF7>KSsSGb53AOQm_dxHIhl)Skzlb z*>RgO?5jp#BEXrInaQaMMz4-(C?}{Qfe;09?b##3=B_P#-}6~Q*OH6^OE_3eIsQUtP`B&eOc1K2#-Qu+X!9Lx^FEXRWZ zs=q#?sfQw}8SZVtyVzTVjm_F7@!8&znwk7ePE9!Kc{a=NK-jWjS%{;nLLE!#ByC2M zyzPILpoRwnpQ=OcBEyQQ)68+ly)iNIY6;JWUY?;Ns%+p(dSUc=-dL%~V5QUn-<{_{ zAZQXUR0lC(BYauxr58$G1S>+tj+wbvai%E_m5ZW=c=aheIoUH!bn|>ZO~vgnaEW2% zjQncFMp*y19F}1fT`$z94otm4iLR#AQu<}|+pzi?*cEzUSVJ_bnGrN%E!NR9iPjyV z%RnOuB;$2`@%sL&h^)CzEL0G^0b}?oV%N|(a0BM>HOxvj(EeK5T33OUjL@Qj*@;N} zz6$1CL_AcUtCcU~ciNa&LHr_)CnB*5=Kp{Nk?fXeqM<2TLDNk%SFlj2R5KP;FA~>r z|Aeu5Nh7qrL^DFqmvNSSEY;2rMz%yli3hYqqM?EZlSab$5jMj`tW{4misUvKBf+L< zf?`^v2)TJk>%1Cem+$;GY1>XT+(7eiB61DOD_C(@Sx-c+V`XT6BJ10KULhnMT*5b4 zOl43wf31tsNLMhEFrSS${Vk>Y)+&-%hb7oVtL?DSO$8jp3LK!)9iwVEXu~+#agJ_j z=dqEZZYR52$?_(Ai_Q2B+weVUR_K0s6Fc!UcHvia;tzD;FZAGV?53)Bv3m5fDE6>M z>}7M1VsZ4dWf)-X*w40;w>FA#1m+zIC~BbHz4>zdQ z3@n~~3$cIjAU$rlg^jdWqVnHJp6V$23-oIePM_fme2xU=0O~;lN#b>Ax<}IknjX~j Ku%<^fefnQZeBWdM delta 881 zcmZ9K%Tp9r6vlsdnCaWowuoau8pR+Hy_A^HjZ}W*E&l{gl z_tC)xBQ9z#rHFCG&{tE`F=j%p=>+4NiC?y7+plYGD4gkHwKN}$4aLivEjEt@Y~rub4b?Q)wtii0LPU9IHu z>FIgDPzXvcUom6yeH}hg&G)`x*0>&1)XhBzT)yS5&3B4;K3A@|+~bbR_uO~!nRA(E zK}ttC^L`>3 z*V}FKslGO)IMq23Ht3E+(uKbuCF+&22@Dp(UF*V-6b;s@e!e`BEfh<^6~8RwY3!VQ zzmw6fSxv#zFNNoIm#TzW{Yq8CR(taL5!tW#VzMTgrpOOPYn4~Yo9Ny~y%3;i6KO?c zoFvC-7c8#op{y+_wm-rxdupTP#Zw1s9N1($p0QpM@2QdU5;YEuXixvn2Z~Kj7}ThE zL(_;YK8==V?{FAuSU*|n>E7Q$*4Y0P&r5iMnrBQVFTR5pIZ2WF8ZDc9OQyG2)Y}}* z5Y{;Z8(p%RZWiS>f25aRN%M$)9?Sjx#vo6~@Judyn_=EE%14sn5_*r5Seg@>rs&sl z$PVmDmjBU_Q4IgkqBI@v=zfRYn3N%$j9NKGdQE^M( userTexts = new ArrayList(); + // Initialise ArrayList to store tasks from user + ArrayList userTasks = new ArrayList(); // Start chat do { @@ -36,14 +36,37 @@ public static void main(String[] args) { break; } + // If user marks "done" mark task as isDone = true + if (input.contains("done ")) { + // Get the index stated after "done" by parsing the string + int index = Integer.parseInt(input.substring(5)) - 1; + + // Try catch block in case task was not found + try { + userTasks.get(index).setDone(); + System.out.println(servantSpeak + + " As you wish Sire. I have marked this task as done:\n" + + " [" + userTasks.get(index).getStatusIcon() + "] " + + userTasks.get(index).getTask()); + } catch (IndexOutOfBoundsException err) { + System.out.println(servantSpeak + + " There seems to be an error your Grace. " + + "That task cannot be found!"); + } + System.out.println(); + continue; + } + // If user requests for list, display list if (input.equals("list")) { int count = 1; - System.out.print(servantSpeak); - for (String i : userTexts) { + System.out.println(servantSpeak + + " Here are your tasks your Majesty:"); + for (Task i : userTasks) { System.out.println(" " + count + ". " - + i); + + "[" + i.getStatusIcon() + "] " + + i.getTask()); count++; } System.out.println(); @@ -51,10 +74,10 @@ public static void main(String[] args) { } // Default: Add input from user into the ArrayList - userTexts.add(input); + userTasks.add(new Task(input)); System.out.println(servantSpeak - + " added: " + input + "\n"); - } while (!input.equalsIgnoreCase("bye")); + + " I have added the task: " + input + "\n"); + } while (!input.equals("bye")); } } From 6f31835c24074dc17e38a7c2a93be58dce296880 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Tue, 18 Aug 2020 22:00:27 +0800 Subject: [PATCH 005/164] Add Task class --- src/main/java/Task.class | Bin 0 -> 583 bytes src/main/java/Task.java | 21 +++++++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 src/main/java/Task.class create mode 100644 src/main/java/Task.java diff --git a/src/main/java/Task.class b/src/main/java/Task.class new file mode 100644 index 0000000000000000000000000000000000000000..bd9aa3d236fa4bbfbc1e06846b3f776b30de80cf GIT binary patch literal 583 zcmZWl%Syvg5Ir|dbJI4pHEn&rS2cnz6kI5RD1uPyqQ!-~w1yHNiL|%=i(lYYK@nW| z0e+NtZX#82GjnI|dCbhm=i57gZ7k;@F`a{j869SA%-NWiSdds0FqJ>J5^x)r{++*Z z?MJ;J6z{tXXugPW; Date: Tue, 18 Aug 2020 22:03:15 +0800 Subject: [PATCH 006/164] Update getStatusIcon to return tick or X symbol --- src/main/java/Task.class | Bin 583 -> 577 bytes src/main/java/Task.java | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/Task.class b/src/main/java/Task.class index bd9aa3d236fa4bbfbc1e06846b3f776b30de80cf..8a7644126b62a9064caa1ad7a263fd579dfa0dda 100644 GIT binary patch delta 23 dcmX@ka*$;M8zUFs(i~wIk2Ydhk delta 29 icmX@ea-3xY8>0Y=OMYG|BLjzDeu)BzxmkeGkP!fSp9i=A diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 586debfbcc..2b244890ce 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -16,6 +16,6 @@ public void setDone() { } public String getStatusIcon() { - return (isDone ? "Done" : "Not Done"); //return tick or X symbols + return (isDone ? "\u2713" : "\u2718"); //return tick or X symbols } } From e8ac15578f23388e9e97c7c29c2b9c69aa115178 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Wed, 19 Aug 2020 00:25:27 +0800 Subject: [PATCH 007/164] Update name of Task attribute from task to description --- src/main/java/Duke.java | 4 ++-- src/main/java/Task.java | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 1227516b77..22915def69 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -47,7 +47,7 @@ public static void main(String[] args) { System.out.println(servantSpeak + " As you wish Sire. I have marked this task as done:\n" + " [" + userTasks.get(index).getStatusIcon() + "] " - + userTasks.get(index).getTask()); + + userTasks.get(index).getDescription()); } catch (IndexOutOfBoundsException err) { System.out.println(servantSpeak + " There seems to be an error your Grace. " @@ -66,7 +66,7 @@ public static void main(String[] args) { System.out.println(" " + count + ". " + "[" + i.getStatusIcon() + "] " - + i.getTask()); + + i.getDescription()); count++; } System.out.println(); diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 2b244890ce..fb39fc60b3 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -1,14 +1,14 @@ public class Task { - protected String task; + protected String description; protected boolean isDone; public Task(String task) { - this.task = task; + this.description = task; this.isDone = false; } - public String getTask() { - return this.task; + public String getDescription() { + return this.description; } public void setDone() { From ee19b5a8963777e30ae6fdd8d3d39fca69d025bb Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Wed, 19 Aug 2020 00:34:40 +0800 Subject: [PATCH 008/164] Add toString method for Task class --- src/main/java/Duke.class | Bin 2897 -> 2738 bytes src/main/java/Duke.java | 6 ++---- src/main/java/Task.class | Bin 577 -> 1073 bytes src/main/java/Task.java | 5 +++-- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index f1a030f05a85d7012eb2954b458e060fe29f6d1c..8f61d5f54a6604df2edf4c31155d9385d1e6d439 100644 GIT binary patch delta 1076 zcmYL|U2IfU5XXP#cK4pUmkXsgp<$8giq>7IbkWtKt)(rLBDB@qKQ`u zK2aM-PjJ#uQ;MdEGdYhk6^E)KI#nv>5*~A$@;J@2nlm2H@w~?iyr_sA&Q@kUULxgD zGAQr&=1Xmh;7FMSqZq_9+!C+daXz(eKtd30bN$p%lr~{$Ras4}P?hj^=$6^it5P zx2ns*wEkRu7_>Pf2ioNZm}SWzrG0{1MQW2>$sXOdgt{sR#Wq1ZR7Qx=!R>Mus?{%Z zj0qtXEINnQ{2Y(?Ep_}Wj0MfHj#`5_)Ug+6>DJeXbTqgjRLHr`+67LF!{$28;t=Vw zR~c;~BOa}DW4Dg$FSto@g`_zp6kpTY?Fey$9e3(%Y;bc(KWnRnm7o3%n}|ohr1fZ5 zJhH@=I=37#k>imDx30#H`0Gs473->$k!PNZY?2W?%^}J|BLiWRlE3xetuzqU)jTNvj5H?f3TOo7~(qnq=mz(nGw~-s7f-%c8NcM zyCO}uHJzGt_-T1pF04pf|5Mk*q(f_H=`+Ir4yy(kl4jG|Wt{8MBh8Lwwu`ViMiX~P qDocJnklmFcFYtks5|;vy*=g<-U3Z8>A&!MO9^ylSF~!kPc>EvKTE3+K delta 1137 zcmZXT+iz4=6vlshI_K;&hf^yjnF(V-hRZ-pp{2D#TQ0S=l(td?N`)4yPTLWBv4fo{ ziXx+k7pONp-l|pOQ=fdG#6fFfNPP1}{TF;OQ6EfvF(gvgK4@a%&dImeTHo6H+iS10 z7vn!Bir?K@`Ucp^$1a;`bhy`HM@;-CU&6ax_OMseY9jZ!XxcRGE-sD6x!=$o4*OiT z)9Itw?a*bMZUa3o4{*R__i7HhBzVxkAp?hfBJ}Adj{20DWe@p8jh@T#71T3eV9>|n zVUs>&h(~;E9@Atr!&epu(<7QuO;+Ld0>;CbG5TnKK!WDyoBemD={W z$4O2p?rhKH3i-lx=5%kia4I*Nudo?&826Z9QuBnz6uIEMN;s!^(k!12=GCgcJO#s4 zE6Rq?W<6#&xSVX7UprFHr4q!EEs&1&519 z?4=+QscL*#awf;}5`4wuRW5m4X4d01UUzuIq`hg*kn?!U2wpLfw}XMmY+1lN*M5$y zk5rbQ%oh3znZiuIdn7ld(Bd0aMMn^~TAdSWD5VrV!Eq}cOjy7AUP^|lP5nbOS9J#i zR&y|Gr-OcLm!o;tsLTal+STf#;3xZw=)58wEDL`_Z|vD5KZzL;>9t(0;1==L$gE_x zwp>SD6+=-YXotZlF}AWzY)Op_N=IXo&=S--hgbZPjQT4}_;U;emz|no(u&(9;x|Z? zNG@>~l&}|A*`gPT)-16)42WH#e1UVadQFLnIr^hJ?AsZ4hZ#w$#M%~})L)TO%(2y2 z>lCtaizA6~JL!~IWk6)shifj{s%v5ShkrLuC9SVX3?!r1*-&ERF|&O#x4wAr-^GcOIds5FnjryR=%f= z-)QF#I{1@)a*^$-j80{u=H^&gz)F%?6Q*$nigr*_C47<3rvjDMcWC a)wD=#SBU#VJQ8BRG);(Op>ra{NB;(nkIOy) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 22915def69..fd1d1454b0 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -46,8 +46,7 @@ public static void main(String[] args) { userTasks.get(index).setDone(); System.out.println(servantSpeak + " As you wish Sire. I have marked this task as done:\n" - + " [" + userTasks.get(index).getStatusIcon() + "] " - + userTasks.get(index).getDescription()); + + " " + userTasks.get(index).toString()); } catch (IndexOutOfBoundsException err) { System.out.println(servantSpeak + " There seems to be an error your Grace. " @@ -65,8 +64,7 @@ public static void main(String[] args) { for (Task i : userTasks) { System.out.println(" " + count + ". " - + "[" + i.getStatusIcon() + "] " - + i.getDescription()); + + i.toString()); count++; } System.out.println(); diff --git a/src/main/java/Task.class b/src/main/java/Task.class index 8a7644126b62a9064caa1ad7a263fd579dfa0dda..734ba80103b2274cad83c5783c52b4610eec0a0d 100644 GIT binary patch literal 1073 zcmaJ<+fEZv6kWS5o#`-8C?H-D5U?E-yx=9NG0_?#3Ft$KCK4YG(~~l^%xPv$N%#(5 zF!9}2O+*tO`~W}04>9h!L`vHDF#F8jXRWm_XaD+h`V+t-JhV{2l>$s$jm$NR%}j}} z=1tr%v0z})z!G7&AwxItI@(h{p|rU#4#jF)_|4V24m`hECFH&Eh4LkV-m&w<^F95P zFjelyR^AYDHPv8jantkVtM0+B47SB?nt2+hur0#YO4NakQB2veFl@udh>Z)FAdEd%N{2cS zoh_;NR3j|rQ8rPr;b57N{r%}fY>&B%NQxO}<9NNhFI{~ul(b{v7H$)UcIf>q5vC7B zOV*U{3jNm8d;Aw_;p>p_c)-N^$1q?r23DdH?-3Tx>hb(T)spEeCHdBct5tAhV2$5t zQ>j+BL$Eh|Uk0_d2t&z59QPKHY9!NmDf~uTh6@R?+Fw~u1Q{oLg6vlg5ysh;mWu_-1Wv?!Dam=FCg_X%=5UZy&%hvkXhsro~o}QOb78*s^1p2xfWna9^KY=l1S) zd8Jt>clYY^vVK35X}ucdj>3`Bc4Tz?shrH2DaR^2!h}VW31j1eBS+}^MLdVQJE>mTD`6_!jtL2nZJ+LwPI{~ebH=80sG1V;3a TQLwI!C2|**4Sh0f4mN)Q3jiGe diff --git a/src/main/java/Task.java b/src/main/java/Task.java index fb39fc60b3..eec5b97296 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -7,8 +7,9 @@ public Task(String task) { this.isDone = false; } - public String getDescription() { - return this.description; + public String toString() { + return "[" + getStatusIcon() + "] " + + this.description; } public void setDone() { From 007cf2248a47aa63b5bde0c0652c2836c73bc3c0 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Wed, 19 Aug 2020 01:25:33 +0800 Subject: [PATCH 009/164] Add Deadline class --- src/main/java/Deadline.class | Bin 0 -> 868 bytes src/main/java/Deadline.java | 13 +++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 src/main/java/Deadline.class create mode 100644 src/main/java/Deadline.java diff --git a/src/main/java/Deadline.class b/src/main/java/Deadline.class new file mode 100644 index 0000000000000000000000000000000000000000..0197e3c355f73394e996265653f9f2effe508eb2 GIT binary patch literal 868 zcmaJ(G3T89BdLS ze@v*fFT|BN423#7?3gG}XHA0rB2a;ON!YJvud@;Fgm9~+`;t&@2THyhUHUTW3P0pX z!RVBiuvYi7$%IlzkD{JD4ifm{kre%qNuDISToiHFg@b~NMJy4PUukV(6N%wlY0h;& zF59?Qz6BC~0uw+}w>CVAUB5jvY`#a}AUFm_GjytV)EP6&qV+Z>@{kGPF(U9f6QA$Rw zP{grh5uav7OgYjiycVh-%D9#$HnYlRBL5_I$3vL|Kb^t9_b+76G-rF8QnW-Eb^;@t z4(f#6On-UW2wVThVTV7f&EJ$?FnM>jEVhd%@xH*`0sC`&E;J6VL5;`XV11duUEY@_ zSMw8!5~uTj;#iuvHz8t7;~H~~udr^o0zUuAwHe2>%uwdj!ZK=nCS@OD509{kHTDba Iuk*V73sPX*y#N3J literal 0 HcmV?d00001 diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java new file mode 100644 index 0000000000..573b7b8793 --- /dev/null +++ b/src/main/java/Deadline.java @@ -0,0 +1,13 @@ +public class Deadline extends Task { + protected String by; + + public Deadline(String description, String by) { + super(description); + this.by = by; + } + + @Override + public String toString() { + return "[D]" + super.toString() + " (by: " + by + ")"; + } +} From df7a4131d11a54ee52cc6e5f60e1e6042197b46e Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Wed, 19 Aug 2020 01:25:57 +0800 Subject: [PATCH 010/164] Implement Deadline class in main --- src/main/java/Duke.class | Bin 2738 -> 3067 bytes src/main/java/Duke.java | 25 +++++++++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index 8f61d5f54a6604df2edf4c31155d9385d1e6d439..5130757285a8555f0a8a009da1c2e6f701c11ede 100644 GIT binary patch delta 1155 zcmZXT+jCP@6vlr$NwZH*kHW+e8yv@s^hz(0DpXSyX)D@VN=r-HQbkUiLz^}xHA#y_ zZ2?hKRD|OV#XAbh6Lky@&M-dt;G0jr`{MrqBX#ZgqT`;dZ?D_8*IN7Rtloa(j+I|; zUcCl%aLJ~Xq(!I2LlGY4k*K)4Y`W>uJZ3yQZ8VQ-p0Ke=8l%^Q`z)Tc*+zd9MVG~Z zF?Jgmv>9TL$sX2>*lb|0fmDL=uYNXd}DnPSP}9f#ALaqxN9;XU5B_`sxn=y2AQ{fLhhR*&bVvzeTX7fehp zIh^AY)83~JpP61hH^uTjd4D``GWZ2we*b6Sd~m3`l;1l)?-jb;q7cJVGj3r=NirLI zo4Td>;(RtEW83v?fwxfrGE2&w^A#I zW1%wl1j}r?BxJ~m1Vnm7?i3jjIk-wFT3aR@3q|Y7)F*XJhuV`?Ob6T7TV-xbMt-7U zJQj&rS7=OzV^y(mnWj;pH5;wwDw{$07pOKzHUD$et!38LoV|JRvUHi@6ld5drOgc2 z}u6vlsNW}0*7c8IaCMxuo@MTSC1N_jUWN|D#88I&|NGa(`GA%yGQSN?#q z)LL1~A7Cxt{Tse!k#nvOxa+Rx?7g37pZ(l>&X4(Ha|gftn*0ou^U7v9Wfp5K)&*Ek zc~F-tY&KIV*9vdh43n?39`>Zqj7W*+qh z_66~kw4h3h?5Y^s!1j@=}aotQ8IVQdh4Ws16fd14 zR&-B+K3wy7^cm^@rLjn7d3qIk%_^QijOsv8tkLfleFRv+N*!ydr&=FTKnudocdNm} zH>WnxEG{^20?n2Ap{!5LI~?*&uw*)Xk5{a1ELm#9MitN%mj zFO)2pF@^P$#X4L)MTt%p2Jo^*Px4S&gQEjm+k3)uZ7;+Iov+mMHtO0Y7k9YW;9{eT K2VFeu;<4Y5Pm4 Date: Wed, 19 Aug 2020 13:22:39 +0800 Subject: [PATCH 011/164] Add ToDo class --- src/main/java/ToDo.class | Bin 0 -> 735 bytes src/main/java/ToDo.java | 10 ++++++++++ 2 files changed, 10 insertions(+) create mode 100644 src/main/java/ToDo.class create mode 100644 src/main/java/ToDo.java diff --git a/src/main/java/ToDo.class b/src/main/java/ToDo.class new file mode 100644 index 0000000000000000000000000000000000000000..eff080fda7fa3aa5c812bc73fc5b55699543d2fe GIT binary patch literal 735 zcmaJ<%TB^T6g?NQt+k5p_ggeR5?#8$xDaDBL0v#}VO$I_kwTpz?O@`c_!+t~ap4E} zQN~*!ihzurFp93btYAH(sI8e?GG#)OSYf_3OC-y9Jpw{lhSDE0%P z?)UR1^woW4`arxHa=wz6jfbKP3!)e>;uzhc5hk{_yTt@IuNz@Wp87F;prB9m zUYx>%1>1v*LBhzf)+REcs9#7^(d8&*Vama@hZ)Rr@>mpaBC5HV!#vx!g*zflKZu&l zYE=^E#y1tVA|sTE2%Ehc=`PR4LY!oUkpAu4SC6_T+wHfapNf*v;ggLu9#&54TBA85`?_jjsNB)kawQpNCZ>`T4|O0z3=YygKZyv7g}G+Sz>ry|Tr(&8yo)`&g4? wgs=ODPi*n|&KnZ%=mTDUG*pF literal 0 HcmV?d00001 diff --git a/src/main/java/ToDo.java b/src/main/java/ToDo.java new file mode 100644 index 0000000000..1d00ab9d69 --- /dev/null +++ b/src/main/java/ToDo.java @@ -0,0 +1,10 @@ +public class ToDo extends Task { + public ToDo (String description) { + super(description); + } + + @Override + public String toString() { + return "[T]" + super.toString(); + } +} From 160086acbbc7c151931903c95a5d4645420f5175 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Wed, 19 Aug 2020 13:23:05 +0800 Subject: [PATCH 012/164] Implement ToDo class in main --- src/main/java/Duke.class | Bin 3067 -> 3305 bytes src/main/java/Duke.java | 12 ++++++++---- src/main/java/Task.class | Bin 1073 -> 1079 bytes src/main/java/Task.java | 3 ++- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index 5130757285a8555f0a8a009da1c2e6f701c11ede..8ce19e351416670b211a0e0c286c0535d58ecbda 100644 GIT binary patch delta 1303 zcmZvb{ZmwB6vsc$?y}F_%S~t*sY_9g74f1_2$%%HTMgtu-o9Hyrn>AfFg>)O(62`}qny13}qlOU)6ELN0w&&7F)Icmu4m(Vi zUW+~>cN*Ab(QomL#ehXzGhkEBpkeN|NN5r^l_ZUx3KKL%hBSK*UGCD)YKArYyh?SK zzlK_`Sg%s++a4Jhh$S3ew;bN)9nB$!!*~ww@}45l9!c(Uc%NE_BaB*nV46AV75hq89us%JWVbl(@F5>L zjB~=_V?MDsX~I5r_>577lKiLm++l*#3M(3mMEm;&VnR>Fqj7Jyui)+)zHm6hn5h_F z9yi}|z~L;XExz=Q`^Nm|`09L_f5IPXj_-{nnj*=VcO_VpXZ1#sy-o3`B=eV+t@f@4 z3%zqW1+zLtk3^%AF4?y)=B?G`!LLnA=e_;9OkMC!=?g03bz9AAs%6~F=?! zm>a$?!~Op1ddpWAa;*#xoRu8ebUx~OSIEBnp1{wYB8yxrT#_O0D24vI&;0!evsd-gfOkb$vS5wf)ukQnH|4e@FRdSG&2> zRMZFE95eeWF>)-u<4*8NsJO95GD%&1tyun44KTtnF$zB z#^8b)6-m3{z6a$AEr${wclP_8zIFO9|Jv=9->zT0 z1Z?D-%PJB!n{4iPcz_3E67F{Cp;z;;iS)T>9??AN;*v1VR+H|xdCX-4+hQoXZ3c|9 z!@y3LL3Wwyq-MzFHiiw1#0arlGZrH}U^@23h!`rDC+cL9eFpZ&h>|j=j2oD+N!w(M zc~FyfY2``NFd4&Qx6L8VlqPrj%AU%!Ca)R}mYNvc{gm^mHnpZcJv2nS^G><0*=YW!;5Bxl}HuX0~U_lZAAt-lAkv_L$|c z=7`7B%qea$2ghg2*<3vMSvmGmjv1O~g5Oocz_T1TWx^RApUZeuc+O^C5lt8JnMRKj zJn!)WFKS-$ILXT%ukflOGL$M!c`Ok3c#Y#WuN%@gg0-QxkyDb+WlLq7H$6_X=n?Ri z$J@MP^R6j-&*O}teV-2$c5fz?&Smp*4dM9soX3ZJWXAj0;}bK>r-rQ1TL>FK zeG^>KKSaJ&G%woC!7p}Gf2S;#c|x)ua`l4uhd>A_u=C5^Jhr z`H@(2m6n9|b)+j{`#RjU%&u~4!ug5TG2ij+3$!IHKk8dm+DE0W!&nU$Sqaj=M4dUR zk9;~T5S=pwV7*L(;Q0v*LHZiFB*rk#r)n0~F ziV>9+onurL7*j{sr{+1pIx{lf4O*}?>opr{ua^H!F5w0p{}0!awZvxhf9rMLbjpG& z&GMVBV*kxuVs5<3Dsfg^qhC9OxmV~y+{f3VUHOzRIm=i0Y!<&$I3JSOmKtua;b;x_ M)bQ~d9;jjVAFx%((*OVf diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index da39b125c2..4689dc8b0d 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -82,15 +82,19 @@ public static void main(String[] args) { description = inputSplit[0].substring(8); t = new Deadline(description, by); userTasks.add(t); - System.out.println(servantSpeak - + " I have added the task:\n " - + t.toString() + "\n"); break; case "todo": System.out.println("ToDo"); + description = input.substring(4); + t = new ToDo(description); + userTasks.add(t); break; } - // Default: Add input from user into the ArrayList + + // Standard reply from Duke for adding a task + System.out.println(servantSpeak + + " I have added the task:\n " + + userTasks.get(userTasks.size() - 1).toString() + "\n"); } while (!input.equals("bye")); diff --git a/src/main/java/Task.class b/src/main/java/Task.class index 734ba80103b2274cad83c5783c52b4610eec0a0d..b3496b10559929696fd3ee86ae8adae79c4aa931 100644 GIT binary patch delta 35 ocmdnUv7KXs4Wj^yOMYG|BLjzDeu)Bzx!H|zD-)yWxxqdAiq8Gz)B%|47 Date: Wed, 19 Aug 2020 13:57:03 +0800 Subject: [PATCH 013/164] Add Event class --- src/main/java/Event.class | Bin 0 -> 862 bytes src/main/java/Event.java | 13 +++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 src/main/java/Event.class create mode 100644 src/main/java/Event.java diff --git a/src/main/java/Event.class b/src/main/java/Event.class new file mode 100644 index 0000000000000000000000000000000000000000..ff1540599ba964a26804eaf8e476439c9253f04e GIT binary patch literal 862 zcmaJfgc5PjnkJ8@0ZrY)s>v?-)*oFaMz5yXM06-WUNiOQkkut`>}8+SLdH<9{J z_!%I9D)qn*;71|GP6R==ICytv{NCF)v-|Vc%?|+2;JdJ~QbGZhBwDR-b;H432b%;- z7(%6eAtvH56zc4-W1>KvH3|01Kn3O%VZWaJovrvMgj+2=kc4tOQ1bowvL~ai=!IM< z8a>q|tkwN2nc#NxIO@yeAc4C_6RFJ8#FU2;?s;%f^l%$Xgyq*-o7hBR^iG;{J&4OT z?icaE!$WKl3MrMXbVWQQtmk<5Ph4!HO7KpPK2fzU%!?}dgpErvlr63L!h8(OIY+S( z%EW}{IV#yEa{6+xlla;t)c#I5P!m0rvq4YKI~IMTqbmpdJomQN!|{miy;Vv^tx&|V zWD}p~P0Tc=BX}d!Ae3=!N^EAG%~k#(cCSV<2Yxz-|IoXTebb!pZ6?tYVb}?bY&xhD zb~F9uc_VE7ABP=&rZzuNzQN?uIkGq|!R2+4vjff-cwcNBT!R`(qDyC z!eu%oPi98kONAKIxW+=`8>|~X0bl-bZN{-IE0lS+u#6h-$+3^HhsW5&8s|mM*ZI5i E8(-$yga7~l literal 0 HcmV?d00001 diff --git a/src/main/java/Event.java b/src/main/java/Event.java new file mode 100644 index 0000000000..def3137863 --- /dev/null +++ b/src/main/java/Event.java @@ -0,0 +1,13 @@ +public class Event extends Task { + protected String at; + + public Event (String description, String at) { + super(description); + this.at = at; + } + + @Override + public String toString() { + return "[E]" + super.toString() + " (at: " + at + ")"; + } +} From 0298c329e4fcc2b1e90c1266b3e506a1d289b018 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Wed, 19 Aug 2020 13:59:24 +0800 Subject: [PATCH 014/164] Add support for tracking three types of tasks --- src/main/java/Duke.class | Bin 3305 -> 3700 bytes src/main/java/Duke.java | 21 ++++++++++++++++++--- src/main/java/Task.java | 4 ++-- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index 8ce19e351416670b211a0e0c286c0535d58ecbda..98264e052ed60529641199ae66e0650b054bc890 100644 GIT binary patch delta 1646 zcmZWpeQXp(6#vcM-p$;0p}0t83F4-5wSe@XNQDCgOQ}Gi0;Pol0^8ow9$atX?pi!h z5Bvf}1iHwV-zZi=ML@1n5CM&UkeFzqi7_!T@gMxt#Hb;``esWahP|8j=Dqp--kW** zc78Me7@5ENPv1oV58^8gQ&B7Mh``)1=3%};?s^T6ViCt;=~<$Iqk&_o1`V~+Xq3xM z0?Ra1W4Qr_dVv+vSSiIS4Ub{9M6cmktDyw86fFi6#5o)TfxKk28Bk>^4T&Pm#(F6> z7zm<6Mo9^{Qg4)ElR#P^Bajv76zJmU)G!X4CHZlI97j$=6k7zg3OvEFRl_7~HV_(! z|CB+y-o~+=<7tM_^u)evjrnIdp5=IsL2Gb3)2&WzBIz)MYdSYL73=LTTSpAj2rV5k zjlpOpm^It&=&)09t09qgVjR!w*nyo4L#kajo5`l_jSHP@yBp6Ghwy^Hi#m4UC63)X zUdA4VJ7nN!XEu?HdKXw&?8QErrrZ054X^jGU&1J7pe5(%cm)Rp4l)GeZpyKA9KvB8 zNAN1gYdT)X8#>;^TMX(_JF`K@+nA=~DE14yBa^=CO;XAyAEV`DB12VsPe%{l*YN?4 z>o|cA1wN9nk9C~Heg;PIKfx&-r*X#HtK3-^bh?~WmO<1wc08F#QE39vmYm$}r#jB! zfK2SxxY9uf3(gsU2ckA5E9mIO8G+AaigVs~%C0~k&YxKmh^TX7%%W$WWp`K^H=WK| z9XV@(n~qnIFYa0?H*2MxR<|vc$T(KE-OgIA10}DZcc5kxTWBY%yxqZ3-XU(5%UJd9 zW-I4*TJ3h1V=*gB<;Ylx6pu%DFbZ~4h*eRMY%pe)^ohrh3 z2s3F;Q1veA=Rw48@}l8IiW2g+hnv_j@5gXsp4FRb0j0*h1&j_<#==UKW`+xhoS;zj zfdK(jwbzoa41S$HLb`gC`qOgKrDoVDE1>u=$^und4=l3p^X(E<+C#`L_w7)yN*ksf zC(daa@=<7*G#Zcxa;KphV+shFsxg*!5#uITD`Q0_4^$2j1q_Xe^BC7`3bUve_s2qJ z&Ml`mmf`K{LCG73>GBWItmS`vt4nHLPL3V=em& zw!+Y&3`VO`g1BO0of1L2QjVlD0V!n`TxBlJ>yTC&k;N>^d;&xJQHBu5!yNf)4*JWV z2K3VnHsHVM_80wynczO*e+$%e93uu@hq!@zXgd2k#*@)c=P$Y)O}Qx^b!l<2K4NNQ zN1rk*@Ha}s)N(aMR4@l$kk+V>pW`wvQp?nlT?v5&R MeVO#-lfKOV3)8?wkpKVy delta 1272 zcmZvb?QaxS6vlsdXS#EDIzrus#;KweZG{%77FuL&1+*eykwOcU0?L+MX=&ZXzDd!# ziYOL*gHaKcqWDq--&$mw;7j~sOi26({A6Nc;s^cY7fGa^JE&mdWbbqCdCqyxIeX{M z@7Mj}=gwa|_cgGHNtXpI)hyH872|Fi<3g`+S;;Dg`wY|M;;`D`eixUe##v*+&6>3? z^{k7dSfOb(&UynITsG2XvNt)jyOglmz?L`>9&mUtj+HWsWE|VHa@k%;11SUPI0fu5 zRXR0Y#_lxGt?AJ`tjTDy4jGq9b{XX(nqG%qm-+M=zdugYG#PYw^w1ye&TfYxhdn{N zy4G4qZLnLFMIZBcoZ(-Tt$5u>hESRF%Yj{_XkJg+E7Wi#nAj~95+<0W2pIOK7d zz~dEORoEr1$-Zun*QoV4!ieT|GtALoWn^~l4T<+ibgmd)Mc$uHWrb<{m$9llhRh%N(Bl*bC8IUlm^H*ckJFsg zd?Z}sK(~m4Y1UrrV?H?(Smm~7_jTXUb2pArVWjgysq=T&#iVU&x~&< z$#cy)Zi7obrQ{D^LsUucSdb(G-c#2v7-)d$I ti#uh^2uqj{>&kh2#^;Q)z~>$z=E|_kg}gV!mJqjwxGltv5FZM0;4cv3;)VbK diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 4689dc8b0d..f166390d40 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -73,11 +73,12 @@ public static void main(String[] args) { // Determine what kind of task it is Task t; + String[] inputSplit; String description; switch (input.toLowerCase().split(" ")[0]) { case "deadline": System.out.println("Deadline"); - String[] inputSplit = input.split("/by"); + inputSplit = input.split("/by"); String by = inputSplit[1]; description = inputSplit[0].substring(8); t = new Deadline(description, by); @@ -89,12 +90,26 @@ public static void main(String[] args) { t = new ToDo(description); userTasks.add(t); break; + case "event": + System.out.println("Event"); + inputSplit = input.split("/at"); + String at = inputSplit[1]; + description = inputSplit[0].substring(5); + t = new Event(description, at); + userTasks.add(t); + break; + default: + System.out.println(servantSpeak + + " I am sorry my Lord. I do not recognise that command.\n"); + continue; } // Standard reply from Duke for adding a task System.out.println(servantSpeak - + " I have added the task:\n " - + userTasks.get(userTasks.size() - 1).toString() + "\n"); + + " As you wish Sire. I have added the task:\n " + + userTasks.get(userTasks.size() - 1).toString() + "\n" + + " Now you have " + userTasks.size() + + " tasks in the list."); } while (!input.equals("bye")); diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 7185e5593b..6c3fb5b64d 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -17,7 +17,7 @@ public void setDone() { } public String getStatusIcon() { - //return (isDone ? "\u2713" : "\u2718"); //return tick or X symbols - return (isDone ? "Done" : "Not Done"); // for manual testing + return (isDone ? "\u2713" : "\u2718"); //return tick or X symbols + //return (isDone ? "Done" : "Not Done"); // for manual testing } } From b4ea69844c01fdc14ce85fdd67ed92707c955cfa Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Wed, 19 Aug 2020 18:50:06 +0800 Subject: [PATCH 015/164] Remove println in each switch case --- src/main/java/Duke.class | Bin 3700 -> 3655 bytes src/main/java/Duke.java | 6 +++--- src/main/java/Task.class | Bin 1079 -> 1073 bytes 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index 98264e052ed60529641199ae66e0650b054bc890..ea3d378ed1e429c42375056dae896cdd09c32b9a 100644 GIT binary patch delta 1288 zcmZXUZBSHI7{`C-?#n&gy+|!1v80pJ2Zxsk)KVe^4XhL@6~sVG7k1SZ+AUZ~D%#%5 z$cS!lQflv1Rtn})Xl5T8XPRlIuYKxsP1Bc}rg28;IoD>Qx^vI}oagyJ|MNWO<=)>H zoLi9l_TtPLU7+tXW&Y&D;_dcZ)+Sx7ploJa;(QY_Qqr;Lv1@O@?mMv^zAi zIf|l1v&9&98t8QBVylVXW^pSV(;X#{Gm1o%ph@MhGs0?i8Q2{q#2zzC zucpuR_ZUcPGMale_i6fV1{^BM8s%P_L5FJY*X*+ya;PO6C46bx2cuH#u+76ZIYoG7 zDxJzUC<5gbo~>H#M{FLodCcolR|Zy4=j~IA!jHQ=!IR!$Rg!y3^R&w|?6-N=WrXJx zm+y%W#%uOwQ++jUJ@Irp+3#|I=Uv&yQAP1T?3(`m_)u$VAnWo1V@6#kdAo;_E-&I~ zUQ&b-nRIfI%gemt@+z;{9CR7yb(c3dqzIO@#|L^{4pZlHgfY#VrkJ<9byj)qZQ=W5 zcFj93@A96@`%Jiez=xWTOxRJEj~P=aN$?4ux*X%ULMM{(L|-bM6nQq2$Vd^%!DKos zrPXu~3E%uTZx%G^GKD9R?V09`ame}uHE{_J&0lL&niDRcaa?oKq|AGvz(`=4&rf)P zU?}{B@qOtX(iQ3}@0>oV&U(WIt?RFs+h!h1E{*KD;0km%0N*s81|h( z3b>J#GM3Q5Z*o5hMc?2RI~y$ZtCw^-)B*3b;Bv1x(iT(3`2E&Mds&SjfKT;t6~uGm#;#O^dp=F-tA zf>kptg*@R278_Hh4&_-EOyrq=mXbWBzCFWrew0i&FHh0I3%^Xts#1)~r6`kv&6``WVdx0eO4)HtDKBgE8}JKTdT;jN-`a#c$US4Z5nJE{nwW7#erF>a{u=Gtj{!J z&lOxEirlg#3u|YYN5Ox>x}^|Xei{-8 ye{yvJ0oI7n;wDZ@@5si@aE4QI#LcBKJ*u974Gu@ delta 1323 zcmZXUZBSHI7{`C-vb*sG9Y&gi_Ds7#?SS!rjLDXrnhl2dd||QGu^r8f6ntf|L5hL`<(k--fwvW z7yp@<1n%Kmho!96+^4Bb=YG}%MP2Ri05vwXMzh|*rp~6`!C|!#8jQJ7v%#T^jX@OE znoUO7Y@pfULADt7R-0`OIfMG+QarRpbap0s&N z5m?qS^m~K-w9PX%&w91$#{DD<7K_Du;@#n0>mu>?SX)n4fEP6T zT?Tp4<|UT{98_GtGu#(0?2UJH71p(eqtQsW%gYS86mv+Cebu_MyF1*!wxcKR;xTNz zOB87>{SlYL9MK$A_}gO9qR4EQS2*VKDzDkR?sA+rTu$(&!dD;e>2!IE5|@(OKzRm6-!HtJv17m3CVCoD-4E=k5UpPA5~dw*MlX%n0q-=F65 z2fi@6^WLzYr!IJt`mFC8MZR|;{buiQdcm3{(ro6jq-W&J1(%6*lgvtH|NJCsR2GWm zf`OFMM>_YiLe@g{&6M_-A^we?0m|PPZ=|JEHc5|BzIj)3kt1Zg2f=z5#|_CQu!0y?Q2VL!+CNN%u2}@7} zb?ox@qq5r$4swWG*@!udKUnTHyMqHYY9F;~i1q3yb?PMb>I@AkNu!!zqq;zoy2vK= z1Dn;4G^?N4qJCkk`ju_!Pr{a>#mc1B%Aw5)vE9n2-I`06wUDS)O3bR1brs!K193_v z>uIv5m_xv3rA?W<1GZcwTP___a{aFAMVTU`3@eQApTiY{d|{j18JEzPxkZ-cmslXe zlxxqdAiq8Gz)B%|47 Date: Thu, 20 Aug 2020 00:45:37 +0800 Subject: [PATCH 016/164] Update Duke output to be compatible with testing --- src/main/java/Duke.class | Bin 3655 -> 3659 bytes src/main/java/Duke.java | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index ea3d378ed1e429c42375056dae896cdd09c32b9a..b95c85b42ccbc53a26b10ed008e870b937f4b95f 100644 GIT binary patch delta 30 jcmX>ub6RG@P9`>11^uK-g~@xFltIkI5{1oAn3A~xnRf|R delta 26 gcmX>tb6jS_P9_#+{iMpt` Date: Thu, 20 Aug 2020 00:48:24 +0800 Subject: [PATCH 017/164] Add text-ui-test files --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index f69985ef1f..843ad439d7 100644 --- a/.gitignore +++ b/.gitignore @@ -13,5 +13,6 @@ src/main/resources/docs/ *.iml bin/ +/text-ui-test/input.txt /text-ui-test/ACTUAL.txt -text-ui-test/EXPECTED-UNIX.TXT +/text-ui-test/EXPECTED.TXT \ No newline at end of file From d31fb2409d8e33be6339d43ee5a28f80aa8c3179 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Thu, 20 Aug 2020 00:54:25 +0800 Subject: [PATCH 018/164] Stop tracking text-ui-test files --- .gitignore | 4 +--- text-ui-test/EXPECTED.TXT | 7 ------- text-ui-test/input.txt | 0 3 files changed, 1 insertion(+), 10 deletions(-) delete mode 100644 text-ui-test/EXPECTED.TXT delete mode 100644 text-ui-test/input.txt diff --git a/.gitignore b/.gitignore index 843ad439d7..616bc39c4f 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,4 @@ src/main/resources/docs/ *.iml bin/ -/text-ui-test/input.txt -/text-ui-test/ACTUAL.txt -/text-ui-test/EXPECTED.TXT \ No newline at end of file +text-ui-test/*.txt \ No newline at end of file diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT deleted file mode 100644 index 657e74f6e7..0000000000 --- a/text-ui-test/EXPECTED.TXT +++ /dev/null @@ -1,7 +0,0 @@ -Hello from - ____ _ -| _ \ _ _| | _____ -| | | | | | | |/ / _ \ -| |_| | |_| | < __/ -|____/ \__,_|_|\_\___| - diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt deleted file mode 100644 index e69de29bb2..0000000000 From 6b2adc99c006e8883da4acc5017aa0186d98f82f Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Thu, 20 Aug 2020 00:55:56 +0800 Subject: [PATCH 019/164] Update javac to compile all .java files --- text-ui-test/runtest.bat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/text-ui-test/runtest.bat b/text-ui-test/runtest.bat index d0facc6310..9b89df913f 100644 --- a/text-ui-test/runtest.bat +++ b/text-ui-test/runtest.bat @@ -4,10 +4,10 @@ REM create bin directory if it doesn't exist if not exist ..\bin mkdir ..\bin REM delete output from previous run -del ACTUAL.TXT +if exist del ACTUAL.TXT REM compile the code into the bin folder -javac -cp ..\src -Xlint:none -d ..\bin ..\src\main\java\Duke.java +javac -cp ..\src -Xlint:none -d ..\bin ..\src\main\java\*.java IF ERRORLEVEL 1 ( echo ********** BUILD FAILURE ********** exit /b 1 From 17eca9fe86eab534ffc91fa110969858440e290a Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Thu, 20 Aug 2020 12:36:09 +0800 Subject: [PATCH 020/164] Change status icon to Done/Not Done --- src/main/java/Task.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 6c3fb5b64d..e5de1ae661 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -17,7 +17,6 @@ public void setDone() { } public String getStatusIcon() { - return (isDone ? "\u2713" : "\u2718"); //return tick or X symbols - //return (isDone ? "Done" : "Not Done"); // for manual testing + return (isDone ? "Done" : "Not Done"); } } From 856067822b39bea4443909d2db0081eab48b1d9e Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Thu, 20 Aug 2020 13:37:04 +0800 Subject: [PATCH 021/164] Change from do while to while --- src/main/java/Duke.class | Bin 3659 -> 3651 bytes src/main/java/Duke.java | 9 +++------ src/main/java/Task.class | Bin 1073 -> 1079 bytes 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index b95c85b42ccbc53a26b10ed008e870b937f4b95f..b965fde04ad48911889f3f09a090c229854080c7 100644 GIT binary patch delta 169 zcmWm0I}1T^90uU`{mI~PPBKxlNU-0Q(|JJ{-YmOW2&;dy(L(A}@OsycFp<4fmtPH0?dHYnr6|`BeyGpsH?KDTo zaEvS`$k9Tca}>BlksFk_LzxFuctn*a)ObdnS2Xy5$v2upv_wZ++~|lGT?wNn(cfd} TOB@3v0nFf0Y29K-J@xDt^u#Qu delta 177 zcmX>sb6REtD;MWy237`M1_ma($$VUajPE8VaD_54_D userTasks = new ArrayList(); // Start chat - do { + while (true) { // Get input from user System.out.println(masterSpeak); input = myObj.nextLine(); @@ -77,7 +77,6 @@ public static void main(String[] args) { String description; switch (input.toLowerCase().split(" ")[0]) { case "deadline": - //System.out.println("Deadline"); inputSplit = input.split(" /by "); String by = inputSplit[1]; description = inputSplit[0].substring(8); @@ -85,13 +84,11 @@ public static void main(String[] args) { userTasks.add(t); break; case "todo": - //System.out.println("ToDo"); description = input.substring(4); t = new ToDo(description); userTasks.add(t); break; case "event": - //System.out.println("Event"); inputSplit = input.split(" /at "); String at = inputSplit[1]; description = inputSplit[0].substring(5); @@ -111,7 +108,7 @@ public static void main(String[] args) { + " Now you have " + userTasks.size() + " tasks in the list."); - } while (!input.equals("bye")); + } } -} +} \ No newline at end of file diff --git a/src/main/java/Task.class b/src/main/java/Task.class index 734ba80103b2274cad83c5783c52b4610eec0a0d..45536d469ef896a8f5603f7c65befbda4357e11a 100644 GIT binary patch delta 29 icmdnUv7KXs4Wj^yOMYG|BLjzDeu)Bzx!H~JH4^}TR0zia delta 23 dcmdnav5{kg4I>xxqdAiq8Gz)B%|48;nE+!$2#Wv! From 572f8d589036b7d4e6c7fa0312c1f81bdd0ca2f1 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Thu, 20 Aug 2020 13:47:17 +0800 Subject: [PATCH 022/164] Add new line to Duke reply --- src/main/java/Duke.class | Bin 3651 -> 3652 bytes src/main/java/Duke.java | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index b965fde04ad48911889f3f09a090c229854080c7..d1b362c85d22064133b958bf8cef2e3bffc6f58c 100644 GIT binary patch delta 31 ncmX>sb3|stcXr0u$$MDkCW~>{v2ZamSWYfv72cf1ag!AQs^|%n delta 30 mcmX>ib694>cXq~@$$MDkCW~>{F*7n)PA+5>-ki;GlNA7@7zv30 diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 6780897b9e..15bdb55f3c 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -106,7 +106,7 @@ public static void main(String[] args) { + " As you wish Sire. I have added the task:\n " + userTasks.get(userTasks.size() - 1).toString() + "\n" + " Now you have " + userTasks.size() - + " tasks in the list."); + + " tasks in the list.\n"); } From c0edbc7f3c3f8767fac1aa42bd4db30dc809de84 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Thu, 20 Aug 2020 14:24:27 +0800 Subject: [PATCH 023/164] Add function to trim input --- src/main/java/Duke.class | Bin 3652 -> 3705 bytes src/main/java/Duke.java | 17 ++++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index d1b362c85d22064133b958bf8cef2e3bffc6f58c..eec5b837cb3f474bbfab00978d6d9bed212ab2b3 100644 GIT binary patch delta 1787 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 PdY49B8guCbE`8`Pm;64( diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 15bdb55f3c..960197042a 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -2,6 +2,10 @@ import java.util.ArrayList; public class Duke { +// public boolean checkValid(String input) { +// +// return true; +// } public static void main(String[] args) { // Initialise strings to separate messages from Duke @@ -25,7 +29,7 @@ public static void main(String[] args) { while (true) { // Get input from user System.out.println(masterSpeak); - input = myObj.nextLine(); + input = myObj.nextLine().trim(); System.out.println(); // If user inputs "bye" in any case, end the chat @@ -71,6 +75,9 @@ public static void main(String[] args) { continue; } + // Variable to check validity of command. True by default + boolean valid = true; + // Determine what kind of task it is Task t; String[] inputSplit; @@ -78,6 +85,10 @@ public static void main(String[] args) { switch (input.toLowerCase().split(" ")[0]) { case "deadline": inputSplit = input.split(" /by "); +// if (inputSplit.length == 1) { +// valid = false; +// break; +// } String by = inputSplit[1]; description = inputSplit[0].substring(8); t = new Deadline(description, by); @@ -90,6 +101,10 @@ public static void main(String[] args) { break; case "event": inputSplit = input.split(" /at "); +// if (inputSplit.length == 1) { +// valid = false; +// break; +// } String at = inputSplit[1]; description = inputSplit[0].substring(5); t = new Event(description, at); From 8d4e4b8b172c6794f0652407105d6a1dd47f3f2e Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Thu, 20 Aug 2020 15:18:16 +0800 Subject: [PATCH 024/164] Replace Event at with start and end --- src/main/java/Duke.class | Bin 3705 -> 4218 bytes src/main/java/Duke.java | 65 +++++++++++++++++++++++++++------------ src/main/java/Event.java | 10 +++--- 3 files changed, 52 insertions(+), 23 deletions(-) diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index eec5b837cb3f474bbfab00978d6d9bed212ab2b3..3de30717f0068195770e20ba715593d4c8129c90 100644 GIT binary patch delta 2390 zcmaJ@X>=1+6#m|1l9^7X76w{K*#?lU&_as@i9lHj0&UsKRzP9e1R6*)HJO5CF@U1r zhA<#fMNyOrDhfynMNx3aeOLZ?ThasVgbE*|& zAuJ)HK*KCftl%~)xlWCYC?{5FU|1$2#)(=5sZzuhn5g46_ee-6=z}B&mIeW9B&^lo z;T8=VL>^DWdOymrfrE`2yhte+hfNxMTsjV0G)OM?fCiakrFc-rLlU+r7>VuN!^09D zQ4qwVaxNZ|@VJ68u3(3T4D6J!OM<=gue>f=G&!ZV&T1%$B&!qAIxA|%?Uc7$!D5EY z3d^WoU2fFPGpb?{27ffUz=%b|^Ni$b2KBn(^mtvpW%puwrG(uQ_DFb=L8&n76V;Ka zQErz}QolMFlVLnDJ|nPF4K(y8(9;HTPmKx ze%oSt{izGD@q zF+oKO8fBc}!QQfG2!o5?CUGp9v}BxB@ebZqaSr=coX2}I-sfr`sJIg)GCou>m9HPE zn9SFYReXXA_BkQDuo$1J_zXvRB(sESQH&-^N*``mI;~UOLVS)3GQQw0zqA$4VtbBM zvRrOu`i6cp+p>poZlqMRqCfViFA}chNg94N>!^;d2m)kWCIIbBz0Q z)8Io4_@O{WS7cJQesV}HKyvP{Bl|QmI?UYcJCo`(Om|hqQ~_m_Nr~2KN}1*_KMr+h z3umNp%Nb-<9!IBUbe?$zT4gi3guEmlMxy*Qx~7pG5{XVDCm?Fw(&)Yqnrk0$?3;vK z66B`QV;^P*MA}5pQ|KjzgT8<_+m}Y~chM)6hR$s|IBE24K|j|4I)^0Jq* zk^ByD0?rnLK38L)qYp`$)Dy>D{4-<_kLMHVVFD|0BUm!!HGp8~R^aPbA=tR?Yh|Uo?-HB*Qo@k#p zsAMZg$Yw9S{1ND-s?%p0h*EWmC^|2LSQPRHBu`N%Uj2}K1|us2a=_n=+d^~-0UysION+sCK_V@U179`wIHC)a2KX$q)9eQ4DB(H%30dU+@YVg&M0NOw&U*^i>p31TkY zHuLGGT1GZ88pj6e{>>!WLF+Cm!ycN4z0~Lj>4rOua{4aMp`M;gU)TzKK$e%V0KZ{T z3YQ7_6P36^mv1YU&>Svh9xP{m7_1w@EEg+SKdfX0Sj7qvV`EUurl5{Z!&>$+8rauZ z$9}|mb_pBU@7Tz$;6B!hO@e^ULMFBd*|=Zmj;%spJSYspLqZ|83FEO{n2KG(Or&-T zcVmyRf`}LzoiD^ebZw(8`y|YeQ0n}$=r*Q*3T-I3ne7N2K{2Eo^<4pd!zA?2Y=wLk zeF!aUMLrQZIXP|gU&YT2Qtc7iT~VY`szFwknp@bbjmmyg9_?BK=#0wgtOU%&_p~Z> vnBU?@d`C^Vl<4uqxr=yrJ8-oF>m7Kn1J^n5KHQZ2cYGp delta 1934 zcmZuyYitx%6#nk)?9A-!l(wTSOo6ghS_*BUEp>(ESz0QO77C?8k=M36!qRQGwo7>l z3yO*lKsxd$;tSNuLlKZ!XcZCAA10dkgGBwOe+*GcNKA}Ppq@KRBPL9C&bjB@?|kQ; zd(YhM_x&>>{_Wk~%K#q7b(KV=g4qhHJa__gbaGd#sKEjm3%RFOg^Wcq7OPNE$&ES{ zGqHqY>J>c6jiovmsueVFV>uU3saS!PJYi$Io45@9cM_Xiv^pSYl3Y{f{hVV#&a^Bm$8dMt&47G zZ!)XG5tG4FxuMw{zdqO*)G!H?iHJJ_DudoYFkeNqr6t%J^3{dg&47#-G`xtH7}91% zqp^-yd$6s>jIE1?I#MO>bxytC+Aa*M>w=}>4KDWZ zWUj`|riKGJsNfKTI}~j-eHspRO)^H4#g5x~f z`_@e%f8hr-9SL{D6nvSR zZG;$$hN83vv(s#iS+%Z=vPt+%!v!4VnWL3aUc_Dk_$CBnKGL%}P=T!>f%6J3@+_CE zgRbRPNGx&nqR%=k_FKi`(DPmHazS+Ek6mv4AlGZ&ShPC2(QK~>c9_;JSDE#bQf{qM zrde5@ccyb+sVwrZvx;x}hft(j9^x_6JSqHXiCmtsyEl9=?bSG31vFcZOsm z^9qLA7{){HcNo3MO2#8SASVe&IF4kpo`G#dJCf&%qgM1wNl3N>G2Avr1!P0M1Rp~; z#_&-N1EmTm1k8{OS_h?g#DVXUSkJ(XLEbzfGpL?N_0cwRU8Mn4@Our_M&2pfK6)0> z>w73nhfH|_BwG^orLe_lpZaL&@n#MOT;ORp_gW)l>1PZA}w-J|Z6fNyR&=6_l z0LBv_feFs^z1a#PEdGx$g%b|)m2ke41WNA@xOa*Zlc#Vuoo_H@qpd9yLxbmLkR3-^ zFCI(6?)-k1dMbi0`g(^`LA>K`IWmRzYzTEn(y(Y{o?FB=UWvyQo(W5c&|c`*GqtK~bmao{ZachhD-ge2q%{irKhHxA<++ ze_;;(#$5Dc9(@S&nF|YDYgjKD*;O>L?+{`)V6q>v zmi>YV`wcDZHd@(TLF)mNbpP>GU^ z88T)%KbdZ36&Rq}{^xckorxKc@5d)6=rfivJf$DX9gL!3c|VHC7@+bsj*bt~55hrt zW>UqesajUa$l?Locl80ZGW|ahkS{3r!3&}zn?xf2{}+<(bTI$` diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 960197042a..d8c6908315 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -2,10 +2,27 @@ import java.util.ArrayList; public class Duke { -// public boolean checkValid(String input) { -// -// return true; + + public static boolean isEmptyInput(String input) { + return input.isEmpty(); + } + + public static boolean isValidTask(String input) { + return input.toLowerCase().startsWith("todo") | + input.toLowerCase().startsWith("deadline") | + input.toLowerCase().startsWith("event"); + } + + public static boolean isEmptyDescription(String input) { + return input.split(" ").length == 1; + } + +// public static boolean isValidInput(String input) { +// return !isEmptyInput(input) & +// isValidTask(input) & +// !isEmptyDescription(input); // } + public static void main(String[] args) { // Initialise strings to separate messages from Duke @@ -75,8 +92,25 @@ public static void main(String[] args) { continue; } - // Variable to check validity of command. True by default - boolean valid = true; + // Check validity of input command + if (isEmptyInput(input)) { + System.out.println(servantSpeak + + " I am sorry my Lord. " + + "You have to give a command.\n"); + continue; + } + if (!isValidTask(input)) { + System.out.println(servantSpeak + + " I am sorry my Lord. " + + "I do not recognise that command.\n"); + continue; + } + if (isEmptyDescription(input)) { + System.out.println(servantSpeak + + " I am sorry my Lord. " + + "Your description cannot be empty.\n"); + continue; + } // Determine what kind of task it is Task t; @@ -85,10 +119,6 @@ public static void main(String[] args) { switch (input.toLowerCase().split(" ")[0]) { case "deadline": inputSplit = input.split(" /by "); -// if (inputSplit.length == 1) { -// valid = false; -// break; -// } String by = inputSplit[1]; description = inputSplit[0].substring(8); t = new Deadline(description, by); @@ -101,19 +131,16 @@ public static void main(String[] args) { break; case "event": inputSplit = input.split(" /at "); -// if (inputSplit.length == 1) { -// valid = false; -// break; -// } - String at = inputSplit[1]; + String start = inputSplit[1].split("-")[0]; + String end = inputSplit[1].split("-")[1]; description = inputSplit[0].substring(5); - t = new Event(description, at); + t = new Event(description, start, end); userTasks.add(t); break; - default: - System.out.println(servantSpeak - + " I am sorry my Lord. I do not recognise that command.\n"); - continue; +// default: +// System.out.println(servantSpeak +// + " I am sorry my Lord. I do not recognise that command.\n"); +// continue; } // Standard reply from Duke for adding a task diff --git a/src/main/java/Event.java b/src/main/java/Event.java index def3137863..125883c243 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -1,13 +1,15 @@ public class Event extends Task { - protected String at; + protected String start; + protected String end; - public Event (String description, String at) { + public Event (String description, String start, String end) { super(description); - this.at = at; + this.start = start; + this.end = end; } @Override public String toString() { - return "[E]" + super.toString() + " (at: " + at + ")"; + return "[E]" + super.toString() + " (at: " + start + "-" + end + ")"; } } From 41875c7ab2ddf937d9e35a6a0088f15e780385d4 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Thu, 20 Aug 2020 16:24:37 +0800 Subject: [PATCH 025/164] Add DukeException class --- src/main/java/DukeException.class | Bin 0 -> 1251 bytes src/main/java/DukeException.java | 32 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 src/main/java/DukeException.class create mode 100644 src/main/java/DukeException.java diff --git a/src/main/java/DukeException.class b/src/main/java/DukeException.class new file mode 100644 index 0000000000000000000000000000000000000000..0fad537148eb09cd98d85d93054346a0bbc92bb6 GIT binary patch literal 1251 zcmZ{j+iuf95Qb;dG<8EmTQ^Oi2iQ^$ZGiL!32_jTn;2w~I8|*T^~&1VOX?Eak-dq? zTfs$y#03w)Lm_4x)os(nk$3#>{`<}BIR5+Z_a6Xw4V63;U{`@hi?9TH3Ottai2_e$ ze5Sy@j0XyoWqiH>FBae>ft`kKS=uMv(du=_)~wH#qc@K2Q^zomzt{xS`Z*i0!!8Ru zhn9%_u=9>Up&EsWV4-NSZl4p_y$vzUmR2`vPPN%+Xl9MT-fhn~QBAk1C&saDG))4f zOIJrf)_ zisEHZ7SJS$;~@=(v>wG?g`P%zdd3Eviimc6jEuVDS}XY_xC_e!-ptx-P%olkBxuat zs1y1LQqGvT4p^0dx3d74Jf_}N6R68V$!l|Z(H~iYDhbtD1P!;3+eL$ZBF0ByH0g2I z|LVKcV}c(FKj0FzCQ;f Date: Thu, 20 Aug 2020 17:05:51 +0800 Subject: [PATCH 026/164] Add error handlers --- src/main/java/Duke.class | Bin 4218 -> 5051 bytes src/main/java/Duke.java | 58 ++++++++++++++++++++++---------------- src/main/java/Event.class | Bin 862 -> 940 bytes 3 files changed, 34 insertions(+), 24 deletions(-) diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index 3de30717f0068195770e20ba715593d4c8129c90..98f507a8710e0c46e993cf6c8fa794eaba853039 100644 GIT binary patch literal 5051 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 Zv5RGSxh$`j<&CnuS(dlS@*Y_}^nc<8_zeI6 delta 2340 zcmY*bX;2hb5dPlm?94Db1Q-Qf;(>UeC?F_nT;mNy1-$S8JV$ob)peJ^qQN8UedIE6 zG)58=6Qjf<8Z|Bo(U?PH%xMy1;y?XoRjN{{N|h<9l=Pbs(JiK5-`%hK^?S5rw5CO` zJ!rlNU>I(x7=DG@nJrMU5QdCJoKvMD z0X`Xi6*{JHVllT_!gZD^2ykMV4u%B^f}B{PB3g`)iZH6V&GRy9RP;nG2N4|tR?1kV z!@(`;b%;Ekjx{cnU@ZshbT|=JF%s)_NL)G+8+FJwwpoY5v0`jhuuaBx6+^Itdw5C4 z%PKs0MM=f0GG0?L+!pNA5r;Qq?2=)cBUz?-k|mE%?q9OZSZU-0jnI;uvPexJv}DA9 zN{0Bdh*7n?)To|eEDHJ=T!GqIMlj%;Vbm^X&;qrEE2<;)6GPQ?5%VrfpS@eg9vN>k zsAb{0nks)$fLp~C)GhaC^8gw~V+;dJ)36tBY1oGb1~C%$g*Cj50tUtBH+;cBh^(Cc zmHtpf!#mh-ZWGd??`n7t2N)8^g~O5BNR3fl>W?f9`)U&;yszK`4F~a|j6)g@qmd!W z+E8625X>p7GD0DLjfRhKglBM+p;L!+Y)y?(UlORLP{+`q;W!6}d76$z^?nT>Pc@uHOhXgS(KdKdG@Qp64b5m!(84qN%q(~Gk6s{gkU}W9 zsNr*5((ncLYxojhDfpVJUDog%3KU$?P{h}7G>qr#RSn!0DUg2TF@7?qIxEe;oOx!mGf$HrHjlR1-yARH zJATIXGi#*9%)3dcsVhgkP$YwQcO2<)lTLlHB)pLKA(9) zJtY0Y%B!rlIwTj->J9KPMPJ2L#6w)ty$xxtUF1rwCyf zM^LhuA{|yL1mRqDD9sC3P0G}T7#tVH1CYf=h>qjL6dp5^QAivogoH74{CG*pF3Meu zqfz57dSu2R>dqJ>3y}#~Z($0@xIa4$K9Yb7Dl~LPJZ0-5htw;QbAKJ##}LZ*4TEV-ETj)cn$*}ZDWv~MOy-AXEn6%F56~5_>Z%59%&DL z$iD3sc^mm*aO8R81dr;Diy`+IH3n1YbHKB-h}Jykm70bqA>(?8x5{ZvcgN|}b1Gv$ zhevHh8qu^JqEkdpClXD`6D>JCYO;EiZ1&Q}e*%3}b-Hwc097ZCqVqC{d0v-WcH|}U z>U)(I45@G{ZdVhAdZ`O;iRzy}yAe~|B1N_oJfzTsVYb+o=90r_Ivi@;VY|QK+@ID2 zZ-)Wz2l=MdM~FVV%~W!WZpO2AmF{0SMJF(b=q~I*?}u~pfF_WpfGX6JMlGFQj0`%< z1JMtIk%e4(Ir7LppGL=n>GXEYq<3cl*#v1E>*@4wAjwWzcTpMk&^+v=gMN_St0O3- z8+00->FIP8mfUz?YGVdded(ZM78a=s>eHL$@(V2xKDIw%}lA_*1ZVu}4_Ay}TnQ@5xh#%0ZbjbTtR( z#J;lTgBL208+_21ia|%KJqz9&&=67+ISZ+wvkD;w3xqhUqnQIpy2S~|EsdeM zX<_9T_zV7lah4d1d(OoAd6ImQZ|N6A>@*ty From 321d0c677ef48311eae14411d332e0b95e4ac3e0 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Thu, 20 Aug 2020 17:37:49 +0800 Subject: [PATCH 027/164] Add message for IndexOutOfBounds --- src/main/java/DukeException.class | Bin 1251 -> 1373 bytes src/main/java/DukeException.java | 2 ++ 2 files changed, 2 insertions(+) diff --git a/src/main/java/DukeException.class b/src/main/java/DukeException.class index 0fad537148eb09cd98d85d93054346a0bbc92bb6..4c838e3cc6330b9f024bc2bbae2e5c829e36e980 100644 GIT binary patch delta 606 zcmZvX%}N4M9L3L_8OCv#tjx-C%F)WwvhN6k0!xb)<-&woiG2|Sy2zki&mi+6wTPfa zy9j!MHbT&QMCWSE!ero{`Ek!Z=l}oqH_iOV&&w--b*z}^#iW5LKLSV?n3g(YASpFv zU{>m!fwa_l0}E0YeOU5gxv}|fM-KAEVs$Qg`Z= zn``H+QmxkN&gq47S-Y*C$1Dt^-(6G__W`a1=m>$O5D1bKej%{cV~xyOkENfz9vfs9 zdu)=~;IYL90j|e$lnp0r5Y(jmrpE76LF)-Uk7R)e&vE!#{~BE;G)|^7-GEJs!=lT^ z*k4kFDwEWp^56x?GVqyT)PJMaVO-;|0?{r`y~D{31e~_fZD^q_Ic>Yl=1r_igxMM4 K&=}`41rxstfj_hW delta 512 zcmZvWO-=$q6ojjP7@7&l*p4^|i~@=}qHat~T!@L$tyl0ScmzmagM}=Ji3<`v zdl;)T$&i>yC$IYJSFiegg+I01kKea<09QB<(Lmo|P(vLIGVvK~qa|?ZB9*vQrfLICH<34Lllm+tfkji`j_tPlmSeTW=Z1Pv zF?FU!(>lKgDu}^B2t*{w6N3Q-Ychih4#-R@*pQi6aEO3+ZpOO9#78Cy>M(nS$gEsJ zWmd0HarfF@EZGrASa&(+@0$LQH6piQ&?O19*=L@c>3Hhh{ts|(fll5bbx8hIS^YxE nV{@Y=bxVxFf1}^JS7J14<8>bC_eo2f;o6xSQyTZUkHr2T7iTAv diff --git a/src/main/java/DukeException.java b/src/main/java/DukeException.java index 49161de40b..aa3953050b 100644 --- a/src/main/java/DukeException.java +++ b/src/main/java/DukeException.java @@ -9,6 +9,8 @@ public class DukeException { + "A deadline must have a specific date/time.\n"; protected final String MESSAGE_EVENT_NO_START_END = " I am sorry my Lord. " + "An event must have a start and end time.\n"; + protected final String MESSAGE_INDEX_OUT_OF_BOUNDS = " I am sorry my Lord. " + + "That task cannot be found!"; public String emptyInputMessage() { return MESSAGE_ALL_TASKS_EMPTY_INPUT; From bfec6495f45d0ba6359eedd3fb49885e584a60cd Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Thu, 20 Aug 2020 17:47:42 +0800 Subject: [PATCH 028/164] Add handler for IndexOutOfBounds --- src/main/java/Duke.class | Bin 5051 -> 4961 bytes src/main/java/Duke.java | 25 +++++++++++++------------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index 98f507a8710e0c46e993cf6c8fa794eaba853039..70ba5add80647ea0b47d8daf61fd898818b2bb46 100644 GIT binary patch delta 2313 zcmZ{ldvsLQ6~=$(&LsEF%ngY{lf^`cQIn7aLP~@H6CscUF$jtUi~*rcGNTEEOh_iF z@ikZ;#aBVEAhFg$wZ;dwCDaK7D@bc?X)7(Q);^@wzM-|+f7)dW={`5bK-X$k*4}6D z{q67UyU*EY4o`fyD0%$c&?~?U{_f{mR{Ck+7A;m;tk(L|7Hcdb7ERh}wuovSv$)mb zHj5UER*SV3>wL7aJ}6Wh{B+V~lF*)RKiTw{e8$f>R+`-ICs*&1O|Ry;BdNi6THK|r zyMrh;SctQMjehRsvl_n1&t|q*Yz<5Fg$@gu3zz=QS;DpJKY<|p1MTMih1kp-#TInEa zzbq7sM5en=FFyU%vc4Fa!r1peP*b4N77caYx2wuDi5>4Kz>E@*egq+$&kBeRA~uT757W}gR-bHUPJ7knmTv0CKJ z8gpsB-ch*1Zg?5Xbr`&7#F+`khfZQlQSvakje}eoP9GpRImIW+QjAYAA?y`9MPA4o zyevh2A3?Dv4RJXLsNdKrfh$r3`dAb4S}CqPNP#z6X=alevuC9Zb_$>VUT;O%4q2XxEZugUJy)_r_8{|gen^;S zH}rF>F0tm~FQ^?Q+~=ImDowiSbvivGG-iAx zji*Hw(5gyVtEP*d$vRcVdR0riswb|NiB2}qp;pkTn&?t3BvhB^9=cU8cd37Jj{!*| zz(!*%_Zm5DGV<7L6tKl87hS;W6IoxN|aldf`4;Z)bpb_OE<2JS%adsHpJZx+f zy@^MRtvqUMXQ%N5yNu^}%s9aAq;ZTs<2X+mC)s1X$6n*KtUurxcd~brGc3I`O>Q!2 zaR0OA4I5|5PbI@lxj5p+M`HhGhAR9B>nxWklbb)HOpLs|ykR*7`$D$l1xdo(AkSfD zrky(>Z>nHx|1W=`oN}Xk@+Xr?8(9v7hi`f?{VelT=|eIx4Y6I J?iEn~e*ha<eSi?vGMWD&J!vRJ3AW{a58>n%1| zv{{*uMxCSMLx zM~?!1C4|XWO`b40;?B`dn_n~ey2&@(9DS@)&owsRH z84cgercRrF2HX}sQgO^?kmDM8SHzr{< z`(|fbykWDP293Gy3%)|P*q9Pnq0ESwW8GF`(zxI8rm8hwCq1m^l+EvX*5*0|s&zHL z<34T7w(9wV%}VL;Ipf;Adj4qh7H?X-t;+aQU!%WN^Zl8>^z96s)ZACCt!}qfUA{;Q z%Wq{%ED;MQW3kQ2a4H^diiM-?;aDOOPlP+;9f|PbM08!u-Q*kRuE;v#F1N1BwOXRd zmfCo8Oj=!9w!}4q?S3QKdP~er1|JFhRi%8_y(GI#`=`4g`$^+Hjbe9AcCkCrp8C7C~}Vpmrv zj~WTcCI=fwWSOi#=Ed?&_089WA?@`TV{#^kFT@({q5SB%9!T2jfo{ktFIAvXGI7Y{ z+7w9G{PW;K4=jE6z=v~|%~Rk489^u#@K`Qk9Mj|htHoAzNQQ_d`d)E_Gh}zM+%c>SlLnY< zG*<;2e|{jtloL$NP^>5)+$b58k~}`6Bj!lJGH;`ow93{qyj|i>_Yy8QssbaBau4G8 zGh7-m9rG9!8eL3Ns~H-SDq;yRKj26ml47O@-xbh$hF_9>FKo$iX07h$vPi%&2B_?! zNQHI+16$uzoy)CE~d}D;6C9#k$dGN=~juaD!YfU z6AVc=#4a$DohP;_wwsk#k~b-mb)4$ePF6qjUJ405)ax9}V zVmp?vGEenevF8ihvHMxz@%QHyghu$a@AHTH+=0C54Ia8qp>v#3{VY^?M=H6p(QAWW z^>&fbeE!9ic=jNRN1l3U$x%5mZ5-errSc_M=9Y~fpRS@pzFbwzVV)eaMIu*F!}Zj% zR+`x+^VTVownI+ZKG6r{5FV7_IwT|2Ey%-iksP5>y1I&E^7(j%Pw)me@-}ODSM+-l z<=@=IS)wwaO`4DOn#~4n3@us_ty*zf7Nu;|%4yRsXR|h!cCAkIV&YmoH)|_MXsbwS z>qM_7rL}Ua_7>Zc!lp&tSKH1$XN;+@mk$ zUVSBd^hWmTYuTsA*spI9olbI}z7_ulsKNXoUL0wm$mL~HnsXLwh>5aX zeU=I_{>wCzSraA<%iFO(L=%?y~~IJ$aia@ABk5p4{Wf{hmDJ$;1Bx-qPxU diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 2abd566c9f..c116247460 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -8,9 +8,9 @@ public static boolean isEmptyInput(String input) { } public static boolean isValidCommand(String input) { - return input.toLowerCase().startsWith("todo") || - input.toLowerCase().startsWith("deadline") || - input.toLowerCase().startsWith("event"); + return input.toLowerCase().startsWith("todo") + || input.toLowerCase().startsWith("deadline") + || input.toLowerCase().startsWith("event"); } public static boolean isEmptyDescription(String input) { @@ -25,8 +25,8 @@ public static boolean hasDeadlineBy(String input) { public static boolean hasEventStartEndTime(String input) { return input.contains("/at") && input.split(" /at ").length == 2 - && input.split(" /at ")[1].contains("-") - && input.split(" /at ")[1].split("-").length == 2; + && input.split(" /at ")[1].contains("-") + && input.split(" /at ")[1].split("-").length == 2; } public static void main(String[] args) { @@ -45,6 +45,9 @@ public static void main(String[] args) { Scanner myObj = new Scanner(System.in); String input; + // Initialise DukeException object + DukeException dE = new DukeException(); + // Initialise ArrayList to store tasks from user ArrayList userTasks = new ArrayList(); @@ -68,16 +71,15 @@ public static void main(String[] args) { // Get the index stated after "done" by parsing the string int index = Integer.parseInt(input.substring(5)) - 1; - // Try catch block in case task was not found - try { + // Check if index is out of bounds + if (index >= userTasks.size()) { + System.out.println(servantSpeak + + dE.MESSAGE_INDEX_OUT_OF_BOUNDS); + } else { userTasks.get(index).setDone(); System.out.println(servantSpeak + " As you wish Sire. I have marked this task as done:\n" + " " + userTasks.get(index).toString()); - } catch (IndexOutOfBoundsException err) { - System.out.println(servantSpeak - + " There seems to be an error your Grace. " - + "That task cannot be found!"); } System.out.println(); continue; @@ -99,7 +101,6 @@ public static void main(String[] args) { } // Check validity of input command - DukeException dE = new DukeException(); if (isEmptyInput(input)) { System.out.println(servantSpeak + dE.MESSAGE_ALL_TASKS_EMPTY_INPUT); From bbabf788191d38c5dec7f69b2cf4c613e10904dd Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Thu, 20 Aug 2020 18:10:24 +0800 Subject: [PATCH 029/164] Add support for deleting tasks from the list --- src/main/java/Duke.class | Bin 4961 -> 5218 bytes src/main/java/Duke.java | 19 +++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index 70ba5add80647ea0b47d8daf61fd898818b2bb46..a794ec421642139e704e79655d5147af46830eba 100644 GIT binary patch delta 2140 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 userTasks.size()) { + System.out.println(servantSpeak + + dE.MESSAGE_INDEX_OUT_OF_BOUNDS); + } else { + System.out.println(servantSpeak + + " As you wish Sire. I removed this task:\n" + + " " + userTasks.get(index).toString()); + userTasks.remove(index); + } + System.out.println(); + continue; + } + // If user requests for list, display list of tasks if (input.equals("list")) { int count = 1; From 8685bbc3969097eea5e81f3d1fb2bb36d4df2c31 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Thu, 20 Aug 2020 20:54:24 +0800 Subject: [PATCH 030/164] Add gitignore for class files --- .gitignore | 6 +++++- src/main/java/Deadline.class | Bin 868 -> 0 bytes src/main/java/Duke.class | Bin 5218 -> 0 bytes src/main/java/DukeException.class | Bin 1373 -> 0 bytes src/main/java/Event.class | Bin 940 -> 0 bytes src/main/java/Task.class | Bin 1079 -> 0 bytes src/main/java/ToDo.class | Bin 735 -> 0 bytes 7 files changed, 5 insertions(+), 1 deletion(-) delete mode 100644 src/main/java/Deadline.class delete mode 100644 src/main/java/Duke.class delete mode 100644 src/main/java/DukeException.class delete mode 100644 src/main/java/Event.class delete mode 100644 src/main/java/Task.class delete mode 100644 src/main/java/ToDo.class diff --git a/.gitignore b/.gitignore index 616bc39c4f..7386799b7e 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,8 @@ src/main/resources/docs/ *.iml bin/ -text-ui-test/*.txt \ No newline at end of file +# Text test files +text-ui-test/*.txt + +# Class files +src/main/java/*.class \ No newline at end of file diff --git a/src/main/java/Deadline.class b/src/main/java/Deadline.class deleted file mode 100644 index 0197e3c355f73394e996265653f9f2effe508eb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 868 zcmaJ(G3T89BdLS ze@v*fFT|BN423#7?3gG}XHA0rB2a;ON!YJvud@;Fgm9~+`;t&@2THyhUHUTW3P0pX z!RVBiuvYi7$%IlzkD{JD4ifm{kre%qNuDISToiHFg@b~NMJy4PUukV(6N%wlY0h;& zF59?Qz6BC~0uw+}w>CVAUB5jvY`#a}AUFm_GjytV)EP6&qV+Z>@{kGPF(U9f6QA$Rw zP{grh5uav7OgYjiycVh-%D9#$HnYlRBL5_I$3vL|Kb^t9_b+76G-rF8QnW-Eb^;@t z4(f#6On-UW2wVThVTV7f&EJ$?FnM>jEVhd%@xH*`0sC`&E;J6VL5;`XV11duUEY@_ zSMw8!5~uTj;#iuvHz8t7;~H~~udr^o0zUuAwHe2>%uwdj!ZK=nCS@OD509{kHTDba Iuk*V73sPX*y#N3J diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class deleted file mode 100644 index a794ec421642139e704e79655d5147af46830eba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5218 zcma)A349dQ9sb_#CNtR#1Xcnp2#%H`L`iCjK^Ch*07(teHW36Aon(h($nMU%GaHOY zy@l3V&mzGKHtu?YsX))s5E_OjY)t-Wk*wf3@y`cvrl-fqYSHvO3&`_BLS{`ddA z;kkW-PXd^a55hPV>%v%rb7XU_4omiJI@)!_b=Y#YUPp)QJ9RiZHt6WmkInI2TLW&+E8EPA-i=z}IoPoLmvc zmAFb$UmeCKY}WCG2m-i9u6#+uwP94_%d)vHf*`KZaYF>5-1bd6ZjPWt3Ni&-%CQ!= z$YyHTp!Yyt#({3+wq~v8wvR!tKl-58KRv35`-!#yV0RsAN+%>QppB2#K zc>x4UY{^?dm1U{A$yhy2j^`VA4g&_Bm(5lEp8`l-!^sp#=vhC zRf5v$_?>~@;|&9Ukly(t-qi6YiS=g#r%U(D8%-J-+w8QuZPRzn4u`#Ew&#McCT!qy z^6Y}q&NiBH*OVG$>~^;!<#DG?Q7+&nak`UfOPV);sNH-16;OpGi@}c+-bcN8I4&HI9wZjJ7f87hJleU45|{bl9c;yle^K*G*}+lO{ki4XwEayJt?@i%JDlH(q1~@ zP>$KfYEx0!^maGpv!-|gQwt9@bXu7f`@F23YPVHcE6}#3$MfwZrF2yt%t__AwWqTN zvR-9uE4eU?zvCYQ^M!Q6DH+@LSsy)>L5|%)r^)qIojp0f_Ar9IY%Z-9U-v6TnZQuRKs zmcZmZcfuBK$eTk?+2{N6+K^>6na1k<2$jGXsHslJRhGi8x>kowA#vM#?|Cs_{@`7L6F4;LJMt z6bf2#K4Xg2lp#&KHi<;ey%C(A8|uVKAvnNf+`<{8vZHk|9=E#3>SVU)$MlK`R8A*S}n8MSWCqsN)Ck@%P%DGlgq$FN>(`pIaxvSnUjZf^N=T0N5&|~ zdDW4zdB{1rVW=)rp|+xh^P)^A@(T?7jxsP6lW;g@(`5@emnNY;F~xip&df0{*~G;P zAb3V(TvKHHiboJRdJunT)eo*Fm zMSi6w`u4w+huya;8rqHdy(8>!`~f@cyIF28*fwH2HoTpc+Y3jYK4Ex!Wt15eR1qJn zi-iOA-B+u{Slf7DBZ%LJ2_4b{brs2;2vCqqcWH4rXp3}8ti;CczTbR^)iVZh}Cl+{AthdIP<3p{|^1G{iX;3?c0coy3O&*SdEi?}E73hoWO z!TwF$7kCSOfp_r$>+6HTF?c9A2|I$burpYLhlBOl6jeWPCXSuSQ^J$tu7}}ya_R_U9D#7ZnaUbYnD!6<)-H>k#5-4ZF9>p z8y10?bC+&tdd;*9*J`*Mdj#gsCyZUga^$G(Xxol!NcO_{q-p8KSGTd_xQ$JBqp@S@ zHi7KNAPmGO0>i7NT>_bE{sYs)TM{)gi{gG zW`L1V@2u8JE)NqhN#Na}wI=l=8b*S~+>4rFkRaudiOYZ~33xvUfXQR(Uo?SwER?)` zPW%0lB@`r~I*6d*^0Ri)b~h1cTVXWma4$FrJnA#S*F@0f5;ZMR+CWrD`%S(IlKrN5 za+Krm95f?A>w`d!?15m(@ulq?MBUIY=3!Q@9J_K%1ST$SPGkRwdjg7h^TzSgW^wy? z27pJ4Y6!mtz?P;ugBlx@YU#&ardmOb#ilxk8cRrZ9y1X6hTwA^Gwfjog0WQo38btJ z^Fq!KDuk+ zo`w5_xyXpn5X#L{F%r9hP{+G16Z-17PRL5tBjjKC$~UhGFKS8B{~+!mA=l77Nhmgb zB|i+$Ix=jFPQXaP=*fMArJ9?RBiJoH47+mQkLmW_NGkI*HtXO99ylmq-hmx2MU)7o zH(Hy>gko?Y&57>JyezN^%cvJi-Ry=F#3~s?>yeS)mfr-665cp%0I@sKzmEO7K} z%m7N>))mOxzC^~`xkUCGpK-T&EpsMVZI1P9)+(|J4=qYl1rJ%?G0(d~&b#3J3uLdE kj<3Hp@?*vVGZz`lu;vr~+l+3)#bc~uh2sLpclcZV1#Nrnr2qf` diff --git a/src/main/java/Task.class b/src/main/java/Task.class deleted file mode 100644 index 45536d469ef896a8f5603f7c65befbda4357e11a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1079 zcmaJ<+int36kUhg48u@b3f60-l~$N)@lr1d#zbivo6!0I(Zt4w!*D{U&^cu0(4>E& zU*M}IR+B#X0e+Nm4>Pee5Fh4T_N=w`+WYL^f6jjac!sA2(zua^j+?=9%b;aBPrp`m z+|g0iu%=<1A=4GU?Kwl`NS7hsJmM$3HsEfr)>5A1_Ua5N$KRH&U|=8U^1^W)^^&1j znZ{P%F(ewYOW0h~amD`VxFfta?+hrSD;Y{M6e`teGK1y|6=sT80;z0IsFvbt=}qdyup1EY@^$`^hd_eAzZ^j2ZM9d0Y>ood*k*J?`H z9}OAIUDp*}W59i1kcm%|CL)cnCvUjh9SFZ166@2>CL))J?bD%{0Y8|)hs~=`))q-L z_+Zd-l&EWX!mu_~-z;wo%m2q=g=RiYBOgN|7zH{df@v7py;K{5L~u z0mX>38gWuq;!-YSY-OGV76?gm8{xNT4|3#4KmHkdKJ^93ycQ&hjZKD03Rt3uhM4(E e!&Ss_Z49`MhqN1{P@{4mQ1mw4gDOh&t^5T{9QRNF diff --git a/src/main/java/ToDo.class b/src/main/java/ToDo.class deleted file mode 100644 index eff080fda7fa3aa5c812bc73fc5b55699543d2fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 735 zcmaJ<%TB^T6g?NQt+k5p_ggeR5?#8$xDaDBL0v#}VO$I_kwTpz?O@`c_!+t~ap4E} zQN~*!ihzurFp93btYAH(sI8e?GG#)OSYf_3OC-y9Jpw{lhSDE0%P z?)UR1^woW4`arxHa=wz6jfbKP3!)e>;uzhc5hk{_yTt@IuNz@Wp87F;prB9m zUYx>%1>1v*LBhzf)+REcs9#7^(d8&*Vama@hZ)Rr@>mpaBC5HV!#vx!g*zflKZu&l zYE=^E#y1tVA|sTE2%Ehc=`PR4LY!oUkpAu4SC6_T+wHfapNf*v;ggLu9#&54TBA85`?_jjsNB)kawQpNCZ>`T4|O0z3=YygKZyv7g}G+Sz>ry|Tr(&8yo)`&g4? wgs=ODPi*n|&KnZ%=mTDUG*pF From 2b6f8315771a6587ba3bec37d9ea3b2ddee28361 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Thu, 20 Aug 2020 21:02:42 +0800 Subject: [PATCH 031/164] Add enums --- src/main/java/CommandType.java | 5 +++++ src/main/java/ExceptionType.java | 8 ++++++++ 2 files changed, 13 insertions(+) create mode 100644 src/main/java/CommandType.java create mode 100644 src/main/java/ExceptionType.java diff --git a/src/main/java/CommandType.java b/src/main/java/CommandType.java new file mode 100644 index 0000000000..433a89f65b --- /dev/null +++ b/src/main/java/CommandType.java @@ -0,0 +1,5 @@ +public enum CommandType { + TODO, + DEADLINE, + EVENT +} diff --git a/src/main/java/ExceptionType.java b/src/main/java/ExceptionType.java new file mode 100644 index 0000000000..b20543bbd2 --- /dev/null +++ b/src/main/java/ExceptionType.java @@ -0,0 +1,8 @@ +public enum ExceptionType { + EMPTY_INPUT, + INVALID_COMMAND, + EMPTY_DESCRIPTION, + DEADLINE_NO_BY, + EVENT_NO_START_END, + INDEX_OUT_OF_BOUNDS +} From 794683f9062146bdd7fa315fb0bfec2c4f21497d Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Thu, 20 Aug 2020 22:03:57 +0800 Subject: [PATCH 032/164] Add enums exception time --- src/main/java/CommandType.java | 5 -- src/main/java/Duke.java | 122 +++++++++++++++++-------------- src/main/java/DukeException.java | 65 ++++++++++++---- 3 files changed, 117 insertions(+), 75 deletions(-) delete mode 100644 src/main/java/CommandType.java diff --git a/src/main/java/CommandType.java b/src/main/java/CommandType.java deleted file mode 100644 index 433a89f65b..0000000000 --- a/src/main/java/CommandType.java +++ /dev/null @@ -1,5 +0,0 @@ -public enum CommandType { - TODO, - DEADLINE, - EVENT -} diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 029812a5b4..6a441c9978 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -29,7 +29,7 @@ public static boolean hasEventStartEndTime(String input) { && input.split(" /at ")[1].split("-").length == 2; } - public static void main(String[] args) { + public static void main(String[] args) throws DukeException { // Initialise strings to separate messages from Duke // and commands from CLI @@ -46,7 +46,7 @@ public static void main(String[] args) { String input; // Initialise DukeException object - DukeException dE = new DukeException(); +// DukeException dE = new DukeException(); // Initialise ArrayList to store tasks from user ArrayList userTasks = new ArrayList(); @@ -71,15 +71,19 @@ public static void main(String[] args) { // Get the index stated after "done" by parsing the string int index = Integer.parseInt(input.substring(5)) - 1; - // Check if index is out of bounds - if (index >= userTasks.size()) { - System.out.println(servantSpeak - + dE.MESSAGE_INDEX_OUT_OF_BOUNDS); - } else { - userTasks.get(index).setDone(); - System.out.println(servantSpeak - + " As you wish Sire. I have marked this task as done:\n" - + " " + userTasks.get(index).toString()); + // Mark item as done + try { + if (index >= userTasks.size()) { + throw new DukeException("", ExceptionType.INDEX_OUT_OF_BOUNDS); + } else { + userTasks.get(index).setDone(); + System.out.println(servantSpeak + + " As you wish Sire. I have marked this task as done:\n" + + " " + userTasks.get(index).toString()); + } + } catch (DukeException ex) { + System.out.print(servantSpeak); + System.out.println(ex); } System.out.println(); continue; @@ -90,15 +94,19 @@ public static void main(String[] args) { // Get the index stated after "delete" by parsing the string int index = Integer.parseInt(input.substring(7)) - 1; - // Check if index is out of bounds - if (index >= userTasks.size()) { - System.out.println(servantSpeak - + dE.MESSAGE_INDEX_OUT_OF_BOUNDS); - } else { - System.out.println(servantSpeak - + " As you wish Sire. I removed this task:\n" - + " " + userTasks.get(index).toString()); - userTasks.remove(index); + // Delete item + try { + if (index >= userTasks.size()) { + throw new DukeException("", ExceptionType.INDEX_OUT_OF_BOUNDS); + } else { + System.out.println(servantSpeak + + " As you wish Sire. I removed this task:\n" + + " " + userTasks.get(index).toString()); + userTasks.remove(index); + } + } catch (DukeException ex) { + System.out.print(servantSpeak); + System.out.println(ex); } System.out.println(); continue; @@ -120,19 +128,19 @@ public static void main(String[] args) { } // Check validity of input command - if (isEmptyInput(input)) { - System.out.println(servantSpeak - + dE.MESSAGE_ALL_TASKS_EMPTY_INPUT); - continue; - } - if (!isValidCommand(input)) { - System.out.println(servantSpeak - + dE.MESSAGE_ALL_TASKS_INVALID_COMMAND); - continue; - } - if (isEmptyDescription(input)) { - System.out.println(servantSpeak - + dE.MESSAGE_ALL_TASKS_EMPTY_DESCRIPTION); + try { + if (isEmptyInput(input)) { + throw new DukeException("", ExceptionType.EMPTY_INPUT); + } + if (!isValidCommand(input)) { + throw new DukeException("", ExceptionType.INVALID_COMMAND); + } + if (isEmptyDescription(input)) { + throw new DukeException("", ExceptionType.EMPTY_DESCRIPTION); + } + } catch (DukeException ex) { + System.out.print(servantSpeak); + System.out.println(ex); continue; } @@ -147,30 +155,38 @@ public static void main(String[] args) { userTasks.add(t); break; case "deadline": - if (!hasDeadlineBy(input)) { - System.out.println(servantSpeak - + dE.MESSAGE_DEADLINE_NO_BY); + try { + if (!hasDeadlineBy(input)) { + throw new DukeException("", ExceptionType.DEADLINE_NO_BY); + } + inputSplit = input.split(" /by "); + String by = inputSplit[1]; + description = inputSplit[0].substring(8); + t = new Deadline(description, by); + userTasks.add(t); + break; + } catch (DukeException ex) { + System.out.print(servantSpeak); + System.out.println(ex); continue; } - inputSplit = input.split(" /by "); - String by = inputSplit[1]; - description = inputSplit[0].substring(8); - t = new Deadline(description, by); - userTasks.add(t); - break; case "event": - if (!hasEventStartEndTime(input)) { - System.out.println(servantSpeak - + dE.MESSAGE_EVENT_NO_START_END); + try { + if (!hasEventStartEndTime(input)) { + throw new DukeException("", ExceptionType.EVENT_NO_START_END); + } + inputSplit = input.split(" /at "); + String start = inputSplit[1].split("-")[0]; + String end = inputSplit[1].split("-")[1]; + description = inputSplit[0].substring(5); + t = new Event(description, start, end); + userTasks.add(t); + break; + } catch (DukeException ex) { + System.out.print(servantSpeak); + System.out.println(ex); continue; } - inputSplit = input.split(" /at "); - String start = inputSplit[1].split("-")[0]; - String end = inputSplit[1].split("-")[1]; - description = inputSplit[0].substring(5); - t = new Event(description, start, end); - userTasks.add(t); - break; } // Standard reply from Duke for adding a task @@ -179,8 +195,6 @@ public static void main(String[] args) { + userTasks.get(userTasks.size() - 1).toString() + "\n" + " Now you have " + userTasks.size() + " tasks in the list.\n"); - } - } } \ No newline at end of file diff --git a/src/main/java/DukeException.java b/src/main/java/DukeException.java index aa3953050b..d6007bc6f4 100644 --- a/src/main/java/DukeException.java +++ b/src/main/java/DukeException.java @@ -1,4 +1,4 @@ -public class DukeException { +public class DukeException extends Exception { protected final String MESSAGE_ALL_TASKS_EMPTY_INPUT = " I am sorry my Lord. " + "You have to give a command.\n"; protected final String MESSAGE_ALL_TASKS_INVALID_COMMAND = " I am sorry my Lord. " @@ -6,29 +6,62 @@ public class DukeException { protected final String MESSAGE_ALL_TASKS_EMPTY_DESCRIPTION = " I am sorry my Lord. " + "Your description cannot be empty.\n"; protected final String MESSAGE_DEADLINE_NO_BY = " I am sorry my Lord. " - + "A deadline must have a specific date/time.\n"; + + "A deadline must have a specific end date/time.\n"; protected final String MESSAGE_EVENT_NO_START_END = " I am sorry my Lord. " + "An event must have a start and end time.\n"; protected final String MESSAGE_INDEX_OUT_OF_BOUNDS = " I am sorry my Lord. " + "That task cannot be found!"; - public String emptyInputMessage() { - return MESSAGE_ALL_TASKS_EMPTY_INPUT; - } - - public String invalidCommandMessage() { - return MESSAGE_ALL_TASKS_INVALID_COMMAND; - } + protected ExceptionType exceptionType; - public String emptyDescriptionMessage() { - return MESSAGE_ALL_TASKS_EMPTY_DESCRIPTION; + public DukeException(String err, ExceptionType exceptionType) { + super(err); + this.exceptionType = exceptionType; } - public String deadlineNoByMessage() { - return MESSAGE_DEADLINE_NO_BY; + @Override + public String toString() { + String errorMessage = ""; + switch (exceptionType) { + case EMPTY_INPUT: + errorMessage = MESSAGE_ALL_TASKS_EMPTY_INPUT; + break; + case INVALID_COMMAND: + errorMessage = MESSAGE_ALL_TASKS_INVALID_COMMAND; + break; + case EMPTY_DESCRIPTION: + errorMessage = MESSAGE_ALL_TASKS_EMPTY_DESCRIPTION; + break; + case DEADLINE_NO_BY: + errorMessage = MESSAGE_DEADLINE_NO_BY; + break; + case EVENT_NO_START_END: + errorMessage = MESSAGE_EVENT_NO_START_END; + break; + case INDEX_OUT_OF_BOUNDS: + errorMessage = MESSAGE_INDEX_OUT_OF_BOUNDS; + break; + } + return errorMessage; } - public String eventNoStartEndMessage() { - return MESSAGE_EVENT_NO_START_END; - } +// public String emptyInputMessage() { +// return MESSAGE_ALL_TASKS_EMPTY_INPUT; +// } +// +// public String invalidCommandMessage() { +// return MESSAGE_ALL_TASKS_INVALID_COMMAND; +// } +// +// public String emptyDescriptionMessage() { +// return MESSAGE_ALL_TASKS_EMPTY_DESCRIPTION; +// } +// +// public String deadlineNoByMessage() { +// return MESSAGE_DEADLINE_NO_BY; +// } +// +// public String eventNoStartEndMessage() { +// return MESSAGE_EVENT_NO_START_END; +// } } From 927ddb6ea5ec89693aba04c55ec9c64936c6cf8e Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Tue, 25 Aug 2020 18:16:24 +0800 Subject: [PATCH 033/164] Remove commented out line of code --- src/main/java/Duke.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 6a441c9978..2aa3ba8f24 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -45,9 +45,6 @@ public static void main(String[] args) throws DukeException { Scanner myObj = new Scanner(System.in); String input; - // Initialise DukeException object -// DukeException dE = new DukeException(); - // Initialise ArrayList to store tasks from user ArrayList userTasks = new ArrayList(); From 1041a2009843bd3399ebfa29d5f021c63110de82 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Tue, 25 Aug 2020 18:35:12 +0800 Subject: [PATCH 034/164] Add function to transform list of tasks to a string --- src/main/java/Duke.java | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 2aa3ba8f24..6bab7919c3 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,8 +1,33 @@ import java.util.Scanner; import java.util.ArrayList; +import java.io.File; +import java.io.IOException; + public class Duke { + public static String listToString(ArrayList taskList) { + String taskListStr = ""; + for (Task t : taskList) { + taskListStr += t.toString() + "\n"; + } + return taskListStr; + } + + public static void saveToFile(String output) { + try { + File myFile = new File("Tasklist.txt"); + if (myFile.createNewFile()) { + System.out.println("File created: " + myFile.getName()); + } else { + System.out.println("File already exists."); + } + } catch (IOException ex) { + System.out.println("Error IDIOT!!!"); + ex.printStackTrace(); + } + } + public static boolean isEmptyInput(String input) { return input.isEmpty(); } @@ -109,6 +134,11 @@ public static void main(String[] args) throws DukeException { continue; } + if (input.equals("to string")) { + System.out.println(listToString(userTasks)); + continue; + } + // If user requests for list, display list of tasks if (input.equals("list")) { int count = 1; From 238a6aa7fbdba9fefdf7a53ce73dcc6eb0e8ba16 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Tue, 25 Aug 2020 18:43:34 +0800 Subject: [PATCH 035/164] Add function to write task list to file --- src/main/java/Duke.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 6bab7919c3..54981805b9 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,7 +1,7 @@ import java.util.Scanner; import java.util.ArrayList; -import java.io.File; +import java.io.FileWriter; import java.io.IOException; public class Duke { @@ -16,12 +16,10 @@ public static String listToString(ArrayList taskList) { public static void saveToFile(String output) { try { - File myFile = new File("Tasklist.txt"); - if (myFile.createNewFile()) { - System.out.println("File created: " + myFile.getName()); - } else { - System.out.println("File already exists."); - } + FileWriter myFile = new FileWriter("Tasklist.txt"); + myFile.write(output); + myFile.close(); + System.out.println("WRITTEN TO FILE THE WHOLE LIST!!!!"); } catch (IOException ex) { System.out.println("Error IDIOT!!!"); ex.printStackTrace(); @@ -139,6 +137,12 @@ public static void main(String[] args) throws DukeException { continue; } + if (input.equals("to file")) { + saveToFile(listToString(userTasks)); + System.out.println("File saved!!!!"); + continue; + } + // If user requests for list, display list of tasks if (input.equals("list")) { int count = 1; From 731bb6d53d4b4454ef60bd8a38033be950981da0 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Tue, 25 Aug 2020 20:25:28 +0800 Subject: [PATCH 036/164] Update file path to be OS-independent --- src/main/java/Duke.java | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 54981805b9..98cb8932df 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -3,6 +3,10 @@ import java.io.FileWriter; import java.io.IOException; +import java.io.File; +import java.io.FileNotFoundException; + +import java.nio.file.Paths; public class Duke { @@ -15,8 +19,9 @@ public static String listToString(ArrayList taskList) { } public static void saveToFile(String output) { + String filePath = Paths.get("..", "..", "..", "data", "Tasklist.txt").toString(); try { - FileWriter myFile = new FileWriter("Tasklist.txt"); + FileWriter myFile = new FileWriter(filePath); myFile.write(output); myFile.close(); System.out.println("WRITTEN TO FILE THE WHOLE LIST!!!!"); @@ -26,6 +31,26 @@ public static void saveToFile(String output) { } } + public static ArrayList readFromFile(String filePath) { + ArrayList savedTasks = new ArrayList(); + try { + File myFile = new File(filePath); + Scanner taskReader = new Scanner(myFile); + while (taskReader.hasNextLine()) { + String task = taskReader.nextLine(); + if (task == "") { + continue; + } else { + break; + } + } + } catch (FileNotFoundException ex) { + System.out.println("Error IDIOT!!!"); + ex.printStackTrace(); + } + return savedTasks; + } + public static boolean isEmptyInput(String input) { return input.isEmpty(); } From bc3ad44b4e8e79fa381d4c0ebeb26cc832f32aa6 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Tue, 25 Aug 2020 20:26:56 +0800 Subject: [PATCH 037/164] Add function fromString() in Task class --- src/main/java/Task.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/Task.java b/src/main/java/Task.java index e5de1ae661..c2dc5960f3 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -12,6 +12,10 @@ public String toString() { + this.description; } + public Task fromString() { + return new Task(this.description); + } + public void setDone() { this.isDone = true; } From af84982c089dc29c975ef78c24eae1fd8103994c Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Tue, 25 Aug 2020 21:50:23 +0800 Subject: [PATCH 038/164] Add function to get done status --- src/main/java/Task.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/Task.java b/src/main/java/Task.java index c2dc5960f3..c6224d2510 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -12,8 +12,12 @@ public String toString() { + this.description; } - public Task fromString() { - return new Task(this.description); + public Task fromString(String description) { + return new Task(description); + } + + public boolean isDone() { + return this.isDone; } public void setDone() { From 00097b1df5cb24b2130a87fcc030b51b91a67304 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Tue, 25 Aug 2020 21:54:30 +0800 Subject: [PATCH 039/164] Override Task fromString function --- src/main/java/ToDo.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/ToDo.java b/src/main/java/ToDo.java index 1d00ab9d69..dc2cdbb55d 100644 --- a/src/main/java/ToDo.java +++ b/src/main/java/ToDo.java @@ -7,4 +7,15 @@ public ToDo (String description) { public String toString() { return "[T]" + super.toString(); } + + @Override + public Task fromString(String taskString) { + boolean isDone = taskString.split(" ")[0].equals("Done"); + String description = taskString.split(" ")[1]; + Task t = new ToDo(description); + if (isDone) { + t.setDone(); + } + return t; + } } From f2450d65771ef22657b0ab49cc3211a14c924536 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Tue, 25 Aug 2020 22:05:21 +0800 Subject: [PATCH 040/164] Add override fromString --- src/main/java/ToDo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ToDo.java b/src/main/java/ToDo.java index dc2cdbb55d..0b9e09b8cf 100644 --- a/src/main/java/ToDo.java +++ b/src/main/java/ToDo.java @@ -10,7 +10,7 @@ public String toString() { @Override public Task fromString(String taskString) { - boolean isDone = taskString.split(" ")[0].equals("Done"); + boolean isDone = taskString.split(" ")[0].equals("[Done]"); String description = taskString.split(" ")[1]; Task t = new ToDo(description); if (isDone) { From 977d9ccadeec673c3024d8587742e01ce47cb316 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Tue, 25 Aug 2020 22:05:32 +0800 Subject: [PATCH 041/164] Add override fromString --- src/main/java/Deadline.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 573b7b8793..795f201926 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -10,4 +10,16 @@ public Deadline(String description, String by) { public String toString() { return "[D]" + super.toString() + " (by: " + by + ")"; } + + @Override + public Task fromString(String taskString) { + boolean isDone = taskString.split(" ")[0].equals("[Done]"); + String description = taskString.split(" ")[1].split(" /by ")[0]; + String by = taskString.split(" ")[1].split(" /by ")[1]; + Deadline d = new Deadline(description, by); + if (isDone) { + d.setDone(); + } + return d; + } } From 816569145a08c0ecf38556e62eaabb644035932f Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Tue, 25 Aug 2020 22:19:54 +0800 Subject: [PATCH 042/164] Update correct index of string split --- src/main/java/Deadline.java | 4 ++-- src/main/java/ToDo.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 795f201926..b44232899d 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -14,8 +14,8 @@ public String toString() { @Override public Task fromString(String taskString) { boolean isDone = taskString.split(" ")[0].equals("[Done]"); - String description = taskString.split(" ")[1].split(" /by ")[0]; - String by = taskString.split(" ")[1].split(" /by ")[1]; + String description = taskString.split(" ")[2].split("\\s(by:\\s)")[0]; + String by = taskString.split(" ")[2].split("\\s(by:\\s)")[1]; Deadline d = new Deadline(description, by); if (isDone) { d.setDone(); diff --git a/src/main/java/ToDo.java b/src/main/java/ToDo.java index 0b9e09b8cf..b6c2e41b06 100644 --- a/src/main/java/ToDo.java +++ b/src/main/java/ToDo.java @@ -11,7 +11,7 @@ public String toString() { @Override public Task fromString(String taskString) { boolean isDone = taskString.split(" ")[0].equals("[Done]"); - String description = taskString.split(" ")[1]; + String description = taskString.split(" ")[2]; Task t = new ToDo(description); if (isDone) { t.setDone(); From c7d44517c8ef6cba401f77b519837d6075ae5f3d Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Tue, 25 Aug 2020 22:23:07 +0800 Subject: [PATCH 043/164] Update regex in split --- src/main/java/Deadline.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index b44232899d..aebcd341bd 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -14,8 +14,8 @@ public String toString() { @Override public Task fromString(String taskString) { boolean isDone = taskString.split(" ")[0].equals("[Done]"); - String description = taskString.split(" ")[2].split("\\s(by:\\s)")[0]; - String by = taskString.split(" ")[2].split("\\s(by:\\s)")[1]; + String description = taskString.split(" ")[2].split("\\s[(]by:\\s")[0]; + String by = taskString.split(" ")[2].split("\\s[(]by:\\s")[1]; Deadline d = new Deadline(description, by); if (isDone) { d.setDone(); From 0857907db5a4a9bf3f00c8ffdea246d155d0a4f0 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Tue, 25 Aug 2020 22:28:46 +0800 Subject: [PATCH 044/164] Update split regex and index of split --- src/main/java/Deadline.java | 6 +++--- src/main/java/ToDo.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index aebcd341bd..af460df432 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -13,9 +13,9 @@ public String toString() { @Override public Task fromString(String taskString) { - boolean isDone = taskString.split(" ")[0].equals("[Done]"); - String description = taskString.split(" ")[2].split("\\s[(]by:\\s")[0]; - String by = taskString.split(" ")[2].split("\\s[(]by:\\s")[1]; + boolean isDone = taskString.split(" ")[0].equals("[Done]"); + String description = taskString.split(" ")[1].split("\\s[(]by:\\s")[0]; + String by = taskString.split(" ")[1].split("\\s[(]by:\\s")[1]; Deadline d = new Deadline(description, by); if (isDone) { d.setDone(); diff --git a/src/main/java/ToDo.java b/src/main/java/ToDo.java index b6c2e41b06..d88ae386a8 100644 --- a/src/main/java/ToDo.java +++ b/src/main/java/ToDo.java @@ -10,8 +10,8 @@ public String toString() { @Override public Task fromString(String taskString) { - boolean isDone = taskString.split(" ")[0].equals("[Done]"); - String description = taskString.split(" ")[2]; + boolean isDone = taskString.split(" ")[0].equals("[Done]"); + String description = taskString.split(" ")[1]; Task t = new ToDo(description); if (isDone) { t.setDone(); From 73fc5eb53ad11eb1c79b449f4df0c1c88769ac8a Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Tue, 25 Aug 2020 22:30:31 +0800 Subject: [PATCH 045/164] Add override fromString --- src/main/java/Event.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 125883c243..3895efd0d9 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -12,4 +12,18 @@ public Event (String description, String start, String end) { public String toString() { return "[E]" + super.toString() + " (at: " + start + "-" + end + ")"; } + + @Override + public Task fromString(String taskString) { + boolean isDone = taskString.split(" ")[0].equals("[Done]"); + String[] stringSplit = taskString.split(" ")[1].split("\\s[(]at:\\s"); + String description = stringSplit[0]; + String start = stringSplit[1].split("-")[0]; + String end = stringSplit[1].split("-")[1]; + Event e = new Event(description, start, end); + if (isDone) { + e.setDone(); + } + return e; + } } From 0d6987a47b6d7a1464edac25bd24ea6abb1d4741 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Tue, 25 Aug 2020 22:31:01 +0800 Subject: [PATCH 046/164] Update name of parameter in fromString --- src/main/java/Task.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/Task.java b/src/main/java/Task.java index c6224d2510..2e2cd30a8c 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -12,8 +12,8 @@ public String toString() { + this.description; } - public Task fromString(String description) { - return new Task(description); + public Task fromString(String taskString) { + return new Task(taskString); } public boolean isDone() { From c0d17dd6f23e8fc2a40469e951e6d51373c82089 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Tue, 25 Aug 2020 23:07:27 +0800 Subject: [PATCH 047/164] Add function to read tasks in hard drive --- src/main/java/Duke.java | 130 +++++++++++++++++++++++++++------------- 1 file changed, 87 insertions(+), 43 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 98cb8932df..861412e492 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -10,6 +10,7 @@ public class Duke { + // Loop through every task and transform it into a string public static String listToString(ArrayList taskList) { String taskListStr = ""; for (Task t : taskList) { @@ -19,10 +20,13 @@ public static String listToString(ArrayList taskList) { } public static void saveToFile(String output) { - String filePath = Paths.get("..", "..", "..", "data", "Tasklist.txt").toString(); + // Get OS-independent file path + String filePath = Paths.get("..", "..", "..", "data", "Tasklist.txt") + .toString(); + try { FileWriter myFile = new FileWriter(filePath); - myFile.write(output); + myFile.write(output); // Output is already all tasks in a string myFile.close(); System.out.println("WRITTEN TO FILE THE WHOLE LIST!!!!"); } catch (IOException ex) { @@ -31,17 +35,57 @@ public static void saveToFile(String output) { } } - public static ArrayList readFromFile(String filePath) { + public static ArrayList readFromFile() { + // Initialise ArrayList to return ArrayList savedTasks = new ArrayList(); + + // Get OS-independent file path to read file + String filePath = Paths.get("..", "..", "..", "data", "Tasklist.txt") + .toString(); + try { File myFile = new File(filePath); Scanner taskReader = new Scanner(myFile); + + // Keep reading new line until file end while (taskReader.hasNextLine()) { - String task = taskReader.nextLine(); - if (task == "") { - continue; - } else { - break; + String taskString = taskReader.nextLine(); + + // Only work with non empty lines + if (taskString != "") { + switch (taskString.charAt(1)) { + case 'T': + boolean isDone = taskString.split(" ")[0].equals("[Done]"); + String description = taskString.split(" ")[1]; + Task t = new ToDo(description); + if (isDone) { + t.setDone(); + } + savedTasks.add(t); + break; + case 'D': + isDone = taskString.split(" ")[0].equals("[Done]"); + description = taskString.split(" ")[1].split("\\s[(]by:\\s")[0]; + String by = taskString.split(" ")[1].split("\\s[(]by:\\s")[1]; + Deadline d = new Deadline(description, by); + if (isDone) { + d.setDone(); + } + savedTasks.add(d); + break; + case 'E': + isDone = taskString.split(" ")[0].equals("[Done]"); + String[] stringSplit = taskString.split(" ")[1].split("\\s[(]at:\\s"); + description = stringSplit[0]; + String start = stringSplit[1].split("-")[0]; + String end = stringSplit[1].split("-")[1]; + Event e = new Event(description, start, end); + if (isDone) { + e.setDone(); + } + savedTasks.add(e); + break; + } } } } catch (FileNotFoundException ex) { @@ -205,44 +249,44 @@ public static void main(String[] args) throws DukeException { String[] inputSplit; String description; switch (input.toLowerCase().split(" ")[0]) { - case "todo": - description = input.substring(4); - t = new ToDo(description); + case "todo": + description = input.substring(4); + t = new ToDo(description); + userTasks.add(t); + break; + case "deadline": + try { + if (!hasDeadlineBy(input)) { + throw new DukeException("", ExceptionType.DEADLINE_NO_BY); + } + inputSplit = input.split(" /by "); + String by = inputSplit[1]; + description = inputSplit[0].substring(8); + t = new Deadline(description, by); userTasks.add(t); break; - case "deadline": - try { - if (!hasDeadlineBy(input)) { - throw new DukeException("", ExceptionType.DEADLINE_NO_BY); - } - inputSplit = input.split(" /by "); - String by = inputSplit[1]; - description = inputSplit[0].substring(8); - t = new Deadline(description, by); - userTasks.add(t); - break; - } catch (DukeException ex) { - System.out.print(servantSpeak); - System.out.println(ex); - continue; - } - case "event": - try { - if (!hasEventStartEndTime(input)) { - throw new DukeException("", ExceptionType.EVENT_NO_START_END); - } - inputSplit = input.split(" /at "); - String start = inputSplit[1].split("-")[0]; - String end = inputSplit[1].split("-")[1]; - description = inputSplit[0].substring(5); - t = new Event(description, start, end); - userTasks.add(t); - break; - } catch (DukeException ex) { - System.out.print(servantSpeak); - System.out.println(ex); - continue; + } catch (DukeException ex) { + System.out.print(servantSpeak); + System.out.println(ex); + continue; + } + case "event": + try { + if (!hasEventStartEndTime(input)) { + throw new DukeException("", ExceptionType.EVENT_NO_START_END); } + inputSplit = input.split(" /at "); + String start = inputSplit[1].split("-")[0]; + String end = inputSplit[1].split("-")[1]; + description = inputSplit[0].substring(5); + t = new Event(description, start, end); + userTasks.add(t); + break; + } catch (DukeException ex) { + System.out.print(servantSpeak); + System.out.println(ex); + continue; + } } // Standard reply from Duke for adding a task From 4031e06ba088345320b499ffa7aa0a420e5e5969 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Tue, 25 Aug 2020 23:37:34 +0800 Subject: [PATCH 048/164] Delete fromString and isDone function --- src/main/java/Deadline.java | 12 ------------ src/main/java/Event.java | 14 -------------- src/main/java/Task.java | 8 -------- src/main/java/ToDo.java | 10 ---------- 4 files changed, 44 deletions(-) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index af460df432..573b7b8793 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -10,16 +10,4 @@ public Deadline(String description, String by) { public String toString() { return "[D]" + super.toString() + " (by: " + by + ")"; } - - @Override - public Task fromString(String taskString) { - boolean isDone = taskString.split(" ")[0].equals("[Done]"); - String description = taskString.split(" ")[1].split("\\s[(]by:\\s")[0]; - String by = taskString.split(" ")[1].split("\\s[(]by:\\s")[1]; - Deadline d = new Deadline(description, by); - if (isDone) { - d.setDone(); - } - return d; - } } diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 3895efd0d9..125883c243 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -12,18 +12,4 @@ public Event (String description, String start, String end) { public String toString() { return "[E]" + super.toString() + " (at: " + start + "-" + end + ")"; } - - @Override - public Task fromString(String taskString) { - boolean isDone = taskString.split(" ")[0].equals("[Done]"); - String[] stringSplit = taskString.split(" ")[1].split("\\s[(]at:\\s"); - String description = stringSplit[0]; - String start = stringSplit[1].split("-")[0]; - String end = stringSplit[1].split("-")[1]; - Event e = new Event(description, start, end); - if (isDone) { - e.setDone(); - } - return e; - } } diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 2e2cd30a8c..e5de1ae661 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -12,14 +12,6 @@ public String toString() { + this.description; } - public Task fromString(String taskString) { - return new Task(taskString); - } - - public boolean isDone() { - return this.isDone; - } - public void setDone() { this.isDone = true; } diff --git a/src/main/java/ToDo.java b/src/main/java/ToDo.java index d88ae386a8..5aa1d9e280 100644 --- a/src/main/java/ToDo.java +++ b/src/main/java/ToDo.java @@ -8,14 +8,4 @@ public String toString() { return "[T]" + super.toString(); } - @Override - public Task fromString(String taskString) { - boolean isDone = taskString.split(" ")[0].equals("[Done]"); - String description = taskString.split(" ")[1]; - Task t = new ToDo(description); - if (isDone) { - t.setDone(); - } - return t; - } } From 2c5c0a06d22406a98563db7a807e207c3369dc76 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Tue, 25 Aug 2020 23:38:28 +0800 Subject: [PATCH 049/164] Add function to read from file --- src/main/java/Duke.java | 38 ++++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 861412e492..36ceea5846 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -50,37 +50,50 @@ public static ArrayList readFromFile() { // Keep reading new line until file end while (taskReader.hasNextLine()) { String taskString = taskReader.nextLine(); + //System.out.println(taskString); // Only work with non empty lines if (taskString != "") { switch (taskString.charAt(1)) { case 'T': - boolean isDone = taskString.split(" ")[0].equals("[Done]"); + boolean isDone = taskString.split(" ")[0] + .substring(3) + .equals("[Done]"); String description = taskString.split(" ")[1]; Task t = new ToDo(description); if (isDone) { + System.out.println("It is done!"); t.setDone(); } savedTasks.add(t); break; case 'D': - isDone = taskString.split(" ")[0].equals("[Done]"); - description = taskString.split(" ")[1].split("\\s[(]by:\\s")[0]; - String by = taskString.split(" ")[1].split("\\s[(]by:\\s")[1]; + isDone = taskString.split(" ")[0] + .substring(3) + .equals("[Done]"); + description = taskString.split(" ")[1] + .split("\\s[(]by:\\s")[0]; + String by = taskString.split(" ")[1] + .split("\\s[(]by:\\s")[1]; Deadline d = new Deadline(description, by); if (isDone) { + System.out.println("It is done!"); d.setDone(); } savedTasks.add(d); break; case 'E': - isDone = taskString.split(" ")[0].equals("[Done]"); - String[] stringSplit = taskString.split(" ")[1].split("\\s[(]at:\\s"); + isDone = taskString.split(" ")[0] + .substring(3) + .equals("[Done]"); + String[] stringSplit = taskString.split(" ")[1] + .split("\\s[(]at:\\s"); description = stringSplit[0]; String start = stringSplit[1].split("-")[0]; String end = stringSplit[1].split("-")[1]; Event e = new Event(description, start, end); if (isDone) { + System.out.println("It is done!"); e.setDone(); } savedTasks.add(e); @@ -212,6 +225,19 @@ public static void main(String[] args) throws DukeException { continue; } + if (input.equals("from file")) { + ArrayList l = readFromFile(); + int count = 1; + System.out.println("File is read!"); + for (Task i : l) { + System.out.println(" " + + count + ". " + + i.toString()); + count++; + } + continue; + } + // If user requests for list, display list of tasks if (input.equals("list")) { int count = 1; From a65be612228a84d2397b7a7ba8b65d4b2d34a94b Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Tue, 25 Aug 2020 23:46:34 +0800 Subject: [PATCH 050/164] Update git to ignore data folder --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 7386799b7e..23bb4f2090 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,7 @@ bin/ text-ui-test/*.txt # Class files -src/main/java/*.class \ No newline at end of file +src/main/java/*.class + +# Data folder +data/ \ No newline at end of file From 8ccd51f5e118764a362dac77155ceeb9fbb0c926 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Wed, 26 Aug 2020 00:09:25 +0800 Subject: [PATCH 051/164] Save tasks in hard drive automatically whenever task list changes --- src/main/java/Duke.java | 49 +++++++++++++++-------------------------- 1 file changed, 18 insertions(+), 31 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 36ceea5846..14450041c4 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -24,13 +24,18 @@ public static void saveToFile(String output) { String filePath = Paths.get("..", "..", "..", "data", "Tasklist.txt") .toString(); + /* + // Uncomment for testing + String filePath = Paths.get("..","data", "Tasklist.txt") + .toString(); + */ + try { FileWriter myFile = new FileWriter(filePath); myFile.write(output); // Output is already all tasks in a string myFile.close(); - System.out.println("WRITTEN TO FILE THE WHOLE LIST!!!!"); + } catch (IOException ex) { - System.out.println("Error IDIOT!!!"); ex.printStackTrace(); } } @@ -50,7 +55,6 @@ public static ArrayList readFromFile() { // Keep reading new line until file end while (taskReader.hasNextLine()) { String taskString = taskReader.nextLine(); - //System.out.println(taskString); // Only work with non empty lines if (taskString != "") { @@ -62,7 +66,6 @@ public static ArrayList readFromFile() { String description = taskString.split(" ")[1]; Task t = new ToDo(description); if (isDone) { - System.out.println("It is done!"); t.setDone(); } savedTasks.add(t); @@ -77,7 +80,6 @@ public static ArrayList readFromFile() { .split("\\s[(]by:\\s")[1]; Deadline d = new Deadline(description, by); if (isDone) { - System.out.println("It is done!"); d.setDone(); } savedTasks.add(d); @@ -93,7 +95,6 @@ public static ArrayList readFromFile() { String end = stringSplit[1].split("-")[1]; Event e = new Event(description, start, end); if (isDone) { - System.out.println("It is done!"); e.setDone(); } savedTasks.add(e); @@ -102,7 +103,6 @@ public static ArrayList readFromFile() { } } } catch (FileNotFoundException ex) { - System.out.println("Error IDIOT!!!"); ex.printStackTrace(); } return savedTasks; @@ -183,6 +183,10 @@ public static void main(String[] args) throws DukeException { + " As you wish Sire. I have marked this task as done:\n" + " " + userTasks.get(index).toString()); } + + // Update Tasklist.txt after marking task as done + saveToFile(listToString(userTasks)); + } catch (DukeException ex) { System.out.print(servantSpeak); System.out.println(ex); @@ -206,6 +210,10 @@ public static void main(String[] args) throws DukeException { + " " + userTasks.get(index).toString()); userTasks.remove(index); } + + // Update Tasklist.txt after removing task + saveToFile(listToString(userTasks)); + } catch (DukeException ex) { System.out.print(servantSpeak); System.out.println(ex); @@ -214,30 +222,6 @@ public static void main(String[] args) throws DukeException { continue; } - if (input.equals("to string")) { - System.out.println(listToString(userTasks)); - continue; - } - - if (input.equals("to file")) { - saveToFile(listToString(userTasks)); - System.out.println("File saved!!!!"); - continue; - } - - if (input.equals("from file")) { - ArrayList l = readFromFile(); - int count = 1; - System.out.println("File is read!"); - for (Task i : l) { - System.out.println(" " - + count + ". " - + i.toString()); - count++; - } - continue; - } - // If user requests for list, display list of tasks if (input.equals("list")) { int count = 1; @@ -321,6 +305,9 @@ public static void main(String[] args) throws DukeException { + userTasks.get(userTasks.size() - 1).toString() + "\n" + " Now you have " + userTasks.size() + " tasks in the list.\n"); + + // Update Tasklist.txt after adding task + saveToFile(listToString(userTasks)); } } } \ No newline at end of file From 3d45590df7aa2438ed635eeccdb3bf4d595cb7b9 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Wed, 26 Aug 2020 02:07:14 +0800 Subject: [PATCH 052/164] Add handler for when directory does not exist --- src/main/java/Duke.java | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 14450041c4..a8ed534073 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,3 +1,4 @@ +import java.nio.file.Files; import java.util.Scanner; import java.util.ArrayList; @@ -6,6 +7,7 @@ import java.io.File; import java.io.FileNotFoundException; +import java.nio.file.Path; import java.nio.file.Paths; public class Duke { @@ -20,15 +22,25 @@ public static String listToString(ArrayList taskList) { } public static void saveToFile(String output) { - // Get OS-independent file path + // Check if data folder exists, if not create + Path folderPath = Paths.get("..", "..", "..", "data"); + if (!Files.exists(folderPath)) { + //System.out.println("DOES NOT EXIST!!!!"); + File folderDir = new File(folderPath.toString()); + folderDir.mkdir(); + } else { + //System.out.println("FOLDER EXIST!!!!"); + } + + // Get OS-independent file path to text file String filePath = Paths.get("..", "..", "..", "data", "Tasklist.txt") .toString(); - /* +/* // Uncomment for testing String filePath = Paths.get("..","data", "Tasklist.txt") .toString(); - */ +*/ try { FileWriter myFile = new FileWriter(filePath); @@ -47,6 +59,11 @@ public static ArrayList readFromFile() { // Get OS-independent file path to read file String filePath = Paths.get("..", "..", "..", "data", "Tasklist.txt") .toString(); +/* + // Uncomment for testing + String filePath = Paths.get("..","data", "Tasklist.txt") + .toString(); +*/ try { File myFile = new File(filePath); @@ -63,7 +80,7 @@ public static ArrayList readFromFile() { boolean isDone = taskString.split(" ")[0] .substring(3) .equals("[Done]"); - String description = taskString.split(" ")[1]; + String description = " " + taskString.split(" ")[1]; Task t = new ToDo(description); if (isDone) { t.setDone(); @@ -74,7 +91,7 @@ public static ArrayList readFromFile() { isDone = taskString.split(" ")[0] .substring(3) .equals("[Done]"); - description = taskString.split(" ")[1] + description = " " + taskString.split(" ")[1] .split("\\s[(]by:\\s")[0]; String by = taskString.split(" ")[1] .split("\\s[(]by:\\s")[1]; @@ -90,7 +107,7 @@ public static ArrayList readFromFile() { .equals("[Done]"); String[] stringSplit = taskString.split(" ")[1] .split("\\s[(]at:\\s"); - description = stringSplit[0]; + description = " " + stringSplit[0]; String start = stringSplit[1].split("-")[0]; String end = stringSplit[1].split("-")[1]; Event e = new Event(description, start, end); @@ -151,7 +168,10 @@ public static void main(String[] args) throws DukeException { String input; // Initialise ArrayList to store tasks from user - ArrayList userTasks = new ArrayList(); + ArrayList userTasks; + + // Read tasks stored in hard drive if any + userTasks = readFromFile(); // Start chat while (true) { From 1e339b47cada7813217c926c91218eb966372d15 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Wed, 26 Aug 2020 02:16:17 +0800 Subject: [PATCH 053/164] Add function to read any tasks saved in hard drive --- src/main/java/Duke.java | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index a8ed534073..c5e2cfdc12 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -25,48 +25,52 @@ public static void saveToFile(String output) { // Check if data folder exists, if not create Path folderPath = Paths.get("..", "..", "..", "data"); if (!Files.exists(folderPath)) { - //System.out.println("DOES NOT EXIST!!!!"); File folderDir = new File(folderPath.toString()); folderDir.mkdir(); - } else { - //System.out.println("FOLDER EXIST!!!!"); } // Get OS-independent file path to text file String filePath = Paths.get("..", "..", "..", "data", "Tasklist.txt") .toString(); -/* // Uncomment for testing - String filePath = Paths.get("..","data", "Tasklist.txt") - .toString(); -*/ +// String filePath = Paths.get("..","data", "Tasklist.txt") +// .toString(); try { FileWriter myFile = new FileWriter(filePath); myFile.write(output); // Output is already all tasks in a string myFile.close(); - } catch (IOException ex) { ex.printStackTrace(); } } public static ArrayList readFromFile() { + // Check if data folder exists, if not create + Path folderPath = Paths.get("..", "..", "..", "data"); + if (!Files.exists(folderPath)) { + File folderDir = new File(folderPath.toString()); + folderDir.mkdir(); + } + // Initialise ArrayList to return ArrayList savedTasks = new ArrayList(); - // Get OS-independent file path to read file - String filePath = Paths.get("..", "..", "..", "data", "Tasklist.txt") - .toString(); -/* + // Check if file exists, if return empty list + Path filePath = Paths.get("..", "..", "..", "data", "Tasklist.txt"); + if (!Files.exists(filePath)) { + return savedTasks; + } + // Uncomment for testing - String filePath = Paths.get("..","data", "Tasklist.txt") - .toString(); -*/ +// Path filePath = Paths.get("..", "data", "Tasklist.txt"); +// if (!Files.exists(filePath)) { +// return savedTasks; +// } try { - File myFile = new File(filePath); + File myFile = new File(filePath.toString()); Scanner taskReader = new Scanner(myFile); // Keep reading new line until file end From 94b2e9ba4256eb6e4e6cf9f6381e3cf78a01d7f4 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Wed, 26 Aug 2020 10:55:07 +0800 Subject: [PATCH 054/164] Add git ignore for data folder using in testing --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 23bb4f2090..ec8dec9f0d 100644 --- a/.gitignore +++ b/.gitignore @@ -20,4 +20,5 @@ text-ui-test/*.txt src/main/java/*.class # Data folder -data/ \ No newline at end of file +data/ +../../data/ \ No newline at end of file From 284cb3553170c5dbfad208aefcea2060dcbe3da6 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Wed, 26 Aug 2020 21:28:57 +0800 Subject: [PATCH 055/164] Update Deadline class to store date and time as LocalDate and LocalTime --- src/main/java/Deadline.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 573b7b8793..ae8abc1335 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -1,13 +1,22 @@ +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; + public class Deadline extends Task { - protected String by; + //protected String by; + protected LocalDate byDate; + protected LocalTime byTime; public Deadline(String description, String by) { super(description); - this.by = by; + this.byDate = LocalDate.parse(by.split(" ")[0]); + this.byTime = LocalTime.parse(by.split(" ")[1]); } @Override public String toString() { - return "[D]" + super.toString() + " (by: " + by + ")"; + DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd MMM yyyy"); + DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("ha"); + return "[D]" + super.toString() + " (by: " + dateFormatter.format(byDate) + " " + timeFormatter.format(byTime) + ")"; } } From 079bd53cb464adebe9b3e7b57d48cecc0478e3a8 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Wed, 26 Aug 2020 21:47:04 +0800 Subject: [PATCH 056/164] Add function to format tasks saved to hard disk --- src/main/java/Deadline.java | 5 +++++ src/main/java/Duke.java | 4 +++- src/main/java/Event.java | 5 +++++ src/main/java/Task.java | 5 +++++ src/main/java/ToDo.java | 4 ++++ 5 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index ae8abc1335..f9ca53e386 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -19,4 +19,9 @@ public String toString() { DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("ha"); return "[D]" + super.toString() + " (by: " + dateFormatter.format(byDate) + " " + timeFormatter.format(byTime) + ")"; } + + @Override + public String toStringFileFormat() { + return "[D]" + super.toStringFileFormat() + " (by: " + byDate + " " + byTime + ")"; + } } diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index c5e2cfdc12..3f2788432b 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -16,7 +16,7 @@ public class Duke { public static String listToString(ArrayList taskList) { String taskListStr = ""; for (Task t : taskList) { - taskListStr += t.toString() + "\n"; + taskListStr += t.toStringFileFormat() + "\n"; } return taskListStr; } @@ -99,6 +99,7 @@ public static ArrayList readFromFile() { .split("\\s[(]by:\\s")[0]; String by = taskString.split(" ")[1] .split("\\s[(]by:\\s")[1]; + by = by.substring(0, by.length() - 1); // remove parentheses at the end Deadline d = new Deadline(description, by); if (isDone) { d.setDone(); @@ -114,6 +115,7 @@ public static ArrayList readFromFile() { description = " " + stringSplit[0]; String start = stringSplit[1].split("-")[0]; String end = stringSplit[1].split("-")[1]; + end = end.substring(0, end.length() - 1); // remove parentheses at the end Event e = new Event(description, start, end); if (isDone) { e.setDone(); diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 125883c243..f2794969c8 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -12,4 +12,9 @@ public Event (String description, String start, String end) { public String toString() { return "[E]" + super.toString() + " (at: " + start + "-" + end + ")"; } + + @Override + public String toStringFileFormat() { + return "[E]" + super.toStringFileFormat() + " (at: " + start + "-" + end + ")"; + } } diff --git a/src/main/java/Task.java b/src/main/java/Task.java index e5de1ae661..3af1354689 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -12,6 +12,11 @@ public String toString() { + this.description; } + public String toStringFileFormat() { + return "[" + getStatusIcon() + "] " + + this.description; + } + public void setDone() { this.isDone = true; } diff --git a/src/main/java/ToDo.java b/src/main/java/ToDo.java index 5aa1d9e280..3c5f98ab31 100644 --- a/src/main/java/ToDo.java +++ b/src/main/java/ToDo.java @@ -8,4 +8,8 @@ public String toString() { return "[T]" + super.toString(); } + @Override + public String toStringFileFormat() { + return "[T]" + super.toStringFileFormat(); + } } From 25e9885e4709a6344a4809471e92c0b19065c47a Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Wed, 26 Aug 2020 22:46:31 +0800 Subject: [PATCH 057/164] Update event class to store date and time as LocalDate and LocalTime --- src/main/java/Deadline.java | 4 +++- src/main/java/Duke.java | 19 ++++++++++--------- src/main/java/Event.java | 28 +++++++++++++++++++++------- 3 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index f9ca53e386..c70d5bca58 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -17,7 +17,9 @@ public Deadline(String description, String by) { public String toString() { DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd MMM yyyy"); DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("ha"); - return "[D]" + super.toString() + " (by: " + dateFormatter.format(byDate) + " " + timeFormatter.format(byTime) + ")"; + return "[D]" + super.toString() + " (by: " + + dateFormatter.format(byDate) + " " + + timeFormatter.format(byTime) + ")"; } @Override diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 3f2788432b..024375c5ba 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -113,10 +113,10 @@ public static ArrayList readFromFile() { String[] stringSplit = taskString.split(" ")[1] .split("\\s[(]at:\\s"); description = " " + stringSplit[0]; - String start = stringSplit[1].split("-")[0]; - String end = stringSplit[1].split("-")[1]; - end = end.substring(0, end.length() - 1); // remove parentheses at the end - Event e = new Event(description, start, end); + String at = stringSplit[1].split(" ")[0]; + String timeRange = stringSplit[1].split(" ")[1]; + timeRange = timeRange.substring(0, timeRange.length() - 1); // remove parentheses at the end + Event e = new Event(description, at, timeRange); if (isDone) { e.setDone(); } @@ -153,8 +153,9 @@ public static boolean hasDeadlineBy(String input) { public static boolean hasEventStartEndTime(String input) { return input.contains("/at") && input.split(" /at ").length == 2 - && input.split(" /at ")[1].contains("-") - && input.split(" /at ")[1].split("-").length == 2; + && input.split(" /at ")[1].split(" ").length == 2 + && input.split(" /at ")[1].split(" ")[1] + .split("-").length == 2; } public static void main(String[] args) throws DukeException { @@ -312,10 +313,10 @@ public static void main(String[] args) throws DukeException { throw new DukeException("", ExceptionType.EVENT_NO_START_END); } inputSplit = input.split(" /at "); - String start = inputSplit[1].split("-")[0]; - String end = inputSplit[1].split("-")[1]; + String at = inputSplit[1].split(" ")[0]; + String timeRange = inputSplit[1].split(" ")[1]; description = inputSplit[0].substring(5); - t = new Event(description, start, end); + t = new Event(description, at, timeRange); userTasks.add(t); break; } catch (DukeException ex) { diff --git a/src/main/java/Event.java b/src/main/java/Event.java index f2794969c8..da173700e6 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -1,20 +1,34 @@ +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; + public class Event extends Task { - protected String start; - protected String end; +// protected String start; +// protected String end; + protected LocalDate at; + protected LocalTime start; + protected LocalTime end; - public Event (String description, String start, String end) { + public Event (String description, String at, String timeRange) { super(description); - this.start = start; - this.end = end; + this.at = LocalDate.parse(at); + this.start = LocalTime.parse(timeRange.split("-")[0]); + this.end = LocalTime.parse(timeRange.split("-")[1]); } @Override public String toString() { - return "[E]" + super.toString() + " (at: " + start + "-" + end + ")"; + DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd MMM yyyy"); + DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("ha"); + return "[E]" + super.toString() + " (at: " + + dateFormatter.format(at) + " " + + timeFormatter.format(start) + "-" + + timeFormatter.format(end) + ")"; } @Override public String toStringFileFormat() { - return "[E]" + super.toStringFileFormat() + " (at: " + start + "-" + end + ")"; + return "[E]" + super.toStringFileFormat() + " (at: " + + at + " " + start + "-" + end + ")"; } } From d82c901807d4b9c1e01f99f99ead77b6dcf3f7b4 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Wed, 26 Aug 2020 23:34:48 +0800 Subject: [PATCH 058/164] Create new classes for code refactoring --- src/main/java/Parser.java | 2 ++ src/main/java/Storage.java | 2 ++ src/main/java/TaskList.java | 2 ++ src/main/java/Ui.java | 2 ++ 4 files changed, 8 insertions(+) create mode 100644 src/main/java/Parser.java create mode 100644 src/main/java/Storage.java create mode 100644 src/main/java/TaskList.java create mode 100644 src/main/java/Ui.java diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java new file mode 100644 index 0000000000..4d27fe15e5 --- /dev/null +++ b/src/main/java/Parser.java @@ -0,0 +1,2 @@ +public class Parser { +} diff --git a/src/main/java/Storage.java b/src/main/java/Storage.java new file mode 100644 index 0000000000..14d3059133 --- /dev/null +++ b/src/main/java/Storage.java @@ -0,0 +1,2 @@ +public class Storage { +} diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java new file mode 100644 index 0000000000..1e7aed1c05 --- /dev/null +++ b/src/main/java/TaskList.java @@ -0,0 +1,2 @@ +public class TaskList { +} diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java new file mode 100644 index 0000000000..30d98a7015 --- /dev/null +++ b/src/main/java/Ui.java @@ -0,0 +1,2 @@ +public class Ui { +} From c5881807556abd40294c47b3b500099bf52b1527 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Wed, 26 Aug 2020 23:53:48 +0800 Subject: [PATCH 059/164] Update format of time --- src/main/java/Deadline.java | 2 +- src/main/java/Event.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index c70d5bca58..fe9f446d4f 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -16,7 +16,7 @@ public Deadline(String description, String by) { @Override public String toString() { DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd MMM yyyy"); - DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("ha"); + DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:mma"); return "[D]" + super.toString() + " (by: " + dateFormatter.format(byDate) + " " + timeFormatter.format(byTime) + ")"; diff --git a/src/main/java/Event.java b/src/main/java/Event.java index da173700e6..9ece1cc009 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -19,7 +19,7 @@ public Event (String description, String at, String timeRange) { @Override public String toString() { DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd MMM yyyy"); - DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("ha"); + DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:mma"); return "[E]" + super.toString() + " (at: " + dateFormatter.format(at) + " " + timeFormatter.format(start) + "-" From 42a6be329e404ced3527248946bff6472186b1c8 Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Thu, 27 Aug 2020 00:02:59 +0800 Subject: [PATCH 060/164] Refactor welcome message into Ui class --- src/main/java/Duke.java | 20 ++++++++++++++++---- src/main/java/Ui.java | 24 ++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 024375c5ba..2f99572029 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -12,6 +12,16 @@ public class Duke { + private Ui ui; + + public Duke() { + this.ui = new Ui(); + } + + public void run() { + ui.welcomeMessage(); + } + // Loop through every task and transform it into a string public static String listToString(ArrayList taskList) { String taskListStr = ""; @@ -160,15 +170,17 @@ public static boolean hasEventStartEndTime(String input) { public static void main(String[] args) throws DukeException { + new Duke().run(); + // Initialise strings to separate messages from Duke // and commands from CLI String servantSpeak = "Duke:\n"; String masterSpeak = "Your Command Sire:"; - // Introduction at the beginning of the chat - System.out.println(servantSpeak - + " Greetings my Liege.\n" - + " Why have you summoned me?\n"); +// // Introduction at the beginning of the chat +// System.out.println(servantSpeak +// + " Greetings my Liege.\n" +// + " Why have you summoned me?\n"); // Initialise the Scanner object to get input from user Scanner myObj = new Scanner(System.in); diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java index 30d98a7015..94e1a4f8fa 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/Ui.java @@ -1,2 +1,26 @@ public class Ui { + private String servantSpeak; + private String masterSpeak; + + public Ui () { + // Initialise strings to separate messages from Duke + // and commands from CLI + this.servantSpeak = "Duke:\n"; + this.masterSpeak = "Your Command Sire:"; + } + + public String getServantSpeak() { + return this.servantSpeak; + } + + public String getMasterSpeak() { + return this.masterSpeak; + } + + public void welcomeMessage() { + // Introduction at the beginning of the chat + System.out.println(servantSpeak + + " Greetings my Liege.\n" + + " Why have you summoned me?\n"); + } } From e1dfb90b317725a3bd7b5e17fda2122ed19c00cc Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Thu, 27 Aug 2020 11:45:53 +0800 Subject: [PATCH 061/164] Move main code block into run function --- src/main/java/Duke.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 2f99572029..4bbd0c4c62 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -18,10 +18,6 @@ public Duke() { this.ui = new Ui(); } - public void run() { - ui.welcomeMessage(); - } - // Loop through every task and transform it into a string public static String listToString(ArrayList taskList) { String taskListStr = ""; @@ -168,10 +164,8 @@ public static boolean hasEventStartEndTime(String input) { .split("-").length == 2; } - public static void main(String[] args) throws DukeException { - - new Duke().run(); - + public void run() { + ui.welcomeMessage(); // Initialise strings to separate messages from Duke // and commands from CLI String servantSpeak = "Duke:\n"; @@ -349,4 +343,8 @@ public static void main(String[] args) throws DukeException { saveToFile(listToString(userTasks)); } } + + public static void main(String[] args) throws DukeException { + new Duke().run(); + } } \ No newline at end of file From 997dcc16174ac90706243a5860b720ca74d9ee4b Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Thu, 27 Aug 2020 11:49:22 +0800 Subject: [PATCH 062/164] Replace chat prompts with ui functions --- src/main/java/Duke.java | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 4bbd0c4c62..9c868da788 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -168,8 +168,8 @@ public void run() { ui.welcomeMessage(); // Initialise strings to separate messages from Duke // and commands from CLI - String servantSpeak = "Duke:\n"; - String masterSpeak = "Your Command Sire:"; +// String servantSpeak = "Duke:\n"; +// String masterSpeak = "Your Command Sire:"; // // Introduction at the beginning of the chat // System.out.println(servantSpeak @@ -189,13 +189,13 @@ public void run() { // Start chat while (true) { // Get input from user - System.out.println(masterSpeak); + System.out.println(ui.getMasterSpeak()); input = myObj.nextLine().trim(); System.out.println(); // If user inputs "bye" in any case, end the chat if (input.equals("bye")) { - System.out.println(servantSpeak + System.out.println(ui.getServantSpeak() + " It was a pleasure to serve you my Liege.\n" + " Till next time."); break; @@ -212,7 +212,7 @@ public void run() { throw new DukeException("", ExceptionType.INDEX_OUT_OF_BOUNDS); } else { userTasks.get(index).setDone(); - System.out.println(servantSpeak + System.out.println(ui.getServantSpeak() + " As you wish Sire. I have marked this task as done:\n" + " " + userTasks.get(index).toString()); } @@ -221,7 +221,7 @@ public void run() { saveToFile(listToString(userTasks)); } catch (DukeException ex) { - System.out.print(servantSpeak); + System.out.print(ui.getServantSpeak()); System.out.println(ex); } System.out.println(); @@ -238,7 +238,7 @@ public void run() { if (index >= userTasks.size()) { throw new DukeException("", ExceptionType.INDEX_OUT_OF_BOUNDS); } else { - System.out.println(servantSpeak + System.out.println(ui.getServantSpeak() + " As you wish Sire. I removed this task:\n" + " " + userTasks.get(index).toString()); userTasks.remove(index); @@ -248,7 +248,7 @@ public void run() { saveToFile(listToString(userTasks)); } catch (DukeException ex) { - System.out.print(servantSpeak); + System.out.print(ui.getServantSpeak()); System.out.println(ex); } System.out.println(); @@ -258,7 +258,7 @@ public void run() { // If user requests for list, display list of tasks if (input.equals("list")) { int count = 1; - System.out.println(servantSpeak + System.out.println(ui.getServantSpeak() + " Here are your tasks your Majesty:"); for (Task i : userTasks) { System.out.println(" " @@ -282,7 +282,7 @@ public void run() { throw new DukeException("", ExceptionType.EMPTY_DESCRIPTION); } } catch (DukeException ex) { - System.out.print(servantSpeak); + System.out.print(ui.getServantSpeak()); System.out.println(ex); continue; } @@ -309,7 +309,7 @@ public void run() { userTasks.add(t); break; } catch (DukeException ex) { - System.out.print(servantSpeak); + System.out.print(ui.getServantSpeak()); System.out.println(ex); continue; } @@ -326,14 +326,14 @@ public void run() { userTasks.add(t); break; } catch (DukeException ex) { - System.out.print(servantSpeak); + System.out.print(ui.getServantSpeak()); System.out.println(ex); continue; } } // Standard reply from Duke for adding a task - System.out.println(servantSpeak + System.out.println(ui.getServantSpeak() + " As you wish Sire. I have added the task:\n " + userTasks.get(userTasks.size() - 1).toString() + "\n" + " Now you have " + userTasks.size() From 5ce7aed1dcc8d608c0bccf4c622038308e6ab8fb Mon Sep 17 00:00:00 2001 From: abdurrahmanfaqihiskandar Date: Thu, 27 Aug 2020 13:52:38 +0800 Subject: [PATCH 063/164] Add help message for usage of Duke --- src/main/java/Duke.java | 7 ++++++- src/main/java/Ui.java | 19 ++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 9c868da788..186ddc1133 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -189,10 +189,15 @@ public void run() { // Start chat while (true) { // Get input from user - System.out.println(ui.getMasterSpeak()); + System.out.println(ui.getUserPrompt()); input = myObj.nextLine().trim(); System.out.println(); + if (input.equals("help")) { + ui.availableCommands(); + continue; + } + // If user inputs "bye" in any case, end the chat if (input.equals("bye")) { System.out.println(ui.getServantSpeak() diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java index 94e1a4f8fa..fb6f03e205 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/Ui.java @@ -13,7 +13,7 @@ public String getServantSpeak() { return this.servantSpeak; } - public String getMasterSpeak() { + public String getUserPrompt() { return this.masterSpeak; } @@ -23,4 +23,21 @@ public void welcomeMessage() { + " Greetings my Liege.\n" + " Why have you summoned me?\n"); } + + public void availableCommands() { + System.out.println(servantSpeak + + " These are your available commands my Lord:\n\n" + + " help - Show list of available commands\n" + + " todo " + + " - To add a normal to do task\n" + + " deadline " + + " /by

`%e-YcQLLR6EYC<+e z$_!b+kxef&a9?#ttfQKAAgC(bE*Nmj6K_dk?Y=iueCq8YHAq|#@unj0%mk{E7 zEK&X=kD0XL`=){V1a&KNf#I#EZA$(TzX9;op-kPmoyn*Asa*cV85~^sKm0<5F3<)a z3q`q0E@=rGgw`;yknx+4=CI|@hZ!X*}lcMjNgei z{!LKCFxJ@5X+Jj)3kO9T<&F7_nVjvq1?>zsV=ys)4pCqpN18J_9_)?(04YwVM%OoD zhoYqOR-FAaCk-um6kZuI@0K;&xN`GYi6!kWW(Pcc!xvVcQ}`zsug`!ZRY24f*}K^uXgSeX9+-kxJ| zYi~+VmEpNw+a5}ME)Np(XCuDFP3);-);EWQ;P7%iq(7xu(eUUE7l;} zvhd`i-jte{+si0YS8V#)&%yrB9KONBy}PyVzf8u|wlNYg{HBosItDv%juS4dacS~V zLlvuDW6O zDr~(dCur>#G!fB%vtR!J1kiuxzxPxB0L02~Ti4c+^x=`?RayK)>Wp&XX6G~euo#c$XL-Ns7FNi?EKh6Ld@gCQn#Uaq#`{YN?6%bJ%`YgK;y>uUr|ryF zw5^Bmq5lAu)4!?ay`6)8C7GEoWYgi%NgUW`4|r&JJ2+|zXS61UQrC{{>d~T$HX?rS zfD5%*LdD`Khg1(}@>JT8(4L_FFdac3qH+9EZ<-_E(L{SNN!=5f{6Mr3lAA+BP4Kh8 zXqy#k^S31VEb$JcctbSzX zKjkQ#&v6<8P~l6Gjitp%MrsMY7cLeMcC~ftof#a_900YWH`J{81(8RPMZ}YQL~bjy z^Iez&Qi$?d3FMmc%?H?`@Z;Xm7^}R)W63f904tG%I9o~)hcNzO@P{Ierkyq2W(v?Yow9~-@O9KC?V>v@Mir98 z<~_NZRPehEE>qqdiuO(uvWGi|ec$^^NrXyivsoo!pcu?wdsekdTE+&A02Hyak>*rz zk*m#>G|dd4bwk2R8o3X{jn3jEMJ(VjwPJ5-3vtq(S?vVMcP9m(5n0rYKuG^B9YS0y{lju`NC5DT? zo=qCirsVHH_<(EhqBiedL1Lx=xk)pnepakDNIiO~F}cE? zQ!Da~lb#sdsN0UaE3LFlEe{#21wJRW6wyHM{+xMmYUGLF)G*Y$I;!S`WAd)RF2pXt zFL!G9cCU4BK#mokl|Kn%O&7Vf3^Omnz1h7NyEmdZarsezeqYfXI9}{Cj_UVT4cd+x zKgxy`pOt%~KPvY&UdZ61=#BpkB^6B$ds$5ed6%#{RIR!2y(rBYOJyYa8S7`TW74~DPR!+CTd}D#%fYE!@ z!(88@_sPFE=!QCOp#2y2gx+6e{i85D1^uNrMxpH~Ps-K(p)W|s(SK-7(m(rG_LKR< z#r>jxb`WNYGAS&H+Sfo_cT>$NKchF6dk&2+D6Kw zc&9KpdM99FyMe|N<+s^P>F}rVS*PZ2hyMTyA80do8VXNov@p_=ashEY=WFPnA%8kT zf+VX}ej}&C7cLw1I>LO&0ropd7*?YNU1;eO1p*vW6k(%aC=*tP_>+@>1*67hj7dYsn!m=@* zLv_hfdDmqlBXhFz=(`~dc6TcZ%+9`>DmSeolygDhyxN(GO~hE;HgD!rVj3bL+J!9% zU6Vo4Te_m+?a-t_X&~+pM?$Mh<6JqavG9Ya3EOcSA&Fk~}`z1p+K)vL6Rt5;~x{VDE@j~D8#y+UAN zH<=2p75SjGwMXH27O|AvG4ml1tA{QGCP*%%+o}u>qC7rH&SX39$RRY2b<=;*68G;d zdITI;JF-`!X?Xtt5=$*_GtDr*?`uuOJ8a5}_d^F8^)932orIB^$0lzgjM7J=*@D?9%HIs2^ges_J>Z7=-Ceb>BA{{S`Lb?;OE0L^mu%t-$L6t928{&D{RYWMli zG4@ZMNkus5yhD#J09qrLG&IF5Whd?0Jv#Y_qw}%;B5*F3@@_ z*1{4LF$6Dp^HR;9MdU4c@Mgp!D}+wU{{U3> z)dODuH1JUzmdNgpeV%KQE0+L=3PCtu9itv-*A|?muC2Z;N#XQVdMZ>^9+at4rACly zqCFP=N{=N-G@{d5D%E9KRz;CG5NrF3O>p`mGP^3h)*l+ycbwaGQ->#y^;oQaZtOQ* zRM8!iA%u;n8&9RgiQ}--jeN z;Y*q-wBgMLirG+Hf(u|&pTs;y{0{sG*Ml`u?mhMR#BOa`l-P5Xz1M0zsS3*>M$27g?5NmnL-tWH*~g zD@-m}tiLX!5hRzpiXOU;n928Gfu20acP3>}_X(IMGR-dDNLY*xn}Eqdgh9|hbn&X3 zgD`2oFn9-mnoU7ogA5D=zrb}Ey8(;E`s?olTuy=b{{Yy9*^Ak&Cw?J}7O+*Hd5F^U zjmA{&9YwT8w%p861r1dat%z)-DNGH#kUT2RwH)rjxUE5|vB3k2IYB>ma`~6a1B&9P zS;cA@1DvzGAI$ko;ti%<)F!Nj84k!+1hh9n#7#!+%v`m_#lONGV=dW0=$Na%q6;c` zHw9s@jmxT8*Y__d01LF@cfQWyNR;Od!W$L&m)R^rHnr{CvTd80VpX@G?jnLAeKRul zkP6E4t>SHnHr?_^T$*W9z#;zwQ?dob~ zHN;MS7;GDrrumhsKe>2?cD`YnYAxKZX4{K)D1PvRcP!Cd(>MbO;EJ*k@daE2K97iD z$m}5bN7OyRP`zR(k*rh1F%OtO-sV`?K~LjHkGl#LFGtsZf;GcVZzrr{+o?w!;mfA- z7{9y?p`b4OO6@%;)XNF(HcpOtioay6T0i-df5yJwxO?VB7v@bSN8TA1487M<{b^hf z(A!;1^y`_vF#iB#W^)%r2D-SJow1VB(I}U#x4EIp6^8DM;t0^LAR*<@ zXO5$$?W_Kv081{qh>Ow`WEak*J5V905oZOBa(b@65rYa^ZLNND2bfl=GH;-XbC8dI z8C|EjpR&2Q*g}5L?~5y5V3in_ncTMm_bIt!Lf1h9V(Tm1^N3WZ%*y`&aVWCa+BNAc zNr22;{{Z2P%Buv^GLP$-!AB92*XPfOl3iI6?n~6j2D2&ol$D%9aKTZRndSjILi}CJ zSR0m{Tp7bCHykh};w)oSQ>r-i6UKE%?}+P#iv0vtjDBX{?H_r77pkxOgl0|(zo}55 z*6&~W0e01Pg_zvDPYO!!h$pnQ>9@CI^K(WtmJEZVA+%^79_ z$omqp6ku>Ax=N0YuMo9H`Nm;k(rK{f3@xy%SNZC!pQm2KIYh!C-&L%%=y3wHRm zW&UA$Uw?^pX7a~{ThwKwS)w=&c_L)j0Ukr*C92bp61-%*%R{K`oD1~{bNhkJ540ke z5DOeaYG}bxBC8k_na-f7g|PziYP=_Ru!l)$pA&6L<=kWy_J}qW)ZaPBmR``^W;#mK z9{~zm`Gp7f1rDO#%WMtHlteG(VPO~cC7WDjGXQXy96Pz92eWak+x&4HTA|Fjmbz1R zEi_IcmEPMSV@f;b;F#emsdcGVswzf~K;5_Y_~47*VH+Rr|o<@-h0k3{iZ{QG=B@?2v70BHNg7V&R0T=?hh8hRY2 zzuSb;e!tegF}1p0HU9vxN?E+}em_#9SCc1thNVs6D!q4~#8vuDe&%9Zbp{XzJ|Z%P zTl=km)(Kjw(?Z{wYb`e2%w3Jjf%85)!o)dAWCKSW^BSSpIj99HyS`;W?}?yH&L5n^ zbyPZC>6>lb1;Hp4Q*&~#5pm0?p0e{D9YCl0=K&Bg_=ZsnV(^UE*E^PR3BJBk@j(b6 z%}TeohKvk{s`KC82umIOUQrk+(n(!<|LJ`bV|F^mK45c+@a({!^F_ zF?pXvQ>ABjD4=}Hn^}VK%IY92(DLdq1}fhCjuTK(b*O|YQ-tm-Ec=26(xCuYc-%cm ztZ&OR5lOv&Z4%8tKl5Mej5^lq{4pf2KbZAZ6)UBxE9Hwtl*J-!_??e;_Xl<1r zJ4CI%Qor0ODBQgTLgNAtHLKn!yH%`rFEP(;{{Y!Zhnz}FU=dxJi$O;6#^H%gAAu0O zis}<;XG6?ezc-=*ve)h+4W@vVEMMdC28S8Nu};RJA)K#HK0j>Erv9oeC9DD_jsWgNOGln}seBg`;?tU8UKj;yQTd zf+hn;INT-6IF`AiMIwC=6;s*+hYZNY*HVd}H8vMzSn(;J0fZr$TJ!$^W-CAuMOr0d z2QTl*GGu33!~XyxzKZ^0QAy5ujny2*`#X`&t*l~1gVo*t0IEKzlg@AA1Qu*QJHKQV z1(bY~0NUNl^UB?G5>0e~`-l^6r3qTghS8U((wOz!%^GK!WK+z^8x8rC1ZTK7JWRR9 z-ld4*JrSCyAxg$!a)t88ZE;zZu9}Rj!4#WiB4pNBwapHE^)}DH`EWcmwi?}+%uEwV z*Tvts!g1IAmNKsa6*Yc;+m08=J|YIj!6GqrXb_~dst%>(&&;vg;9vPFp+7K9Kh&gz z6@ZJj27K-1aRt5fUhw? z1}7IwispP{f~qVRHE&h=gpqDv9LGh^a)E0B_WOs&0d;ue%vw3isySgQzj9->ql0e~ z7snE$a-AI!GOyaj{{S;p+LO%?Y4PFf{LFVzy6duFg0(IRvbPAbW?n$h?szR~B^0ir zcGrki9cE;ks9ca*7cQ_hxR9&XRUJG6&IIJI-iYvaL=9g)0p&=T3)Yom+ zBUto3!(`jbUZz0I$y;WJpJOW*Z$^K32_iA<}1Sxh#&}g1VHk#mtm)4ljP^)P^*wEJWD{eT4K4< z;yq^T;FaRDxm(I3?hV3+t+@XHd5*U`9u9p!HD(3N{{fT&4e8Aw+B^1ua7#0v);br!*K(kr9D>QNU_EU7?N+LXn%d19Rs#_Hiz2!vMwyxd@{6h(E! zz+cJ>8|zmQgA4HhR;PA%7Q>X}w*LV3rID$ASA_Eov^-UxOP_ztcAdTYHG~hab(bG@`Y^GcL#e4>j@tMLK0-^?|rE-W}12AVl zX!SwOHui?_2Xj5~EO?9phP?TOek+1&09@F9;hZ-)x?tC3 zgi|eIrUDPjEKG3m1qTsS3ML?H@e1u&#W*8t3lUAMvE=mzTb1fEQIOmu1+iW|y+brz zYWak{{Ux*9G39( z;LCU;43`4_PUvlb|QpMpBAn5_E+jxPK^A+%-G6_Koanp$OFsx9=pi+od zFUc*ocySoy5D3?vrDKes=+1TxMv%3A?pGN8(Nz_@KQfrLsJll%<=n-3jwshL9Mzri z5K-4h{GGAoIz(y&sfw2^pD;R=%KdG-h8ZO*5##7*`ls45;+|(bkPsm8;wd=prIoRm zSPCn)AX!HcMLY^4xbrdb954YdhGB|_F}l<4^$pXOK;8NxHYZevhg!lO+# zxgH^Ko&o+}<~&Zuy*-~fk7N4Xe=*SBMRtGLZ;KwKhZb(8(p7Lkr1-}f&Hg2kh!qhL zdzH(8MQQAu&0&Rxj^GMzQN2Y3TH;>u{{Ut?X4!o(ny#QN`ExK@VG876j3*e%3quyM zG`zU{N1zxmTsLpaDN6Cr^%U6h?izlcV#7#v~O;*qlq%l{xbRLvt-HJhurBOuw{$Y>nyl9Sz(n`ke!rtO7qhL3Tq- zEl0^)jPUfrexY-70Pv%DiDBZWAvklJfEK5u#zj%|f3qE#z^5VK+A|=Dk$*manO+*! zx&~@lV56T_Q~9P|^>4uW<{yHvJt7Bj{LP`eb<7gIe-J7Q{mwFTaczX~g>uhxA8v*M zvX${Du_3P$EiKQ-amaJrS8xv2v5qDfYnS*%Y*_$=KzqN!rK%TK++~9MGcSM?yxl#x z)ahK_y$&HQ@5~^hX8VHLkBU#3=H=pf`VhYUnC?*KJuNK@Sx;~?Q862XZB1q~#MWx& zI*hpZIpqn(G);RW0qx=|3kM;Emx+#M-Ogy23N17|#?3ze0RBP%-8%crQQDYuUfO$TD5EpIUDA5Vxna9U*UQ8?T1$NU5xC4yg7l()V`G=*MziV}I zEUN|%aLilOXP;%2kkofJvg<;kv+2=+v$!<8z0IT^ID*|yFKls6X^qB7`#P2vnU>0k zG6gUtkOCH)^9s4npcdnDANdF+Tbk6&TelBA%@h=PC1Pflr^M6J3t=(mh{t3z6n8nE zYJAKQTEuSh%zZv(=WysEbjt4&nwY-g6=uIv%zlguKe+z@>~!0f1Pu|YV6EyAY$ACJmtO=-R-na;S4k(C~^ zXY(D*2htL90CgWgV~Lnmcp&g|5!O<^5FuKoJhLU%5Xy-<6--FhK{^1?g)bN%*QXeX5fr|P}B@D)>Zla%vJq2FT~8zh8mlS z8K}8V)V{u(f2r>VAH)P)b^-mt;R-`P5ymeP$(xH!qwXVVaOkBqcjg`~)(#aWe(?IE zD^|fcbvc^1b5VVgm%t2scLxO94X6MLk>DfGc$p-3al+KPjeAV62D-1_HcrkwMWa|p zyz@C$dXy;aa?_>y^bha`S{#st||MYt2+a!bX&`6KMT2Ho5J=# z)Z$5Emgg+4k$+@fA;H&wnMU3Ips}pprPmzu5>9F15-zR*xTwpkf8i=HIj{ESJlM1{ zxYTQ+U5c5^w0{v~Alak=krx97Gt4NPy{9ndw6eeWm9_yZY&%Rs@^D8@O&~Y%9}j_S zBSZi+nq%&K&xkqrn7M3+B*;vxAO*Q%wsQ$Bmv~=q67G*~Sh*Y?BG7PL6tshEZ_LVx zpAyxujT*0*CI*N%al+!`0{0wdf$HTesY{XPW5&zN5xP%-E#MDa%($6v?HM&7E76QY zdYfJdP-Y8HMP2OC3Lo1&x?VhGKg+97g%22S%a}H zV8KMnIe>26&C=0E_=8K3o`VnSUOt)M{3DPyIk+X?$?i2~yrrcPP!9g_$C2eM0P>W9 z%|OjvZWz(vi><-C-eG3AJVPxA7lyfZ!aQ|wb9G^lea!nOG4Pq;UE$cPr(PhmFG0tt zeLyB|Hf$UI(QP5dMeqJf1Gv^oT6Ki}z1iS8K+>;tPx9(I`63h+& z7P0YA;}!c7t-R|x@h(?8y{{UyYj{5fj zl-yj`WHjwDjv$fb4e!TM7&VzGTy13yGVV1`!LPJVrM5Y(lAaL<)UCKx>C6(uUdP%X z0MV~e&0Mp{yaZrmWo_kql>w|`CYZcMvl%(ITw;$iPo2~vsk2eUy1C+8Rb>VZ!PWXe z1hu(m%Perv-=1LN4E|vTm8r-6OLv1_qg&M=CbD7c*K;|NjKAF4vsGpv`3*kGst3R! zv8N2PJWXa?UXsHRaXukAppxM0`G3hmnhi{pgYz}dV2#npU`GY(g|B=^zZ*XcS^VJ{ z!L??gnN^dPVvV<1h*RdvHjq*V9`0xEgNuk=ak5|`T`7>| z{{WK(n0uIL$fA^(A+w}(j_xUsGS$%Zg)Ckd_LQIm)BK(^{pSHDNx1C5HZMkI1bjC! z1=m`cwfK~;L?3bQY;?&+;#%_&grdCEqEvFi?S&Bq%5G+uA_{N&Ww|~sV{Qx!g3_j* zh-3~o)Zf|H2ew*sn(#lkTU&U5gi?E!0*mfBDOZe+cq4}cyRUIeN<*Y(@e3LrClNk| zQxLaxm@op_y$MDC0KR3_9WGo~eO6llys+DWG;iN1j#{hSzF3v0*i1t5z0=hYU!64WI|`&=!}Vi_LZ z{_}O zrI@~I1L1nc;mCZn#b{B+C6kW$oM~2gjyd}<%oCZ3cSC(krE*y2qLh~ID{D{yw*wc3 zc;$`QE)c3KpW+l%Mm`?@0J!o+N$|~^1rcU$qD%<4Dixv-YW<=sv)O>W^D1!{TwbD3 z=o>4EUQ?cD*`_JNzz>xfjifFY`I(@|un(NMDjJI{zqA9qvF;Rq5C&^$Og%C8gh(#@ zOUU#i=D-&y<`5~&MzlT0R3+?AO5p98Hye3o88+C26r&cf*w%d4bDrr8E@^IEx$EtdJtzdYH83cVBEofzoqV1xvR#h~KVF?l_kCsL;C{#0tE4 zV>u|eVO4AVLMU%QZZ$hC7b<~jtAXYM*oTN9U*MLr0=P*Ea#OT5RX5^W zV%)|{Wp>Jn3BlCuTuvi#T|UsYTEEQ5tOdXtV(uletM?Wb^ZJh#=ft-~Ige#y$*7|z zS;ppY%H2XN0@7Bxl|XD^V_>u!PUwEtW2*CARK=^XDd(6*U%W~}$|TXfK_C^wDUQ*W zXf*M1;}eS#`7p8Q?kY^!^22}uTzqfnP48qrJbSf zRT;4BnTUC5%oq%)$j!L8Bnjqg(lWb(oeD&yuComP0FHj26U-tS%*A;J?+hOh&QO?J zjup(M*_({F?PE4y5QYkuW|)P=#4$U5fD?+t*wk@bDxwPXx$4mMAP4Z3Yg_j=JZf_A zVHN>O?kkV%!@+wVh*46-oIz@u_ZM&nU%61pmeP1;(5V?NIebH!*;sD~_=Acp)k16J zasL1#hN;The_xatrm#*^!TXhpHx6J>v!|2!J;N@he(}M;n{J|9OvSZX%(Ljht@kW) zgOcs}luSTTvl7!aM{@I*K_3VXZKx2kt7<;b02hizV}_1%m{Gn~##05^a_NW4YnZh- zfT)!-01x1c@)6e<^FB|Q(f1x;Slus%=ir~Y>M$XsnXEU7OI{H2-RPXKq__5i8p<{d zp~SxHxwMZtmGenrrlDr$Q|sXD+6x6zqEfra{ z`$GEyx8I}fP^uk*@!5XzOQvnlgy#?5Hq7oGNo(B2##MQnEVaxmrLXN4S=wP%QMe1> zl(JNA1!W6bs67G*ZV?}VAhQpD#0g=p30xf=WsS6Ari0GmjQ!G=ajpo8vRrN;ZkP&H zztfPF3$BvvtSky3`=0MH^S-smm{OKNVgCRakR6{hc=Qmfq6zUcbo5mC*qcm%reLXV zsg)}rw6_&-^2@IDPd;FPhnVuphQTf=lxa}{iMsyh@dSbY0I8d%-AsI}!!=_kJP>P%mGYF>_IhSh%>EK%UhW(Mjf^ z*=1TwFT$q&XF|puc$s%z;fren+**K?x`=S6(at7biOn*x3n0v^Sb2a-DS@hw-9v>( zwB+2f)lm*U(ZIO88156PkpQRAfPgq!O*JeDGyu=IltVnAeXiq)qwaG501!B@VG6k( zkb(G2{X;s`)Du$A3LAiuihs<*dNGJI*weR(R9c&G{{YEnksAIcX0cIQ;%6$FP1rQl zV(NnMR@`ys2$wsG;kw_;AFtfDYN|fc^$pt*4Zp@45i(Vrz&@FX$Mq{YCK`RkOx5uUzv5~k6mA7tyz?EX zYWU(1=%@>cgNRN|O9++Jv2k8zN*vs>n~$2ju}M|~oXp@MoS^_0uXmLSgg_gKRbQB+ z7^Yd8jklOR50|NuLj}OZbPTiIFN&gMOD`)afHj4RDkC%bAuXcy71V@QjHe{@=h1y2=6|<2)aLk< z^QqVKFB^{On0!ufLI!0S#HTTV^*Jn+d`1@8Y|ezFL+A?TULx^xwZQsJz4kyNvDp=v z3ltE@kl3F*GbjL#SUsqz6x^ zsBj*QAMWNNLvIbF=0jDRhE`EvZrvo9LCcjj|syppk} zbAYx{u31ZX^@v|c@wN$;1vQMsQ<%i0QX6V1s|Pa2zllxra1~nCTH+R{%mIgnQFV1F z%)<)IH-Cx0_)5&N;w@CI%l9eb$HYR)YqY6o^g{3+XE065j`TWqxT6Y9^)(ms8$C9f*2}qGdG{6-S)Zup}e)HUN1oQu)A$8alj^v1fNihjr`h9PCdtldBux{J&z$SxTI2RV%3 z+@Rhd?f(GW%~q6_RcaW|T*05_W}s*;ZUq59s4;YO8z_)av%L90MMB zcp=dP`ipk~L6wJmP{u8~dYI&7`g)5GyN;YS6~|C~;$Kk~xSB&;!7FresL{~U z%`k-u*;XqChgY$6H)$hT91p|`OV;Q9lSJ_v8^YrGdWxYbD7=kl@dT~LDB2!{`+(kH zLbRz)2FS0r@ibo#BgIALfHs>^%JuK%& zh+54CYoCUfS14mjmW=tHBW7F56h0wicM20{AGy+4g2>h*-6rNJOk7l95NgAP48bs? z#UI2(JPb^Cyu-%3V;ecDg=Au^%*Y-_V%~)m#xbYNTWG?~!M27x?${XA+b~ymF#w}e zGZM&IJ1RC1N()7`gGpPGx+URzpAq*l9wXviN*&dHVLC>0fbI@c9SM-252yT$MhA9z;!_sb z;MwQIz0;UQS^=!{9YG;;lXA#!L^1l7TF^(fU>CY$^Bob4WlHtx7O24;=OM?;%0(2z z`IV|D;@MTon_AQg2aKzkgwefm7P8|qf+Z#Z)T>yIdYgmhBIM>#d6;>kEGYYca|(b; z_=+GX>!_$n>CK$S-B}&Yu@cT&@z6HAblzY95Dh7z>I77+ZGzd!#2U~54J#(wrLG%| zm|PU65m`EpW~ntQndWb)P$uPucabtd8ZPDil9XZ@8;yaK>+bx@kHyL-_V_Kr((5^4 z@n&tCHn^+TaNS1in5{RLaTc1J9L+S$cnH`Pt6taZiJC4vR!Eya64i-El1)(^@c#fZ z!sPLf;xLHncta0Nz90z#*5Iz?4FaoZg=ZU2U&?J-!pADq3i;uUv3n*(_YDM4tB}0h zOejXUrN?^W1cnomV^;A%#3^O90?OTO<{-6LoJDd_@@bdqisMmPVmwB9R#e`10eZ(! z70&e?RUX+;*ZhHvOw~ZhK`QPo)~G-y?-rLFHCW(E0$Rg{{Xe_3KsH@Y7J4c_A6D+3xitxM7sS)3>A4i^7K@^ z9S*LSTtk-@*idFC3i*%(u?pGZlXA5CRsi~g8w?qk+tgO>0W~PZa8^{+z;SZViCmG9 zcaoW&LZ)Mee3VYkX4*p+%wwI)9^zP~e$Z>E31N`hzR?JtD!pYZ%tLGBPJ>+E)C~!*=@W<+yPZP9eyT^)Uw-sK_DJ8Gi8g+TC?_oSPBjD z%PV!%HFz{4i;PM&D~U}`VFksrVzo+za~-2_ZqbwyzGBp7z6M?pnP8k8KDv!+LS$b} zRxqSMRGrn+M0>0R8_se#&?W5i?{z6z(wy6HomxD%GVF zXX?SyTSA{Csy4Oz8~Z}+nnT{@fPd;-cX24Ra#;~UD19aZE~&B{7DB}gM*{_Ma+2W? z>^AWo;y1PwBdKv18zUlm;w~$Wpt8SEKXNYzS?6Q2-pd5H(6C8(a;hpG4MB)NIHbyF*H9|#1|IDi^V z^KPdj>3dHQR$R>cJ=4`(V_?+ryRW?KLPdhg+7kC^5R>cbKi&I$_a2$s|2H$ zQ3m-(>JkqYD{y9CO!$eclE@OmG<9(3+eog2(=8$}ec(KYkBDmB9++NS1qg8NTo82~ zbBSK<%HK>qexn{a(nhUvRcjm-sc$aB{iEd2G})<@w=Qn;7$$Aaa>Lf;u#`4`sjg;V z()xiZQE_opECyLMsi-I zBdEqrbugZ0*@frErG#m#@f>W_GlScs@5Hg~xlAxk_wF(^KF(kQd^_%7FI6^7D;|h! zy&nOpqRtanw=p;w&qO(Q)qld0z5-Rb|s3&%X+{Z9O4_UxEZ|q?q10h0Ap5oxkNE-Xy87} znQv8Pcs^rBtR;F`TgB3ag=OLqiA1XW%0!p1nb?Ho44aD?^#;*o+o~W~nV=D&iFs}% zcQ}lXLxiKo9UfxlvjwnVSgf^uMx6bP4~D(VIBh@&NWYnA?iWwIwLyp;V{*b&Ec)UZ zr_XRI(;Y!5=NS9Mgk!Ps7?qYbXUxYX8{~9)@iQ~7U@{q;EqInRct zzbYEl(GQY{AX=K*vA>wv(NkcaO&=1!CTnF4eb>?^&Z4W zCKoD1G#;n7AM*Un(i%|lamO=W!#0wGF#G#Yl2OXc7u3Rx&zDnR zmjqzxgSSk;{{XdV>@r4X5J);Z*WNWWA?sqsOK*p{gJ|PeU`I_d#%Z_&AnxMY+SRWV zaiHLB#O@%R_-!)GspYE8ak!%-4KbD5zm!xHu@hrTv77>-e9kC1^^#gC3 zBA7Nq7X&a_WV-(V45yZC1J5<6RPJG;!vrSql~7~aT*!Pxmx_9pInTLcC+1qPQ8v#c zzwky7%2g?~GeX>uRTD~zwkr9Q zS?q>2Qx!|GEXwHA&$HZfFnKHfA(;E4v{IlrB`TQSgYG7=1#3Q~5ao%j$B7lXmc};+ z!G;1bEen|x$L=QB+5%l!gMT#!D&XelgyX1u@oROn&^Y@rZ0b05tGJO^{ z*OcZ3FNNFV$XY4%I*7q=sG_PPUb>;8AsDlnAu(v$dcE!LTz?L z8vxilgF$2r_7j9*o9gU2?sAha5!JH-n-&$xmSj7#Z^S}#bB)cZj(qrrsLTtc$~tcn zkz1r4LCn17V)DU=8>pDvMQ2}`X=!HVm8q<+B(Cf2D;D*LXO{V%SL}oCndX-b#XFQE zw6jdavx#DbM?R4La-uD1Hj6a?hFVOmaKrnUFg`3V5fTg_&NPMDbzcJ$$JER5m>5R6 zQw654S(gBT{{RjpSipB}6X%G_9?}b7RZ^<2F{05lva)xi5dre3UL5h5m}@Qz-W#YW zR6+|Xt$l}NSuYZayK|+q`Ii8h-~oZh<4_237%hGxsTG8+({8w9lgvuG#Gut&leN=?eh!t2!C#)HLtqi$z!x|m^Xm#f6q?{K=y z9ct$6;%{J@I*p-eikSZZa~-3n~Gp>i@~^t=2u7i@f57+3T2PG5>hM`p;y6cnPv&A2S<%r@h#v73h+4#AoW!X z8&hXSqZLp|SKVKDpMrC-a8!$miI(PfgusO=neiLyWtV2+g#nq8{FC+SQn=B~CsC5w&DZ7y!=c(z zR%S zCo_#t4<05}IPME7m}M_j?k9*f--)7IRTA|Tb`f=LOu+6La8OTCA?9;eP)`YCIiUbv z%9fNaR*T0Y`;SztWsd2pjtW_VqeF)e5~I8c870b@8gr~X@hG7!6EX>+zqB`F zR7V~*sNFFOF#~aVMBu(L_=Ye9>!roQgfm*F=miz2XBRzO=efDUad#b&T_!qp28nYQ z4>2rA#HmLlc8Yus{++`~%K0#vph=5ms!FEn=ANNN0O>C^P-5{?n@Z0UXXv-BeJs0! z9$J^SGB9QmVhJ42nZ(a?Nex_;Qm|!ddxk4rvXIj+${80tO}Q!^Ru>b8xLnOaFZ+&U z;yIJ#o`pLSjBz?xdz6gu%rS8rb%gl5%%IKcTQP`iu!$MzmzwjD_aH<xdH zpfZXYu+gB#j?8YDkxNqA_%|yR_C-{mG2>DCARP;oF<_6AsG1dJEfXUW`InEYwec}z zd|~_#;buauTRkt&<{DT;TxXAoTtGt2O8~P>#8t3DAS3SkW3Qdgb2+cB7^@u2)q0G1 zgSADHXQ=-G`u>vuR6RP1TP=T>;ma`3`VdOjx#&YF=?9V{Y;x>_BxOdH+t-=lQN>;p zQ=Qt(Q0k1V;n`HzDy@gZ%?vR7)EtGKjx7!U<__(JT_G3Kk7tsHLX$SBQH&jfXd zdtDcX{K_0~>TWghE>ox~L9$iC-AhV-BB#l(6B*(G9O`P{DK7E#F}VZ$lvt3$s$j7zew@vEoNiR(#;3XHn3t@7*;%y2sk=d}IghDGD9%xeuckh} zWm{^oUBa59Zap<}3GQ|b#KqfNw6X}{?heZf$|F&sd*{6)s9`UqSa$mU(j&v07a zAmMmo;5^LRjf+y354b4Qc#Ug-!ooreC&7Q;iGN_AKpHyciGINC{&;-G+L9LmUj=%y zHU@?K5M`r5>S8VnQyYm!273A(sQNpW#~(~qPpu2gU_vyOR0x7}YSpKRRKz!yZF3gC zsN{2Utb*#^;sH6-s8-@Dd_~6KOz4e5nC2)@6IkvzY5F^|b2+)=0w~TQn4y*!JQhu= z4V5{MR)_8d0<=yUcbTZdmP;U-S>x2!ncOrk zA|F@{jA-7fv(zEnU=C*1OkCnO4gCO1Zt)k91$?Cb_>DtO+p}xQ{{UvQFy=Hn+)zTQ z<~E5&2b8Xz%b4zbOXgbPubG(pjHSUA*VM&NiNpj9W?Q&Yk;q5Tij-vB^31&^8aC=+ z>OP|~*;8=@ahZH$71I%EJt38M3?3h2l0IC)nI?g3NwbMyY#dLAPfzsKy^dhUe7JWB zNNwaFkeMl}%NcvnH4ap@fuowc?{Qyfg{^rWl&ITzKeI>A@hPCI@fSJ25uc2^EC8wa znJ4L%=XVW2^BJDu?qr3SMMVV&(ln+Yq_SY;v0m)R$wb};#egC zaPW*5Gi8fN+U{m*d{3BS5HW;nECB%8G{NhK)9iR*ltYs@I~Zq$N5BaZ2&<^g9UNM4>H&bx^Wf2t0b z(~Oe1gyuM(GXwD=>%B|>yO@}vGmV@^yys99AU@bp<}0b0+E82(+$E9+io+Igu8{p{ zm`DbcD{!lWw@c=^n5x`s#3ZOY8l6K!W>IyP*?;WEX{>!2#LVMyy-c_a!W+a`shO)M z#3IJbux0s|8CihbO3e9)%>zfS5m9Zk%t{t~Oz!4(Km|aLSkLxnsc_rO$+h74iC}II zQk82=EY5Q`CpOIPqDC{Ddd#kt7qEQ8E&7{qzr6Fyn{1DkW3C~pGs8Aq%p=NCo$Z~V zTPP!^VU?Sh!up5A>p<`)P`O6!mR`~AzT*dz)UEIq+nS!E)kfNA{q_MH&~69e(E!pPmM!8f}!k3uZ>{PiP+EL9@&A#W-da%5HGoZ;$Adl zte5tQu-(8ZmMIi=N+3Z;l{30TQaJu#k##esV~`_;pqF(VvZb|9YaC23Q^M-Cy#g57;q)Tyb&U!5`3 z)b%*FCXBRsnS^RE*V~w;W}HMS!6_9R`Y-vb5Xf<%%Mzw{e)yM%^)J{5x|X8B=H+`W zOmM*aZEU0(J+jyVj`bN8me}OBqWZ z&rtMY7%gfjIhq+mZ`>3Ss52QYS${J*b8&mx<}`_xeycpoiJNik;!>(pKoMPaRooX? zqo~lbc$k=H%-&>K)x~VgbxoSYDh<9x&ccB^1X~ zIwb&bMHXc*buAUQDLDE}>EGQHK*I&rriv2AOvia4#gVh)~?cxqKqPT%iaQ z7cv8#JxuP*&HOhwN)MZfaaw~fc=(CF%ko9p31O>P)&R+@`go!yV*x)fuIv%!U3!R`F+T6&i-ZyKSd@Q#06WPigR(w!Y0wFp}?|K z`;M-l2I6D)l%h3RBeB4P=J>b{w&nTp)X?;OlRmAjNG3(Z4t zBUz1#i;t-TY^$`fPU2WmDPQVZ-apLCRQiEaYRE)3p>5iUx$1b*eIu3%c#$IM`s%a{x(r&UVKrqJA?UI2b0qU12brv45@&o)YG<;}vWBRJf|#OQ$ypE1DacW^qe z6MVkn#4Z#KQq&;?UM={P5NQ0u{{Zm?C4p{WB~1*f*M?&QY#(qy*Q`udMf@riuwN{- zH~K`tES3Y=9`db9=)PD)SfKcd@zl!2*$j+k4{X;@B-Q@_?Fz4;9DI`($tXC&Tt9Xt zBMjzaZeMd-p5kTHr5zSi zw_msbou-J~zb0WSS4Re7P;|f+b8IKHd4T;F0>C+DJ_6qkzcE=TJygvP_%+;IuPDG< z`XhWD6kYp2+`u-&8t^~dqD8;zQFdXRbbF5+Va_GAZeXTBn2ci@Vl9-#fR*sFw+sR4 z61bH))EjCK;VMRC)eu|e1&pI;*85^)W6gaS);T9*QGz?TU>AcjxGu}U+XmImUWfk7 z)W;SNwsslqHraI-6qtD8IM>QjR0`bjd+HanULex&*KwK!*-QmdxK1fR@{uxD=7zHi ztC;En1@3S(VslYLn)(3CP>mRz?Qs{MGRa}GSO(&%@R*BM%{}^#!Hc#vm{2Xo<{vcQ zQ3wzVd8aVppR7t6$GFJy>LNZMYu|`E`lsK?FwEUdZ*vI@k5em5xlKwZnL@Br7b+z1 zHy(%Kf)N=*Ouv-UbM!D$AVix?9Lq}-%ytr`xsP+0XB9aacE)nOB*OCvk{!hXdE!?r ztfjB)iVnBkQ`UC~7Hi1%nhV6ih$YQ3`hu5-=U+R6Q|4T2qp=}@CT7^(G`~l=K!bs- z`IQ2_o;;Ai6goL@5FDbxLH_`o=519Pw|4=p{WZO2;@V??GRo5b0BKlG=1UJ#EahTz zVx}roxJn#DaIgfuOvFU^@fN|B>{4G4w}Z#6+!##Nr3hx3g67}Al&k>PD75(MFAT^G z$}qH@oWXLitBn;4$QJs63KoYw{Vz+pOtGd~iI{ft88|&bd@-AusQ&<)V`w!9d8t-! zT~iZzM3qgE4!6W_)hYp#7Y4p&<3NpXH^Wlez{9C?ET6QX1^!yGdi>`+!#D1d-9MRY zxC}R++xw<^eIzmUI%8V=A`H`l}5;1^ajK4w*3-zYC< z#LsbJQ>nW6m|*FheRm)C6&`gQlzV?f0a-N_4a@#SDj_Q1D`$lN0AKMr%sIG~ZVPK$ z>J$Q4a%wjPe zOQmZBFxbm6d<%2#qR>I*wc#yH(o^yO03rw?3bNouP{J><^4RE;2u@n!W2x=~GQ%zc z1M?k?UJ-(unwM$R60yW?2JY28IxC2o!F#HnK6-_f)AE527$&tynV8K<- zRX=jR(v(|J@h^A+CdA+I14uLT0a2yyASo{%nZ_S5MLIZ^MGx+9KN6HTm@{GG1Cb9i zIG4hpJF|W1Q)!fWg{A%HF=C=3C537ViJoHIC1yL7v96JXbi*yN8&>0QiKx{&tdB79 zwT809D^clj*3h4I3UuaPt;Dq@awgHJLy1Mew#0;2;JJSIK!DgMRDp}^5zIHFmZ^9& zU|3t~QFr+ZW#m4Vmr$x9Sv!XpWNca}iWxW=%|Lp>6nya3Jh;QkMp>aCnrrQox=O z09_xVQ&r`dU+j&3B3-n+ku%^%0Wdh3=y{4r@x_v=2(P&iD*pgVDK5jx%Bh8wGarYh z7}}TN03J#{CdJ{2Roz_3W((RlFhc5he$mw5xo&J_%*3>gmXRIYsH}#{h9C-Juz%dO z*c{&A3_!G_+@QV7o3sPl)KzRl0eXOVR%Ns*Hw1uOUgu|g%x_ZRycmK|``He9h>U6*kxAas9*W{{Sj2hTvdXFQHMUGJF2!4VObR8O%bu->BvmDWI4m zdKq+(Gh{oBY%_*tls(E`8(8muY2h+U*)MR(Yo$TI2%>6+4ts*Qi*u$37f&UVr~bz$ z7sCNg@qYEmT|pW?`ChlJr5hLpjzDpfl73UC|RxnEwC~%1Gnzv!DAAV2*!rG2mt2 z{7u^=)h1&i!W@X=ri*w2IrYiM;@Y6E{(;_y~PE^d6bs1V-V&+;p|~FNn*e`Nntwi2<~KA9>y;=s(pmcV?Nfwzo4@b(wXGg#q!h zJ1hB=QJiX7V>(PuX2CXDsdT(eYEuYKErpV+giMG5x}aJwao5lv^dbHXU&+L++Z|nr zWpKV8V&78-489qJ5)YvFFDnpLnQ(6MU%1|H5733evi^g}{6QZJ&)xtk^_ZXL5p$T< z5UfeMisNykAN4Va0Q~f@lJ`HaGSy>ArcgR`c=AkJUde*Ev>LohHuEYwvsNo?l~K>> zD;4K|5!5FMa>@#gm{QzvIWo0YkRFr!AT8evO=HQnC~1aH+K(dHunZxAy1@9%!BEwo zm{b|TpNIw08LduLpFP~J7i{NH!JM%I<(hp|u`tH35p8G~mNuRs_~sg-Vb60R%*DZG z;;QvIYkQST?ZXy{KpzBi?qv;y9CaQ)Qjyu@sN-3@J*EsF9zNGF8hKCV7hpV~%4%22 zHpK9;RdpL?W?}BR^9{?bGQsNp-%3K*(`!&FTN(KHARRHw@_%sZ=-hVUhf=D<&Edp+ zF#)T_)><>%HluHzmfpsM_rKn3X1J&WI7PC zr!H{|&c0E~={Pu5n3kfNscKK?%|iw=F!AvmwRx9{&5oWw-eRnb5;0=4=AuQYJbqw3 z?QoDWYh3g&(5&V3%FGR_2Aizi@ffIciHwH{Fk=K$eZtrm&GFkA>WhM3LQt<2& z{gDtCtAN_PL&nRixqtwUhU;`UuHf`9re$R-4LS83azl&ph=sqr8;4}Z@f6)a<%WP! zhL61d;}$_*7(dtQT>*SO2BN0~k&Y+lQ<#Hek?dH!cBkGK9$iaoBt(oF^2-v6cno-! zP#6nfr_M`?b5G3pX~j)GWtl3y%%9i93X6a(;x8mm^vrZ0??frQ%BX1h8$1tjp)=ZCgEnIE4hfM?W(SC} z#*J|51OXM5hB}LhpQURM#%453-Bm+qb+(>y5sEE+R%tx=h(l7=vN4kD$T827k97+(YZkOUc3dqHeLx=CEY%>PO zgSmiNC)kI{!4J-{{{Vr5Q2~R5Rk((XFZ_$igfyHdasG<7bcO!7ej^nKeFRiA`I#EU zKoZ>Kjg9ta#K%Tv`Q;U9T*Q`M1?$wcu5u(i(h`BbGaM8&SqP4 z1o6B|Uy}zO=SfA|%P=Df!^@ed+w-p+Ze)mj<0S1 z0LGXE-a?+ipSC-h(ZQaAupTieiC5XFqQFBXqdOw_m{vldxGq4q;Vgo=NU99u_YS1} zV-z^!%+5M)wFgZPaa$otYM4q|QC!Du&kz-{RehF2GSC-mx&FcUmz%-k)Wha+<|S3; zS7PcA@O4qFD7%-LwxTR?DGa&zg50RXL;GWWRV}LRmaSCQW*N*VRc-+E3oV0Q2bot6 zV`B%ii9&(i5B-l+F9U{hzNSj6x&1G3fx!aJD((j^$3m6IYNqhjN0sP;0N_NEG3)!@exxM z)?uvuCvHjmU0*N6%*6Ajv-=6yD6)7+{ST&Ql^%?9_5!49PI6ai*)}0 zmDCM1LGbiUeJQO5_4tSlVh9l(U4G;2hY<+3fT(}Ltp5NK_gf8mnKBbd27E#1A3s1@ ztMLcI5$w6fB}+w2Pz3KTW7T>07trEdDhZZdU|7#=UV8T#_&AQ^;x&gSnUgA?S=^&4 zXdCza#>6j%SUk@TnKD{}BH~p+%n)vPoX9jjAf{3PVW#l|a+lr1%2MZDMU}0_p2GlF zQ4LNYtiH1|U0M1iu6D-(EgRD0lCe<992w?idsTaHD{ANP#cu#NIK7PCR$z8^3_EDpj2mnwHAkZ%hDFh7{Q}&c2p$aIY z>_JhYIkoV0AG|T*GTsQV9aX>x*adxE7yEJD^FGip8mcLr>Tz?#)UydwBFRv@V_7Tr5o(^l5{kh@RK=hjYC6>B zT@jXPrv>|AmvW6>=4$l!9hMs^$ITk~aTh9EFSm0B@7zP1fU0k&5EQyo;wwhpVYVf} zSRHxncw&-kP#aI~d1SZ8P?Bk^L^(s1gcoYrt(FH8z%pPw&5m;Th=|6;-Uw1TW?paZ z>-k`!y81Y+P*uDK%nRmS5%R|N)CYp4dPgYLW9~|(t}v^^{2_z`(5aU6^%0yL!B%~+ zd~+?GY_BPaYbs^L4In_7FPYPTaranLHT%pmuyvw1A2IQlxW8}-326TSiKvHxmb*tx zhg?NE<|k}Mgz$_qtBLIwHj0MKYngndo?t07l}Ga%xs(Wi(&qNXLznJmt>!K`B4E9f zOQ?sX5AFL#`(hla$BZRnhcz6+Q@-Nhswas-RbQrW)m~*NVO0If@q(_hYxfyjRf-}o z;H7Vxa6`2-3xX+v@fTQY7_=^Bzsntm88L5V<+!(l_V|HkT!-iDMMYf9mY--c_czbb zy3Xb;C&c+6^KY~l{wD5!6M*$F4aC$RQEoqLmKh-LGRE%Z+6m%5(+$+7kKrDBo-y1L z4?ZKje-Y|FrrVswO_^1;_+_6i$i6i8YG&d!)TS3R4Kzf}9Tzb!Mi3ejk*ioy=@qR) zw!=hmr?`?TlDMzT;%1h`yd3UWn@9HstUoe}%EE-)TjpRE>!KN8^)S4aqia+39eIdw z*~WO5cEa!c8Cy=`?lUkp`9P$gKT`K?m|!?2XgwkY3P!xms9Ma1IZnULy!wYM=2KNY zL)_Y+ZQ>^bImKcuIo!J6++x`Fb2QXTGFkBg;kjX^x+R+?EfUlB62*h!3zkxhx$sP& zlgSG>m8rm~ZjZ)u!2`+@07*i>v_b)!@Yh6+Ogv5wK1kd@ZWiWtQUu<3ERQKy2k8i^ zzVR;RqE)iI!y38TAWPSn*PZ!>a9Xp?p5=oU5P@TPLo!`maLN^KpA#lN^7k&HE*8{! zB?s>S#sJHyQrwRP&J#9K_lHa#(=!KdW@+J0SkM75Dcb)4P>t58I){6N6KW}LzB!wX zOv7wZXrivz9oSSr$YF=q74#2q^Iu4WrKj}-Q4y?H%-^@zlP1>(@eIBG36lHrw%}gC z1uXeUYr*XgFw2Jk=tz0Ga;An((ov0n+)! zXDiH8K>NxcVSHjQ8#!T!kS<3r@~0i%NrN9gCFSJ;6rf@(46k!Lgf<4Ff=)=ZmD`y4 zqh5F}odtCPZ85lJZv)}XCM}XaX{k+@b27KYea4aN9m)HPQhUmP9?)tvJI3B%@V^d` zI(`YVW-Q$vAdN9DYtbpoE6n(nh-VBA6K&N`KT5`-^Bz&lxNPcUbr3sB#w}3GpR~3n zU@YTsv7FI?Dk~EL74raEtS#*T4g8=MVG${(-edm&P!moH8MkU#7i%hBpr~Zu;!#XW z?om^lnCl;?ipS{=s0(6LZI)yc?Nqn@5HkXR<_muj(Nl$+msrE6WFcitu3~tOyD(YB za6n}^1O15Jn?jgMP*n=lt%z3IoI~?6RxpDoLQ5Bw7x|Rrl+Zr$^pi#|cp-gC z>Uqsd&D6+h5eDmD%mHkOl@s%oG2Flx;mQ5OQY)OX1hJN#v9qG_ckq=JcpyV$P_(6& z2chMFMY6ncGZMSZL0^Wdf_YM+Vm7dVCS8r;d6)VR*7VvTVsCJm-CU0)N4z=s*j z`Iz4%vJ00pF?B!Q<;(FZcR3~;+`F{CYFT=i@1CWG_4=I0;Hc6@y2Le=vLHwGF*+>7 z#op&M15&D$C~6aud`wn>RrW$7b@`Rapn7)(9_0zP%8wSSPTZ0HX~3NI;WHN(T}pn~ zn$2ntBBO+ATUvUEv2xzup<@c`8fA94l&hD|e8f}j^DT^=%h4qr#ZIPCI%6BlRPT>6 zoimRzs9ti5P9-1I0YauVJjYLoZP(^EU%>(7mEu+^w-F6~&?86=R5|(ePkDd{5-2FbKTr*6o)YEkkmCS9x1ytA`u_)-mdZ>S0l zVgO@%fS{Ow2A~P9W5j^MR-zq71)+GTuW>gT1y_bPg~e@_v5HN?0*o7gaDWX;afS%~ zks`!8A_W8lp+TF8QJ>T^G|C|b6ZHTX;FNU|i*ENn5>ZhB)G{)#3o|wIoIS^f5v0?I z;mT2?QQRUt*7;EK#B#^v*$H$; z3MNR(T@M`4)R$&BxiWK5RJ#(C*rKto>|AokD!X{!DJnxjEYsD`ZJZ*=|mZa8N{~WXLAO>yq~vqqP&s;Tzf>W> z5^^@EqC`~-l1|>#Mk*?o?a2i=(>APKjk&uqLvuPN)YTuxB;~n@7&~u7hlRItVv1c7 zmxMkDWB&jqX3MowBL^lZs3E&#Vs<3t_M#Z04!>3Vb7S>7?Fn1ji2PL}CQ3)++ijWp z5+uwE;b)NzjH)9K@{yN1TttR9K3PgAZ*ZaI=-$<5a3#wdQ5@{u5#&YL(aicI2;)}C<&^kFJRVr2pt%#hS@{m5 zqGT^^vRODFlYE;}L(Lp&yoxSQbcy7lJ7GreTih*_R^e9(XZhu348Qd{&Wz zlOYYJPK-+BV-nG^jTFU=v10ocIHI&}hbGA5^2Hh$%Qp%}PKGjt7E`(-x~Rwg++2q2 z#|q_=$wPiw2)QyaQADIZVq#Q}a%Vu#p}<)bXIk3}I!c+=#TDQdS=DFS~21B%1D&&gidwBF)t^b7MU2wuH=W3`V?CfXh@;Ovm^fi;Gf5H6S1<# zt%;UWmuI69B)S-jB)*Ap*({zB1#ZZdOIbP_y&nURDZ!{v0An=&BjhlaoZbYWxTB@ zYedMgyE+)UB|WA&Zsv>)BC`7WQ*#@5@WtXRdFM+#bdP}jCZ78zzZ&p1Mkl%OL4oyB{dN zMam?F*#*XuR!_YanLn4Ye#*0G(8(e%S>#bw5PW0 zi@O=dt#j|3?}SDxu|5mcqZ|Eh1dx{^l9O%8Wnna~3iBOTzMI4=rhx;Uo zrbLdLkiJgF$Igp^qWzgCMeb)rRg^J4biPPF3K#2=BtTkiLRF>epM!3%qat=L1e;`4 zBhHVZJu0~UtZ0abry5qR*S8>*k&S8R-Mi#3*)j}{jT~vuvi+G61bG&ni&t!McVt@q znFw|v@NPFUT_?P5T_Dx$Buiv-I6Sey0MRIVv9IT;Giq$SXvU~}7EbCY7VkP{z z6#m5T^vFty&M5U&3n-?Tgg(XC_(G1Xmsqt=ommMoO%6x+EHjiOkZSE528qY|Z~ zmAx4$UkHpVM-R(H3Kxk}}Q9f)8&ZTbcbLC|r#j#TO}C8=+=LtrOLU z+3H8^^&)z)Jy@Qs4^}6rhbS{@zQkP$Xl}&I_U4sGSh{0Te2aoGvP$?P8bXZ}`Vy@g z(p{TmI7rzuWX-cb+&*W_`InI0G;f%)OpoMbLj08bM1D(jOJrGhrO?@x*|mv%m3gK8WrqS({(q@vkFjr1%| z#T1JDPqOvnUJeRI)NMx8ZI98iKSIS1p+zpelsXhqu^yPQp?=oOHx^mAvdzsK*yL_E zGkYQYecKiP0KudG!~iW300II51OWpC0s;a900000009CK0}v7+F(5EOQ3MkrGC)FM zaU(NBfwBME00;pC0RcY%y=cD$$zBU2mq*;b(RkmnvL7bThB!;$raSUl-n|qgM<2T` z2yML^5c%;+wMxh1X67uC`99+}FM{Ay4YBz)N95ZdlVbTcFO%)BlVbTcrS2&5T8{(D z{f8#RhN!;<$t@Ba(IcX~YtZPuY_iC3o7N~@lJCWEF(K->)%Y^Jklw3H)A|fW(E;j_ z(b$f(NTIvZ#C7Z5zts=1a5rRn9=#W$*RICz!>?6n^<=+PC1cTaJv!BBxj04Ng8m0y z68%tyF7$p$9e*KmG5)A*qCJnH`8Vq{seYm4y9yq^ZczENgtQF7Xlu~Qmlt0ei>j)bgd^wDVaehb#XxE};% zN8;Vkklho6R9i#UD&*{{D}(xIhR5hVIxo;hDN)%}dyArn(Ju5u4>*-1cTywi;K+-H2R`){FkS)xSFOtrm$JMu_$y4o56l+a(I*%PZqX z>_u4JYaiA4*P(hOQAG%di9~9M$g;~~$k8l~qFk||B8MvBctiDm3(oXNO2r#Cy(pmz zM-jx_(55G1Mn;mMY0%q#IQo7FUN_*G86@n)zJ13VmefivB@`iPLy5G1iT4@UhEL`fue#EEu737I2HjVRlsKVn^rRp?Pd(G4a;@iI$)2-v8mF**~{ ziJ}4+vDuM6in5B)c4SpA1>;(!r3+q;ouSUw(khiBZue-EYe>jW$#N${kqGYOmgxTg zqxR%zt0il-O;OzI*vS<~+Lc*t8?0nwZ2eWlmP_b~ zMNve#Wf^J4EqE_GEV9ka+$@5cJ06xn(KmF4_!U*MQTP@+7YLO7jkHCGlC(-yq9y+T zQt*#nwUM0(r>qXi3R38{EQI-dbbE<#J{cA=Z=F~DOa1sRzkzfq3PNIJk8yTJ7VO(Z z;zN{AvIa@g@KXGC_%6SOn6eR_l2k^U@sgZXPYuLDC`X7a8iaIaT zqP-|ew7D*eY>z|Xl6({JTp>|$MV42fp!*U++KtFgB%q%}m3k@Ari4X|Pl9@)ty1w` zNf3v-J9K5oQs9(aT|HAL>BdAJoicjG8`4yT-=i3|MhYW#CtR}k5|dKoQi}FA!d#+o zaFu$9i#>@F(`z3b7~ha}xgl1h;oZRBr6h`dX( z@MMPGjF{YcU3!?w^h=@%%Y;V*_dd*Gt)FiT_cB5&q8xE9j8z<}`W_d##FjY4(|!d$+zU2ljSk1 z8@Ntq?i(pcJ86PY?V=^n%$mUb=%&!%^Wo@@UAhEJx8 ze}g3%LDMYUUzASFa>$h~56k3nmuBX=B_#PnmGI1eqa?owkz1u?62E^0jnF9Gj#|9HZLs zifn?4Tnj`_7s?u_>?|TDE|Ot@zb@@2vIMCq<@x8lHw^AZ5v87ggk8f zaz5ORjM&AFN86G1Yb z#@OX;v$kW$Oh|DUiX|!&_Z){i6N`4qJ9nk%jnOwm-4k?8(Jm+ATu;RON<|}THZIW| zxg-8X^*Ckt-hsp)40B3V)%L+%bu`L2z~v|2YJ z(P*@AS}h5oJvbzc{fV{EzM~{ee^t5Ehl&#BT^Q$%G5iqaAKJMT)t1fG*z!h)Cw`iI z73XYimdj@5ZkNfvUn9vck+%ERgx|>=^GKe2lHsvUiy-p0y;Y?YQAW~@rqpak(`cfN Mh@b7{yZB%K+2MAxApigX literal 0 HcmV?d00001 diff --git a/src/main/resources/images/LukeDaKing.jpg b/src/main/resources/images/LukeDaKing.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dc9baac04db9717ea161b3d5f3361a6f48fd5e5a GIT binary patch literal 77763 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∋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 Tsql?glvqh@7N|ZDPb<&S=gs&UnYwmx_;r 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 QGDg}s>Ge;i>3{J54<%<{9 literal 0 HcmV?d00001 diff --git a/src/main/resources/view/DialogBox.fxml b/src/main/resources/view/DialogBox.fxml new file mode 100644 index 0000000000..e433809947 --- /dev/null +++ b/src/main/resources/view/DialogBox.fxml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/view/MainWindow.fxml b/src/main/resources/view/MainWindow.fxml new file mode 100644 index 0000000000..435f3ce0d8 --- /dev/null +++ b/src/main/resources/view/MainWindow.fxml @@ -0,0 +1,19 @@ + + + + + + + + + + + +