Format specifics for Homework 3: The server will be invoked via the following command: java AMServer portnum or java AMServer portnum filename In the first case, if no filename is specified, you should restore from the previously saved local state. If a filename is specified, you should initialize to the state specified in the file. In this case I will follow the command with: java Init upwlist portnum or java Init upwlist portnum 1i2Lt*M where upwlist is a file containing a list of users and their passwords. You may assume that bossman will always be present in this list, and should make provisions to handle cases where users in the ACM are not in this list, and cases where users in this list are not already in the ACM. Finally, I will invoke your client (possibly from another machine) by: java GenClient servermachine portnum or java GenClient servermachine portnum user PW where servermachine is the full name of the machine I am running your server on (e.g. marlowe.umd.edu). Your client should then prompt me for, in order, a user name and a password. You decide (and justify) what you do if the password is in-correct, but if the authentication is successful, you should allow the client to proceed with the other options. The ACM file I give you (when invoking Init), and the format I expect when you output an ACM is as follows: O1 O2 fi phi foo Alice Bob Joe S TS U C S S C U Alice S orw w n n n o n n Bob C n n n n o n o n Joe U n w ox n n n n o o where the first row (column) is the name of objects (subjects), the second row (column) is a security level associated with the object (subject) and the rest of the entries define the DAC which will be applied IN ADDITION to the specified MAC. E.g., it's not a violation of policy to have an U subject with DAC read permission to a S object, but your program should deny access based on the MAC. Refer to you class notes re: covert channels to determine which message to return when access is denied by both policies. The file for input into you Init program shall be as follows: Alice egbdf bob !@#$%^ joe b!r+hd&y bossman g0+3rp5 that is, just a list of un-encrypted userids followed by un-encrypted (and, in this case, poorly chosen) passwords. After invoking GenClient, the typical user should be able to use the following commands: r file (request read access to file) w file (request write access to file) x file (request execute access to file) n file [L] (create a new file, at security level L if specified) e file (erase file) c file access user (change access rights for user to file owned by process) p old new new (change password from old to new) q (quit, server stays resident and keeps any changes made to ACM) Additionally, the privileged user should be able to: s [file] (show the ACM to standard out, or save it in file) a user L (add a user at level L) d user (delete a user) u user pw (update a users auth. info by setting password to pw) o file user (change a files ownership to user) k (kill the server when I quit (not right now!) don't forget to save state first) Your program should output a descriptive one line response for each of the above, such as "read access allowed", "write access denied due to * property", "user information updated", etc.