i have java project, and i will send the details

profilead2006
BluePrints.rar

BluePrints/.classpath

BluePrints/.gitignore

/target/ /logs/

BluePrints/.project

BluePrints org.eclipse.wst.common.project.facet.core.builder org.eclipse.jdt.core.javabuilder org.springframework.ide.eclipse.core.springbuilder org.springframework.ide.eclipse.boot.validation.springbootbuilder net.sf.eclipsecs.core.CheckstyleBuilder org.eclipse.wst.validation.validationbuilder org.eclipse.m2e.core.maven2Builder org.eclipse.jdt.core.javanature org.eclipse.m2e.core.maven2Nature org.eclipse.wst.common.project.facet.core.nature org.eclipse.wst.common.modulecore.ModuleCoreNature

BluePrints/.settings/.jsdtscope

BluePrints/.settings/org.eclipse.core.resources.prefs

eclipse.preferences.version=1 encoding//src/main/java=UTF-8 encoding//src/main/resources=UTF-8 encoding//src/test/java=UTF-8 encoding/<project>=UTF-8

BluePrints/.settings/org.eclipse.jdt.core.prefs

eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning org.eclipse.jdt.core.compiler.release=disabled org.eclipse.jdt.core.compiler.source=1.8

BluePrints/.settings/org.eclipse.wst.common.component

BluePrints/.settings/org.eclipse.wst.common.project.facet.core.xml

BluePrints/.settings/org.eclipse.wst.jsdt.ui.superType.container

org.eclipse.wst.jsdt.launching.baseBrowserLibrary

BluePrints/.settings/org.eclipse.wst.jsdt.ui.superType.name

Window

BluePrints/.settings/org.eclipse.wst.validation.prefs

disabled=06target eclipse.preferences.version=1

BluePrints/GitProj/Kings/BluePrints/target/m2e-wtp/web-resources/.gitignore

/META-INF/

BluePrints/pom.xml

4.0.0 edu.kings.cs480 BluePrints war BluePrints http://maven.apache.org edu.kings.cs480.BluePrints.BluePrintsMain UTF-8 1.8 org.springframework.boot spring-boot-starter-parent 1.5.9.RELEASE org.springframework.boot spring-boot-starter-tomcat provided org.springframework.boot spring-boot-starter-data-jpa org.apache.tomcat.embed tomcat-embed-jasper provided com.unboundid unboundid-ldapsdk org.springframework.boot spring-boot-starter-freemarker org.webjars bootstrap 4.0.0-beta.3 org.webjars.bower popper.js 1.12.9 org.json json org.postgresql postgresql org.webjars datatables 1.10.16 runtime org.springframework.boot spring-boot-starter-log4j2 org.apache.logging.log4j log4j-slf4j-impl com.h2database h2 runtime javax.xml.bind jaxb-api runtime 2.3.0 org.webjars jquery 3.0.0 runtime org.springframework.boot spring-boot-maven-plugin 1.0

BluePrints/ReadMe.md

Source Code Citations: Author(s): Martin Konicek and Maarten Bodewes Date: 4/18/18 Title: Password Version: 06-14-2012 Type: Source Code Web Site: https://stackoverflow.com/questions/2860943/how-can-i-hash-a-password-in-java?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

BluePrints/src/main/java/edu/kings/cs480/BluePrints/ActiveDirectory/AuthenticatedUser.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/ActiveDirectory/AuthenticatedUser.java

/**
 * 
 */
package  edu . kings . cs480 . BluePrints . ActiveDirectory ;

import  javax . naming . NamingException ;
import  javax . naming . directory . Attributes ;

/**
 * This class represents a user from the Active Directory.
 */
public   class   AuthenticatedUser   {

     /** Keeps track of the user's king's id. */
     private   String  kingsid ;

     /** Keeps track of the user's first name. */
     private   String  firstName ;

     /** Keeps track of the user's last name. */
     private   String  lastName ;

     /** Keeps track of the user's email address. */
     private   String  email ;

     /**
     * Creates a user with the provided information.
     * 
     *  @param  attr
     *            - the set of attributes which contains information about this
     *            user.
     *
     */

     protected   AuthenticatedUser ( Attributes  attr )   throws   NamingException   {

        firstName  =   ( String )  attr . get ( "givenName" ). get ( 0 );
        lastName  =   ( String )  attr . get ( "sn" ). get ( 0 );
        kingsid  =   ( String )  attr . get ( "KingsID" ). get ( 0 );
        email  =   ( String )  attr . get ( "mail" ). get ( 0 );

     }

     /**
     * Returns the user's first name.
     * 
     *  @return  the user's first name.
     */
     public   String  getFirstName ()   {
         return  firstName ;
     }

     /**
     * Returns the user's last name.
     * 
     *  @return  the user's last name.
     */
     public   String  getLastName ()   {
         return  lastName ;
     }

     /**
     * Returns the user's email.
     * 
     *  @return  the user's email.
     */
     public   String  getEmail ()   {
         return  email ;
     }

     /**
     * Returns the user's king's id.
     * 
     *  @return  the user's king's id.
     */
     public   String  getKingsId ()   {
         return  kingsid ;
     }

}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/ActiveDirectory/AuthenticationService.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/ActiveDirectory/AuthenticationService.java

package  edu . kings . cs480 . BluePrints . ActiveDirectory ;

import  java . util . Hashtable ;

import  javax . naming . Context ;
import  javax . naming . NamingEnumeration ;
import  javax . naming . NamingException ;
import  javax . naming . directory . Attribute ;
import  javax . naming . directory . Attributes ;
import  javax . naming . directory . SearchResult ;
import  javax . naming . directory . SearchControls ;
import  javax . naming . ldap . InitialLdapContext ;
import  javax . naming . ldap . LdapContext ;

/**
 * AuthenticationService
 *
 * Provides an interface to authenticate against the King's Active Directory server.
 *
 */
public   class   AuthenticationService   {

     // the domain name to authenticate against.
     private   static   String  domain  =   "kings.edu" ;

     /**
     * AuthenticationService()
     */
     private   AuthenticationService ()   {
     }

     /**
     * authenticate
     *
     * Try to authenticate against active directory via ldap and return the status of the authentication.
     *
     *  @param  email The email to authenticate against.
     *  @param  password The password associated with the email
     *  @return  true if authentication was successful, otherwise false.
     *  @throws  NamingException When communication or authentication fails against the domain controller.
     */
     public   static   LdapContext  authenticate ( String  email ,   String  password )   throws   NamingException   {

         // Define our properties of LDAP.
         Hashtable < String ,   String >  adProps  =   new   Hashtable < String ,   String > ();
        adProps . put ( Context . SECURITY_PRINCIPAL ,  email );
        adProps . put ( Context . SECURITY_CREDENTIALS ,  password );
        adProps . put ( Context . INITIAL_CONTEXT_FACTORY ,   "com.sun.jndi.ldap.LdapCtxFactory" );
        adProps . put ( Context . PROVIDER_URL ,   "ldap://"   +  domain );

         // Try created a connection based on the above properties that we defined.
         try   {
             return   new   InitialLdapContext ( adProps ,   null );
         }
         catch ( javax . naming . CommunicationException  e )   {
            e . printStackTrace ();
             throw   new   NamingException ( "Failed to connect to "   +  domain );
         }
         catch ( NamingException  e )   {
             throw   new   NamingException ( "Failed to authenticate against "   +  domain );
         }
     }

     /**
     * getUser
     *
     * Returns the user object based on the user from AD, otherwise return null.
     *
     *  @param  email The email to retrieve.
     *  @param  context The context connection to the AD directory.
     *  @return  A user if the user exists, otherwise return null.
     */
     public   static   AuthenticatedUser  getUser ( String  email ,   LdapContext  context )   {
        
        
         try   {
            
             String []  requestedAttrs  =   new   String []   {   "sn" ,   "givenName" ,   "KingsID" ,   "mail" ,   "userPrincipalName" };
            
             // Setup a search control.
             SearchControls  controls  =   new   SearchControls ();
             // Limit our search, otherwise we will time out traversing the whole directory.
            controls . setSearchScope ( javax . naming . directory . SearchControls . SUBTREE_SCOPE );
             // Limit our attributes, AD has 100+ fields, we don't need all of them.
            controls . setReturningAttributes ( requestedAttrs );
             // Define our connection string, this format is required for LDAP.
             // TODO: Refactor this.
             NamingEnumeration < SearchResult >  result  =  context . search ( "OU=User_New,DC=kings,DC=edu" ,   "(& (userPrincipalName=" + email + ")(objectClass=user))" ,  controls );
             // Search our attributes until we come across one that matches the email we specified.
             if   ( result . hasMore ())   {
                 Attributes  attr  =  result . next (). getAttributes ();
                 Attribute  user  =  attr . get ( "userPrincipalName" );
                 if   ( user != null )   return   new   AuthenticatedUser ( attr );
             }
         }
         catch ( NamingException  e )   {
             // TODO: Handle this gracefully.
             //System.out.println(e.toString());
            e . printStackTrace ();
         }

         return   null ;
     }
    
    
    
}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Adapters/BuildingAdapter.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Adapters/BuildingAdapter.java

/**
 * 
 */
package  edu . kings . cs480 . BluePrints . Adapters ;

import  java . util . List ;
import  java . util . UUID ;

import  org . springframework . beans . factory . annotation . Autowired ;
import  org . springframework . stereotype . Service ;

import  edu . kings . cs480 . BluePrints . Database . AppUser ;
import  edu . kings . cs480 . BluePrints . Database . AppUserRepository ;
import  edu . kings . cs480 . BluePrints . Database . Building ;
import  edu . kings . cs480 . BluePrints . Database . BuildingCoordinate ;
import  edu . kings . cs480 . BluePrints . Database . BuildingRepository ;
import  edu . kings . cs480 . BluePrints . Database . CoordinateRepository ;

/**
 * This class is responsible for handling method used in the Map Manager Page.
 * 
 */
@ Service
public   class   BuildingAdapter   {

     /** Used to query data from the buildings table in the database. */
    @ Autowired
     private   BuildingRepository  buildingRepo ;

     /** Handles calls to the database about the users in the BluePrints System. */
    @ Autowired
     private   AppUserRepository  userRepo ;

     /** Handles calls to the database about the coordinate data for buildings. */
    @ Autowired
     private   CoordinateRepository  coordinateRepo ;

     /**
     * Returns all the buildings stored in the system.
     * 
     *  @return  all the buildings stored in the system.
     */
     public   List < Building >  getBuildings ()   {
         return  buildingRepo . findAll ();
     }

     /**
     * Returns the building with the corresponding id provided.
     * 
     *  @param  buildingId
     *            - the id of the building being returned.
     *  @return  the building corresponding to the provided id.
     */
     public   Building  getBuilding ( UUID buildingId )   {

         Building  building  =   null ;
        building  =  buildingRepo . findOne ( buildingId );

         return  building ;
     }

     /**
     * Updates the building with corresponding id, with the information provided.
     * 
     *  @param  buildingId
     *            - the id of the building being updated.
     *  @param  buildingName
     *            - the new name of the building.
     *  @return  whether, or not, the building was successfully updated.
     */
     public   boolean  updateBuilding ( UUID buildingId ,   String  buildingName )   {

         boolean  updated  =   false ;

         Building  building  =  buildingRepo . findOne ( buildingId );

         if   ( building  !=   null )   {

            building . setName ( buildingName );
            buildingRepo . save ( building );
            updated  =   true ;
         }

         return  updated ;
     }

     /**
     * Removes the building with the provided id from the system.
     * 
     *  @param  buildingId
     *            - the id of the building being deleted.
     *  @return  whether, or not, the building was successfully removed.
     */
     public   boolean  deleteBuilding ( UUID buildingId )   {
         boolean  deleted  =   false ;
         Building  building  =  getBuilding ( buildingId );

         if   ( building  !=   null )   {
            buildingRepo . delete ( building );
            deleted  =   true ;
         }

         return  deleted ;

     }

     /**
     * Adds a new building with the provided name, and creator id.
     * 
     *  @param  buildingName
     *            - the name of the building.
     *  @param  creatorId
     *            - the id of the person creating the building.
     *  @return  the newly added building.
     */
     public   Building  addBuilding ( String  buildingName ,  UUID creatorId )   {

         Building  building  =   null ;

         AppUser  creator  =  userRepo . findOne ( creatorId );

         if   ( creator  !=   null )   {
            building  =   new   Building ( buildingName ,  creator );
            buildingRepo . save ( building );
         }

         return  building ;

     }

     /**
     * Adds the coordinates to the database for the building with the corresponding
     * building id.
     * 
     *  @param  buildingId
     *            - the id of the building the coordinate belongs to.
     *  @param  coordinateData
     *            - the data being stored in the database.
     *  @return  whether, or not, the data was successfully added.
     */
     public   boolean  addCoordinates ( UUID buildingId ,   String  coordinateData )   {

         boolean  added  =   false ;

         Building  building  =  buildingRepo . findOne ( buildingId );

         if   ( building  !=   null )   {
             BuildingCoordinate  coordinates  =   new   BuildingCoordinate ( building ,  coordinateData );

            coordinateRepo . save ( coordinates );
            added  =   true ;
         }

         return  added ;
     }

     /**
     * Updates the coordinate data for the building with the corresponding building
     * id.
     * 
     *  @param  buildingId
     *            - the id of the building the coordinate belongs to.
     *  @param  coordinateData
     *            - the data being stored in the database.
     *  @return  whether, or not, the data was successfully updated.
     */
     public   boolean  updateCoordinates ( UUID buildingId ,   String  coordinateData )   {

         boolean  updated  =   false ;

         Building  building  =  buildingRepo . findOne ( buildingId );

         if   ( building  !=   null )   {
             BuildingCoordinate  coordinates  =  coordinateRepo . findByBuilding ( building );

            coordinates . setCoordinateData ( coordinateData );
            coordinateRepo . save ( coordinates );
            updated  =   true ;
         }

         return  updated ;
     }

     /**
     * Returns the coordinate data for the building with the corresponding building
     * id.
     * 
     *  @param  buildingId
     *            - the id of the building the coordinates are being requested for.
     *  @return  the coordinates for the building.
     */
     public   BuildingCoordinate  getCoordinates ( UUID buildingId )   {

         BuildingCoordinate  coordinates  =   null ;

         Building  building  =  buildingRepo . findOne ( buildingId );

         if   ( building  !=   null )   {
            coordinates  =  coordinateRepo . findByBuilding ( building );
         }

         return  coordinates ;
     }

}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Adapters/CommentAdapter.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Adapters/CommentAdapter.java


package  edu . kings . cs480 . BluePrints . Adapters ;

import  org . springframework . beans . factory . annotation . Autowired ;
import  org . springframework . stereotype . Service ;

import  edu . kings . cs480 . BluePrints . Database . Comment ;
import  edu . kings . cs480 . BluePrints . Database . CommentRepository ;
import  edu . kings . cs480 . BluePrints . Database . Floor ;
import  edu . kings . cs480 . BluePrints . Database . FloorRepository ;
import  edu . kings . cs480 . BluePrints . Database . AppUser ;
import  edu . kings . cs480 . BluePrints . Database . AppUserRepository ;

import  java . util . UUID ;
import  java . util . List ;

/**
 * This adapter is responsible for handling data involving comment.
 * 
 */
@ Service
public   class   CommentAdapter   {

     /** Handles calls to the Floor table in the database. */
    @ Autowired
     public   FloorRepository  floorRepo ;

     /** Handles calls to the App User table in the database. */
    @ Autowired
     public   AppUserRepository  userRepo ;

     /** Handles calls to the floor comment table in the database. */
    @ Autowired
     public   CommentRepository  commentRepo ;

     /**
     * This method adds a comment to the floor.
     * 
     *  @param  floorId
     *            - the id of the floor that comment is being added to.
     *  @param  creatorId
     *            - the id of the creator of this comment.
     *  @param  commentMsg
     *            - the comment being added to the floor.
     * 
     */
     public   boolean  addComment ( UUID floorId ,  UUID creatorId ,   String  commentMsg )   {

         boolean  added  =   false ;

         AppUser  user  =  userRepo . getOne ( creatorId );
         Floor  floor  =  floorRepo . getOne ( floorId );

         if   ( floor  !=   null   &&  user  !=   null )   {

             Comment  newComment  =   new   Comment ( floor ,  user ,  commentMsg );

            commentRepo . save ( newComment );

            added  =   true ;
         }

         return  added ;

     }

     /**
     * This method updates a comment with the new message provided.
     * 
     *  @param  commentId
     *            - the id of the comment being updated.
     *  @param  editorId
     *            - the id of the user updating this comment.
     *  @param  newMsg
     *            - the content of the new message for the comment.
     */
     public   boolean  updateComment ( UUID commentId ,  UUID editorId ,   String  newMsg )   {

         boolean  updated  =   false ;

         AppUser  user  =  userRepo . findOne ( editorId );
         Comment  comment  =  commentRepo . findOne ( commentId );

         if   ( comment  !=   null   &&  user  !=   null )   {

            comment . setCreator ( user );
            comment . setMessage ( newMsg );
            commentRepo . save ( comment );

            updated  =   true ;
         }

         return  updated ;

     }

     /**
     * This method returns the comments which corresponds to the floor id provided.
     * 
     *  @param  floorId
     *            - the id of the floor the comment belong to.
     *  @return  the comment for corresponding floor id.
     */
     public   List < Comment >  getFloorComments ( UUID floorId )   {

         List < Comment >  floorComment  =   null ;

        floorComment  =  commentRepo . findByFloorIdOrderByCreatedDateAsc ( floorId );

         return  floorComment ;
     }

     public   void  clearFloorComments ( UUID floorId )   {

        commentRepo . delete ( this . getFloorComments ( floorId ));

     }

}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Adapters/FloorAdapter.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Adapters/FloorAdapter.java


package  edu . kings . cs480 . BluePrints . Adapters ;

import  org . springframework . beans . factory . annotation . Autowired ;
import  org . springframework . stereotype . Service ;

import  java . util . UUID ;
import  java . util . List ;
import  java . util . Map ;
import  java . util . HashMap ;
import  java . util . LinkedList ;


import  edu . kings . cs480 . BluePrints . Database . FloorRepository ;
import  edu . kings . cs480 . BluePrints . Database . Floor ;
import  edu . kings . cs480 . BluePrints . Database . Building ;
import  edu . kings . cs480 . BluePrints . Database . BuildingRepository ;


/**
 * This adapter is responsible for handling data involing 
 * floors. 
 */
@ Service
public   class   FloorAdapter    {

     /** Used to handle calls to the database. */
    @ Autowired
     private   FloorRepository  floorRepo ;
    

     /** Used to query data from the buildings table in the database. */
    @ Autowired
     private   BuildingRepository  buildingRepo ;

     /**
     * This method takes a building id, and the name of a floor,
     * then adds it to the system. 
     * 
     *  @param  buildingId - the id of the building the floor is being added to.
     *  @param  floorName - the name of the floor being added to the building.
     * 
     */
     public   Floor  addFloor ( UUID buildingId ,   String  floorName )   {

         Floor  newFloor  =   null ;

         Building  building  =  buildingRepo . getOne ( buildingId );

         if ( building  !=   null )   {
            
            newFloor  =   new   Floor ( building ,  floorName );

            floorRepo . save ( newFloor );

         }

         return  newFloor ;

     }

    
    
   
     public   boolean  deleteFloor ( UUID floorId )   {
        
         boolean  deleted  =   false ;
        
        
         Floor  floor  =  floorRepo . findOne ( floorId );
        
         if ( floor  !=   null )   {
            
            floorRepo . delete ( floor );
            deleted  =   true ;
         }
        
         return  deleted ;
  
     }
    
     public   boolean  deleteFloorsInBuilding ( Building  building )   {
        
         boolean  deleted  =   false ;
     
        
         List < Floor >  floors  =  floorRepo . findByBuilding ( building );
        
         if ( floors  !=   null )   {
             for ( Floor  floor  :  floors )   {
                deleteFloor ( floor . getId ());
             }
            
            deleted  =   true ;
         }
        
         return  deleted ;
        
     }
    
    

     /**
     * Returns all the floors.
     * 
     */
     public   Map < String ,   List < Floor >>  getFloors ()   {

         HashMap < String ,   List < Floor >>  buildingFloors  =   new   HashMap <> ();
         List < Floor >  floors  =  floorRepo . findAll ();

         for ( Floor  floor  :  floors )   {

             Building  building  =  floor . getBuilding ();
             String  buildingId  =  building . getId (). toString ();

             if ( buildingFloors . containsKey ( buildingId ))   {
                buildingFloors . get ( buildingId ). add ( floor );
                 System . out . println ( String . format ( "added Floor %s to list." ,  floor . getName ()));
             }   else   {
                 LinkedList < Floor >  newFloorList  =   new   LinkedList <> ();
                newFloorList . add ( floor );
                buildingFloors . put ( buildingId ,  newFloorList );
                 System . out . println ( String . format ( "Created a new list for Building %s, and added Floor %s." ,  building . getName (),  floor . getName ()));
             }

         }

         return  buildingFloors ;

     }


     /**
     * This method returns the floor which corresponds 
     * to the id provided.
     * 
     *  @param  floorId - the id of the floor being requested.
     *  @return  the floor corresponding to the id provided.
     */
     public   Floor  getFloor ( UUID floorId )   {

         Floor  floor  =   null ;

        floor  =  floorRepo . getOne ( floorId );

         return  floor ;
     }

}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Adapters/LoggingAdapter.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Adapters/LoggingAdapter.java

package  edu . kings . cs480 . BluePrints . Adapters ;

import  java . util . logging . Level ;
import  org . apache . logging . log4j . LogManager ;
import  org . apache . logging . log4j . Logger ;
import  org . springframework . stereotype . Service ;

@ Service
public   class   LoggingAdapter   {
    
     private   final   static   Logger  LOGGER  =    LogManager . getLogger ();
    
     public   void  log ( Level  level ,   String  message )   {

         if ( level  ==   Level . INFO )   {
            LOGGER . info ( message );
         }   else   if ( level  ==   Level . WARNING )   {
            LOGGER . warn ( message );
         }

        
     }
    
}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Adapters/LoginAdapter.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Adapters/LoginAdapter.java

/**
 * 
 */
package  edu . kings . cs480 . BluePrints . Adapters ;


import  java . security . NoSuchAlgorithmException ;
import  java . security . spec . InvalidKeySpecException ;

import  javax . naming . NamingException ;
import  javax . servlet . http . HttpSession ;

import  org . springframework . beans . factory . annotation . Autowired ;
import  org . springframework . stereotype . Service ;
import  org . springframework . ui . Model ;

import  edu . kings . cs480 . BluePrints . Database . AppUser ;

/**
 * This class represents a wrapper for an active directory connection, which
 * provides information about employees and students of King's College.
 */
@ Service
public   class   LoginAdapter   {
    
//  /** Used to log any errors that may error while using the active directory adapter. */
//  @Autowired
//  private LoggingAdapter loggingAdapter;

    @ Autowired
     private   UserAdapter  userAdapter ;


     /**
     * Returns whether, or not, there is a user currently logged into the
     * BluePrints system.
     * 
     *  @param  model
     *            - the model used to store attributes that can be used in the
     *            page currently being viewed by the user.
     *  @param  session
     *            - the session which keeps track of the currently active user.
     *  @return  whether, or not, there is a user currently logged in.
     */
     public   boolean  checkLogin ( Model  model ,   HttpSession  session )   {

         boolean  loggedIn  =   false ;

         Object  user  =  session . getAttribute ( "activeUser" );

         if   ( user  !=   null )   {

             AppUser  activeUser  =   ( AppUser )  user ;

            loggedIn  =   true ;
            model . addAttribute ( "activeUser" ,  activeUser );

         }

         return  loggedIn ;
     }

     /**
     * This helper method tries to log in with the provided password and user
     * name and returns whether, or not, it was successful.
     * 
     *  @param  email
     *            - the email of the user trying to log in.
     *  @param  password
     *            - the password of the user trying to log in.
     *  @param  session
     *            - the session which keeps track of the currently active user.
     *  @return  whether, or not, the user was able to login.
     *  @throws  NamingException 
     */
     public   boolean  login ( String  email ,   String  password ,   HttpSession  session )   {

         boolean  loggedIn  =   false ;
        
         AppUser  user  =  userAdapter . getUserByEmail ( email );
        
         if ( user  !=   null )   {
            
             String  stored  =  user . getPassword ();
            
             try   {
                
                 if ( SecurityAdapter . check ( password ,  stored ))   {
                    
                    loggedIn  =   true ;
                    session . setAttribute ( "activeUser" ,  user );
                 }
             }   catch   ( InvalidKeySpecException   |   NoSuchAlgorithmException  e )   {
                e . printStackTrace ();
             }
            
         }
        

         return  loggedIn ;
     }
    
    
     /**
     * Returns the active user in the provided session, if any.
     * 
     *  @param  session - the session containing the active user.
     *  @return  the active user in the provided session, if any.
     */
     public   AppUser  getActiveUser ( HttpSession  session )   {
         AppUser  activeUser  =   null ;
        
         Object  user  =  session . getAttribute ( "activeUser" );

         if   ( user  !=   null )   {

            activeUser  =   ( AppUser )  user ;
         }
        
         return  activeUser ;
     }
}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Adapters/Mock/MockStaffAdapter.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Adapters/Mock/MockStaffAdapter.java

package  edu . kings . cs480 . BluePrints . Adapters . Mock ;

import  java . util . ArrayList ;
import  java . util . HashMap ;
import  java . util . List ;
import  java . util . UUID ;

import  edu . kings . cs480 . BluePrints . Adapters . StaffAdapter ;
import  edu . kings . cs480 . BluePrints . Database . Staff ;

public   class   MockStaffAdapter   implements   StaffAdapter < UUID >   {

    
     private   HashMap < UUID ,   Staff < UUID >>  mockStaff ;
    
    
    
     public   MockStaffAdapter (){
        
        
        mockStaff  =   new   HashMap <> ();
        mockStaff . put ( UUID . fromString ( "8761c1d6-df23-494c-a62e-5dd25bd7ee1a" ),   new   MockStaff ( "Bob" ,  UUID . fromString ( "8761c1d6-df23-494c-a62e-5dd25bd7ee1a" ),   "[email protected]" ));
        
        mockStaff . put ( UUID . fromString ( "585b434e-4173-43d0-ae56-7d7b219f035f" ),   new   MockStaff ( "Steven" ,  UUID . fromString ( "585b434e-4173-43d0-ae56-7d7b219f035f" ),   "[email protected]" ));
        
        mockStaff . put ( UUID . fromString ( "2168ac0b-9da7-43e7-9b96-829f54cd87e1" ),   new   MockStaff ( "Richard" ,  UUID . fromString ( "2168ac0b-9da7-43e7-9b96-829f54cd87e1" ),   "[email protected]" ));
        
        mockStaff . put ( UUID . fromString ( "e15efdfe-bc09-40dc-9ea0-9fdad9b718b4" ),   new   MockStaff ( "Chadd" ,  UUID . fromString ( "e15efdfe-bc09-40dc-9ea0-9fdad9b718b4" ),   "[email protected]" ));
        
     }
    
    @ Override
     public   Staff < UUID >  getStaff ( UUID staffId )   {
        
        
         return  mockStaff . get ( staffId );
        
     }

    @ Override
     public   void  deleteStaff ( UUID staffId )   {
        
         throw   new   UnsupportedOperationException ( "Not needed for test" );
     }
    
    
    @ Override
     public   List < Staff < UUID >>  getAllStaff ()   {
        
          return   new   ArrayList <> ( mockStaff . values ());
         
     }

    @ Override
     public   void  updateStaff ( UUID staffId ,   String  name ,   String  email )   {
         throw   new   UnsupportedOperationException ( "Not needed for test" );
     }
    
    
    
     private   class   MockStaff   implements   Staff < UUID >   {
        
        
         private   String  name ;
        
         private  UUID staffId ;
        
         private   String  email ;
        
         public   MockStaff ( String  name ,  UUID staffId ,   String  email )   {
             this . name  =  name ;  
             this . staffId  =  staffId ;
             this . email  =  email ;
         }
        
        @ Override
         public   String  getName ()   {
             return  name ;
         }

        @ Override
         public  UUID getStaffId ()   {
             return  staffId ;
         }

        @ Override
         public   String  getStaffEmail ()   {
             return  email ;
         }
        
     }



    
    
}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Adapters/RoomAdapter.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Adapters/RoomAdapter.java

package  edu . kings . cs480 . BluePrints . Adapters ;

import  java . util . LinkedList ;
import  java . util . List ;
import  java . util . UUID ;

import  org . springframework . beans . factory . annotation . Autowired ;
import  org . springframework . stereotype . Service ;

import  edu . kings . cs480 . BluePrints . Database . Floor ;
import  edu . kings . cs480 . BluePrints . Database . Room ;
import  edu . kings . cs480 . BluePrints . Database . RoomCoordinateRepository ;
import  edu . kings . cs480 . BluePrints . Database . RoomCoordinates ;
import  edu . kings . cs480 . BluePrints . Database . RoomRepository ;
import  edu . kings . cs480 . BluePrints . Database . StaffAssignment ;
import  edu . kings . cs480 . BluePrints . Database . StaffAssignmentRepository ;

@ Service
public   class   RoomAdapter   {

    @ Autowired
     private   RoomRepository  roomRepo ;

    @ Autowired
     private   RoomCoordinateRepository  roomCoordinateRepo ;

    @ Autowired
     private   FloorAdapter  floorAdapter ;
    
    @ Autowired
     private   StaffAssignmentRepository  staffRepo ;

     public   Room  getRoom ( UUID roomId )   {

         Room  room  =  roomRepo . findOne ( roomId );

         return  room ;

     }

     public   List < Room >  getAllRooms ( UUID floorId )   {

         List < Room >  rooms  =   null ;

         Floor  floor  =  floorAdapter . getFloor ( floorId );

         if   ( floor  !=   null )   {

            rooms  =  roomRepo . findByFloor ( floor );

         }

         return  rooms ;
     }

     public   Room  addRoom ( String  roomName ,  UUID floorId )   {

         Room  room  =   null ;

         Floor  floor  =  floorAdapter . getFloor ( floorId );

         if   ( floor  !=   null )   {

            room  =   new   Room ( roomName ,  floor );

            roomRepo . save ( room );

         }

         return  room ;

     }

     public   boolean  updateRoom ( UUID roomId ,   String  newRoomName )   {

         boolean  updated  =   false ;

         Room  room  =  roomRepo . findOne ( roomId );

         if   ( room  !=   null )   {

            room . setName ( newRoomName );
            roomRepo . save ( room );

            updated  =   true ;
         }

         return  updated ;
     }

     public   boolean  deleteRoom ( UUID roomId )   {

         boolean  deleted  =   false ;

         Room  room  =  roomRepo . findOne ( roomId );

         if   ( room  !=   null )   {
            
            unassignAllStaff ( roomId );
            roomCoordinateRepo . delete ( roomId );
            roomRepo . delete ( room );
            deleted  =   true ;
         }

         return  deleted ;

     }

     public   boolean  addRoomCoordinates ( UUID roomId ,   String  roomCoordinateData )   {

         boolean  added  =   false ;

         if   ( roomRepo . exists ( roomId ))   {

             RoomCoordinates  roomCoordinates  =   new   RoomCoordinates ( roomId ,  roomCoordinateData );
            roomCoordinateRepo . save ( roomCoordinates );
            added  =   true ;
         }

         return  added ;

     }

     public   boolean  deleteRoomCoordinates ( UUID roomId )   {

         boolean  deleted  =   false ;

         RoomCoordinates  coordinates  =  roomCoordinateRepo . findOne ( roomId );

         if   ( coordinates  !=   null )   {

            roomCoordinateRepo . delete ( coordinates );
            deleted  =   false ;

         }

         return  deleted ;

     }

     public   boolean  updateRoomCoordinates ( UUID roomId ,   String  newRoomCoordinateData )   {

         boolean  updated  =   false ;

         RoomCoordinates  coordinates  =  roomCoordinateRepo . findOne ( roomId );

         if   ( coordinates  !=   null )   {

            coordinates . setCoordinateData ( newRoomCoordinateData );
            roomCoordinateRepo . save ( coordinates );
            updated  =   true ;
         }

         return  updated ;

     }

     public   List < RoomCoordinates >  getAllRoomCoordinates ( UUID floorId )   {

         List < RoomCoordinates >  roomCoordinates  =   null ;

         Floor  floor  =  floorAdapter . getFloor ( floorId );

         if   ( floor  !=   null )   {

             List < Room >  rooms  =  roomRepo . findByFloor ( floor );

             if   ( rooms  !=   null )   {

                roomCoordinates  =   new   LinkedList <> ();

                 for   ( Room  room  :  rooms )   {

                     RoomCoordinates  coordinates  =  roomCoordinateRepo . findOne ( room . getId ());
                    roomCoordinates . add ( coordinates );
                 }

             }

         }

         return  roomCoordinates ;
     }

     public   RoomCoordinates  getRoomCoordinates ( UUID roomId )   {

         RoomCoordinates  coordinates  =  roomCoordinateRepo . findOne ( roomId );

         return  coordinates ;

     }

     public   boolean  clearAllFloorRooms ( UUID floorId )   {

         boolean  deleted  =   false ;

         Floor  floor  =  floorAdapter . getFloor ( floorId );

         if   ( floor  !=   null )   {

             List < Room >  rooms  =  roomRepo . findByFloor ( floor );

             for   ( Room  room  :  rooms )   {

                deleteRoom ( room . getId ());
             }

            deleted  =   true ;
         }
         return  deleted ;
     }
    
     public   List < StaffAssignment >  getRoomAssignments ( UUID roomId ){
        
         List < StaffAssignment >  result  =   null ;;
        
         Room  room  =  roomRepo . findOne ( roomId );
        
         if ( room  !=   null )   {
            result  =   staffRepo . findByRoom ( room );
         }
        
         return  result ;
        
     }
    
     public   boolean  assignStaffToRooms ( UUID roomId ,  UUID []  staffIds )   {
        
         boolean  assigned  =   false ;
        
         Room  room  =  roomRepo . findOne ( roomId );
        
         if ( room  !=   null )   {
            
             for ( UUID staffId  :  staffIds )   {
                
                 StaffAssignment  assignment  =   new   StaffAssignment ( room ,  staffId );
                
                staffRepo . save ( assignment );
             }
            
            assigned  =   true ;
         }
        
        
         return  assigned ;
        
     }
    
     public   boolean  unassignStaff ( UUID staffId ,  UUID roomId )   {
        
         boolean  unassigned  =   false ;
        
         Room  room  =  getRoom ( roomId );
        
         if ( room  !=   null )   {
            
             StaffAssignment  assignmentId  =  staffRepo . findByStaffIdAndRoom ( staffId ,  room );
            
             if ( assignmentId  !=   null )   {
                
                staffRepo . delete ( assignmentId );
                unassigned  =   true ;
             }
         }
        
         return  unassigned ;
        
     }
    
     public   boolean  unassignAllStaff ( UUID roomId )   {

         boolean  unassigned  =   false ;

         Room  room  =  getRoom ( roomId );

         if   ( room  !=   null )   {

             List < StaffAssignment >  assignments  =  staffRepo . findByRoom ( room );

             if   ( assignments  !=   null )   {
                
                 for ( StaffAssignment  assignment  :  assignments )   {
                    
                    staffRepo . delete ( assignment );
                 }

                unassigned  =   true ;
             }
         }

         return  unassigned ;

     }
    
    
}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Adapters/SecurityAdapter.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Adapters/SecurityAdapter.java

/**
 * 
 */
package  edu . kings . cs480 . BluePrints . Adapters ;

import  java . security . NoSuchAlgorithmException ;
import  java . security . SecureRandom ;
import  java . security . spec . InvalidKeySpecException ;

import  javax . crypto . SecretKey ;
import  javax . crypto . SecretKeyFactory ;
import  javax . crypto . spec . PBEKeySpec ;

import  org . apache . tomcat . util . codec . binary . Base64 ;

/**
 * This class is used for handling password encryptions and 
 * checks.
 *
 */
public   class   SecurityAdapter   {
    
     /**Represents the number of hash iterations that will be performed.*/
     private   static   final   int  HASH_ITERATIONS ;
    
     /**Represents the length of the salt being used for the hash.*/
     private   static   final   int  SALT_LENGTH ;
    
     /**Represents the length of the hashed password. */
     private   static   final   int  HASH_LENGTH ;
    
     static   {
        
        HASH_ITERATIONS  =   1000 ;
        SALT_LENGTH  =   32 ;
        HASH_LENGTH  =   256 ;
     }
    
    
    /**
    * This method returns a hashed password along with the salt used to hash it.
    * 
    * Title: getSaltedHash
    * Author:  Martin Konicek and Maarten Bodewes
    * Date: 4/18/18
    * Code version: 06/14/12
    * Availability: { @link  https://stackoverflow.com/questions/2860943/how-can-i-hash-a-password-in-java?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa}
    *
    *  @param  password - the password being hashed.
    *  @return  the hashed password along with the salt used to hash it. 
    */
     public   static   String  getSaltedHash ( String  password )   throws   NoSuchAlgorithmException ,   InvalidKeySpecException    {
         byte []  salt  =   SecureRandom . getInstance ( "SHA1PRNG" ). generateSeed ( SALT_LENGTH );
         // store the salt with the password
         return   Base64 . encodeBase64String ( salt )   +   "$"   +  hash ( password ,  salt );
     }


    /**
    * Checks whether given plaintext password corresponds to a stored salted hash
     * of the password.
    * 
    * Title: check
    * Author:  Martin Konicek and Maarten Bodewes
    * Date: 4/18/18
    * Code version: 06/14/12
    * Availability: { @link  https://stackoverflow.com/questions/2860943/how-can-i-hash-a-password-in-java?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa}
    * 
    *  @param  password - the password being checked against the stored password.
    *  @param  stored - the hashed password being checked against.
    *  @param  whether, or not, the password matches the stored password.
    */
     public   static   boolean  check ( String  password ,   String  stored )   throws   InvalidKeySpecException ,   NoSuchAlgorithmException    {
         return   true ;
//      String[] saltAndPass = stored.split("\\$");
//      if (saltAndPass.length != 2) {
//          throw new IllegalStateException("The stored password have the form 'salt$hash'");
//      }
//      String hashOfInput = hash(password, Base64.decodeBase64(saltAndPass[0]));
//      return hashOfInput.equals(saltAndPass[1]);
     }
    
    /**
    * This method hashes the provided password with the provided sault 
    * and returns it.
    * 
    * Title: hash
    * Author:  Martin Konicek and Maarten Bodewes
    * Date: 4/18/18
    * Code version: 06/14/12
    * Availability: { @link  https://stackoverflow.com/questions/2860943/how-can-i-hash-a-password-in-java?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa}
    *
    * Author Notes: 
    *   using PBKDF2 from Sun, an alternative is https://github.com/wg/scrypt
    *   cf. http://www.unlimitednovelty.com/2012/03/dont-use-bcrypt.html
    *
    *  @param  password - the password being hashed.
    *  @param  salt - the salt being used to hash the password.
    *  @return  the hashed password.
    *
    */
     private   static   String  hash ( String  password ,   byte []  salt )   throws   NoSuchAlgorithmException ,   InvalidKeySpecException    {
        
         if   ( password  ==   null   ||  password . length ()   ==   0 )   {
             throw   new   IllegalArgumentException ( "Empty passwords are not supported." );
         }
        
         SecretKeyFactory  f  =   SecretKeyFactory . getInstance ( "PBKDF2WithHmacSHA1" );
         SecretKey  key  =  f . generateSecret ( new   PBEKeySpec ( password . toCharArray (),  salt ,  HASH_ITERATIONS ,  HASH_LENGTH ));
         return   Base64 . encodeBase64String ( key . getEncoded ());
     }
    
     public   static   void  main ( String [] args )   {
        
         String  password  =   "" ;
        
         try   {
            
             String  stored  =  getSaltedHash ( password );
             System . out . println ( stored );
             System . out . println ( check ( password ,  stored ));
            
         }   catch   ( NoSuchAlgorithmException   |   InvalidKeySpecException  e )   {
            e . printStackTrace ();
         }
        
     }

}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Adapters/StaffAdapter.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Adapters/StaffAdapter.java

package  edu . kings . cs480 . BluePrints . Adapters ;

import  java . util . List ;

import  edu . kings . cs480 . BluePrints . Database . Staff ;

public   interface   StaffAdapter < T >   {
    
    
     public   Staff < T >  getStaff ( T staffId );
    
     public   void  deleteStaff ( T staffId );
    
     public   List < Staff < T >>  getAllStaff ();
    
     public   void  updateStaff ( T staffId ,   String  name ,   String  email );
}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Adapters/UserAdapter.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Adapters/UserAdapter.java

/**
 * 
 */
package  edu . kings . cs480 . BluePrints . Adapters ;

import  java . security . NoSuchAlgorithmException ;
import  java . security . spec . InvalidKeySpecException ;
import  java . util . List ;
import  java . util . UUID ;

import  org . springframework . beans . factory . annotation . Autowired ;
import  org . springframework . stereotype . Service ;

import  edu . kings . cs480 . BluePrints . Database . AppUser ;
import  edu . kings . cs480 . BluePrints . Database . AppUserRepository ;
import  edu . kings . cs480 . BluePrints . Database . UserRole ;
import  edu . kings . cs480 . BluePrints . Database . UserRoleRepository ;

/**
 * This represents an Adapter handling data 
 * about the users in the database.
 *
 */
@ Service
public   class   UserAdapter   {
    
     /**Handles the database calls dealing with users. */
    @ Autowired
     private   AppUserRepository  userRepo ;
    
     /**Handles the database calls dealing with user roles. */
    @ Autowired
     private   UserRoleRepository  roleRepo ;
    
     /**
     * Returns the available user roles. 
     * 
     *  @return  the user roles. 
     */
     public   List < UserRole >  getUserRoles ()   {
         return  roleRepo . findAll ();
     }
    
     /**
     * Returns the user with the provided id.
     * 
     *  @param  userId - the id of the user being requested.
     *  @return  the user with the provided id.
     */
     public   AppUser  getUser ( UUID userId )   {
         return  userRepo . findOne ( userId );
     }
    
     /**
     * Returns the users with the provided email.
     * 
     *  @param  email - the email of the user being requested.
     *  @return  the user with the provided email.
     */
     public   AppUser  getUserByEmail ( String  email )   {
         return  userRepo . findByEmail ( email );
     }

     /**
     * Get the user role with the provided id.
     * 
     *  @param  id - the id of the user role being requested.
     *  @return  the user role being requested.
     */
     public   UserRole  getUserRole ( UUID id )   {
         return  roleRepo . findOne ( id );
     }


     /**
     * Assigns the user role corresponding to the provided user role id
     * with the user that corresponds to the user with the provided user id.
     * 
     *  @param  userId - the id of the user being assigned the role.
     *  @param  roleID - the id of the user role being assigned to the user.
     *  @return  whether, or not, the assignment was successful.
     */
     public   boolean   assignRole ( UUID userId ,  UUID roleID )   {
        
         boolean  assigned  =   false ;
        
         UserRole  role  =  getUserRole ( roleID );
        
        
         if ( role  !=   null )   {
            
             AppUser  user  =  getUser ( userId );
            
             if ( user  !=   null )   {
                
                user . setRole ( role );
                userRepo . save ( user );
                assigned  =   true ;
             }
         }
        
         return  assigned ;
        
     }

     /**
     * Deletes a user with the provided id.
     * 
     *  @param  userId - the id of the user being deleted.
     *  @return  whether, or not, the user was successfully deleted.
     */
     public   boolean  deleteUser ( UUID userId )   {
        
         boolean  deleted  =   false ;
        
         AppUser  user  =  getUser ( userId );
        
         if ( user  !=   null )   {
            
            userRepo . delete ( user );
            
            deleted  =   true ;  
         }
        
        
         return  deleted ;
     }
    
     public   boolean  createUser ( String  firstName ,   String  lastName ,   String  email ,  UUID roleId )   {
    
         boolean  created  =   false ;
        
         UserRole  role  =  roleRepo . findOne ( roleId );
        
         if ( role  !=   null )   {
            
             AppUser  newUser  =   new   AppUser ( firstName ,  lastName ,  email );
            newUser . setRole ( role );
             try   {
                newUser . setPassword ( SecurityAdapter . getSaltedHash ( "Kings" ));
                userRepo . save ( newUser );
                
                created  =   true ;
             }   catch   ( NoSuchAlgorithmException  e )   {
                e . printStackTrace ();
             }   catch   ( InvalidKeySpecException  e )   {
                e . printStackTrace ();
             }
            
         }
        
         return  created ;
     }
    
     public   List < AppUser >  getUsers ()   {
         return  userRepo . findAll ();
     }
    
     public   boolean  doesUserExist ( String  email )   {
        
         boolean  exists  =   false ;
        
         AppUser  user  =  userRepo . findByEmail ( email );
        
         if ( user  !=   null )   {
            exists  =   true ;
         }
        
         return  exists ;
     }
    
    
     public   boolean  changeUserPassword ( String  newPassword ,   String  email )   {
         
         boolean  passwordChanged  =   false ;
        
        
         AppUser  user  =  userRepo . findByEmail ( email );
        
        
         if ( user  !=   null )   {
            
             String  hashedPassword ;
            
             try   {
                
                hashedPassword  =   SecurityAdapter . getSaltedHash ( newPassword );
                user . setPassword ( hashedPassword );
            
                userRepo . save ( user );
                passwordChanged  =   true ;
                
             }   catch   ( NoSuchAlgorithmException  e )   {
                e . printStackTrace ();
             }   catch   ( InvalidKeySpecException  e )   {
                e . printStackTrace ();
             }
            
         }
        
         return  passwordChanged ;
     }
    

}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/BluePrintsMain.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/BluePrintsMain.java

/**
 * 
 */
package  edu . kings . cs480 . BluePrints ;

import  org . springframework . boot . SpringApplication ;
import  org . springframework . boot . autoconfigure . SpringBootApplication ;
import  org . springframework . boot . builder . SpringApplicationBuilder ;
import  org . springframework . boot . web . support . SpringBootServletInitializer ;
import  org . springframework . data . jpa . repository . config . EnableJpaRepositories ;

/**
 * This class represents the main launcher for the BluePrints application.
 */
@ EnableJpaRepositories
@ SpringBootApplication
public   class   BluePrintsMain   extends   SpringBootServletInitializer   {

    @ Override
     protected   SpringApplicationBuilder  configure ( SpringApplicationBuilder  application )   {
         return  application . sources ( BluePrintsMain . class );
     }

     /**
     * Starts the BluePrints application.
     * 
     *  @param  args
     *            - the commands provided by the user.
     */
     public   static   void  main ( String []  args )   {
         SpringApplication . run ( BluePrintsMain . class ,  args );
         //testing
        
     }

}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/controllers/BluePrintsController.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/controllers/BluePrintsController.java

package  edu . kings . cs480 . BluePrints . controllers ;

import  org . springframework . beans . factory . annotation . Autowired ;

import  edu . kings . cs480 . BluePrints . Adapters . LoginAdapter ;
import  edu . kings . cs480 . BluePrints . Adapters . LoggingAdapter ;

/**
 * This class represents the base controller for the BluePrints application.
 * 
 */
public   class   BluePrintsController   {

     /** Represents the login redirect command for when the login check fails. */
     protected   static   final   String  REDIRECT_LOGIN ;
    
     /** Represents the command to redirect to the home screen. */
     protected   static   final   String  REDIRECT_HOME ;
    
     /** used to handle calls to the active directory for King's College.*/
    @ Autowired
     protected   LoginAdapter  loginAdapter ;

     /** used to log any errors that may occurs in the application.*/
    @ Autowired
     protected   LoggingAdapter  logger ;

     static   {
        REDIRECT_LOGIN  =   "redirect:/login" ;
        REDIRECT_HOME  =   "redirect:/mapManager" ;
     }

    
}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/controllers/BuildingController.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/controllers/BuildingController.java

package  edu . kings . cs480 . BluePrints . controllers ;

import  java . util . List ;
import  java . util . Map ;
import  java . util . UUID ;

import  javax . servlet . http . HttpSession ;

import  org . json . JSONObject ;
import  org . springframework . beans . factory . annotation . Autowired ;
import  org . springframework . stereotype . Controller ;
import  org . springframework . web . bind . annotation . RequestMapping ;
import  org . springframework . web . bind . annotation . RequestMethod ;
import  org . springframework . web . bind . annotation . RequestParam ;
import  org . springframework . web . bind . annotation . ResponseBody ;
import  org . springframework . web . bind . annotation . SessionAttributes ;

import  edu . kings . cs480 . BluePrints . Adapters . BuildingAdapter ;
import  edu . kings . cs480 . BluePrints . Adapters . FloorAdapter ;
import  edu . kings . cs480 . BluePrints . Database . Building ;
import  edu . kings . cs480 . BluePrints . Database . BuildingCoordinate ;
import  edu . kings . cs480 . BluePrints . Database . Floor ;

import  org . springframework . ui . Model ;

/**
 * This class represents a controller responsible for handling the interactions
 * with the Map Manager Views.
 */
@ Controller
@ SessionAttributes ( "activeUser" )
@ RequestMapping ( "/mapManager" )
public   class   BuildingController   extends   BluePrintsController   {

     /**
     * Used to handle any server side functionality for the map manager page.
     */
    @ Autowired
     private   BuildingAdapter  buildingAdapter ;

     /**
     * Used to handle any server side functionality dealing with floor data.
     */
    @ Autowired
     private   FloorAdapter  floorAdapter ;

     /**
     * Handles displaying information for the Map Manager section.
     * 
     *  @param  model the model for the page. 
     *  @param  session the session. 
     *  @return  the name of the landing page.
     */
    @ RequestMapping ({   "" ,   "/"   })
     public   String  displayBuildings ( Model  model ,   HttpSession  session )   {

         String  landPage  =   "mapManager" ;

         if   ( loginAdapter . checkLogin ( model ,  session ))   {
             List < Building >  buildings  =  buildingAdapter . getBuildings ();
             Map < String ,   List < Floor >>  floors  =  floorAdapter . getFloors ();

             if   ( buildings  !=   null )   {

                model . addAttribute ( "buildings" ,  buildings );
                model . addAttribute ( "floors" ,  floors );

             }   else   {

                model . addAttribute ( "status" ,   "No buildings were found in the system." );
             }

         }   else   {
            landPage  =   BluePrintsController . REDIRECT_LOGIN ;
         }

         return  landPage ;
     }
    
     /**
     * Handles displaying the form for creating a new building.
     *  @param  model the model for the page. 
     *  @param  session the session. 
     *  @return  the name of the landing page.
     */
    @ RequestMapping ( "/newBuilding" )
     public   String  displayNewBuilding ( Model  model ,   HttpSession  session )   {

         String  landPage  =   "newBuilding" ;

         if   ( ! loginAdapter . checkLogin ( model ,  session ))   {

            landPage  =   BluePrintsController . REDIRECT_LOGIN ;
            
         }
        
        model . addAttribute ( "source" ,   "addBtn" );

         return  landPage ;
     }
    
    

     /**
     * Gets the building with the corresponding, provided, id and converts it
     * into a JSON string to be returned.
     * 
     *  @param  buildingId
     *            - the id of the building being requested.
     *  @return  the information of the building in JSON format.
     */
    @ ResponseBody
    @ RequestMapping ( "/getBuildingInfo" )
     public   String  getBuildingInfo ( @ RequestParam ( name  =   "buildingId" ,  required  =   true )  UUID buildingId )   {

         JSONObject  response  =   new   JSONObject ();
         Building  building  =  buildingAdapter . getBuilding ( buildingId );

         if   ( building  !=   null )   {
            response . put ( "buildingName" ,  building . getName ());
         }   else   {

            response . put ( "error" ,   "This building could not be found." );
         }

         return  response . toString ();
     }

     /**
     * Updates the building with the corresponding, provided, id and updates it
     * with the provided information.
     * 
     *  @param  buildingId
     *            - the id of the building being updated.
     *  @param  buildingName
     *            - the new name of the building being updated.
     *  @return  the word "ok", if the building was successfully updated, or
     *         failed if it wasn't.
     */
    @ ResponseBody
    @ RequestMapping ( value  =   "/updateBuilding" ,  method  =   RequestMethod . POST )
     public   String  updateBuilding ( @ RequestParam ( name  =   "buildingId" ,  required  =   true )  UUID buildingId ,
            @ RequestParam ( "buildingName" )   String  buildingName ,  
            @ RequestParam ( name  =   "coordinateData" )   String  coordinateData )   {

         JSONObject  response  =   new   JSONObject ();

         boolean  updated  =  buildingAdapter . updateBuilding ( buildingId ,  buildingName );

         if   ( updated )   {
            
             if ( buildingAdapter . addCoordinates ( buildingId ,  coordinateData ))   {
                response . put ( "status" ,   "ok" );
             }   else   {
                response . put ( "status" ,   "Could not update building coordinates" );
             }
            
         }   else   {
            response . put ( "status" ,   "Could not update building" );
         }

         return  response . toString ();

     }
    
    @ RequestMapping ( "/viewBuilding" )
     public   String  viewBuilding ( @ RequestParam ( name  =   "buildingId" ,  required  =   true )  UUID buildingId ,   Model  model ,   HttpSession  session )   {
        
         String  landPage  =   "newBuilding" ;

         if   ( ! loginAdapter . checkLogin ( model ,  session ))   {
            
            landPage  =   BluePrintsController . REDIRECT_LOGIN ;
            
         }   else   {
             Building  building  =  buildingAdapter . getBuilding ( buildingId );
            
             if ( building  !=   null )   {
                model . addAttribute ( "building" ,  building );
             }   else   {
                model . addAttribute ( "error" ,   "Building Could not be found" );
             }
         }
        
        model . addAttribute ( "source" ,   "viewBtn" );

         return  landPage ;
        
     }
    
    
    
     /**
     * Removes the building with the corresponding, provided, id from the system.
     * 
     *  @param  buildingId - the id of the building being removed. 
     *  @return  a JSON string containing the status on whether, or not, the being was deleted, or not.
     */
    @ ResponseBody
    @ RequestMapping ( "/deleteBuilding" )
     public   String  deleteBuilding ( @ RequestParam ( name  =   "buildingId" ,  required  =   true )  UUID buildingId )   {

         JSONObject  response  =   new   JSONObject ();
        
         Building  building  =  buildingAdapter . getBuilding ( buildingId );
        
         if ( building  !=   null )   {
             boolean  deletedFloors  =  floorAdapter . deleteFloorsInBuilding ( building );
            
             if ( deletedFloors )   {
                
                
                 boolean  deletedBuilding  =  buildingAdapter . deleteBuilding ( buildingId );
                
                 if ( deletedBuilding )   {
                    
                    response . put ( "status" ,   "ok" );
                
                 }   else   {
                    response . put ( "status" ,   "Could not deleted Building." );
                 }
                
             }   else   {
                response . put ( "status" ,   "Could not delete floors." );
             }
            
         }   else   {
            response . put ( "status" ,   "This building does not exist." );
         }
        
        

         return  response . toString ();

     }
    
    
     /**
     * Takes a building name, and creator id and creates a new building, then stores
     * it in the system.
     * 
     *  @param  buildingName - the new name of the building.
     *  @param  creatorId - the id of the user creating the building.
     *  @return  a status on whether, or not, the building was successfully created. In JSON format.
     */
    @ ResponseBody
    @ RequestMapping ( value  =   "/addBuilding" ,  method  =   RequestMethod . POST )
     public   String  addBuidling ( @ RequestParam ( name  =   "buildingName" )   String  buildingName ,  @ RequestParam ( name  =   "creatorId" )  UUID creatorId ,
            @ RequestParam ( name  =   "coordinateData" )   String  coordinateData )   {
        
         JSONObject  response  =   new   JSONObject ();
        
        
         Building  building  =  buildingAdapter . addBuilding ( buildingName ,  creatorId );
        
         if ( building  !=   null )   {
            
             if ( buildingAdapter . addCoordinates ( building . getId (),  coordinateData ))   {
                
                response . put ( "status" ,   "ok" );
                
             }   else   {
                response . put ( "status" ,   "Could not add building coordinates" );
             }
            
            
         }   else   {
            
            response . put ( "status" ,   "Could not add building" );
         }
        
        
         return  response . toString ();
     }
    
    
     /**
     * Gets the building coordinates for the corresponding building id.
     * 
     *  @param  buildingId
     *            - the id of the building the coordinates are being requested for.
     *  @return  the coordinate data being requested.
     */
    @ ResponseBody
    @ RequestMapping ( "/getBuildingCoordinates" )
     public   String  getBuildingCoordinates ( @ RequestParam ( name  =   "buildingId" ,  required  =   true )  UUID buildingId )   {

         JSONObject  response  =   new   JSONObject ();
         BuildingCoordinate  coordinateData  =  buildingAdapter . getCoordinates ( buildingId );

         if   ( coordinateData  !=   null )   {
            response . put ( "coordinateData" ,  coordinateData . getCoordinateData ());
         }   else   {

            response . put ( "error" ,   "The requested coordinate data could not be found." );
         }

         return  response . toString ();
     }
    
    

}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/controllers/CategoriesController.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/controllers/CategoriesController.java

package  edu . kings . cs480 . BluePrints . controllers ;


import  java . util . List ;
import  java . util . UUID ;

import  javax . servlet . http . HttpSession ;

import  org . json . JSONObject ;
import  org . springframework . beans . factory . annotation . Autowired ;
import  org . springframework . stereotype . Controller ;


import  org . springframework . ui . Model ;
import  org . springframework . web . bind . annotation . PostMapping ;
import  org . springframework . web . bind . annotation . RequestMapping ;
import  org . springframework . web . bind . annotation . RequestParam ;
import  org . springframework . web . bind . annotation . ResponseBody ;

import  edu . kings . cs480 . BluePrints . Database . Category ;
import  edu . kings . cs480 . BluePrints . Database . CategoryRepository ;

/**
 * This is a class for a Categories controller which extends the BluePrints Controller.
 */
@ Controller
public   class   CategoriesController   extends   BluePrintsController   {
    
    @ Autowired
     CategoryRepository  categoryRepo ;
    
     /**
     * Controller method for displaying the home categories page. 
     *  @param  model the model for the page. 
     *  @param  session the session. 
     *  @return  the appropriate view. 
     */
    @ RequestMapping ( "/categories" )
     public   String  displayCategories ( Model  model ,   HttpSession  session ){
        
         String  landPage  =   BluePrintsController . REDIRECT_LOGIN ;
        
         if ( super . loginAdapter . checkLogin ( model ,  session )){
             List < Category >  categories   =  categoryRepo . findAll ();
            model . addAttribute ( "categories" ,  categories );
            
            landPage  =   "categories" ;
         }
         return  landPage ;
     }
    
    
    
    @ PostMapping ( value  =   "/category/editCategory" )
    @ ResponseBody
     public   String  editCategory ( @ RequestParam ( "oldName" )   String  oldName ,  @ RequestParam ( "newName" )   String  newName ,  @ RequestParam ( "catId" )  UUID catId ,   HttpSession  session ){
        
         JSONObject  response  =   new   JSONObject ();
         Category  catToBeEdited  =  categoryRepo . findByCategoryID ( catId );
        catToBeEdited . setName ( newName );
        categoryRepo . save ( catToBeEdited );
        response . put ( "msg" ,   "ok" );
         return  response . toString ();
     }
    
    @ PostMapping ( value  =   "/category/deleteCategory" )
    @ ResponseBody
     public   String  deleteCategory ( @ RequestParam ( "catId" )  UUID catId ,   HttpSession  session ){
         JSONObject  response  =   new   JSONObject ();
         Category  catToBeEdited  =  categoryRepo . findByCategoryID ( catId );
        categoryRepo . delete ( catToBeEdited );
        response . put ( "msg" ,   "ok" );
         return  response . toString ();
     }
    
    
    @ PostMapping ( value  =   "/category/addCategory" )
    @ ResponseBody
     public   String  addCategory ( @ RequestParam ( "name" )   String  name ,   HttpSession  session ){
         JSONObject  response  =   new   JSONObject ();
         Category  newCategory  =   new   Category ( name );
        categoryRepo . save ( newCategory );
        response . put ( "msg" ,   "ok" );
         return  response . toString ();
     }
}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/controllers/CommentController.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/controllers/CommentController.java

package  edu . kings . cs480 . BluePrints . controllers ;


import  java . util . UUID ;
import  java . util . List ;

import  org . springframework . web . bind . annotation . RequestMapping ;
import  org . springframework . web . bind . annotation . RequestParam ;
import  org . springframework . web . bind . annotation . ResponseBody ;
import  org . springframework . web . bind . annotation . RequestMethod ;
import  org . json . JSONObject ;
import  org . springframework . beans . factory . annotation . Autowired ;
import  org . springframework . stereotype . Controller ;
import  org . springframework . ui . Model ;

import  edu . kings . cs480 . BluePrints . Adapters . CommentAdapter ;
import  edu . kings . cs480 . BluePrints . Database . Comment ;




/**
 * This class represents the controller which handles loading the floor map page
 * and interacting with its function calls.
 */
@ RequestMapping ( "/mapManager/floor" )
@ Controller
public   class   CommentController   extends   BluePrintsController   {

     /** Used to handle floor data. */
    @ Autowired
     private   CommentAdapter  commentAdapter ;
    


     /**
     * This method adds a comment to the floor with the corresponding floor 
     * id provided.
     * 
     *  @param  floorId - the id of the floor the comment is being added to.
     *  @param  creatorId - the id of the creator of the comment.
     *  @param  commentMsg - the content of the comment.
     * 
     */
    @ RequestMapping ( value  =   "addComment" ,  method  =   RequestMethod . POST )
    @ ResponseBody
     public   String  newFloor ( @ RequestParam ( name  =   "floorId" ,  required  =   true )  UUID floorId ,  
    @ RequestParam ( name  =   "creatorId" ,  required  =   true )  UUID creatorId ,  
    @ RequestParam ( name  =   "commentMsg" ,  required  =   true )   String  commentMsg )   {

         JSONObject  response  =   new   JSONObject ();

         boolean  added  =  commentAdapter . addComment ( floorId ,  creatorId ,  commentMsg );

         if ( added )   {
            response . put ( "status" ,   "ok" );
         }   else   {
            response . put ( "status" ,   "could not add comment." );
         }

         return  response . toString ();
     }

     /**
     * This method updated the comment, with the provided id, with 
     * the provided message content.
     * 
     * 
     *  @param  commentId - the id of the comment being updated.
     *  @param  editorId - the id of the user that is updating this comment.
     *  @param  commentMsg - the content of the comment.
     */
    @ RequestMapping ( value  =   "updateComment" ,  method  =   RequestMethod . POST )
    @ ResponseBody
     public   String  updateComment ( @ RequestParam ( name  =   "commentId" ,  required  =   true )  UUID commentId ,
    @ RequestParam ( name  =   "creatorId" ,  required  =   true )  UUID editorId ,   
    @ RequestParam ( name  =   "commentMsg" ,  required  =   true )   String  commentMsg )   {
                
         JSONObject  response  =   new   JSONObject ();

         boolean  updated  =  commentAdapter . updateComment ( commentId ,  editorId ,  commentMsg );

         if ( updated )   {
            response . put ( "status" ,   "ok" );
         }   else   {
            response . put ( "status" ,   "could not update the comment." );
         }

         return  response . toString ();
     }


     /**
     * These method handles gettings comments and sending them to a page to be turned
     * into table rows for the comment section.
     * 
     *  @param  floorId - the id of the floor the comments belong to.s
     *  @param  model - the model of the page.
     */
    @ RequestMapping ( value  =   "getComments" )
     public   String  getComments ( @ RequestParam ( name  =   "floorId" ,  required  =   true )  UUID floorId ,   Model  model )   {

         String  landPage  =   "getComments" ;


         List < Comment >  floorComments  =  commentAdapter . getFloorComments ( floorId );

         if ( floorComments  !=   null )   {
            model . addAttribute ( "comments" ,  floorComments );
         }

         return  landPage ;
     }
    
}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/controllers/FloorController.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/controllers/FloorController.java

package  edu . kings . cs480 . BluePrints . controllers ;


import  java . util . List ;
import  java . util . UUID ;

import  javax . servlet . http . HttpSession ;
import  org . springframework . ui . Model ;
import  org . springframework . web . bind . annotation . PostMapping ;
import  org . springframework . web . bind . annotation . RequestMapping ;
import  org . springframework . web . bind . annotation . RequestParam ;
import  org . springframework . web . bind . annotation . ResponseBody ;
import  org . json . JSONObject ;
import  org . springframework . beans . factory . annotation . Autowired ;
import  org . springframework . stereotype . Controller ;

import  edu . kings . cs480 . BluePrints . Adapters . CommentAdapter ;
import  edu . kings . cs480 . BluePrints . Adapters . FloorAdapter ;
import  edu . kings . cs480 . BluePrints . Adapters . RoomAdapter ;
import  edu . kings . cs480 . BluePrints . Database . Floor ;
import  edu . kings . cs480 . BluePrints . Database . Room ;
import  edu . kings . cs480 . BluePrints . Database . RoomCoordinates ;
import  edu . kings . cs480 . BluePrints . Database . StaffAssignment ;



/**
 * This class represents the controller which handles loading the floor map page
 * and interacting with its function calls.
 */
@ RequestMapping ( "/mapManager/floor" )
@ Controller
public   class   FloorController   extends   BluePrintsController   {
    
     /** Used to handle room data. */
    @ Autowired
     private   RoomAdapter  roomAdapter ;

     /** Used to handle floor data. */
    @ Autowired
     private   FloorAdapter  floorAdapter ;
    
     /** Used to handle comment data. */
    @ Autowired
     private   CommentAdapter  commentAdapter ;

     /**
     * This method is an end point call which creates a new room and returns 
     * whether, or not it was successful.
     * 
     *  @param  buildingId - the id of the building the floor is being added to.
     *  @param  floorName - the name of the floor being created.
     *  @return  whether, or not the room was created.
     * 
     */
    @ RequestMapping ( "addFloor" )
    @ ResponseBody
     public   String  newFloor ( @ RequestParam ( name  =   "buildingId" ,  required  =   true )  UUID buildingId ,  
    @ RequestParam ( name  =   "floorName" ,  required  =   true )   String  floorName )   {

         System . out . println ( buildingId );
         System . out . println ( floorName );

         JSONObject  response  =   new   JSONObject ();
         Floor  newFloor  =  floorAdapter . addFloor ( buildingId ,  floorName );
        
         if ( newFloor  !=   null )   {
            response . put ( "status" ,   "ok" );
         }   else   {
            response . put ( "status" ,   "Could not add floor." );
         }

         return  response . toString ();
     }

     /**
     * This method is an end point which deletes a floor from the system.
     * 
     *  @param  floorId - the id of the floor being deleted.
     *  @return  whether, or not, the floor was deleted.
     */
    @ PostMapping ( "deleteFloor" )
    @ ResponseBody
     public   String  deleteFloor ( @ RequestParam ( name  =   "floorId" ,  required  =   true )  UUID floorId )   {
        
          JSONObject  response  =   new   JSONObject ();
         
        commentAdapter . clearFloorComments ( floorId );
         
         if ( roomAdapter . clearAllFloorRooms ( floorId )   &&  floorAdapter . deleteFloor ( floorId ))   {
            response . put ( "status" ,   "ok" );
         }   else   {
            response . put ( "status" ,   "Could not delete floor." );
         }

         return  response . toString ();
    
     }
    
     /**
     * This method is an end point which duplicates a floor with the provided id.
     * 
     *  @param  originalFloorId - the id of the floor being duplicated.
     *  @param  newFloorName - the name of the new floor being created.
     *  @return  whether, or not, the floor was successfully duplicated.
     */
    @ PostMapping ( "duplicateFloor" )
    @ ResponseBody
     public   String  duplicateFloor ( @ RequestParam ( name  =   "floorId" ,  required  =   true )  UUID originalFloorId ,  
                              @ RequestParam ( name  =   "newFloorName" ,  required  =   true )   String  newFloorName )   {
        
          JSONObject  response  =   new   JSONObject ();
         
          Floor  originalFloor  =  floorAdapter . getFloor ( originalFloorId );
         
         if ( originalFloor  !=   null )   {
            
             Floor  duplicateFloor  =  floorAdapter . addFloor ( originalFloor . getBuilding (). getId (),  newFloorName );
            
             if ( duplicateFloor  !=   null )   {
                
                 List < Room >  originalRooms  =  roomAdapter . getAllRooms ( originalFloor . getId ());
                
                 for ( Room  room  :  originalRooms )   {
                    
                     Room  newRoom  =  roomAdapter . addRoom ( room . getName (),  duplicateFloor . getId ());
                    
                     if ( newRoom  !=   null )   {
                         RoomCoordinates  coordinates  =  roomAdapter . getRoomCoordinates ( room . getId ());
                        roomAdapter . addRoomCoordinates ( newRoom . getId (),  coordinates . getCoordinateData ());
                         List < StaffAssignment >  roomAssignments  =  roomAdapter . getRoomAssignments ( room . getId ());
                        
                        UUID []  staffIds  =   new  UUID [ roomAssignments . size ()];
                         int  i  =   0 ;
                         for ( StaffAssignment  assignment  :  roomAssignments )   {
                            staffIds [ i ]   =  assignment . getStaffId ();
                         }
                        
                        roomAdapter . assignStaffToRooms ( newRoom . getId (),  staffIds );
                        
                     }
                 }
                
                
                response . put ( "status" ,   "ok" );
             }
            
            
            
         }   else   {
            
            response . put ( "status" ,   "Could not delete floor." );
         }

         return  response . toString ();
    
     }
    
    
    
    
     /**
     * This method handles loading the floor editing page.
     * 
     *  @param  floorId - the id of the floor being edited.
     *  @param  model the model for the page. 
     *  @param  session the session. 
     *  @return  the name of the landing page.
     */
    @ RequestMapping ( "floorEditor" )
     public   String  floorEditor ( @ RequestParam ( name  =   "floorId" ,  required  =   true )  UUID floorId ,   Model  model ,   HttpSession  session )   {
         String  landPage  =   "floorEditor" ;

         if ( loginAdapter . checkLogin ( model ,  session ))   {
             Floor  floor  =  floorAdapter . getFloor ( floorId );

             if ( floor  !=   null )   {

                model . addAttribute ( "floor" ,  floor );
             }   else   {

                model . addAttribute ( "error" ,   "Please Provide a floor ID." );
             }
         }   else   {
            landPage  =   BluePrintsController . REDIRECT_LOGIN ;
         }

         return  landPage ;
     }
    
    
    
    
    
}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/controllers/LoginController.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/controllers/LoginController.java

/**
 * 
 */
package  edu . kings . cs480 . BluePrints . controllers ;

import  java . util . logging . Level ;

import  javax . servlet . http . HttpSession ;

import  org . springframework . stereotype . Controller ;
import  org . springframework . ui . Model ;
import  org . springframework . web . bind . annotation . RequestMapping ;
import  org . springframework . web . bind . annotation . RequestMethod ;
import  org . springframework . web . bind . annotation . RequestParam ;
import  org . springframework . web . bind . annotation . SessionAttributes ;

/**
 * This class represents the main controller for the BluePrints site.
 */
@ Controller
@ SessionAttributes ( "activeUser" )
public   class   LoginController   extends   BluePrintsController   {
     /**
     * Handles setting up the home page.
     * 
     *  @param  model
     *            - the model used to store attributes that can be used in the page.
     *  @param  session
     *            - the session which keeps track of the currently active user.
     * 
     *  @return  the home page, if there is an active user. The login page, if not.
     */
    @ RequestMapping ( value  =   "" )
     public   String  index ( Model  model ,   HttpSession  session )   {

         String  landPage  =   BluePrintsController . REDIRECT_LOGIN ;

         if   ( super . loginAdapter . checkLogin ( model ,  session ))   {

            landPage  =   "index" ;
         }

         return  landPage ;

     }

     /**
     * Handles displaying the login page.
     * 
     *  @param  model
     *            - the model used to store attributes that can be used in the page.
     *  @param  session
     *            - the session which keeps track of the currently active user.
     *  @return  The login page.
     */
    @ RequestMapping ( value  =   "/login" ,  method  =   RequestMethod . GET )
     public   String  displayLogin ( Model  model ,   HttpSession  session )   {

         String  landPage  =   "login" ;

         if   ( loginAdapter . checkLogin ( model ,  session ))   {

            landPage  =   BluePrintsController . REDIRECT_LOGIN ;
         }

         return  landPage ;
     }

     /**
     * Handles processing the credentials submitted by the login page.
     * 
     *  @param  email
     *            - the provided email by the login page.
     *  @param  password
     *            - the provided password by the login page.
     *  @param  model
     *            - the model used to store attributes that can be used in the page.
     *  @param  session
     *            - the session which keeps track of the currently active user.
     *  @return  the home page, if the login was successful. The login page with an
     *         error, if not.
     */
    @ RequestMapping ( value  =   "/login" ,  method  =   RequestMethod . POST )
     public   String  submitLogin ( @ RequestParam ( name  =   "email" ,  required  =   true )   String  email ,
            @ RequestParam ( name  =   "password" ,  required  =   true )   String  password ,   Model  model ,   HttpSession  session )   {

         String  landPage  =   "login" ;
         String  userEmail  =  email . trim ();

         if   ( loginAdapter . login ( userEmail ,  password ,  session ))   {

            landPage  =   BluePrintsController . REDIRECT_HOME ;
            logger . log ( Level . INFO ,   "Logged in Successful" );
         }   else   {
            model . addAttribute ( "error" ,   "Please check your email and password, then try again." );
            model . addAttribute ( "email" ,  userEmail );
         }

         return  landPage ;
     }

     /**
     * Logs the user out of the system, and returns the user to the login page.
     * 
     *  @param  model
     *            - the model used to store attributes that can be used in the page
     *            currently being viewed by the user.
     *  @param  session
     *            - the session which keeps track of the currently active user.
     *  @return  the redirect command to the login page.
     */
    @ RequestMapping ( "/logout" )
     public   String  logout ( Model  model ,   HttpSession  session )   {

        session . invalidate ();
        model . asMap (). remove ( "activeUser" );

         return   BluePrintsController . REDIRECT_LOGIN ;
     }

}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/controllers/RoomController.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/controllers/RoomController.java

package  edu . kings . cs480 . BluePrints . controllers ;

import  java . util . LinkedList ;
import  java . util . List ;
import  java . util . UUID ;

import  org . json . JSONObject ;
import  org . springframework . beans . factory . annotation . Autowired ;
import  org . springframework . stereotype . Controller ;
import  org . springframework . web . bind . annotation . PostMapping ;
import  org . springframework . web . bind . annotation . RequestBody ;
import  org . springframework . web . bind . annotation . RequestMapping ;
import  org . springframework . web . bind . annotation . RequestParam ;
import  org . springframework . web . bind . annotation . ResponseBody ;

import  edu . kings . cs480 . BluePrints . Adapters . RoomAdapter ;
import  edu . kings . cs480 . BluePrints . Adapters . StaffAdapter ;
import  edu . kings . cs480 . BluePrints . Adapters . Mock . MockStaffAdapter ;
import  edu . kings . cs480 . BluePrints . Database . Room ;
import  edu . kings . cs480 . BluePrints . Database . RoomCoordinates ;
import  edu . kings . cs480 . BluePrints . Database . Staff ;
import  edu . kings . cs480 . BluePrints . Database . StaffAssignment ;

@ Controller
public   class   RoomController   {

    @ Autowired
     RoomAdapter  roomAdapter ;
    
    
     private   StaffAdapter < UUID >  staffAdapter ;
    
     public   RoomController ()   {
        staffAdapter  =   new   MockStaffAdapter ();
     }

    @ RequestMapping ( "room/getRoom" )
    @ ResponseBody
     public   String  getRoom ( @ RequestParam ( name  =   "roomId" ,  required  =   true )  UUID roomId )   {

         JSONObject  resp  =   new   JSONObject ();

         System . out . println ( roomId );

         Room  room  =  roomAdapter . getRoom ( roomId );

         if   ( room  !=   null )   {

             RoomCoordinates  coordinates  =  roomAdapter . getRoomCoordinates ( roomId );

             if   ( coordinates  !=   null )   {

                resp . put ( "roomName" ,  room . getName ());
                resp . put ( "roomCoordinateData" ,  coordinates . getCoordinateData ());

             }   else   {

                resp . put ( "status" ,   "Could not find room coordinate data" );
             }

         }   else   {

            resp . put ( "status" ,   "Could not find room" );
         }

         return  resp . toString ();

     }

    @ PostMapping ( "room/clearFloor" )
    @ ResponseBody
     public   String  clearFloor ( @ RequestParam ( name  =   "floorId" ,  required  =   true )  UUID floorId )   {

         JSONObject  resp  =   new   JSONObject ();

         boolean  cleared  =  roomAdapter . clearAllFloorRooms ( floorId );

         if   ( cleared )   {

            resp . put ( "status" ,   "ok" );
         }   else   {

            resp . put ( "status" ,   "Encountered error when trying to clear the floor: " );
         }

         return  resp . toString ();

     }

    @ PostMapping ( "room/deleteRoom" )
    @ ResponseBody
     public   String  deleteRoom ( @ RequestParam ( name  =   "roomId" ,  required  =   true )  UUID roomId )   {

         JSONObject  resp  =   new   JSONObject ();

         boolean  deleted  =  roomAdapter . deleteRoom ( roomId );

         if   ( deleted )   {

            resp . put ( "status" ,   "ok" );
         }   else   {

            resp . put ( "status" ,   "Encountered error when trying to deleted the room with ID: "   +  roomId );
         }

         return  resp . toString ();

     }

    @ PostMapping ( "room/updateRoom" )
    @ ResponseBody
     public   String  updateRoom ( @ RequestParam ( name  =   "roomId" ,  required  =   true )  UUID roomId ,
            @ RequestParam ( name  =   "roomName" ,  required  =   true )   String  newRoomName ,
            @ RequestParam ( name  =   "roomCoordinateData" ,  required  =   true )   String  newRoomCoordinateData )   {

         JSONObject  resp  =   new   JSONObject ();

         boolean  updatedRoom  =  roomAdapter . updateRoom ( roomId ,  newRoomName );

         if   ( updatedRoom )   {

             boolean  updateRoomCoordinateData  =  roomAdapter . updateRoomCoordinates ( roomId ,  newRoomCoordinateData );

             if   ( updateRoomCoordinateData )   {

                resp . put ( "status" ,   "ok" );
             }   else   {

                resp . put ( "status" ,   "Encountered error when updating room coordinate data." );
             }

         }   else   {

            resp . put ( "status" ,   "Encountered error when updating room." );
         }

         return  resp . toString ();

     }

    @ PostMapping ( "room/addRoom" )
    @ ResponseBody
     public   String  addRoom ( @ RequestParam ( name  =   "floorId" ,  required  =   true )  UUID floorId ,
            @ RequestParam ( name  =   "roomName" ,  required  =   true )   String  newRoomName ,
            @ RequestParam ( name  =   "roomCoordinateData" ,  required  =   true )   String  roomCoordinateData )   {

         JSONObject  resp  =   new   JSONObject ();

         Room  room  =  roomAdapter . addRoom ( newRoomName ,  floorId );

         if   ( room  !=   null )   {

             boolean  addedCoordinate  =  roomAdapter . addRoomCoordinates ( room . getId (),  roomCoordinateData );

             if   ( addedCoordinate )   {

                resp . put ( "roomId" ,  room . getId ());

             }   else   {
                resp . put ( "status" ,   "Could not add room coordinate data." );
             }

         }   else   {

            resp . put ( "status" ,   "Could not add room." );
         }

         return  resp . toString ();

     }

    @ RequestMapping ( "room/getRoomCoordinates" )
    @ ResponseBody
     public   String  getRoomCoordinates ( @ RequestParam ( name  =   "floorId" ,  required  =   true )  UUID floorId )   {

         JSONObject  resp  =   new   JSONObject ();

         List < RoomCoordinates >  roomCoordinates  =  roomAdapter . getAllRoomCoordinates ( floorId );

         if   ( roomCoordinates  !=   null )   {

            resp . put ( "roomCoordinates" ,  roomCoordinates );

         }   else   {

            resp . put ( "status" ,   "Could not retrieve room coordinates" );
         }

         return  resp . toString ();

     }

    @ RequestMapping ( "room/getRooms" )
    @ ResponseBody
     public   String  getRooms ( @ RequestParam ( name  =   "floorId" ,  required  =   true )  UUID floorId )   {

         JSONObject  resp  =   new   JSONObject ();

         List < Room >  rooms  =  roomAdapter . getAllRooms ( floorId );

         if   ( rooms  !=   null )   {

             List < JSONObject >  roomJSONs  =   new   LinkedList <> ();

             for   ( Room  room  :  rooms )   {
                 JSONObject  roomJSON  =   new   JSONObject ();
                roomJSON . put ( "id" ,  room . getId ());
                roomJSON . put ( "name" ,  room . getName ());
                roomJSONs . add ( roomJSON );
             }

            resp . put ( "rooms" ,  roomJSONs );

         }   else   {

            resp . put ( "status" ,   "Could not retrieve room" );
         }

         return  resp . toString ();

     }

    @ PostMapping ( "room/assignStaffToRoom" )
    @ ResponseBody
     public   String  assignStaffToRoom ( @ RequestParam ( name  =   "roomId" ,  required  =   true )  UUID roomId ,
            @ RequestBody  @ RequestParam ( name  =   "staffIds[]" ,  required  =   true )  UUID []  staffIds )   {

         JSONObject  resp  =   new   JSONObject ();
         boolean  assigned  =  roomAdapter . assignStaffToRooms ( roomId ,  staffIds );

         if   ( assigned )   {

            resp . put ( "status" ,   "ok" );

         }   else   {
            resp . put ( "status" ,   "Could not set staff." );
         }

         return  resp . toString ();

     }
    
    @ RequestMapping ( "room/getRoomStaff" )
    @ ResponseBody
     public   String  getRoomStaff ( @ RequestParam ( name  =   "roomId" ,  required  =   true )  UUID roomId )   {

         JSONObject  resp  =   new   JSONObject ();
        
         List < StaffAssignment >  assignments  =  roomAdapter . getRoomAssignments ( roomId );
        
         if   ( assignments  !=   null )   {
            
             List < JSONObject >  staffJsonList  =   new   LinkedList <> ();

             for   ( StaffAssignment  assignment  :  assignments )   {
                
                 Staff < UUID >  staff  =  staffAdapter . getStaff ( assignment . getStaffId ());
                
                 JSONObject  staffJson  =   new   JSONObject ();
                staffJson . put ( "id" ,  assignment . getStaffId ());
                staffJson . put ( "name" ,  staff . getName ());
                staffJsonList . add ( staffJson );
             }

            resp . put ( "staff" ,  staffJsonList );

         }   else   {

            resp . put ( "status" ,   "Could not retrieve staff" );
         }


         return  resp . toString ();

     }
    
    @ PostMapping ( "room/unassignStaff" )
    @ ResponseBody
     public   String  unassignStaff ( @ RequestParam ( name  =   "roomId" ,  required  =   true )  UUID roomId ,
                                @ RequestParam ( name  =   "staffId" ,  required  =   true )  UUID staffId )   {

         JSONObject  resp  =   new   JSONObject ();
        
         boolean  unassigned  =  roomAdapter . unassignStaff ( staffId ,  roomId );
        
         if   ( unassigned )   {
            resp . put ( "status" ,   "ok" );
         }   else   {

            resp . put ( "status" ,   "Could not unassign staff" );
         }


         return  resp . toString ();

     }
    
    @ PostMapping ( "room/unassignAllStaff" )
    @ ResponseBody
     public   String  unassignAllStaff ( @ RequestParam ( name  =   "roomId" ,  required  =   true )  UUID roomId )   {

         JSONObject  resp  =   new   JSONObject ();
        
         boolean  unassigned  =  roomAdapter . unassignAllStaff ( roomId );
        
         if   ( unassigned )   {
            resp . put ( "status" ,   "ok" );
         }   else   {

            resp . put ( "status" ,   "Could not unassign staff" );
         }


         return  resp . toString ();

     }
    
    

}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/controllers/StaffController.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/controllers/StaffController.java

package  edu . kings . cs480 . BluePrints . controllers ;

import  java . util . LinkedList ;
import  java . util . List ;
import  java . util . UUID ;

import  org . json . JSONObject ;
import  org . springframework . beans . factory . annotation . Autowired ;
import  org . springframework . stereotype . Controller ;
import  org . springframework . web . bind . annotation . RequestMapping ;
import  org . springframework . web . bind . annotation . RequestParam ;
import  org . springframework . web . bind . annotation . ResponseBody ;

import  edu . kings . cs480 . BluePrints . Adapters . RoomAdapter ;
import  edu . kings . cs480 . BluePrints . Adapters . StaffAdapter ;
import  edu . kings . cs480 . BluePrints . Adapters . Mock . MockStaffAdapter ;
import  edu . kings . cs480 . BluePrints . Database . Staff ;
import  edu . kings . cs480 . BluePrints . Database . StaffAssignment ;

@ Controller
public   class   StaffController   extends   BluePrintsController   {
    
    
    
     private   StaffAdapter < UUID >  staffAdapter ;
    
    @ Autowired
     private   RoomAdapter  roomAdapter ;
    
    
     public   StaffController ()   {
        staffAdapter  =   new   MockStaffAdapter ();
     }
    
    @ RequestMapping ( "staff/getAllStaff" )
    @ ResponseBody
     public   String  getAllStaff ( @ RequestParam ( name  =   "roomId" )  UUID roomId )   {
        
         JSONObject  resp  =   new   JSONObject ();
        
         List < Staff < UUID >>   staff  =  staffAdapter . getAllStaff ();
        
         List < StaffAssignment >  assignments  =  roomAdapter . getRoomAssignments ( roomId );
        
         if ( staff  !=   null   &&  assignments  !=   null )   {
            
             for ( StaffAssignment  assignment  :  assignments )   {
                
                 Staff < UUID >  addedStaff  =  staffAdapter . getStaff ( assignment . getStaffId ());
                
                staff . remove ( addedStaff );
                
             }
            
             List < JSONObject >  staffJSONs  =   new   LinkedList <> ();
            
             for ( Staff < UUID >  current  :  staff )   {
                
                 System . out . println ( current . getName ());
                
                 JSONObject  staffJSON  =   new   JSONObject ();
                staffJSON . put ( "id" ,  current . getStaffId ());
                staffJSON . put ( "name" ,  current . getName ());
                staffJSON . put ( "email" ,  current . getStaffEmail ());
                staffJSONs . add ( staffJSON );
             }
            
            resp . put ( "staff" ,  staffJSONs );
        
         }   else   {
            
            resp . put ( "status" ,   "Could not retrieve room" );
         }
        
         return  resp . toString ();  
     }

    
    
}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/controllers/TestDisplayMap.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/controllers/TestDisplayMap.java

package  edu . kings . cs480 . BluePrints . controllers ;

import  org . springframework . stereotype . Controller ;
import  org . springframework . web . bind . annotation . RequestMapping ;

@ Controller
public   class   TestDisplayMap   {

    @ RequestMapping ( "/testDisplayMap" )
     public   String  index (){
         return   "mapDisplay" ;
     }
}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/controllers/UserManagementController.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/controllers/UserManagementController.java

package  edu . kings . cs480 . BluePrints . controllers ;

import  java . security . NoSuchAlgorithmException ;
import  java . security . spec . InvalidKeySpecException ;
import  java . util . List ;
import  java . util . UUID ;

import  javax . servlet . http . HttpSession ;

import  org . json . JSONObject ;
import  org . springframework . beans . factory . annotation . Autowired ;
import  org . springframework . stereotype . Controller ;
import  org . springframework . ui . Model ;
import  org . springframework . web . bind . annotation . PostMapping ;
import  org . springframework . web . bind . annotation . RequestMapping ;
import  org . springframework . web . bind . annotation . RequestMethod ;
import  org . springframework . web . bind . annotation . RequestParam ;
import  org . springframework . web . bind . annotation . ResponseBody ;
import  org . springframework . web . bind . annotation . SessionAttributes ;

import  edu . kings . cs480 . BluePrints . Adapters . SecurityAdapter ;
import  edu . kings . cs480 . BluePrints . Adapters . UserAdapter ;
import  edu . kings . cs480 . BluePrints . Database . AppUser ;
import  edu . kings . cs480 . BluePrints . Database . UserRole ;

/**
 * This class represents a controller which handles sending and receiving data
 * for the user management site.
 * 
 */
@ Controller
@ SessionAttributes ( "activeUser" )
public   class   UserManagementController   extends   BluePrintsController   {

     /** Used to handle calls to the blueprints database. */
    @ Autowired
     private   UserAdapter  userAdapter ;

     /**
     * Returns a user with the corresponding king's id provided.
     * 
     *  @param  kingsId
     *            - the king's id of the user being requested.
     *  @return  A json with the provided user information.
     */
    @ ResponseBody
    @ RequestMapping ( value  =   "users/getUserInformation" ,  method  =   RequestMethod . GET )
     public   String  getUserInformation ( @ RequestParam ( name  =   "userId" ,  required  =   true )  UUID userId )   {

         // TODO add actual database logic
         AppUser  user  =  userAdapter . getUser ( userId );
         JSONObject  jsonObj  =   new   JSONObject ();

         if   ( user  !=   null )   {
            jsonObj . put ( "FirstName" ,  user . getFirstName ());
            jsonObj . put ( "LastName" ,  user . getLastName ());
            jsonObj . put ( "Email" ,  user . getEmail ());
            jsonObj . put ( "RoleID" ,  user . getRole (). getId ());
            jsonObj . put ( "Role" ,  user . getRole (). getName ());
         }

         return  jsonObj . toString ();

     }

     /**
     * Updates the user which corresponds to the provided king's id, with the
     * provided user information.
     * 
     *  @param  userId
     *            - the id for the user being updated.
     *  @param  roleId
     *            - the new user role for the user.
     *  @return  a message on whether, or not, the update was successful.
     */
    @ PostMapping ( value  =   "users/updateUserInformation" )
     public  @ ResponseBody   String  updateUserInformation ( @ RequestParam ( "userId" )  UUID userId ,
            @ RequestParam ( "userRole" )  UUID roleId )   {
         // TODO when database stuff is figured out.
         JSONObject  response  =   new   JSONObject ();

         boolean  assigned  =  userAdapter . assignRole ( userId ,  roleId );

         if   ( assigned )   {
            response . put ( "msg" ,   "ok" );
         }   else   {
            response . put ( "msg" ,   "Could not Update User." );
         }

         return  response . toString ();
     }

     /**
     * Deletes the user which corresponds to the provided king's id, with the
     * provided user information.
     * 
     *  @param  userId
     *            - the id for the user being updated.
     *  @return  a message on whether, or not, the update was successful.
     */
    @ PostMapping ( value  =   "users/deleteUser" )
     public  @ ResponseBody   String  deleteUser ( @ RequestParam ( "userId" )  UUID userId )   {
         // TODO when database stuff is figured out.
         JSONObject  response  =   new   JSONObject ();

         boolean  deleted  =  userAdapter . deleteUser ( userId );

         if   ( deleted )   {
            response . put ( "msg" ,   "ok" );
         }   else   {
            response . put ( "msg" ,   "Could not delete user." );
         }

         return  response . toString ();
     }

     /**
     * Deletes the user which corresponds to the provided king's id, with the
     * provided user information.
     * 
     *  @param  email
     *            - the email of the user being added.
     *  @param  roleId
     *            - the new user role for the user.
     *  @param  session
     *            - the session which keeps track of the currently active user.
     *  @return  a message on whether, or not, the update was successful.
     */
    @ PostMapping ( value  =   "users/addUser" )
     public  @ ResponseBody   String  addUser ( @ RequestParam ( "firstName" )   String  firstName ,
            @ RequestParam ( "lastName" )   String  lastName ,  @ RequestParam ( "email" )   String  email ,
            @ RequestParam ( "userRole" )  UUID roleId ,   HttpSession  session )   {
         // TODO when database stuff is figured out.
         JSONObject  response  =   new   JSONObject ();

         String  msg  =   null ;

         if   ( ! userAdapter . doesUserExist ( email ))   {

             boolean  added  =  userAdapter . createUser ( firstName ,  lastName ,  email ,  roleId );

             if   ( added )   {

                msg  =   "ok" ;
             }   else   {

                msg  =   "Could not add user." ;
             }

         }   else   {
            msg  =   "This user already exists." ;
         }

        response . put ( "msg" ,  msg );

         return  response . toString ();
     }

     /**
     * Handles the user management display page.
     * 
     *  @param  model
     *            - the model used to store attributes that can be used in the page.
     *  @param  session
     *            - the session which keeps track of the currently active user.
     *  @return  the user management page, if there is an active user. The login page,
     *         if not.
     */
    @ RequestMapping ( "users" )
     public   String  displayUsers ( Model  model ,   HttpSession  session )   {

         String  landPage  =   BluePrintsController . REDIRECT_LOGIN ;

         if   ( loginAdapter . checkLogin ( model ,  session ))   {

             List < AppUser >  users  =  userAdapter . getUsers ();
             List < UserRole >  roles  =  userAdapter . getUserRoles ();

            model . addAttribute ( "users" ,  users );
            model . addAttribute ( "roles" ,  roles );

            landPage  =   "users" ;

         }

         return  landPage ;
     }

     /**
     * Handles the password reset page.
     * 
     *  @param  model
     *            - the model used to store attributes that can be used in the page.
     *  @param  session
     *            - the session which keeps track of the currently active user.
     *  @return  the password reset page, if there is an active user. The login page,
     *         if not.
     */
    @ RequestMapping ( "passwordReset" )
     public   String  displayPasswordReset ( Model  model ,   HttpSession  session )   {

         String  landPage  =   "passwordReset" ;

         return  landPage ;
     }

     /**
     * Deletes the user which corresponds to the provided king's id, with the
     * provided user information.
     * 
     *  @param  email
     *            - the email of the user being added.
     *  @param  newPassword
     *            - the password for the user.
     *  @param  session
     *            - the session which keeps track of the currently active user.
     *  @return  a message on whether, or not, the update was successful.
     */
    @ PostMapping ( value  =   "users/changePassword" )
     public  @ ResponseBody   String  changeUserPassword ( @ RequestParam ( "email" )   String  email ,
            @ RequestParam ( "oldPassword" )   String  oldPassword ,
            @ RequestParam ( "newPassword" )   String  newPassword ,
             HttpSession  session )   {
         JSONObject  response  =   new   JSONObject ();

         String  msg  =   null ;

         AppUser  user  =  userAdapter . getUserByEmail ( email );

         System . out . println ( user . getFirstName ());
         try   {
             if   ( user  !=   null   &&   SecurityAdapter . check ( oldPassword ,  user . getPassword ()))   {

                 boolean  changed  =  userAdapter . changeUserPassword ( newPassword ,  email );

                 if   ( changed )   {

                    msg  =   "ok" ;
                 }   else   {

                    msg  =   "Error encountered when changing password." ;
                 }

             }   else   {
                msg  =   "Incorrect Email, or Password. Please check that your credentials are correct and try again." ;
             }

         }   catch   ( NoSuchAlgorithmException   |   InvalidKeySpecException  e )   {
            e . printStackTrace ();
            msg  =   "Issue encountered when verifying user." ;
         }

        response . put ( "msg" ,  msg );

         return  response . toString ();
     }

}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/AppUser.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/AppUser.java

/**
 * 
 */
package  edu . kings . cs480 . BluePrints . Database ;

import  java . util . UUID ;

import  javax . persistence . Column ;
import  javax . persistence . Entity ;
import  javax . persistence . Id ;
import  javax . persistence . ManyToOne ;
import  javax . persistence . JoinColumn ;
import  javax . persistence . Table ;

/**
 * This class represents a entry for the app_user table in the BluePrints
 * database.
 *
 */
@ Entity
@ Table ( name  =   "app_user" )
public   class   AppUser   {

     /** Keeps track of the primary key for the app user. */
    @ Id
    @ Column ( name  =   "user_id" )
     private  UUID id ;

     /** Keeps track of the app user's first name. */
    @ Column ( name  =   "first_name" )
     private   String  firstName ;

     /** Keeps track of the app user's last name. */
    @ Column ( name  =   "last_name" )
     private   String  lastName ;

     /** Keeps track of the app user's email address. */
    @ Column ( name  =   "email" )
     private   String  email ;
    
     /**Keeps track of the password for the user. */
    @ Column ( name  =   "password" )
     private   String  password ;

     /** Keeps track of the user assigned to the role. */
    @ ManyToOne
    @ JoinColumn ( name  =   "role_id" )
     private   UserRole  role ;

     /**
     * Creates a new user with the provided id number and email.
     * 
     *  @param  newFirstName
     *            - the first name of the user being created.
     *  @param  newLastName
     *            - the last name of the user being created.
     *  @param  newEmail
     *            - the email for the new user being created.
     */
     public   AppUser ( String  newFirstName ,   String  newLastName ,   String  newEmail )   {
        id  =  UUID . randomUUID ();
        firstName  =  newFirstName ;
        lastName  =  newLastName ;
        email  =  newEmail ;

     }

     /**
     * Creates a new instance of AppUser and initializes it's fields.
     */
     public   AppUser ()   {
        id  =   null ;
        firstName  =   null ;
        lastName  =   null ;
        email  =   null ;
     }

     /**
     * Return's the user's unique id.
     * 
     *  @return  the unique id for the user.
     */
     public  UUID getId ()   {
         return  id ;
     }

     /**
     * Returns the first name of the user.
     * 
     *  @return  the first name of the user.
     */
     public   String  getFirstName ()   {
         return  firstName ;
     }

     /**
     * Changes the first name of the user with the provided name.
     * 
     *  @param  firstName
     *            - the new first name for the user.
     */
     public   void  setFirstName ( String  firstName )   {
         this . firstName  =  firstName ;
     }

     /**
     * Returns the last name of the user.
     * 
     *  @return  the last name of the user.
     */
     public   String  getLastName ()   {
         return  lastName ;
     }

     /**
     * Changes the last name of the user to the provided last name.
     * 
     *  @param  lastName
     *            - the new last name for the user.
     */
     public   void  setLastName ( String  lastName )   {
         this . lastName  =  lastName ;
     }

     /**
     * Returns the email for the user.
     * 
     *  @return  the email for the user.
     */
     public   String  getEmail ()   {
         return  email ;
     }

     /**
     * Changes the email for the user to the provided email.
     * 
     *  @param  email
     *            - the new email for the user.
     */
     public   void  setEmail ( String  email )   {
         this . email  =  email ;
     }

     /**
     * Returns the role assigned to this user.
     * 
     *  @return  the role assigned to this user.
     */
     public   UserRole  getRole ()   {
         return  role ;
     }

     /**
     * Changes the role assigned to this user, to the 
     * provided role.
     * 
     *  @param  role - the new role for the user.
     */
     public   void  setRole ( UserRole  role )   {
         this . role  =  role ;
     }
    
     /**
     * Returns the user's password.
     * 
     *  @return  the user's password.
     */
     public   String  getPassword ()   {
         return  password ;
     }
    
     /**
     * Updates the password to the password provided.
     * 
     *  @param  newPassword
     */
     public   void  setPassword ( String  newPassword )   {
        password  =  newPassword ;
     }
    
    

}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/AppUserRepository.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/AppUserRepository.java

/**
 * 
 */
package  edu . kings . cs480 . BluePrints . Database ;

import  java . util . UUID ;

import  org . springframework . data . domain . Page ;
import  org . springframework . data . domain . Pageable ;
import  org . springframework . data . jpa . repository . JpaRepository ;
import  org . springframework . stereotype . Repository ;

/**
 * This interface represents a repository for the AppUser class. It can be used
 * to query data from the app_user table in the BluePrints database.
 *
 */
@ Repository
public   interface   AppUserRepository   extends   JpaRepository < AppUser ,  UUID >   {

     /**
     * Returns a user with the matching email address.
     * 
     *  @param  email
     *            - the email address being used to filter the AppUser table
     *            data.
     *  @return  the app user that has the provided email.
     */
     AppUser  findByEmail ( String  email );
    
    
     /**
     * Return a set of users using the provided pageable  configuration.
     * 
     *  @param  pageConfig - the pageable configurations.
     *  @return  the page data with the set of users.
     */
     Page < AppUser >  findAll ( Pageable  pageConfig );

}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/Building.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/Building.java

/**
 * 
 */
package  edu . kings . cs480 . BluePrints . Database ;

import  java . util . UUID ;

import  javax . persistence . Column ;
import  javax . persistence . Entity ;
import  javax . persistence . Id ;
import  javax . persistence . JoinColumn ;
import  javax . persistence . ManyToOne ;
import  javax . persistence . Table ;

import  org . hibernate . annotations . NotFound ;
import  org . hibernate . annotations . NotFoundAction ;

/**
 * This class represents a building entity in the database, which 
 * keeps track of its name and the person who created it.
 */
@ Entity
@ Table ( name  =   "building" )
public   class   Building   {

    
     /** Keeps track of the buidling's id. */
    @ Id
    @ Column ( name  =   "building_id" )
     private  UUID id ;
    
     /** Keeps track of the name of the building. */
    @ Column ( name  =   "name" )
     private   String  name ;
    
     /** Keeps track of the user who created the building. */
    @ NotFound ( action  =   NotFoundAction . IGNORE )
    @ ManyToOne
    @ JoinColumn ( name  =   "created_by" )
     private   AppUser  creator ;
    
    
     /**
     * Creates a building and initializes it's fields.
     */
     public   Building ()   {
        id  =   null ;
        name  =   null ;
        creator  =   null ;
     }
    
     /**
     * Creates a new building with the provided name, and assigns which user is creating it.
     * 
     *  @param  newName - the name of the building being created.
     *  @param  newCreator - the user creating this new building.
     */
     public   Building ( String  newName ,   AppUser  newCreator )   {
        id  =  UUID . randomUUID ();
        name  =  newName ;
        creator  =  newCreator ;
     }

     /**
     * Returns the name of the building.
     * 
     *  @return  the name of the building.
     */
     public   String  getName ()   {
         return  name ;
     }

     /**
     * Changes the name of the building to the new name provided.
     * 
     *  @param  name - the new name for the building.
     */
     public   void  setName ( String  name )   {
         this . name  =  name ;
     }

     /**
     * Returns the unique ID for the building. 
     * 
     *  @return  the building's ID.
     */
     public  UUID getId ()   {
         return  id ;
     }

     /**
     * Returns the user who created the building. 
     * 
     *  @return  the creator of the building.
     */
     public   AppUser  getCreator ()   {
         return  creator ;
     }
    
    
    
}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/BuildingCoordinate.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/BuildingCoordinate.java

/**
 * 
 */
package  edu . kings . cs480 . BluePrints . Database ;

import  java . util . UUID ;

import  javax . persistence . Column ;
import  javax . persistence . Entity ;
import  javax . persistence . Id ;
import  javax . persistence . JoinColumn ;
import  javax . persistence . ManyToOne ;
import  javax . persistence . Table ;

import  org . hibernate . validator . constraints . Length ;

/**
 * This class represents coordinates data for a 
 * building. 
 */
@ Entity  
@ Table ( name  =   "building_coordinate" )
public   class   BuildingCoordinate   {
    
    
     /**Keeps track of the id for the building coordinate. */
    @ Id
    @ Column ( name  =   "coordinate_id" )
     private  UUID id ;
    
    
     /**Keeps track of coordinate data.*/
    @ Column ( name  =   "coordinate_data" ,  length  =   4000 )
     private   String  coordinateData ;  
    
    
     /**Keeps track of the building the coordinate data belongs to.*/
    @ ManyToOne
    @ JoinColumn ( name  =   "building_id" )
     private   Building  building ;
    
    
     /**
     * Constructs a new BuildingCoordinate and initializes its
     * fields.
     */
     public   BuildingCoordinate ()   {
        
        id  =   null ;
        coordinateData  =   null ;
        building  =   null ;
     }
    
     /**
     * Constructs a new BuildingCoordinate and initializes its
     * fields.
     */
     public   BuildingCoordinate ( Building  newBuilding ,   String  coordinates )   {
        
        id  =  UUID . randomUUID ();
        coordinateData  =  coordinates ;
        building  =  newBuilding ;
     }
    
     /**
     * Returns the coordinate data.
     * Will be in json format.
     * 
     *  @return  the coordinate data.
     */
     public   String  getCoordinateData ()   {
         return  coordinateData ;
     }

     /**
     * Sets the coordinate data.
     * 
     *  @param  coordinateData - the coordinates being set.
     */
     public   void  setCoordinateData ( String  coordinateData )   {
         this . coordinateData  =  coordinateData ;
     }

     /**
     * The id for the coordinate data.
     * 
     *  @return  the id of the coordinate data.
     */
     public  UUID getId ()   {
         return  id ;
     }

     /**
     * Returns the building the data belongs to.
     * 
     *  @return  The building the data belongs to.
     */
     public   Building  getBuilding ()   {
         return  building ;
     }
    
    

    
    
    
}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/BuildingRepository.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/BuildingRepository.java

/**
 * 
 */
package  edu . kings . cs480 . BluePrints . Database ;

import  java . util . UUID ;

import  org . springframework . data . jpa . repository . JpaRepository ;
import  org . springframework . stereotype . Repository ;

/**
 * This interface is used to query entities from the building database.
 */
@ Repository
public   interface   BuildingRepository   extends   JpaRepository < Building ,  UUID >   {

}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/Category.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/Category.java

package  edu . kings . cs480 . BluePrints . Database ;

import  java . util . UUID ;

import  javax . persistence . Column ;
import  javax . persistence . Entity ;
import  javax . persistence . Id ;
import  javax . persistence . Table ;
@ Entity
@ Table ( name = "category" )
public   class   Category   {
    
    @ Id
    @ Column ( name  = "category_id" )
     private  UUID categoryID ;
    
    @ Column ( name  = "name" )
     private   String  name ;
    
    
     public   Category (){
        categoryID  =   null ;
        name  =   null ;
     }
    
     public   Category ( String  name ){
        categoryID  =  UUID . randomUUID ();
         this . name  =  name ;
     }
    
     public  UUID getCategoryID (){
         return  categoryID ;
     }
    
     public   String  getName (){
         return  name ;
     }
    
     public   void  setName ( String  name ){
         this . name  =  name ;
     }
}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/CategoryRepository.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/CategoryRepository.java

package  edu . kings . cs480 . BluePrints . Database ;

import  java . util . UUID ;

import  org . springframework . data . jpa . repository . JpaRepository ;
import  org . springframework . stereotype . Repository ;

@ Repository
public   interface   CategoryRepository   extends   JpaRepository < Category ,  UUID > {
    
     public   Category  findByCategoryID ( UUID id );
    
    
}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/Comment.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/Comment.java

package  edu . kings . cs480 . BluePrints . Database ;

import  java . util . UUID ;
import  java . util . Calendar ;
import  java . util . Date ;

import  javax . persistence . Column ;
import  javax . persistence . Entity ;
import  javax . persistence . FetchType ;
import  javax . persistence . Id ;
import  javax . persistence . ManyToOne ;
import  javax . persistence . JoinColumn ;
import  javax . persistence . Table ;
import  javax . persistence . Temporal ;
import  javax . persistence . TemporalType ;

import  org . hibernate . annotations . NotFound ;
import  org . hibernate . annotations . NotFoundAction ;

/**
 * This class represents a entry for the comment table in the BluePrints
 * database.
 */
@ Entity
@ Table ( name  =   "floor_comment" )
public   class   Comment   {

     /** Keeps track of the primary key for the comment table. */
    @ Id
    @ Column ( name  =   "comment_id" )
     private  UUID id ;

     /** Keeps track of the message content. */
    @ Column ( name  =   "comment_msg" )
     private   String  commentMsg ;

     /** Keeps track of the floor this comment belongs to. */
    @ ManyToOne
    @ JoinColumn ( name  =   "floor_id" )
     private   Floor  floor ;
    
     /** Keeps track of the user this comment belongs to. */
    @ NotFound ( action  =   NotFoundAction . IGNORE )
    @ ManyToOne ( fetch = FetchType . LAZY )
    @ JoinColumn ( name  =   "created_by" )
     private   AppUser  creator ;
    
     /**Keeps track of the date this comment was created. */
    @ Column ( name  =   "created_date" )
    @ Temporal ( TemporalType . TIMESTAMP )
     private   Date  createdDate ;

     /**
     * Creates a new floor comment with the provided id and message.
     * 
     *  @param  floor - the floor this comment belongs to.
     *  @param  creator - the user that created this comment.
     *  @param  commentMsg - the content of the message being created.
     */
     public   Comment ( Floor  floor ,   AppUser  creator ,   String  commentMsg )   {
        id  =  UUID . randomUUID ();
         this . floor  =  floor ;
         this . creator  =  creator ;
         this . commentMsg  =  commentMsg ;
                
         Calendar  cal  =   Calendar . getInstance ();
        createdDate  =  cal . getTime ();
}

     /**
     * Creates a new instance of Comment and initializes it's fields.
     */
     public   Comment ()   {
        id  =   null ;
        floor  =   null ;
        creator  =   null ;
        commentMsg  =   null ;
        
     }

     /**
     * Return's the user's unique id.
     * 
     *  @return  the unique id for the user.
     */
     public  UUID getId ()   {
         return  id ;
     }
    

     /**
     * This method returns the content of the comment.
     * 
     *  @return  the content of the message.
     */
     public   String  getMessage ()   {
         return  commentMsg ;
     }
    
     /**
     * This method changes the content of the message 
     * to the new content provided.
     * 
     *  @param  newMsg - the new content of the comment.
     * 
     */
     public   void  setMessage ( String  newMsg )   {
        commentMsg  =  newMsg ;
     }

     /**
     * This method returns floor this comment belongs to.
     * 
     *  @return  the floor this comment belongs to.
     */
     public   Floor  getFloor ()   {
         return  floor ;
     }
    
     /**
     * This method returns the creator to this 
     * comment. 
     * 
     *  @return  the user which created this comment.
     */
     public   AppUser  getCreator ()   {
         return  creator ;
     }

     /**
     * Sets the new user to the provided user.
     * 
     *  @param  newUser - the new creator of the comment.
     */
     public   void  setCreator ( AppUser  newUser )   {
        creator  =  newUser ;
     }

     /**
     * Gets the date the comment was created.
     * 
     *  @return  the date the comment was created.
     * 
     */
     public   Date  getDate ()   {
         return  createdDate ;
     }
    

     /**
     * This method changes the created date
     * to the provided date.
     * 
     *  @param  newDate - the new date for this comment.
     * 
     */
     public   void  setDate ( Date  newDate )   {
        createdDate  =  newDate ;
     }
}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/CommentRepository.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/CommentRepository.java

/**
 * 
 */
package  edu . kings . cs480 . BluePrints . Database ;

import  java . util . UUID ;
import  java . util . List ;

import  org . springframework . data . jpa . repository . JpaRepository ;
import  org . springframework . stereotype . Repository ;

/**
 * This interface represents a repository for the AppUser class. It can be used
 * to query data from the app_user table in the BluePrints database.
 */
@ Repository
public   interface   CommentRepository   extends   JpaRepository < Comment ,  UUID >   {

     /**
     * Returns the comment which have to the provided floor id.
     * 
     *  @param  floorId - the floor id being used to filter the comments.
     *  @return  the comments that belong to the corresponding floor id.
     */
     List < Comment >  findByFloorIdOrderByCreatedDateAsc ( UUID floorId );

}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/CoordinateRepository.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/CoordinateRepository.java

/**
 * 
 */
package  edu . kings . cs480 . BluePrints . Database ;

import  java . util . UUID ;

import  org . springframework . data . jpa . repository . JpaRepository ;

/**
 * This represents a repository that can be used to interact with 
 * the building_coordinate table in the database.
 */
public   interface   CoordinateRepository   extends   JpaRepository < BuildingCoordinate ,  UUID >   {
    
    
     /**
     * Returns the Coordinates for the corresponding building provided.
     * 
     *  @return
     */
     public   BuildingCoordinate  findByBuilding ( Building  building );
    
}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/Floor.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/Floor.java

package  edu . kings . cs480 . BluePrints . Database ;

import  java . util . UUID ;

import  javax . persistence . Column ;
import  javax . persistence . Entity ;
import  javax . persistence . Id ;
import  javax . persistence . ManyToOne ;
import  javax . persistence . JoinColumn ;
import  javax . persistence . Table ;

/**
 * This class represents a entry for the floor table in the BluePrints
 * database.
 */
@ Entity
@ Table ( name  =   "floor" )
public   class   Floor   {

     /** Keeps track of the primary key for the floor. */
    @ Id
    @ Column ( name  =   "floor_id" )
     private  UUID id ;

     /** Keeps track of the floors name. */
    @ Column ( name  =   "floor_name" )
     private   String  floorName ;

     /** Keeps track of the building this floor belongs to. */
    @ ManyToOne
    @ JoinColumn ( name  =   "building_id" )
     private   Building  building ;

     /**
     * Creates a new floor with the provided id number and .
     * 
     */
     public   Floor ( Building  building ,   String  newFloorName )   {
        id  =  UUID . randomUUID ();
         this . building  =  building ;
        floorName  =  newFloorName ;
}

     /**
     * Creates a new instance of Floor and initializes it's fields.
     */
     public   Floor ()   {
        id  =   null ;
        building  =   null ;
        floorName  =   null ;
        
     }

     /**
     * Return's the user's unique id.
     * 
     *  @return  the unique id for the user.
     */
     public  UUID getId ()   {
         return  id ;
     }
    

     /**
     * This method returns the name of the floor.
     * 
     *  @return  the name of the floor.
     */
     public   String  getName ()   {
         return  floorName ;
     }

     /**
     * This method returns the building this 
     * floor belongs to.
     * 
     *  @return  the building this floor belongs to.
     */
     public   Building  getBuilding ()   {
         return  building ;
     }
    
}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/FloorRepository.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/FloorRepository.java

/**
 * 
 */
package  edu . kings . cs480 . BluePrints . Database ;
import  java . util . List ;
import  java . util . UUID ;

import  org . springframework . data . jpa . repository . JpaRepository ;

/**
 * This class represents a repository used to query data from the floor
 * table in the database.
 */
public   interface   FloorRepository   extends   JpaRepository < Floor ,  UUID >   {
    
     List < Floor >  findByBuilding ( Building  building );

}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/Room.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/Room.java

/**
 * 
 */
package  edu . kings . cs480 . BluePrints . Database ;

import  java . util . UUID ;

import  javax . persistence . Column ;
import  javax . persistence . Entity ;
import  javax . persistence . Id ;
import  javax . persistence . JoinColumn ;
import  javax . persistence . ManyToOne ;
import  javax . persistence . Table ;

@ Entity
@ Table ( name  =   "room" )
public   class   Room   {
    
     /** Keep track of the room's id.*/
    @ Id
    @ Column ( name  =   "room_id" )
     private  UUID id ;
    
     /** Keeps track of the name of the room.*/
    @ Column ( name  =   "room_name" )
     private   String  name ;
    
    @ ManyToOne
    @ JoinColumn ( name  =   "floor_id" )
     private   Floor  floor ;
    
    
     public   Room ()   {
        id  =   null ;
        name  =   null ;
        floor  =   null ;
     }
    
     public   Room ( String  newName ,   Floor  newFloor )   {
        
        id  =  UUID . randomUUID ();
        name  =  newName ;
        floor  =  newFloor ;
        
     }

     public  UUID getId ()   {
         return  id ;
     }

     public   String  getName ()   {
         return  name ;
     }

     public   void  setName ( String  name )   {
         this . name  =  name ;
     }

     public   Floor  getFloor ()   {
         return  floor ;
     }

     public   void  setFloor ( Floor  floor )   {
         this . floor  =  floor ;
     }
    
    

}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/RoomCoordinateRepository.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/RoomCoordinateRepository.java

package  edu . kings . cs480 . BluePrints . Database ;

import  java . util . UUID ;

import  org . springframework . data . jpa . repository . JpaRepository ;

public   interface   RoomCoordinateRepository   extends   JpaRepository < RoomCoordinates ,  UUID >   {}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/RoomCoordinates.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/RoomCoordinates.java

/**
 * 
 */
package  edu . kings . cs480 . BluePrints . Database ;

import  java . util . UUID ;

import  javax . persistence . Column ;
import  javax . persistence . Entity ;
import  javax . persistence . Id ;
import  javax . persistence . Table ;

@ Entity
@ Table ( name  =   "room_coordinates" )
public   class   RoomCoordinates   {
    
     /** Keep track of the room's id.*/
    @ Id
    @ Column ( name  =   "room_id" )
     private  UUID id ;
    
     /** Keeps track of the name of the room.*/
    @ Column ( name  =   "room_coordinates" ,  length  =   4000 )
     private   String  coordinateData ;
    
    
     public   RoomCoordinates ()   {
        id  =   null ;
        coordinateData  =   null ;
     }
    
     public   RoomCoordinates ( UUID roomId ,   String  newCoordinateData )   {
        
        id  =  roomId ;
        coordinateData  =  newCoordinateData ;
        
     }

     public  UUID getId ()   {
         return  id ;
     }

     public   String  getCoordinateData ()   {
         return  coordinateData ;
     }

     public   void  setCoordinateData ( String  newCoordinateData )   {
        coordinateData  =  newCoordinateData ;
     }
    
    

}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/RoomRepository.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/RoomRepository.java

package  edu . kings . cs480 . BluePrints . Database ;

import  java . util . List ;
import  java . util . UUID ;

import  org . springframework . data . jpa . repository . JpaRepository ;

public   interface   RoomRepository   extends   JpaRepository < Room ,  UUID >   {
    
    
     List < Room >  findByFloor ( Floor  floor );
    
}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/Staff.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/Staff.java

package  edu . kings . cs480 . BluePrints . Database ;

public   interface   Staff < T >   {
    
    
     public   String  getName ();
    
     public  T getStaffId ();
    
     public   String  getStaffEmail ();
}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/StaffAssignment.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/StaffAssignment.java

package  edu . kings . cs480 . BluePrints . Database ;

import  java . io . Serializable ;
import  java . util . UUID ;

import  javax . persistence . Column ;
import  javax . persistence . Entity ;
import  javax . persistence . Id ;
import  javax . persistence . JoinColumn ;
import  javax . persistence . ManyToOne ;
import  javax . persistence . Table ;

@ Entity
@ Table ( name  =   "staff_assigned_to_room" )
public   class   StaffAssignment   implements   Serializable {
    
    
     private   static   final   long  serialVersionUID  =   2620119567850306216L ;

    @ Id
    @ Column ( name  =   "assignment_id" )
     private  UUID assignmentId ;
    
    @ ManyToOne
    @ JoinColumn ( name  =   "room_id" )
     private   Room  room ;
    
    @ Column ( name  =   "staff_id" )
     private  UUID staffId ;
    
     public   StaffAssignment ()   {
        assignmentId  =   null ;
        room  =   null ;
        staffId  =   null ;
     }
    
     public   StaffAssignment ( Room  newRoom ,  UUID newStaffId )   {
        assignmentId  =  UUID . randomUUID ();
        room  =  newRoom ;
        staffId  =  newStaffId ;
     }

     public  UUID getId ()   {
         return  assignmentId ;
     }

     public   Room  getRoom ()   {
         return  room ;
     }

     public  UUID getStaffId ()   {
         return  staffId ;
     }
    
    
    
    

}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/StaffAssignmentRepository.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/StaffAssignmentRepository.java

package  edu . kings . cs480 . BluePrints . Database ;

import  java . util . List ;
import  java . util . UUID ;

import  org . springframework . data . jpa . repository . JpaRepository ;
import  org . springframework . data . repository . query . Param ;

public   interface   StaffAssignmentRepository   extends   JpaRepository < StaffAssignment ,  UUID > {
    
    
     public   List < StaffAssignment >  findByRoom ( Room  room );
    
     public   StaffAssignment  findByStaffIdAndRoom ( @ Param ( "staff_id" )  UUID staffId ,  @ Param ( "room_id" )   Room  room );
    
    
}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/UserRole.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/UserRole.java

/**
 * 
 */
package  edu . kings . cs480 . BluePrints . Database ;

import  java . util . Set ;
import  java . util . UUID ;

import  javax . persistence . CascadeType ;
import  javax . persistence . Column ;
import  javax . persistence . Entity ;
import  javax . persistence . Id ;
import  javax . persistence . OneToMany ;
import  javax . persistence . Table ;


/**
 * This class represents an entity for a user role in the
 * the user_role table in BluePrints database.
 */
@ Entity
@ Table ( name  =   "user_role" )
public   class   UserRole   {

     /**Keeps track of the role's id. */
    @ Id
    @ Column ( name  =   "role_id" )
     private  UUID id ;
    
     /**Keeps track of the role's name.*/
    @ Column
     private   String  name ;
    
     /**Keeps track of permission level for the role. */
    @ Column ( name  =   "permission_level" )
     private   int  permissionLevel ;
    
     /**Keeps track of the users assigned to this role.*/
     //@OneToMany(mappedBy = "id", cascade = CascadeType.ALL)
     //private Set<AppUser> users;


     /**
     * Creates a new user role and initializes its 
     * values.
     */
     protected   UserRole ()   {
        id  =   null ;
        name  =   null ;
        permissionLevel  =   - 1 ;
     }

     /**
     * Returns the role's id.
     * 
     *  @return  the id
     */
     public  UUID getId ()   {
         return  id ;
     }
    
    

     /**
     * Returns the role's name.
     * 
     *  @return  the name
     */
     public   String  getName ()   {
         return  name ;
     }

     /**
     * Returns the role's permissionLevel.
     * 
     *  @return  the permissionLevel
     */
     public   int  getPermissionLevel ()   {
         return  permissionLevel ;
     }
    
     /**
     * Returns the users assigned to this
     * role.
     * 
     *  @return  the users assigned to this role.
     */
//  public Set<AppUser> getUsers() {
//      return users;
//  }
    
     /**
     * Changes the users assigned to this role.
     * 
     *  @param  users - the new users assigned to this role.
     */
//  public void setUsers(Set<AppUser> users) {
//      this.users = users;
//  }
    
    

}

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/UserRoleRepository.java

BluePrints/src/main/java/edu/kings/cs480/BluePrints/Database/UserRoleRepository.java

/**
 * 
 */
package  edu . kings . cs480 . BluePrints . Database ;
import  java . util . UUID ;

import  org . springframework . data . jpa . repository . JpaRepository ;
import  org . springframework . stereotype . Repository ;

/**
 * This class represents a repository used to query data from the user role
 * table in the database.
*/
@ Repository
public   interface   UserRoleRepository   extends   JpaRepository < UserRole ,  UUID >   {

}

BluePrints/src/main/resources/application.properties

#View Settings spring.freemarker.template-loader-path: /WEB-INF/ spring.freemarker.suffix: .ftl #Database Settings #spring.jpa.database: POSTGRESQL #spring.datasource.platform: postgres #spring.jpa.show-sql:false #spring.datasource.url: jdbc:postgresql://cs480.kings.edu:5432/cs480f17 #spring.datasource.username: cs480f17app #spring.datasource.password: eduECVtPTf7p63m=H3!fvR!*E#Hc6fKF #spring.datasource.driver-class-name: org.postgresql.Driver spring.datasource.url=jdbc:h2:mem:testdb spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password= spring.jpa.database-platform=org.hibernate.dialect.H2Dialect #Server Settings server.contextPath: /BluePrints/ server.port: 8443 server.ssl.key-store: classpath:keystore.p12 server.ssl.key-store-password: eduECVtPTf7p63m=H3!fvR!*E#Hc6fKF server.ssl.keyStoreType: PKCS12 server.ssl.keyAlias: tomcat

BluePrints/src/main/resources/data.sql

INSERT INTO user_role (role_id, name, permission_level) VALUES ('65b0075f662329afe4bb3e6b73a3eecf', 'Admin', 1); INSERT INTO user_role (role_id, name, permission_level) VALUES ('9cef3e32f0b60dd45e75b4eb6ebca17b', 'Coordinator', 2); INSERT INTO user_role (role_id, name, permission_level) VALUES ('3071704b1cbf8abc1cc0b072dadec49b', 'Faculty', 2); INSERT INTO user_role (role_id, name, permission_level) VALUES ('581c16c93e573343963815258c7c91f9', 'Student', 3); INSERT INTO app_user (user_id, first_name, last_name, email, role_id, password) VALUES ('8b72105565441d6e547b6193cf9782b4', 'Administrator', '', 'admin', '65b0075f662329afe4bb3e6b73a3eecf', '8KZdhebgZAkZ/wnHfFVwx81LDJoQTQjRn1sviayhWw0=$U5+nBQFW1r96veavMNnDvl5G3ALJyY2tuNTuBy/oA9Q='); INSERT INTO building (building_id, created_by, name) VALUES ('73285e99115b46958da135cdc87e5979', '8b72105565441d6e547b6193cf9782b4', 'Administration'); INSERT INTO building (building_id, created_by, name) VALUES ('361f42d188854f4faecc8f7313bd9053', '8b72105565441d6e547b6193cf9782b4', 'McGowan'); INSERT INTO building (building_id, created_by, name) VALUES ('437364cf50994316b66aff02a14b38ca', '8b72105565441d6e547b6193cf9782b4', 'Holy Cross'); INSERT INTO building_coordinate (coordinate_id, coordinate_data, building_id) VALUES ('ddb656bf7f7643a588cc7ce1383a771d', '"{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[[[-8446933.521771798,5049316.046571197],[-8446909.138414914,5049283.497014376],[-8446900.774058463,5049273.995947136],[-8446880.268458366,5049289.703013803],[-8446911.591175789,5049331.528724969],[-8446933.521771798,5049316.046571197]]]},\"properties\":null}]}"', '73285e99115b46958da135cdc87e5979'); INSERT INTO building_coordinate (coordinate_id, coordinate_data, building_id) VALUES ('cd1c46d6f4854ef19246f16af62e4bf6', '"{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[[[-8446963.698534664,5049213.488995077],[-8446941.744568048,5049229.249557793],[-8446953.796394216,5049245.941900484],[-8446949.8529061,5049253.171175872],[-8446935.118684333,5049263.379210815],[-8446954.856229238,5049290.93379666],[-8446974.557279576,5049276.519838015],[-8446980.416161507,5049284.397927668],[-8447002.998708887,5049267.612085324],[-8446963.698534664,5049213.488995077]]]},\"properties\":null}]}"', '361f42d188854f4faecc8f7313bd9053'); INSERT INTO building_coordinate (coordinate_id, coordinate_data, building_id) VALUES ('f8a92fc04ee74945af193f4243420f3c', '"{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[[[-8447002.285586065,5049267.42088277],[-8446963.160327425,5049214.283873965],[-8446928.3826528,5049205.5484992005],[-8446941.237116456,5049229.835559354],[-8446953.171269117,5049245.890968572],[-8446951.351579137,5049252.452020467],[-8446935.775435865,5049264.029929765],[-8446955.067676567,5049290.985433176],[-8446974.656069092,5049276.797209947],[-8446980.712206265,5049284.944731043],[-8447002.285586065,5049267.42088277]]]},\"properties\":null}]}"', '437364cf50994316b66aff02a14b38ca'); INSERT INTO category (category_id, name) VALUES ('faceb0ab63bd4ff69fe69b551133bce8', 'Test2'); INSERT INTO category (category_id, name) VALUES ('4bdd0ad8c4d0461cba5b727050807ad3', 'Edit2'); INSERT INTO floor (floor_id, building_id, floor_name) VALUES ('96027d0799094e909235693eb83c508c', '361f42d188854f4faecc8f7313bd9053', '1'); INSERT INTO floor (floor_id, building_id, floor_name) VALUES ('29c6a5ea13ac4504b66e1ee858bca028', '73285e99115b46958da135cdc87e5979', '2'); INSERT INTO floor (floor_id, building_id, floor_name) VALUES ('44d282fa701342ccb7c27c9637d4bab4', '437364cf50994316b66aff02a14b38ca', '1'); INSERT INTO floor (floor_id, building_id, floor_name) VALUES ('dfdf5f0aec14490a8f14536856591577', '437364cf50994316b66aff02a14b38ca', '2'); INSERT INTO floor_comment (comment_id, floor_id, comment_msg, created_date, created_by) VALUES ('0bd66ed456bd42b0bdf6d296a2da1243', '29c6a5ea13ac4504b66e1ee858bca028', 'Test Comment', '2018-04-16 14:26:19.748', '8b72105565441d6e547b6193cf9782b4'); INSERT INTO floor_comment (comment_id, floor_id, comment_msg, created_date, created_by) VALUES ('61f3af859c39408aa339497fbc93b009', 'dfdf5f0aec14490a8f14536856591577', 'test comment 2', '2018-05-06 23:52:09.769', '8b72105565441d6e547b6193cf9782b4'); INSERT INTO floor_comment (comment_id, floor_id, comment_msg, created_date, created_by) VALUES ('bfb544e1c16442a494a773b8d119af75', 'dfdf5f0aec14490a8f14536856591577', 'test comment 3', '2018-05-07 00:08:51.077', '8b72105565441d6e547b6193cf9782b4'); INSERT INTO floor_comment (comment_id, floor_id, comment_msg, created_date, created_by) VALUES ('d0d3b974afcb4422a3807a14b071c7f6', 'dfdf5f0aec14490a8f14536856591577', 'test comment 4', '2018-05-07 20:57:23.315', '8b72105565441d6e547b6193cf9782b4'); INSERT INTO floor_comment (comment_id, floor_id, comment_msg, created_date, created_by) VALUES ('494c0aba28de4dfc80457a7e7a193d76', 'dfdf5f0aec14490a8f14536856591577', 'test comment 5', '2018-05-08 16:26:01.679', '8b72105565441d6e547b6193cf9782b4'); INSERT INTO floor_comment (comment_id, floor_id, comment_msg, created_date, created_by) VALUES ('edab6a10ca5e4bd889d61c917fa8abe0', '44d282fa701342ccb7c27c9637d4bab4', 'test comment 6', '2018-05-08 17:08:11.382', '8b72105565441d6e547b6193cf9782b4'); INSERT INTO room (room_id, floor_id, room_name) VALUES ('c8c9b303b7b249c092c57bbf7ddaad73', '29c6a5ea13ac4504b66e1ee858bca028', '100'); INSERT INTO room (room_id, floor_id, room_name) VALUES ('bd9eab399db9481c9765d950a0e257a5', '29c6a5ea13ac4504b66e1ee858bca028', '101'); INSERT INTO room (room_id, floor_id, room_name) VALUES ('db4bd3c4790143d79d78a1a59e957f86', '29c6a5ea13ac4504b66e1ee858bca028', '104'); INSERT INTO room (room_id, floor_id, room_name) VALUES ('84cdc682dff645b28207dbf1fbcbe0d8', '29c6a5ea13ac4504b66e1ee858bca028', '105'); INSERT INTO room (room_id, floor_id, room_name) VALUES ('1bf05038bbc447b4982900d7d3c37d47', '44d282fa701342ccb7c27c9637d4bab4', '100'); INSERT INTO room (room_id, floor_id, room_name) VALUES ('4966481651aa444b95f8553210267bed', 'dfdf5f0aec14490a8f14536856591577', '100'); INSERT INTO room_coordinates (room_id, room_coordinates) VALUES ('4966481651aa444b95f8553210267bed', '"{\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[[[-8446935.666030645,5049262.4657801995],[-8446947.292626845,5049280.6099626925],[-8446965.436809339,5049268.983366492],[-8446953.81021314,5049250.839183999],[-8446935.666030645,5049262.4657801995]]]},\"properties\":null}"'); INSERT INTO room_coordinates (room_id, room_coordinates) VALUES ('bd9eab399db9481c9765d950a0e257a5', '"{\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[[[-8446886.766721489,5049339.726678741],[-8446893.168745117,5049348.571188428],[-8446902.013254805,5049342.1691648],[-8446895.611231176,5049333.324655113],[-8446886.766721489,5049339.726678741]]]},\"properties\":{\"roomId\":\"034b815cc6fb4581aacdce7299ac4200\"}}"'); INSERT INTO room_coordinates (room_id, room_coordinates) VALUES ('db4bd3c4790143d79d78a1a59e957f86', '"{\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[[[-8446880.6179965,5049314.081986577],[-8446886.103995256,5049321.107121838],[-8446893.129130518,5049315.62112308],[-8446887.643131763,5049308.595987819],[-8446880.6179965,5049314.081986577]]]},\"properties\":{\"roomId\":\"78a719665e7249f0b26a0020a9b58c12\"}}"'); INSERT INTO room_coordinates (room_id, room_coordinates) VALUES ('84cdc682dff645b28207dbf1fbcbe0d8', '"{\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[[[-8446925.349449974,5049282.291602794],[-8446929.738454485,5049290.0495243715],[-8446937.496376064,5049285.660519859],[-8446933.107371552,5049277.902598281],[-8446925.349449974,5049282.291602794]]]},\"properties\":{\"roomId\":\"abf9bf5684e24630afc01815ba4ba50d\"}}"'); INSERT INTO room_coordinates (room_id, room_coordinates) VALUES ('c8c9b303b7b249c092c57bbf7ddaad73', '"{\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[[[-8446941.656412095,5049301.681679387],[-8446946.045416607,5049309.439600964],[-8446953.803338185,5049305.050596451],[-8446949.414333673,5049297.292674874],[-8446941.656412095,5049301.681679387]]]},\"properties\":null}"'); INSERT INTO room_coordinates (room_id, room_coordinates) VALUES ('1bf05038bbc447b4982900d7d3c37d47', '"{\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[[[-8446935.666030645,5049262.4657801995],[-8446947.292626845,5049280.6099626925],[-8446965.436809339,5049268.983366492],[-8446953.81021314,5049250.839183999],[-8446935.666030645,5049262.4657801995]]]},\"properties\":null}"'); INSERT INTO staff_assigned_to_room (assignment_id, room_id, staff_id) VALUES ('66d8d626c254417f993a863fe2d76073', 'c8c9b303b7b249c092c57bbf7ddaad73', '8761c1d6df23494ca62e5dd25bd7ee1a'); INSERT INTO staff_assigned_to_room (assignment_id, room_id, staff_id) VALUES ('e2bacc0c5d4d401b8d5f32982e2d4d5b', 'db4bd3c4790143d79d78a1a59e957f86', '8761c1d6df23494ca62e5dd25bd7ee1a'); INSERT INTO staff_assigned_to_room (assignment_id, room_id, staff_id) VALUES ('2c7597405c294b43b07b8960e3ea512d', 'db4bd3c4790143d79d78a1a59e957f86', NULL); INSERT INTO staff_assigned_to_room (assignment_id, room_id, staff_id) VALUES ('4cd1bf8eecb54e278e049962f3e5a3f6', '84cdc682dff645b28207dbf1fbcbe0d8', '8761c1d6df23494ca62e5dd25bd7ee1a'); INSERT INTO staff_assigned_to_room (assignment_id, room_id, staff_id) VALUES ('3f829b7ab3074ae19e3dc47aa18de538', '84cdc682dff645b28207dbf1fbcbe0d8', NULL); INSERT INTO staff_assigned_to_room (assignment_id, room_id, staff_id) VALUES ('e014f85ed5824b819c268547748d54e4', '1bf05038bbc447b4982900d7d3c37d47', '2168ac0b9da743e79b96829f54cd87e1'); INSERT INTO staff_assigned_to_room (assignment_id, room_id, staff_id) VALUES ('622b2dd2762e48bda76ad971cee615ae', '1bf05038bbc447b4982900d7d3c37d47', '8761c1d6df23494ca62e5dd25bd7ee1a'); INSERT INTO staff_assigned_to_room (assignment_id, room_id, staff_id) VALUES ('9d1c599155d444f8ad20593d32ba5f9e', '4966481651aa444b95f8553210267bed', '8761c1d6df23494ca62e5dd25bd7ee1a'); INSERT INTO staff_assigned_to_room (assignment_id, room_id, staff_id) VALUES ('7e2ba4b47015404a92615ceb83ce4fab', '4966481651aa444b95f8553210267bed', NULL);

BluePrints/src/main/resources/keystore.p12

BluePrints/src/main/resources/log4j2.xml

logs ${log-path}/archive

BluePrints/src/main/webapp/css/comments.css

#commentSection { max-height:200px; overflow-y: auto; overflow-x: hidden; display: block; } #commentTable tr { display:table; width:100%; table-layout:fixed; }

BluePrints/src/main/webapp/css/coordinates.css

#coordinateData { max-height:200px; overflow-y: auto; overflow-x: hidden; display: block; } #coordinateTable tr { display:table; width:100%; table-layout:fixed; }

BluePrints/src/main/webapp/css/fontawesome/css/fa-brands.css

/*! * Font Awesome Free 5.0.12 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) */ @font-face { font-family: 'Font Awesome 5 Brands'; font-style: normal; font-weight: normal; src: url("../webfonts/fa-brands-400.eot"); src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg"); } .fab { font-family: 'Font Awesome 5 Brands'; }

BluePrints/src/main/webapp/css/fontawesome/css/fa-brands.min.css

/*! * Font Awesome Free 5.0.12 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) */ @font-face{font-family:Font Awesome\ 5 Brands;font-style:normal;font-weight:400;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:Font Awesome\ 5 Brands}

BluePrints/src/main/webapp/css/fontawesome/css/fa-regular.css

/*! * Font Awesome Free 5.0.12 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) */ @font-face { font-family: 'Font Awesome 5 Free'; font-style: normal; font-weight: 400; src: url("../webfonts/fa-regular-400.eot"); src: url("../webfonts/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.woff") format("woff"), url("../webfonts/fa-regular-400.ttf") format("truetype"), url("../webfonts/fa-regular-400.svg#fontawesome") format("svg"); } .far { font-family: 'Font Awesome 5 Free'; font-weight: 400; }

BluePrints/src/main/webapp/css/fontawesome/css/fa-regular.min.css

/*! * Font Awesome Free 5.0.12 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) */ @font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-family:Font Awesome\ 5 Free;font-weight:400}

BluePrints/src/main/webapp/css/fontawesome/css/fa-solid.css

/*! * Font Awesome Free 5.0.12 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) */ @font-face { font-family: 'Font Awesome 5 Free'; font-style: normal; font-weight: 900; src: url("../webfonts/fa-solid-900.eot"); src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); } .fa, .fas { font-family: 'Font Awesome 5 Free'; font-weight: 900; }

BluePrints/src/main/webapp/css/fontawesome/css/fa-solid.min.css

/*! * Font Awesome Free 5.0.12 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) */ @font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:Font Awesome\ 5 Free;font-weight:900}

BluePrints/src/main/webapp/css/fontawesome/css/fontawesome-all.css

/*! * Font Awesome Free 5.0.12 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) */ .fa, .fas, .far, .fal, .fab { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; display: inline-block; font-style: normal; font-variant: normal; text-rendering: auto; line-height: 1; } .fa-lg { font-size: 1.33333em; line-height: 0.75em; vertical-align: -.0667em; } .fa-xs { font-size: .75em; } .fa-sm { font-size: .875em; } .fa-1x { font-size: 1em; } .fa-2x { font-size: 2em; } .fa-3x { font-size: 3em; } .fa-4x { font-size: 4em; } .fa-5x { font-size: 5em; } .fa-6x { font-size: 6em; } .fa-7x { font-size: 7em; } .fa-8x { font-size: 8em; } .fa-9x { font-size: 9em; } .fa-10x { font-size: 10em; } .fa-fw { text-align: center; width: 1.25em; } .fa-ul { list-style-type: none; margin-left: 2.5em; padding-left: 0; } .fa-ul > li { position: relative; } .fa-li { left: -2em; position: absolute; text-align: center; width: 2em; line-height: inherit; } .fa-border { border: solid 0.08em #eee; border-radius: .1em; padding: .2em .25em .15em; } .fa-pull-left { float: left; } .fa-pull-right { float: right; } .fa.fa-pull-left, .fas.fa-pull-left, .far.fa-pull-left, .fal.fa-pull-left, .fab.fa-pull-left { margin-right: .3em; } .fa.fa-pull-right, .fas.fa-pull-right, .far.fa-pull-right, .fal.fa-pull-right, .fab.fa-pull-right { margin-left: .3em; } .fa-spin { -webkit-animation: fa-spin 2s infinite linear; animation: fa-spin 2s infinite linear; } .fa-pulse { -webkit-animation: fa-spin 1s infinite steps(8); animation: fa-spin 1s infinite steps(8); } @-webkit-keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } } @keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } } .fa-rotate-90 { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; -webkit-transform: rotate(90deg); transform: rotate(90deg); } .fa-rotate-180 { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; -webkit-transform: rotate(180deg); transform: rotate(180deg); } .fa-rotate-270 { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; -webkit-transform: rotate(270deg); transform: rotate(270deg); } .fa-flip-horizontal { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; -webkit-transform: scale(-1, 1); transform: scale(-1, 1); } .fa-flip-vertical { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; -webkit-transform: scale(1, -1); transform: scale(1, -1); } .fa-flip-horizontal.fa-flip-vertical { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; -webkit-transform: scale(-1, -1); transform: scale(-1, -1); } :root .fa-rotate-90, :root .fa-rotate-180, :root .fa-rotate-270, :root .fa-flip-horizontal, :root .fa-flip-vertical { -webkit-filter: none; filter: none; } .fa-stack { display: inline-block; height: 2em; line-height: 2em; position: relative; vertical-align: middle; width: 2em; } .fa-stack-1x, .fa-stack-2x { left: 0; position: absolute; text-align: center; width: 100%; } .fa-stack-1x { line-height: inherit; } .fa-stack-2x { font-size: 2em; } .fa-inverse { color: #fff; } /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen readers do not read off random characters that represent icons */ .fa-500px:before { content: "\f26e"; } .fa-accessible-icon:before { content: "\f368"; } .fa-accusoft:before { content: "\f369"; } .fa-address-book:before { content: "\f2b9"; } .fa-address-card:before { content: "\f2bb"; } .fa-adjust:before { content: "\f042"; } .fa-adn:before { content: "\f170"; } .fa-adversal:before { content: "\f36a"; } .fa-affiliatetheme:before { content: "\f36b"; } .fa-algolia:before { content: "\f36c"; } .fa-align-center:before { content: "\f037"; } .fa-align-justify:before { content: "\f039"; } .fa-align-left:before { content: "\f036"; } .fa-align-right:before { content: "\f038"; } .fa-allergies:before { content: "\f461"; } .fa-amazon:before { content: "\f270"; } .fa-amazon-pay:before { content: "\f42c"; } .fa-ambulance:before { content: "\f0f9"; } .fa-american-sign-language-interpreting:before { content: "\f2a3"; } .fa-amilia:before { content: "\f36d"; } .fa-anchor:before { content: "\f13d"; } .fa-android:before { content: "\f17b"; } .fa-angellist:before { content: "\f209"; } .fa-angle-double-down:before { content: "\f103"; } .fa-angle-double-left:before { content: "\f100"; } .fa-angle-double-right:before { content: "\f101"; } .fa-angle-double-up:before { content: "\f102"; } .fa-angle-down:before { content: "\f107"; } .fa-angle-left:before { content: "\f104"; } .fa-angle-right:before { content: "\f105"; } .fa-angle-up:before { content: "\f106"; } .fa-angrycreative:before { content: "\f36e"; } .fa-angular:before { content: "\f420"; } .fa-app-store:before { content: "\f36f"; } .fa-app-store-ios:before { content: "\f370"; } .fa-apper:before { content: "\f371"; } .fa-apple:before { content: "\f179"; } .fa-apple-pay:before { content: "\f415"; } .fa-archive:before { content: "\f187"; } .fa-arrow-alt-circle-down:before { content: "\f358"; } .fa-arrow-alt-circle-left:before { content: "\f359"; } .fa-arrow-alt-circle-right:before { content: "\f35a"; } .fa-arrow-alt-circle-up:before { content: "\f35b"; } .fa-arrow-circle-down:before { content: "\f0ab"; } .fa-arrow-circle-left:before { content: "\f0a8"; } .fa-arrow-circle-right:before { content: "\f0a9"; } .fa-arrow-circle-up:before { content: "\f0aa"; } .fa-arrow-down:before { content: "\f063"; } .fa-arrow-left:before { content: "\f060"; } .fa-arrow-right:before { content: "\f061"; } .fa-arrow-up:before { content: "\f062"; } .fa-arrows-alt:before { content: "\f0b2"; } .fa-arrows-alt-h:before { content: "\f337"; } .fa-arrows-alt-v:before { content: "\f338"; } .fa-assistive-listening-systems:before { content: "\f2a2"; } .fa-asterisk:before { content: "\f069"; } .fa-asymmetrik:before { content: "\f372"; } .fa-at:before { content: "\f1fa"; } .fa-audible:before { content: "\f373"; } .fa-audio-description:before { content: "\f29e"; } .fa-autoprefixer:before { content: "\f41c"; } .fa-avianex:before { content: "\f374"; } .fa-aviato:before { content: "\f421"; } .fa-aws:before { content: "\f375"; } .fa-backward:before { content: "\f04a"; } .fa-balance-scale:before { content: "\f24e"; } .fa-ban:before { content: "\f05e"; } .fa-band-aid:before { content: "\f462"; } .fa-bandcamp:before { content: "\f2d5"; } .fa-barcode:before { content: "\f02a"; } .fa-bars:before { content: "\f0c9"; } .fa-baseball-ball:before { content: "\f433"; } .fa-basketball-ball:before { content: "\f434"; } .fa-bath:before { content: "\f2cd"; } .fa-battery-empty:before { content: "\f244"; } .fa-battery-full:before { content: "\f240"; } .fa-battery-half:before { content: "\f242"; } .fa-battery-quarter:before { content: "\f243"; } .fa-battery-three-quarters:before { content: "\f241"; } .fa-bed:before { content: "\f236"; } .fa-beer:before { content: "\f0fc"; } .fa-behance:before { content: "\f1b4"; } .fa-behance-square:before { content: "\f1b5"; } .fa-bell:before { content: "\f0f3"; } .fa-bell-slash:before { content: "\f1f6"; } .fa-bicycle:before { content: "\f206"; } .fa-bimobject:before { content: "\f378"; } .fa-binoculars:before { content: "\f1e5"; } .fa-birthday-cake:before { content: "\f1fd"; } .fa-bitbucket:before { content: "\f171"; } .fa-bitcoin:before { content: "\f379"; } .fa-bity:before { content: "\f37a"; } .fa-black-tie:before { content: "\f27e"; } .fa-blackberry:before { content: "\f37b"; } .fa-blind:before { content: "\f29d"; } .fa-blogger:before { content: "\f37c"; } .fa-blogger-b:before { content: "\f37d"; } .fa-bluetooth:before { content: "\f293"; } .fa-bluetooth-b:before { content: "\f294"; } .fa-bold:before { content: "\f032"; } .fa-bolt:before { content: "\f0e7"; } .fa-bomb:before { content: "\f1e2"; } .fa-book:before { content: "\f02d"; } .fa-bookmark:before { content: "\f02e"; } .fa-bowling-ball:before { content: "\f436"; } .fa-box:before { content: "\f466"; } .fa-box-open:before { content: "\f49e"; } .fa-boxes:before { content: "\f468"; } .fa-braille:before { content: "\f2a1"; } .fa-briefcase:before { content: "\f0b1"; } .fa-briefcase-medical:before { content: "\f469"; } .fa-btc:before { content: "\f15a"; } .fa-bug:before { content: "\f188"; } .fa-building:before { content: "\f1ad"; } .fa-bullhorn:before { content: "\f0a1"; } .fa-bullseye:before { content: "\f140"; } .fa-burn:before { content: "\f46a"; } .fa-buromobelexperte:before { content: "\f37f"; } .fa-bus:before { content: "\f207"; } .fa-buysellads:before { content: "\f20d"; } .fa-calculator:before { content: "\f1ec"; } .fa-calendar:before { content: "\f133"; } .fa-calendar-alt:before { content: "\f073"; } .fa-calendar-check:before { content: "\f274"; } .fa-calendar-minus:before { content: "\f272"; } .fa-calendar-plus:before { content: "\f271"; } .fa-calendar-times:before { content: "\f273"; } .fa-camera:before { content: "\f030"; } .fa-camera-retro:before { content: "\f083"; } .fa-capsules:before { content: "\f46b"; } .fa-car:before { content: "\f1b9"; } .fa-caret-down:before { content: "\f0d7"; } .fa-caret-left:before { content: "\f0d9"; } .fa-caret-right:before { content: "\f0da"; } .fa-caret-square-down:before { content: "\f150"; } .fa-caret-square-left:before { content: "\f191"; } .fa-caret-square-right:before { content: "\f152"; } .fa-caret-square-up:before { content: "\f151"; } .fa-caret-up:before { content: "\f0d8"; } .fa-cart-arrow-down:before { content: "\f218"; } .fa-cart-plus:before { content: "\f217"; } .fa-cc-amazon-pay:before { content: "\f42d"; } .fa-cc-amex:before { content: "\f1f3"; } .fa-cc-apple-pay:before { content: "\f416"; } .fa-cc-diners-club:before { content: "\f24c"; } .fa-cc-discover:before { content: "\f1f2"; } .fa-cc-jcb:before { content: "\f24b"; } .fa-cc-mastercard:before { content: "\f1f1"; } .fa-cc-paypal:before { content: "\f1f4"; } .fa-cc-stripe:before { content: "\f1f5"; } .fa-cc-visa:before { content: "\f1f0"; } .fa-centercode:before { content: "\f380"; } .fa-certificate:before { content: "\f0a3"; } .fa-chart-area:before { content: "\f1fe"; } .fa-chart-bar:before { content: "\f080"; } .fa-chart-line:before { content: "\f201"; } .fa-chart-pie:before { content: "\f200"; } .fa-check:before { content: "\f00c"; } .fa-check-circle:before { content: "\f058"; } .fa-check-square:before { content: "\f14a"; } .fa-chess:before { content: "\f439"; } .fa-chess-bishop:before { content: "\f43a"; } .fa-chess-board:before { content: "\f43c"; } .fa-chess-king:before { content: "\f43f"; } .fa-chess-knight:before { content: "\f441"; } .fa-chess-pawn:before { content: "\f443"; } .fa-chess-queen:before { content: "\f445"; } .fa-chess-rook:before { content: "\f447"; } .fa-chevron-circle-down:before { content: "\f13a"; } .fa-chevron-circle-left:before { content: "\f137"; } .fa-chevron-circle-right:before { content: "\f138"; } .fa-chevron-circle-up:before { content: "\f139"; } .fa-chevron-down:before { content: "\f078"; } .fa-chevron-left:before { content: "\f053"; } .fa-chevron-right:before { content: "\f054"; } .fa-chevron-up:before { content: "\f077"; } .fa-child:before { content: "\f1ae"; } .fa-chrome:before { content: "\f268"; } .fa-circle:before { content: "\f111"; } .fa-circle-notch:before { content: "\f1ce"; } .fa-clipboard:before { content: "\f328"; } .fa-clipboard-check:before { content: "\f46c"; } .fa-clipboard-list:before { content: "\f46d"; } .fa-clock:before { content: "\f017"; } .fa-clone:before { content: "\f24d"; } .fa-closed-captioning:before { content: "\f20a"; } .fa-cloud:before { content: "\f0c2"; } .fa-cloud-download-alt:before { content: "\f381"; } .fa-cloud-upload-alt:before { content: "\f382"; } .fa-cloudscale:before { content: "\f383"; } .fa-cloudsmith:before { content: "\f384"; } .fa-cloudversify:before { content: "\f385"; } .fa-code:before { content: "\f121"; } .fa-code-branch:before { content: "\f126"; } .fa-codepen:before { content: "\f1cb"; } .fa-codiepie:before { content: "\f284"; } .fa-coffee:before { content: "\f0f4"; } .fa-cog:before { content: "\f013"; } .fa-cogs:before { content: "\f085"; } .fa-columns:before { content: "\f0db"; } .fa-comment:before { content: "\f075"; } .fa-comment-alt:before { content: "\f27a"; } .fa-comment-dots:before { content: "\f4ad"; } .fa-comment-slash:before { content: "\f4b3"; } .fa-comments:before { content: "\f086"; } .fa-compass:before { content: "\f14e"; } .fa-compress:before { content: "\f066"; } .fa-connectdevelop:before { content: "\f20e"; } .fa-contao:before { content: "\f26d"; } .fa-copy:before { content: "\f0c5"; } .fa-copyright:before { content: "\f1f9"; } .fa-couch:before { content: "\f4b8"; } .fa-cpanel:before { content: "\f388"; } .fa-creative-commons:before { content: "\f25e"; } .fa-creative-commons-by:before { content: "\f4e7"; } .fa-creative-commons-nc:before { content: "\f4e8"; } .fa-creative-commons-nc-eu:before { content: "\f4e9"; } .fa-creative-commons-nc-jp:before { content: "\f4ea"; } .fa-creative-commons-nd:before { content: "\f4eb"; } .fa-creative-commons-pd:before { content: "\f4ec"; } .fa-creative-commons-pd-alt:before { content: "\f4ed"; } .fa-creative-commons-remix:before { content: "\f4ee"; } .fa-creative-commons-sa:before { content: "\f4ef"; } .fa-creative-commons-sampling:before { content: "\f4f0"; } .fa-creative-commons-sampling-plus:before { content: "\f4f1"; } .fa-creative-commons-share:before { content: "\f4f2"; } .fa-credit-card:before { content: "\f09d"; } .fa-crop:before { content: "\f125"; } .fa-crosshairs:before { content: "\f05b"; } .fa-css3:before { content: "\f13c"; } .fa-css3-alt:before { content: "\f38b"; } .fa-cube:before { content: "\f1b2"; } .fa-cubes:before { content: "\f1b3"; } .fa-cut:before { content: "\f0c4"; } .fa-cuttlefish:before { content: "\f38c"; } .fa-d-and-d:before { content: "\f38d"; } .fa-dashcube:before { content: "\f210"; } .fa-database:before { content: "\f1c0"; } .fa-deaf:before { content: "\f2a4"; } .fa-delicious:before { content: "\f1a5"; } .fa-deploydog:before { content: "\f38e"; } .fa-deskpro:before { content: "\f38f"; } .fa-desktop:before { content: "\f108"; } .fa-deviantart:before { content: "\f1bd"; } .fa-diagnoses:before { content: "\f470"; } .fa-digg:before { content: "\f1a6"; } .fa-digital-ocean:before { content: "\f391"; } .fa-discord:before { content: "\f392"; } .fa-discourse:before { content: "\f393"; } .fa-dna:before { content: "\f471"; } .fa-dochub:before { content: "\f394"; } .fa-docker:before { content: "\f395"; } .fa-dollar-sign:before { content: "\f155"; } .fa-dolly:before { content: "\f472"; } .fa-dolly-flatbed:before { content: "\f474"; } .fa-donate:before { content: "\f4b9"; } .fa-dot-circle:before { content: "\f192"; } .fa-dove:before { content: "\f4ba"; } .fa-download:before { content: "\f019"; } .fa-draft2digital:before { content: "\f396"; } .fa-dribbble:before { content: "\f17d"; } .fa-dribbble-square:before { content: "\f397"; } .fa-dropbox:before { content: "\f16b"; } .fa-drupal:before { content: "\f1a9"; } .fa-dyalog:before { content: "\f399"; } .fa-earlybirds:before { content: "\f39a"; } .fa-ebay:before { content: "\f4f4"; } .fa-edge:before { content: "\f282"; } .fa-edit:before { content: "\f044"; } .fa-eject:before { content: "\f052"; } .fa-elementor:before { content: "\f430"; } .fa-ellipsis-h:before { content: "\f141"; } .fa-ellipsis-v:before { content: "\f142"; } .fa-ember:before { content: "\f423"; } .fa-empire:before { content: "\f1d1"; } .fa-envelope:before { content: "\f0e0"; } .fa-envelope-open:before { content: "\f2b6"; } .fa-envelope-square:before { content: "\f199"; } .fa-envira:before { content: "\f299"; } .fa-eraser:before { content: "\f12d"; } .fa-erlang:before { content: "\f39d"; } .fa-ethereum:before { content: "\f42e"; } .fa-etsy:before { content: "\f2d7"; } .fa-euro-sign:before { content: "\f153"; } .fa-exchange-alt:before { content: "\f362"; } .fa-exclamation:before { content: "\f12a"; } .fa-exclamation-circle:before { content: "\f06a"; } .fa-exclamation-triangle:before { content: "\f071"; } .fa-expand:before { content: "\f065"; } .fa-expand-arrows-alt:before { content: "\f31e"; } .fa-expeditedssl:before { content: "\f23e"; } .fa-external-link-alt:before { content: "\f35d"; } .fa-external-link-square-alt:before { content: "\f360"; } .fa-eye:before { content: "\f06e"; } .fa-eye-dropper:before { content: "\f1fb"; } .fa-eye-slash:before { content: "\f070"; } .fa-facebook:before { content: "\f09a"; } .fa-facebook-f:before { content: "\f39e"; } .fa-facebook-messenger:before { content: "\f39f"; } .fa-facebook-square:before { content: "\f082"; } .fa-fast-backward:before { content: "\f049"; } .fa-fast-forward:before { content: "\f050"; } .fa-fax:before { content: "\f1ac"; } .fa-female:before { content: "\f182"; } .fa-fighter-jet:before { content: "\f0fb"; } .fa-file:before { content: "\f15b"; } .fa-file-alt:before { content: "\f15c"; } .fa-file-archive:before { content: "\f1c6"; } .fa-file-audio:before { content: "\f1c7"; } .fa-file-code:before { content: "\f1c9"; } .fa-file-excel:before { content: "\f1c3"; } .fa-file-image:before { content: "\f1c5"; } .fa-file-medical:before { content: "\f477"; } .fa-file-medical-alt:before { content: "\f478"; } .fa-file-pdf:before { content: "\f1c1"; } .fa-file-powerpoint:before { content: "\f1c4"; } .fa-file-video:before { content: "\f1c8"; } .fa-file-word:before { content: "\f1c2"; } .fa-film:before { content: "\f008"; } .fa-filter:before { content: "\f0b0"; } .fa-fire:before { content: "\f06d"; } .fa-fire-extinguisher:before { content: "\f134"; } .fa-firefox:before { content: "\f269"; } .fa-first-aid:before { content: "\f479"; } .fa-first-order:before { content: "\f2b0"; } .fa-first-order-alt:before { content: "\f50a"; } .fa-firstdraft:before { content: "\f3a1"; } .fa-flag:before { content: "\f024"; } .fa-flag-checkered:before { content: "\f11e"; } .fa-flask:before { content: "\f0c3"; } .fa-flickr:before { content: "\f16e"; } .fa-flipboard:before { content: "\f44d"; } .fa-fly:before { content: "\f417"; } .fa-folder:before { content: "\f07b"; } .fa-folder-open:before { content: "\f07c"; } .fa-font:before { content: "\f031"; } .fa-font-awesome:before { content: "\f2b4"; } .fa-font-awesome-alt:before { content: "\f35c"; } .fa-font-awesome-flag:before { content: "\f425"; } .fa-font-awesome-logo-full:before { content: "\f4e6"; } .fa-fonticons:before { content: "\f280"; } .fa-fonticons-fi:before { content: "\f3a2"; } .fa-football-ball:before { content: "\f44e"; } .fa-fort-awesome:before { content: "\f286"; } .fa-fort-awesome-alt:before { content: "\f3a3"; } .fa-forumbee:before { content: "\f211"; } .fa-forward:before { content: "\f04e"; } .fa-foursquare:before { content: "\f180"; } .fa-free-code-camp:before { content: "\f2c5"; } .fa-freebsd:before { content: "\f3a4"; } .fa-frown:before { content: "\f119"; } .fa-fulcrum:before { content: "\f50b"; } .fa-futbol:before { content: "\f1e3"; } .fa-galactic-republic:before { content: "\f50c"; } .fa-galactic-senate:before { content: "\f50d"; } .fa-gamepad:before { content: "\f11b"; } .fa-gavel:before { content: "\f0e3"; } .fa-gem:before { content: "\f3a5"; } .fa-genderless:before { content: "\f22d"; } .fa-get-pocket:before { content: "\f265"; } .fa-gg:before { content: "\f260"; } .fa-gg-circle:before { content: "\f261"; } .fa-gift:before { content: "\f06b"; } .fa-git:before { content: "\f1d3"; } .fa-git-square:before { content: "\f1d2"; } .fa-github:before { content: "\f09b"; } .fa-github-alt:before { content: "\f113"; } .fa-github-square:before { content: "\f092"; } .fa-gitkraken:before { content: "\f3a6"; } .fa-gitlab:before { content: "\f296"; } .fa-gitter:before { content: "\f426"; } .fa-glass-martini:before { content: "\f000"; } .fa-glide:before { content: "\f2a5"; } .fa-glide-g:before { content: "\f2a6"; } .fa-globe:before { content: "\f0ac"; } .fa-gofore:before { content: "\f3a7"; } .fa-golf-ball:before { content: "\f450"; } .fa-goodreads:before { content: "\f3a8"; } .fa-goodreads-g:before { content: "\f3a9"; } .fa-google:before { content: "\f1a0"; } .fa-google-drive:before { content: "\f3aa"; } .fa-google-play:before { content: "\f3ab"; } .fa-google-plus:before { content: "\f2b3"; } .fa-google-plus-g:before { content: "\f0d5"; } .fa-google-plus-square:before { content: "\f0d4"; } .fa-google-wallet:before { content: "\f1ee"; } .fa-graduation-cap:before { content: "\f19d"; } .fa-gratipay:before { content: "\f184"; } .fa-grav:before { content: "\f2d6"; } .fa-gripfire:before { content: "\f3ac"; } .fa-grunt:before { content: "\f3ad"; } .fa-gulp:before { content: "\f3ae"; } .fa-h-square:before { content: "\f0fd"; } .fa-hacker-news:before { content: "\f1d4"; } .fa-hacker-news-square:before { content: "\f3af"; } .fa-hand-holding:before { content: "\f4bd"; } .fa-hand-holding-heart:before { content: "\f4be"; } .fa-hand-holding-usd:before { content: "\f4c0"; } .fa-hand-lizard:before { content: "\f258"; } .fa-hand-paper:before { content: "\f256"; } .fa-hand-peace:before { content: "\f25b"; } .fa-hand-point-down:before { content: "\f0a7"; } .fa-hand-point-left:before { content: "\f0a5"; } .fa-hand-point-right:before { content: "\f0a4"; } .fa-hand-point-up:before { content: "\f0a6"; } .fa-hand-pointer:before { content: "\f25a"; } .fa-hand-rock:before { content: "\f255"; } .fa-hand-scissors:before { content: "\f257"; } .fa-hand-spock:before { content: "\f259"; } .fa-hands:before { content: "\f4c2"; } .fa-hands-helping:before { content: "\f4c4"; } .fa-handshake:before { content: "\f2b5"; } .fa-hashtag:before { content: "\f292"; } .fa-hdd:before { content: "\f0a0"; } .fa-heading:before { content: "\f1dc"; } .fa-headphones:before { content: "\f025"; } .fa-heart:before { content: "\f004"; } .fa-heartbeat:before { content: "\f21e"; } .fa-hips:before { content: "\f452"; } .fa-hire-a-helper:before { content: "\f3b0"; } .fa-history:before { content: "\f1da"; } .fa-hockey-puck:before { content: "\f453"; } .fa-home:before { content: "\f015"; } .fa-hooli:before { content: "\f427"; } .fa-hospital:before { content: "\f0f8"; } .fa-hospital-alt:before { content: "\f47d"; } .fa-hospital-symbol:before { content: "\f47e"; } .fa-hotjar:before { content: "\f3b1"; } .fa-hourglass:before { content: "\f254"; } .fa-hourglass-end:before { content: "\f253"; } .fa-hourglass-half:before { content: "\f252"; } .fa-hourglass-start:before { content: "\f251"; } .fa-houzz:before { content: "\f27c"; } .fa-html5:before { content: "\f13b"; } .fa-hubspot:before { content: "\f3b2"; } .fa-i-cursor:before { content: "\f246"; } .fa-id-badge:before { content: "\f2c1"; } .fa-id-card:before { content: "\f2c2"; } .fa-id-card-alt:before { content: "\f47f"; } .fa-image:before { content: "\f03e"; } .fa-images:before { content: "\f302"; } .fa-imdb:before { content: "\f2d8"; } .fa-inbox:before { content: "\f01c"; } .fa-indent:before { content: "\f03c"; } .fa-industry:before { content: "\f275"; } .fa-info:before { content: "\f129"; } .fa-info-circle:before { content: "\f05a"; } .fa-instagram:before { content: "\f16d"; } .fa-internet-explorer:before { content: "\f26b"; } .fa-ioxhost:before { content: "\f208"; } .fa-italic:before { content: "\f033"; } .fa-itunes:before { content: "\f3b4"; } .fa-itunes-note:before { content: "\f3b5"; } .fa-java:before { content: "\f4e4"; } .fa-jedi-order:before { content: "\f50e"; } .fa-jenkins:before { content: "\f3b6"; } .fa-joget:before { content: "\f3b7"; } .fa-joomla:before { content: "\f1aa"; } .fa-js:before { content: "\f3b8"; } .fa-js-square:before { content: "\f3b9"; } .fa-jsfiddle:before { content: "\f1cc"; } .fa-key:before { content: "\f084"; } .fa-keybase:before { content: "\f4f5"; } .fa-keyboard:before { content: "\f11c"; } .fa-keycdn:before { content: "\f3ba"; } .fa-kickstarter:before { content: "\f3bb"; } .fa-kickstarter-k:before { content: "\f3bc"; } .fa-korvue:before { content: "\f42f"; } .fa-language:before { content: "\f1ab"; } .fa-laptop:before { content: "\f109"; } .fa-laravel:before { content: "\f3bd"; } .fa-lastfm:before { content: "\f202"; } .fa-lastfm-square:before { content: "\f203"; } .fa-leaf:before { content: "\f06c"; } .fa-leanpub:before { content: "\f212"; } .fa-lemon:before { content: "\f094"; } .fa-less:before { content: "\f41d"; } .fa-level-down-alt:before { content: "\f3be"; } .fa-level-up-alt:before { content: "\f3bf"; } .fa-life-ring:before { content: "\f1cd"; } .fa-lightbulb:before { content: "\f0eb"; } .fa-line:before { content: "\f3c0"; } .fa-link:before { content: "\f0c1"; } .fa-linkedin:before { content: "\f08c"; } .fa-linkedin-in:before { content: "\f0e1"; } .fa-linode:before { content: "\f2b8"; } .fa-linux:before { content: "\f17c"; } .fa-lira-sign:before { content: "\f195"; } .fa-list:before { content: "\f03a"; } .fa-list-alt:before { content: "\f022"; } .fa-list-ol:before { content: "\f0cb"; } .fa-list-ul:before { content: "\f0ca"; } .fa-location-arrow:before { content: "\f124"; } .fa-lock:before { content: "\f023"; } .fa-lock-open:before { content: "\f3c1"; } .fa-long-arrow-alt-down:before { content: "\f309"; } .fa-long-arrow-alt-left:before { content: "\f30a"; } .fa-long-arrow-alt-right:before { content: "\f30b"; } .fa-long-arrow-alt-up:before { content: "\f30c"; } .fa-low-vision:before { content: "\f2a8"; } .fa-lyft:before { content: "\f3c3"; } .fa-magento:before { content: "\f3c4"; } .fa-magic:before { content: "\f0d0"; } .fa-magnet:before { content: "\f076"; } .fa-male:before { content: "\f183"; } .fa-mandalorian:before { content: "\f50f"; } .fa-map:before { content: "\f279"; } .fa-map-marker:before { content: "\f041"; } .fa-map-marker-alt:before { content: "\f3c5"; } .fa-map-pin:before { content: "\f276"; } .fa-map-signs:before { content: "\f277"; } .fa-mars:before { content: "\f222"; } .fa-mars-double:before { content: "\f227"; } .fa-mars-stroke:before { content: "\f229"; } .fa-mars-stroke-h:before { content: "\f22b"; } .fa-mars-stroke-v:before { content: "\f22a"; } .fa-mastodon:before { content: "\f4f6"; } .fa-maxcdn:before { content: "\f136"; } .fa-medapps:before { content: "\f3c6"; } .fa-medium:before { content: "\f23a"; } .fa-medium-m:before { content: "\f3c7"; } .fa-medkit:before { content: "\f0fa"; } .fa-medrt:before { content: "\f3c8"; } .fa-meetup:before { content: "\f2e0"; } .fa-meh:before { content: "\f11a"; } .fa-mercury:before { content: "\f223"; } .fa-microchip:before { content: "\f2db"; } .fa-microphone:before { content: "\f130"; } .fa-microphone-slash:before { content: "\f131"; } .fa-microsoft:before { content: "\f3ca"; } .fa-minus:before { content: "\f068"; } .fa-minus-circle:before { content: "\f056"; } .fa-minus-square:before { content: "\f146"; } .fa-mix:before { content: "\f3cb"; } .fa-mixcloud:before { content: "\f289"; } .fa-mizuni:before { content: "\f3cc"; } .fa-mobile:before { content: "\f10b"; } .fa-mobile-alt:before { content: "\f3cd"; } .fa-modx:before { content: "\f285"; } .fa-monero:before { content: "\f3d0"; } .fa-money-bill-alt:before { content: "\f3d1"; } .fa-moon:before { content: "\f186"; } .fa-motorcycle:before { content: "\f21c"; } .fa-mouse-pointer:before { content: "\f245"; } .fa-music:before { content: "\f001"; } .fa-napster:before { content: "\f3d2"; } .fa-neuter:before { content: "\f22c"; } .fa-newspaper:before { content: "\f1ea"; } .fa-nintendo-switch:before { content: "\f418"; } .fa-node:before { content: "\f419"; } .fa-node-js:before { content: "\f3d3"; } .fa-notes-medical:before { content: "\f481"; } .fa-npm:before { content: "\f3d4"; } .fa-ns8:before { content: "\f3d5"; } .fa-nutritionix:before { content: "\f3d6"; } .fa-object-group:before { content: "\f247"; } .fa-object-ungroup:before { content: "\f248"; } .fa-odnoklassniki:before { content: "\f263"; } .fa-odnoklassniki-square:before { content: "\f264"; } .fa-old-republic:before { content: "\f510"; } .fa-opencart:before { content: "\f23d"; } .fa-openid:before { content: "\f19b"; } .fa-opera:before { content: "\f26a"; } .fa-optin-monster:before { content: "\f23c"; } .fa-osi:before { content: "\f41a"; } .fa-outdent:before { content: "\f03b"; } .fa-page4:before { content: "\f3d7"; } .fa-pagelines:before { content: "\f18c"; } .fa-paint-brush:before { content: "\f1fc"; } .fa-palfed:before { content: "\f3d8"; } .fa-pallet:before { content: "\f482"; } .fa-paper-plane:before { content: "\f1d8"; } .fa-paperclip:before { content: "\f0c6"; } .fa-parachute-box:before { content: "\f4cd"; } .fa-paragraph:before { content: "\f1dd"; } .fa-paste:before { content: "\f0ea"; } .fa-patreon:before { content: "\f3d9"; } .fa-pause:before { content: "\f04c"; } .fa-pause-circle:before { content: "\f28b"; } .fa-paw:before { content: "\f1b0"; } .fa-paypal:before { content: "\f1ed"; } .fa-pen-square:before { content: "\f14b"; } .fa-pencil-alt:before { content: "\f303"; } .fa-people-carry:before { content: "\f4ce"; } .fa-percent:before { content: "\f295"; } .fa-periscope:before { content: "\f3da"; } .fa-phabricator:before { content: "\f3db"; } .fa-phoenix-framework:before { content: "\f3dc"; } .fa-phoenix-squadron:before { content: "\f511"; } .fa-phone:before { content: "\f095"; } .fa-phone-slash:before { content: "\f3dd"; } .fa-phone-square:before { content: "\f098"; } .fa-phone-volume:before { content: "\f2a0"; } .fa-php:before { content: "\f457"; } .fa-pied-piper:before { content: "\f2ae"; } .fa-pied-piper-alt:before { content: "\f1a8"; } .fa-pied-piper-hat:before { content: "\f4e5"; } .fa-pied-piper-pp:before { content: "\f1a7"; } .fa-piggy-bank:before { content: "\f4d3"; } .fa-pills:before { content: "\f484"; } .fa-pinterest:before { content: "\f0d2"; } .fa-pinterest-p:before { content: "\f231"; } .fa-pinterest-square:before { content: "\f0d3"; } .fa-plane:before { content: "\f072"; } .fa-play:before { content: "\f04b"; } .fa-play-circle:before { content: "\f144"; } .fa-playstation:before { content: "\f3df"; } .fa-plug:before { content: "\f1e6"; } .fa-plus:before { content: "\f067"; } .fa-plus-circle:before { content: "\f055"; } .fa-plus-square:before { content: "\f0fe"; } .fa-podcast:before { content: "\f2ce"; } .fa-poo:before { content: "\f2fe"; } .fa-portrait:before { content: "\f3e0"; } .fa-pound-sign:before { content: "\f154"; } .fa-power-off:before { content: "\f011"; } .fa-prescription-bottle:before { content: "\f485"; } .fa-prescription-bottle-alt:before { content: "\f486"; } .fa-print:before { content: "\f02f"; } .fa-procedures:before { content: "\f487"; } .fa-product-hunt:before { content: "\f288"; } .fa-pushed:before { content: "\f3e1"; } .fa-puzzle-piece:before { content: "\f12e"; } .fa-python:before { content: "\f3e2"; } .fa-qq:before { content: "\f1d6"; } .fa-qrcode:before { content: "\f029"; } .fa-question:before { content: "\f128"; } .fa-question-circle:before { content: "\f059"; } .fa-quidditch:before { content: "\f458"; } .fa-quinscape:before { content: "\f459"; } .fa-quora:before { content: "\f2c4"; } .fa-quote-left:before { content: "\f10d"; } .fa-quote-right:before { content: "\f10e"; } .fa-r-project:before { content: "\f4f7"; } .fa-random:before { content: "\f074"; } .fa-ravelry:before { content: "\f2d9"; } .fa-react:before { content: "\f41b"; } .fa-readme:before { content: "\f4d5"; } .fa-rebel:before { content: "\f1d0"; } .fa-recycle:before { content: "\f1b8"; } .fa-red-river:before { content: "\f3e3"; } .fa-reddit:before { content: "\f1a1"; } .fa-reddit-alien:before { content: "\f281"; } .fa-reddit-square:before { content: "\f1a2"; } .fa-redo:before { content: "\f01e"; } .fa-redo-alt:before { content: "\f2f9"; } .fa-registered:before { content: "\f25d"; } .fa-rendact:before { content: "\f3e4"; } .fa-renren:before { content: "\f18b"; } .fa-reply:before { content: "\f3e5"; } .fa-reply-all:before { content: "\f122"; } .fa-replyd:before { content: "\f3e6"; } .fa-researchgate:before { content: "\f4f8"; } .fa-resolving:before { content: "\f3e7"; } .fa-retweet:before { content: "\f079"; } .fa-ribbon:before { content: "\f4d6"; } .fa-road:before { content: "\f018"; } .fa-rocket:before { content: "\f135"; } .fa-rocketchat:before { content: "\f3e8"; } .fa-rockrms:before { content: "\f3e9"; } .fa-rss:before { content: "\f09e"; } .fa-rss-square:before { content: "\f143"; } .fa-ruble-sign:before { content: "\f158"; } .fa-rupee-sign:before { content: "\f156"; } .fa-safari:before { content: "\f267"; } .fa-sass:before { content: "\f41e"; } .fa-save:before { content: "\f0c7"; } .fa-schlix:before { content: "\f3ea"; } .fa-scribd:before { content: "\f28a"; } .fa-search:before { content: "\f002"; } .fa-search-minus:before { content: "\f010"; } .fa-search-plus:before { content: "\f00e"; } .fa-searchengin:before { content: "\f3eb"; } .fa-seedling:before { content: "\f4d8"; } .fa-sellcast:before { content: "\f2da"; } .fa-sellsy:before { content: "\f213"; } .fa-server:before { content: "\f233"; } .fa-servicestack:before { content: "\f3ec"; } .fa-share:before { content: "\f064"; } .fa-share-alt:before { content: "\f1e0"; } .fa-share-alt-square:before { content: "\f1e1"; } .fa-share-square:before { content: "\f14d"; } .fa-shekel-sign:before { content: "\f20b"; } .fa-shield-alt:before { content: "\f3ed"; } .fa-ship:before { content: "\f21a"; } .fa-shipping-fast:before { content: "\f48b"; } .fa-shirtsinbulk:before { content: "\f214"; } .fa-shopping-bag:before { content: "\f290"; } .fa-shopping-basket:before { content: "\f291"; } .fa-shopping-cart:before { content: "\f07a"; } .fa-shower:before { content: "\f2cc"; } .fa-sign:before { content: "\f4d9"; } .fa-sign-in-alt:before { content: "\f2f6"; } .fa-sign-language:before { content: "\f2a7"; } .fa-sign-out-alt:before { content: "\f2f5"; } .fa-signal:before { content: "\f012"; } .fa-simplybuilt:before { content: "\f215"; } .fa-sistrix:before { content: "\f3ee"; } .fa-sitemap:before { content: "\f0e8"; } .fa-sith:before { content: "\f512"; } .fa-skyatlas:before { content: "\f216"; } .fa-skype:before { content: "\f17e"; } .fa-slack:before { content: "\f198"; } .fa-slack-hash:before { content: "\f3ef"; } .fa-sliders-h:before { content: "\f1de"; } .fa-slideshare:before { content: "\f1e7"; } .fa-smile:before { content: "\f118"; } .fa-smoking:before { content: "\f48d"; } .fa-snapchat:before { content: "\f2ab"; } .fa-snapchat-ghost:before { content: "\f2ac"; } .fa-snapchat-square:before { content: "\f2ad"; } .fa-snowflake:before { content: "\f2dc"; } .fa-sort:before { content: "\f0dc"; } .fa-sort-alpha-down:before { content: "\f15d"; } .fa-sort-alpha-up:before { content: "\f15e"; } .fa-sort-amount-down:before { content: "\f160"; } .fa-sort-amount-up:before { content: "\f161"; } .fa-sort-down:before { content: "\f0dd"; } .fa-sort-numeric-down:before { content: "\f162"; } .fa-sort-numeric-up:before { content: "\f163"; } .fa-sort-up:before { content: "\f0de"; } .fa-soundcloud:before { content: "\f1be"; } .fa-space-shuttle:before { content: "\f197"; } .fa-speakap:before { content: "\f3f3"; } .fa-spinner:before { content: "\f110"; } .fa-spotify:before { content: "\f1bc"; } .fa-square:before { content: "\f0c8"; } .fa-square-full:before { content: "\f45c"; } .fa-stack-exchange:before { content: "\f18d"; } .fa-stack-overflow:before { content: "\f16c"; } .fa-star:before { content: "\f005"; } .fa-star-half:before { content: "\f089"; } .fa-staylinked:before { content: "\f3f5"; } .fa-steam:before { content: "\f1b6"; } .fa-steam-square:before { content: "\f1b7"; } .fa-steam-symbol:before { content: "\f3f6"; } .fa-step-backward:before { content: "\f048"; } .fa-step-forward:before { content: "\f051"; } .fa-stethoscope:before { content: "\f0f1"; } .fa-sticker-mule:before { content: "\f3f7"; } .fa-sticky-note:before { content: "\f249"; } .fa-stop:before { content: "\f04d"; } .fa-stop-circle:before { content: "\f28d"; } .fa-stopwatch:before { content: "\f2f2"; } .fa-strava:before { content: "\f428"; } .fa-street-view:before { content: "\f21d"; } .fa-strikethrough:before { content: "\f0cc"; } .fa-stripe:before { content: "\f429"; } .fa-stripe-s:before { content: "\f42a"; } .fa-studiovinari:before { content: "\f3f8"; } .fa-stumbleupon:before { content: "\f1a4"; } .fa-stumbleupon-circle:before { content: "\f1a3"; } .fa-subscript:before { content: "\f12c"; } .fa-subway:before { content: "\f239"; } .fa-suitcase:before { content: "\f0f2"; } .fa-sun:before { content: "\f185"; } .fa-superpowers:before { content: "\f2dd"; } .fa-superscript:before { content: "\f12b"; } .fa-supple:before { content: "\f3f9"; } .fa-sync:before { content: "\f021"; } .fa-sync-alt:before { content: "\f2f1"; } .fa-syringe:before { content: "\f48e"; } .fa-table:before { content: "\f0ce"; } .fa-table-tennis:before { content: "\f45d"; } .fa-tablet:before { content: "\f10a"; } .fa-tablet-alt:before { content: "\f3fa"; } .fa-tablets:before { content: "\f490"; } .fa-tachometer-alt:before { content: "\f3fd"; } .fa-tag:before { content: "\f02b"; } .fa-tags:before { content: "\f02c"; } .fa-tape:before { content: "\f4db"; } .fa-tasks:before { content: "\f0ae"; } .fa-taxi:before { content: "\f1ba"; } .fa-teamspeak:before { content: "\f4f9"; } .fa-telegram:before { content: "\f2c6"; } .fa-telegram-plane:before { content: "\f3fe"; } .fa-tencent-weibo:before { content: "\f1d5"; } .fa-terminal:before { content: "\f120"; } .fa-text-height:before { content: "\f034"; } .fa-text-width:before { content: "\f035"; } .fa-th:before { content: "\f00a"; } .fa-th-large:before { content: "\f009"; } .fa-th-list:before { content: "\f00b"; } .fa-themeisle:before { content: "\f2b2"; } .fa-thermometer:before { content: "\f491"; } .fa-thermometer-empty:before { content: "\f2cb"; } .fa-thermometer-full:before { content: "\f2c7"; } .fa-thermometer-half:before { content: "\f2c9"; } .fa-thermometer-quarter:before { content: "\f2ca"; } .fa-thermometer-three-quarters:before { content: "\f2c8"; } .fa-thumbs-down:before { content: "\f165"; } .fa-thumbs-up:before { content: "\f164"; } .fa-thumbtack:before { content: "\f08d"; } .fa-ticket-alt:before { content: "\f3ff"; } .fa-times:before { content: "\f00d"; } .fa-times-circle:before { content: "\f057"; } .fa-tint:before { content: "\f043"; } .fa-toggle-off:before { content: "\f204"; } .fa-toggle-on:before { content: "\f205"; } .fa-trade-federation:before { content: "\f513"; } .fa-trademark:before { content: "\f25c"; } .fa-train:before { content: "\f238"; } .fa-transgender:before { content: "\f224"; } .fa-transgender-alt:before { content: "\f225"; } .fa-trash:before { content: "\f1f8"; } .fa-trash-alt:before { content: "\f2ed"; } .fa-tree:before { content: "\f1bb"; } .fa-trello:before { content: "\f181"; } .fa-tripadvisor:before { content: "\f262"; } .fa-trophy:before { content: "\f091"; } .fa-truck:before { content: "\f0d1"; } .fa-truck-loading:before { content: "\f4de"; } .fa-truck-moving:before { content: "\f4df"; } .fa-tty:before { content: "\f1e4"; } .fa-tumblr:before { content: "\f173"; } .fa-tumblr-square:before { content: "\f174"; } .fa-tv:before { content: "\f26c"; } .fa-twitch:before { content: "\f1e8"; } .fa-twitter:before { content: "\f099"; } .fa-twitter-square:before { content: "\f081"; } .fa-typo3:before { content: "\f42b"; } .fa-uber:before { content: "\f402"; } .fa-uikit:before { content: "\f403"; } .fa-umbrella:before { content: "\f0e9"; } .fa-underline:before { content: "\f0cd"; } .fa-undo:before { content: "\f0e2"; } .fa-undo-alt:before { content: "\f2ea"; } .fa-uniregistry:before { content: "\f404"; } .fa-universal-access:before { content: "\f29a"; } .fa-university:before { content: "\f19c"; } .fa-unlink:before { content: "\f127"; } .fa-unlock:before { content: "\f09c"; } .fa-unlock-alt:before { content: "\f13e"; } .fa-untappd:before { content: "\f405"; } .fa-upload:before { content: "\f093"; } .fa-usb:before { content: "\f287"; } .fa-user:before { content: "\f007"; } .fa-user-alt:before { content: "\f406"; } .fa-user-alt-slash:before { content: "\f4fa"; } .fa-user-astronaut:before { content: "\f4fb"; } .fa-user-check:before { content: "\f4fc"; } .fa-user-circle:before { content: "\f2bd"; } .fa-user-clock:before { content: "\f4fd"; } .fa-user-cog:before { content: "\f4fe"; } .fa-user-edit:before { content: "\f4ff"; } .fa-user-friends:before { content: "\f500"; } .fa-user-graduate:before { content: "\f501"; } .fa-user-lock:before { content: "\f502"; } .fa-user-md:before { content: "\f0f0"; } .fa-user-minus:before { content: "\f503"; } .fa-user-ninja:before { content: "\f504"; } .fa-user-plus:before { content: "\f234"; } .fa-user-secret:before { content: "\f21b"; } .fa-user-shield:before { content: "\f505"; } .fa-user-slash:before { content: "\f506"; } .fa-user-tag:before { content: "\f507"; } .fa-user-tie:before { content: "\f508"; } .fa-user-times:before { content: "\f235"; } .fa-users:before { content: "\f0c0"; } .fa-users-cog:before { content: "\f509"; } .fa-ussunnah:before { content: "\f407"; } .fa-utensil-spoon:before { content: "\f2e5"; } .fa-utensils:before { content: "\f2e7"; } .fa-vaadin:before { content: "\f408"; } .fa-venus:before { content: "\f221"; } .fa-venus-double:before { content: "\f226"; } .fa-venus-mars:before { content: "\f228"; } .fa-viacoin:before { content: "\f237"; } .fa-viadeo:before { content: "\f2a9"; } .fa-viadeo-square:before { content: "\f2aa"; } .fa-vial:before { content: "\f492"; } .fa-vials:before { content: "\f493"; } .fa-viber:before { content: "\f409"; } .fa-video:before { content: "\f03d"; } .fa-video-slash:before { content: "\f4e2"; } .fa-vimeo:before { content: "\f40a"; } .fa-vimeo-square:before { content: "\f194"; } .fa-vimeo-v:before { content: "\f27d"; } .fa-vine:before { content: "\f1ca"; } .fa-vk:before { content: "\f189"; } .fa-vnv:before { content: "\f40b"; } .fa-volleyball-ball:before { content: "\f45f"; } .fa-volume-down:before { content: "\f027"; } .fa-volume-off:before { content: "\f026"; } .fa-volume-up:before { content: "\f028"; } .fa-vuejs:before { content: "\f41f"; } .fa-warehouse:before { content: "\f494"; } .fa-weibo:before { content: "\f18a"; } .fa-weight:before { content: "\f496"; } .fa-weixin:before { content: "\f1d7"; } .fa-whatsapp:before { content: "\f232"; } .fa-whatsapp-square:before { content: "\f40c"; } .fa-wheelchair:before { content: "\f193"; } .fa-whmcs:before { content: "\f40d"; } .fa-wifi:before { content: "\f1eb"; } .fa-wikipedia-w:before { content: "\f266"; } .fa-window-close:before { content: "\f410"; } .fa-window-maximize:before { content: "\f2d0"; } .fa-window-minimize:before { content: "\f2d1"; } .fa-window-restore:before { content: "\f2d2"; } .fa-windows:before { content: "\f17a"; } .fa-wine-glass:before { content: "\f4e3"; } .fa-wolf-pack-battalion:before { content: "\f514"; } .fa-won-sign:before { content: "\f159"; } .fa-wordpress:before { content: "\f19a"; } .fa-wordpress-simple:before { content: "\f411"; } .fa-wpbeginner:before { content: "\f297"; } .fa-wpexplorer:before { content: "\f2de"; } .fa-wpforms:before { content: "\f298"; } .fa-wrench:before { content: "\f0ad"; } .fa-x-ray:before { content: "\f497"; } .fa-xbox:before { content: "\f412"; } .fa-xing:before { content: "\f168"; } .fa-xing-square:before { content: "\f169"; } .fa-y-combinator:before { content: "\f23b"; } .fa-yahoo:before { content: "\f19e"; } .fa-yandex:before { content: "\f413"; } .fa-yandex-international:before { content: "\f414"; } .fa-yelp:before { content: "\f1e9"; } .fa-yen-sign:before { content: "\f157"; } .fa-yoast:before { content: "\f2b1"; } .fa-youtube:before { content: "\f167"; } .fa-youtube-square:before { content: "\f431"; } .sr-only { border: 0; clip: rect(0, 0, 0, 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; } .sr-only-focusable:active, .sr-only-focusable:focus { clip: auto; height: auto; margin: 0; overflow: visible; position: static; width: auto; } @font-face { font-family: 'Font Awesome 5 Brands'; font-style: normal; font-weight: normal; src: url("../webfonts/fa-brands-400.eot"); src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg"); } .fab { font-family: 'Font Awesome 5 Brands'; } @font-face { font-family: 'Font Awesome 5 Free'; font-style: normal; font-weight: 400; src: url("../webfonts/fa-regular-400.eot"); src: url("../webfonts/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.woff") format("woff"), url("../webfonts/fa-regular-400.ttf") format("truetype"), url("../webfonts/fa-regular-400.svg#fontawesome") format("svg"); } .far { font-family: 'Font Awesome 5 Free'; font-weight: 400; } @font-face { font-family: 'Font Awesome 5 Free'; font-style: normal; font-weight: 900; src: url("../webfonts/fa-solid-900.eot"); src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); } .fa, .fas { font-family: 'Font Awesome 5 Free'; font-weight: 900; }

BluePrints/src/main/webapp/css/fontawesome/css/fontawesome-all.min.css

/*! * Font Awesome Free 5.0.12 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) */ .fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:a 2s infinite linear;animation:a 2s infinite linear}.fa-pulse{-webkit-animation:a 1s infinite steps(8);animation:a 1s infinite steps(8)}@-webkit-keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-aws:before{content:"\f375"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blind:before{content:"\f29d"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-certificate:before{content:"\f0a3"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-square:before{content:"\f14a"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-credit-card:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crosshairs:before{content:"\f05b"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-deviantart:before{content:"\f1bd"}.fa-diagnoses:before{content:"\f470"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drupal:before{content:"\f1a9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-excel:before{content:"\f1c3"}.fa-file-image:before{content:"\f1c5"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fire:before{content:"\f06d"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frown:before{content:"\f119"}.fa-fulcrum:before{content:"\f50b"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-gift:before{content:"\f06b"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-martini:before{content:"\f000"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hashtag:before{content:"\f292"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-heart:before{content:"\f004"}.fa-heartbeat:before{content:"\f21e"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-internet-explorer:before{content:"\f26b"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-joget:before{content:"\f3b7"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-korvue:before{content:"\f42f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-meh:before{content:"\f11a"}.fa-mercury:before{content:"\f223"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-moon:before{content:"\f186"}.fa-motorcycle:before{content:"\f21c"}.fa-mouse-pointer:before{content:"\f245"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-old-republic:before{content:"\f510"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-people-carry:before{content:"\f4ce"}.fa-percent:before{content:"\f295"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-plane:before{content:"\f072"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poo:before{content:"\f2fe"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-r-project:before{content:"\f4f7"}.fa-random:before{content:"\f074"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-rendact:before{content:"\f3e4"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-retweet:before{content:"\f079"}.fa-ribbon:before{content:"\f4d6"}.fa-road:before{content:"\f018"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-rupee-sign:before{content:"\f156"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-scribd:before{content:"\f28a"}.fa-search:before{content:"\f002"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shower:before{content:"\f2cc"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smoking:before{content:"\f48d"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowflake:before{content:"\f2dc"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spinner:before{content:"\f110"}.fa-spotify:before{content:"\f1bc"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-star:before{content:"\f005"}.fa-star-half:before{content:"\f089"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-strava:before{content:"\f428"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-train:before{content:"\f238"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-moving:before{content:"\f4df"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vuejs:before{content:"\f41f"}.fa-warehouse:before{content:"\f494"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-glass:before{content:"\f4e3"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:Font Awesome\ 5 Brands;font-style:normal;font-weight:400;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:Font Awesome\ 5 Brands}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:Font Awesome\ 5 Free}.fa,.fas{font-weight:900}

BluePrints/src/main/webapp/css/fontawesome/css/fontawesome.css

/*! * Font Awesome Free 5.0.12 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) */ .fa, .fas, .far, .fal, .fab { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; display: inline-block; font-style: normal; font-variant: normal; text-rendering: auto; line-height: 1; } .fa-lg { font-size: 1.33333em; line-height: 0.75em; vertical-align: -.0667em; } .fa-xs { font-size: .75em; } .fa-sm { font-size: .875em; } .fa-1x { font-size: 1em; } .fa-2x { font-size: 2em; } .fa-3x { font-size: 3em; } .fa-4x { font-size: 4em; } .fa-5x { font-size: 5em; } .fa-6x { font-size: 6em; } .fa-7x { font-size: 7em; } .fa-8x { font-size: 8em; } .fa-9x { font-size: 9em; } .fa-10x { font-size: 10em; } .fa-fw { text-align: center; width: 1.25em; } .fa-ul { list-style-type: none; margin-left: 2.5em; padding-left: 0; } .fa-ul > li { position: relative; } .fa-li { left: -2em; position: absolute; text-align: center; width: 2em; line-height: inherit; } .fa-border { border: solid 0.08em #eee; border-radius: .1em; padding: .2em .25em .15em; } .fa-pull-left { float: left; } .fa-pull-right { float: right; } .fa.fa-pull-left, .fas.fa-pull-left, .far.fa-pull-left, .fal.fa-pull-left, .fab.fa-pull-left { margin-right: .3em; } .fa.fa-pull-right, .fas.fa-pull-right, .far.fa-pull-right, .fal.fa-pull-right, .fab.fa-pull-right { margin-left: .3em; } .fa-spin { -webkit-animation: fa-spin 2s infinite linear; animation: fa-spin 2s infinite linear; } .fa-pulse { -webkit-animation: fa-spin 1s infinite steps(8); animation: fa-spin 1s infinite steps(8); } @-webkit-keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } } @keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } } .fa-rotate-90 { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; -webkit-transform: rotate(90deg); transform: rotate(90deg); } .fa-rotate-180 { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; -webkit-transform: rotate(180deg); transform: rotate(180deg); } .fa-rotate-270 { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; -webkit-transform: rotate(270deg); transform: rotate(270deg); } .fa-flip-horizontal { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; -webkit-transform: scale(-1, 1); transform: scale(-1, 1); } .fa-flip-vertical { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; -webkit-transform: scale(1, -1); transform: scale(1, -1); } .fa-flip-horizontal.fa-flip-vertical { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; -webkit-transform: scale(-1, -1); transform: scale(-1, -1); } :root .fa-rotate-90, :root .fa-rotate-180, :root .fa-rotate-270, :root .fa-flip-horizontal, :root .fa-flip-vertical { -webkit-filter: none; filter: none; } .fa-stack { display: inline-block; height: 2em; line-height: 2em; position: relative; vertical-align: middle; width: 2em; } .fa-stack-1x, .fa-stack-2x { left: 0; position: absolute; text-align: center; width: 100%; } .fa-stack-1x { line-height: inherit; } .fa-stack-2x { font-size: 2em; } .fa-inverse { color: #fff; } /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen readers do not read off random characters that represent icons */ .fa-500px:before { content: "\f26e"; } .fa-accessible-icon:before { content: "\f368"; } .fa-accusoft:before { content: "\f369"; } .fa-address-book:before { content: "\f2b9"; } .fa-address-card:before { content: "\f2bb"; } .fa-adjust:before { content: "\f042"; } .fa-adn:before { content: "\f170"; } .fa-adversal:before { content: "\f36a"; } .fa-affiliatetheme:before { content: "\f36b"; } .fa-algolia:before { content: "\f36c"; } .fa-align-center:before { content: "\f037"; } .fa-align-justify:before { content: "\f039"; } .fa-align-left:before { content: "\f036"; } .fa-align-right:before { content: "\f038"; } .fa-allergies:before { content: "\f461"; } .fa-amazon:before { content: "\f270"; } .fa-amazon-pay:before { content: "\f42c"; } .fa-ambulance:before { content: "\f0f9"; } .fa-american-sign-language-interpreting:before { content: "\f2a3"; } .fa-amilia:before { content: "\f36d"; } .fa-anchor:before { content: "\f13d"; } .fa-android:before { content: "\f17b"; } .fa-angellist:before { content: "\f209"; } .fa-angle-double-down:before { content: "\f103"; } .fa-angle-double-left:before { content: "\f100"; } .fa-angle-double-right:before { content: "\f101"; } .fa-angle-double-up:before { content: "\f102"; } .fa-angle-down:before { content: "\f107"; } .fa-angle-left:before { content: "\f104"; } .fa-angle-right:before { content: "\f105"; } .fa-angle-up:before { content: "\f106"; } .fa-angrycreative:before { content: "\f36e"; } .fa-angular:before { content: "\f420"; } .fa-app-store:before { content: "\f36f"; } .fa-app-store-ios:before { content: "\f370"; } .fa-apper:before { content: "\f371"; } .fa-apple:before { content: "\f179"; } .fa-apple-pay:before { content: "\f415"; } .fa-archive:before { content: "\f187"; } .fa-arrow-alt-circle-down:before { content: "\f358"; } .fa-arrow-alt-circle-left:before { content: "\f359"; } .fa-arrow-alt-circle-right:before { content: "\f35a"; } .fa-arrow-alt-circle-up:before { content: "\f35b"; } .fa-arrow-circle-down:before { content: "\f0ab"; } .fa-arrow-circle-left:before { content: "\f0a8"; } .fa-arrow-circle-right:before { content: "\f0a9"; } .fa-arrow-circle-up:before { content: "\f0aa"; } .fa-arrow-down:before { content: "\f063"; } .fa-arrow-left:before { content: "\f060"; } .fa-arrow-right:before { content: "\f061"; } .fa-arrow-up:before { content: "\f062"; } .fa-arrows-alt:before { content: "\f0b2"; } .fa-arrows-alt-h:before { content: "\f337"; } .fa-arrows-alt-v:before { content: "\f338"; } .fa-assistive-listening-systems:before { content: "\f2a2"; } .fa-asterisk:before { content: "\f069"; } .fa-asymmetrik:before { content: "\f372"; } .fa-at:before { content: "\f1fa"; } .fa-audible:before { content: "\f373"; } .fa-audio-description:before { content: "\f29e"; } .fa-autoprefixer:before { content: "\f41c"; } .fa-avianex:before { content: "\f374"; } .fa-aviato:before { content: "\f421"; } .fa-aws:before { content: "\f375"; } .fa-backward:before { content: "\f04a"; } .fa-balance-scale:before { content: "\f24e"; } .fa-ban:before { content: "\f05e"; } .fa-band-aid:before { content: "\f462"; } .fa-bandcamp:before { content: "\f2d5"; } .fa-barcode:before { content: "\f02a"; } .fa-bars:before { content: "\f0c9"; } .fa-baseball-ball:before { content: "\f433"; } .fa-basketball-ball:before { content: "\f434"; } .fa-bath:before { content: "\f2cd"; } .fa-battery-empty:before { content: "\f244"; } .fa-battery-full:before { content: "\f240"; } .fa-battery-half:before { content: "\f242"; } .fa-battery-quarter:before { content: "\f243"; } .fa-battery-three-quarters:before { content: "\f241"; } .fa-bed:before { content: "\f236"; } .fa-beer:before { content: "\f0fc"; } .fa-behance:before { content: "\f1b4"; } .fa-behance-square:before { content: "\f1b5"; } .fa-bell:before { content: "\f0f3"; } .fa-bell-slash:before { content: "\f1f6"; } .fa-bicycle:before { content: "\f206"; } .fa-bimobject:before { content: "\f378"; } .fa-binoculars:before { content: "\f1e5"; } .fa-birthday-cake:before { content: "\f1fd"; } .fa-bitbucket:before { content: "\f171"; } .fa-bitcoin:before { content: "\f379"; } .fa-bity:before { content: "\f37a"; } .fa-black-tie:before { content: "\f27e"; } .fa-blackberry:before { content: "\f37b"; } .fa-blind:before { content: "\f29d"; } .fa-blogger:before { content: "\f37c"; } .fa-blogger-b:before { content: "\f37d"; } .fa-bluetooth:before { content: "\f293"; } .fa-bluetooth-b:before { content: "\f294"; } .fa-bold:before { content: "\f032"; } .fa-bolt:before { content: "\f0e7"; } .fa-bomb:before { content: "\f1e2"; } .fa-book:before { content: "\f02d"; } .fa-bookmark:before { content: "\f02e"; } .fa-bowling-ball:before { content: "\f436"; } .fa-box:before { content: "\f466"; } .fa-box-open:before { content: "\f49e"; } .fa-boxes:before { content: "\f468"; } .fa-braille:before { content: "\f2a1"; } .fa-briefcase:before { content: "\f0b1"; } .fa-briefcase-medical:before { content: "\f469"; } .fa-btc:before { content: "\f15a"; } .fa-bug:before { content: "\f188"; } .fa-building:before { content: "\f1ad"; } .fa-bullhorn:before { content: "\f0a1"; } .fa-bullseye:before { content: "\f140"; } .fa-burn:before { content: "\f46a"; } .fa-buromobelexperte:before { content: "\f37f"; } .fa-bus:before { content: "\f207"; } .fa-buysellads:before { content: "\f20d"; } .fa-calculator:before { content: "\f1ec"; } .fa-calendar:before { content: "\f133"; } .fa-calendar-alt:before { content: "\f073"; } .fa-calendar-check:before { content: "\f274"; } .fa-calendar-minus:before { content: "\f272"; } .fa-calendar-plus:before { content: "\f271"; } .fa-calendar-times:before { content: "\f273"; } .fa-camera:before { content: "\f030"; } .fa-camera-retro:before { content: "\f083"; } .fa-capsules:before { content: "\f46b"; } .fa-car:before { content: "\f1b9"; } .fa-caret-down:before { content: "\f0d7"; } .fa-caret-left:before { content: "\f0d9"; } .fa-caret-right:before { content: "\f0da"; } .fa-caret-square-down:before { content: "\f150"; } .fa-caret-square-left:before { content: "\f191"; } .fa-caret-square-right:before { content: "\f152"; } .fa-caret-square-up:before { content: "\f151"; } .fa-caret-up:before { content: "\f0d8"; } .fa-cart-arrow-down:before { content: "\f218"; } .fa-cart-plus:before { content: "\f217"; } .fa-cc-amazon-pay:before { content: "\f42d"; } .fa-cc-amex:before { content: "\f1f3"; } .fa-cc-apple-pay:before { content: "\f416"; } .fa-cc-diners-club:before { content: "\f24c"; } .fa-cc-discover:before { content: "\f1f2"; } .fa-cc-jcb:before { content: "\f24b"; } .fa-cc-mastercard:before { content: "\f1f1"; } .fa-cc-paypal:before { content: "\f1f4"; } .fa-cc-stripe:before { content: "\f1f5"; } .fa-cc-visa:before { content: "\f1f0"; } .fa-centercode:before { content: "\f380"; } .fa-certificate:before { content: "\f0a3"; } .fa-chart-area:before { content: "\f1fe"; } .fa-chart-bar:before { content: "\f080"; } .fa-chart-line:before { content: "\f201"; } .fa-chart-pie:before { content: "\f200"; } .fa-check:before { content: "\f00c"; } .fa-check-circle:before { content: "\f058"; } .fa-check-square:before { content: "\f14a"; } .fa-chess:before { content: "\f439"; } .fa-chess-bishop:before { content: "\f43a"; } .fa-chess-board:before { content: "\f43c"; } .fa-chess-king:before { content: "\f43f"; } .fa-chess-knight:before { content: "\f441"; } .fa-chess-pawn:before { content: "\f443"; } .fa-chess-queen:before { content: "\f445"; } .fa-chess-rook:before { content: "\f447"; } .fa-chevron-circle-down:before { content: "\f13a"; } .fa-chevron-circle-left:before { content: "\f137"; } .fa-chevron-circle-right:before { content: "\f138"; } .fa-chevron-circle-up:before { content: "\f139"; } .fa-chevron-down:before { content: "\f078"; } .fa-chevron-left:before { content: "\f053"; } .fa-chevron-right:before { content: "\f054"; } .fa-chevron-up:before { content: "\f077"; } .fa-child:before { content: "\f1ae"; } .fa-chrome:before { content: "\f268"; } .fa-circle:before { content: "\f111"; } .fa-circle-notch:before { content: "\f1ce"; } .fa-clipboard:before { content: "\f328"; } .fa-clipboard-check:before { content: "\f46c"; } .fa-clipboard-list:before { content: "\f46d"; } .fa-clock:before { content: "\f017"; } .fa-clone:before { content: "\f24d"; } .fa-closed-captioning:before { content: "\f20a"; } .fa-cloud:before { content: "\f0c2"; } .fa-cloud-download-alt:before { content: "\f381"; } .fa-cloud-upload-alt:before { content: "\f382"; } .fa-cloudscale:before { content: "\f383"; } .fa-cloudsmith:before { content: "\f384"; } .fa-cloudversify:before { content: "\f385"; } .fa-code:before { content: "\f121"; } .fa-code-branch:before { content: "\f126"; } .fa-codepen:before { content: "\f1cb"; } .fa-codiepie:before { content: "\f284"; } .fa-coffee:before { content: "\f0f4"; } .fa-cog:before { content: "\f013"; } .fa-cogs:before { content: "\f085"; } .fa-columns:before { content: "\f0db"; } .fa-comment:before { content: "\f075"; } .fa-comment-alt:before { content: "\f27a"; } .fa-comment-dots:before { content: "\f4ad"; } .fa-comment-slash:before { content: "\f4b3"; } .fa-comments:before { content: "\f086"; } .fa-compass:before { content: "\f14e"; } .fa-compress:before { content: "\f066"; } .fa-connectdevelop:before { content: "\f20e"; } .fa-contao:before { content: "\f26d"; } .fa-copy:before { content: "\f0c5"; } .fa-copyright:before { content: "\f1f9"; } .fa-couch:before { content: "\f4b8"; } .fa-cpanel:before { content: "\f388"; } .fa-creative-commons:before { content: "\f25e"; } .fa-creative-commons-by:before { content: "\f4e7"; } .fa-creative-commons-nc:before { content: "\f4e8"; } .fa-creative-commons-nc-eu:before { content: "\f4e9"; } .fa-creative-commons-nc-jp:before { content: "\f4ea"; } .fa-creative-commons-nd:before { content: "\f4eb"; } .fa-creative-commons-pd:before { content: "\f4ec"; } .fa-creative-commons-pd-alt:before { content: "\f4ed"; } .fa-creative-commons-remix:before { content: "\f4ee"; } .fa-creative-commons-sa:before { content: "\f4ef"; } .fa-creative-commons-sampling:before { content: "\f4f0"; } .fa-creative-commons-sampling-plus:before { content: "\f4f1"; } .fa-creative-commons-share:before { content: "\f4f2"; } .fa-credit-card:before { content: "\f09d"; } .fa-crop:before { content: "\f125"; } .fa-crosshairs:before { content: "\f05b"; } .fa-css3:before { content: "\f13c"; } .fa-css3-alt:before { content: "\f38b"; } .fa-cube:before { content: "\f1b2"; } .fa-cubes:before { content: "\f1b3"; } .fa-cut:before { content: "\f0c4"; } .fa-cuttlefish:before { content: "\f38c"; } .fa-d-and-d:before { content: "\f38d"; } .fa-dashcube:before { content: "\f210"; } .fa-database:before { content: "\f1c0"; } .fa-deaf:before { content: "\f2a4"; } .fa-delicious:before { content: "\f1a5"; } .fa-deploydog:before { content: "\f38e"; } .fa-deskpro:before { content: "\f38f"; } .fa-desktop:before { content: "\f108"; } .fa-deviantart:before { content: "\f1bd"; } .fa-diagnoses:before { content: "\f470"; } .fa-digg:before { content: "\f1a6"; } .fa-digital-ocean:before { content: "\f391"; } .fa-discord:before { content: "\f392"; } .fa-discourse:before { content: "\f393"; } .fa-dna:before { content: "\f471"; } .fa-dochub:before { content: "\f394"; } .fa-docker:before { content: "\f395"; } .fa-dollar-sign:before { content: "\f155"; } .fa-dolly:before { content: "\f472"; } .fa-dolly-flatbed:before { content: "\f474"; } .fa-donate:before { content: "\f4b9"; } .fa-dot-circle:before { content: "\f192"; } .fa-dove:before { content: "\f4ba"; } .fa-download:before { content: "\f019"; } .fa-draft2digital:before { content: "\f396"; } .fa-dribbble:before { content: "\f17d"; } .fa-dribbble-square:before { content: "\f397"; } .fa-dropbox:before { content: "\f16b"; } .fa-drupal:before { content: "\f1a9"; } .fa-dyalog:before { content: "\f399"; } .fa-earlybirds:before { content: "\f39a"; } .fa-ebay:before { content: "\f4f4"; } .fa-edge:before { content: "\f282"; } .fa-edit:before { content: "\f044"; } .fa-eject:before { content: "\f052"; } .fa-elementor:before { content: "\f430"; } .fa-ellipsis-h:before { content: "\f141"; } .fa-ellipsis-v:before { content: "\f142"; } .fa-ember:before { content: "\f423"; } .fa-empire:before { content: "\f1d1"; } .fa-envelope:before { content: "\f0e0"; } .fa-envelope-open:before { content: "\f2b6"; } .fa-envelope-square:before { content: "\f199"; } .fa-envira:before { content: "\f299"; } .fa-eraser:before { content: "\f12d"; } .fa-erlang:before { content: "\f39d"; } .fa-ethereum:before { content: "\f42e"; } .fa-etsy:before { content: "\f2d7"; } .fa-euro-sign:before { content: "\f153"; } .fa-exchange-alt:before { content: "\f362"; } .fa-exclamation:before { content: "\f12a"; } .fa-exclamation-circle:before { content: "\f06a"; } .fa-exclamation-triangle:before { content: "\f071"; } .fa-expand:before { content: "\f065"; } .fa-expand-arrows-alt:before { content: "\f31e"; } .fa-expeditedssl:before { content: "\f23e"; } .fa-external-link-alt:before { content: "\f35d"; } .fa-external-link-square-alt:before { content: "\f360"; } .fa-eye:before { content: "\f06e"; } .fa-eye-dropper:before { content: "\f1fb"; } .fa-eye-slash:before { content: "\f070"; } .fa-facebook:before { content: "\f09a"; } .fa-facebook-f:before { content: "\f39e"; } .fa-facebook-messenger:before { content: "\f39f"; } .fa-facebook-square:before { content: "\f082"; } .fa-fast-backward:before { content: "\f049"; } .fa-fast-forward:before { content: "\f050"; } .fa-fax:before { content: "\f1ac"; } .fa-female:before { content: "\f182"; } .fa-fighter-jet:before { content: "\f0fb"; } .fa-file:before { content: "\f15b"; } .fa-file-alt:before { content: "\f15c"; } .fa-file-archive:before { content: "\f1c6"; } .fa-file-audio:before { content: "\f1c7"; } .fa-file-code:before { content: "\f1c9"; } .fa-file-excel:before { content: "\f1c3"; } .fa-file-image:before { content: "\f1c5"; } .fa-file-medical:before { content: "\f477"; } .fa-file-medical-alt:before { content: "\f478"; } .fa-file-pdf:before { content: "\f1c1"; } .fa-file-powerpoint:before { content: "\f1c4"; } .fa-file-video:before { content: "\f1c8"; } .fa-file-word:before { content: "\f1c2"; } .fa-film:before { content: "\f008"; } .fa-filter:before { content: "\f0b0"; } .fa-fire:before { content: "\f06d"; } .fa-fire-extinguisher:before { content: "\f134"; } .fa-firefox:before { content: "\f269"; } .fa-first-aid:before { content: "\f479"; } .fa-first-order:before { content: "\f2b0"; } .fa-first-order-alt:before { content: "\f50a"; } .fa-firstdraft:before { content: "\f3a1"; } .fa-flag:before { content: "\f024"; } .fa-flag-checkered:before { content: "\f11e"; } .fa-flask:before { content: "\f0c3"; } .fa-flickr:before { content: "\f16e"; } .fa-flipboard:before { content: "\f44d"; } .fa-fly:before { content: "\f417"; } .fa-folder:before { content: "\f07b"; } .fa-folder-open:before { content: "\f07c"; } .fa-font:before { content: "\f031"; } .fa-font-awesome:before { content: "\f2b4"; } .fa-font-awesome-alt:before { content: "\f35c"; } .fa-font-awesome-flag:before { content: "\f425"; } .fa-font-awesome-logo-full:before { content: "\f4e6"; } .fa-fonticons:before { content: "\f280"; } .fa-fonticons-fi:before { content: "\f3a2"; } .fa-football-ball:before { content: "\f44e"; } .fa-fort-awesome:before { content: "\f286"; } .fa-fort-awesome-alt:before { content: "\f3a3"; } .fa-forumbee:before { content: "\f211"; } .fa-forward:before { content: "\f04e"; } .fa-foursquare:before { content: "\f180"; } .fa-free-code-camp:before { content: "\f2c5"; } .fa-freebsd:before { content: "\f3a4"; } .fa-frown:before { content: "\f119"; } .fa-fulcrum:before { content: "\f50b"; } .fa-futbol:before { content: "\f1e3"; } .fa-galactic-republic:before { content: "\f50c"; } .fa-galactic-senate:before { content: "\f50d"; } .fa-gamepad:before { content: "\f11b"; } .fa-gavel:before { content: "\f0e3"; } .fa-gem:before { content: "\f3a5"; } .fa-genderless:before { content: "\f22d"; } .fa-get-pocket:before { content: "\f265"; } .fa-gg:before { content: "\f260"; } .fa-gg-circle:before { content: "\f261"; } .fa-gift:before { content: "\f06b"; } .fa-git:before { content: "\f1d3"; } .fa-git-square:before { content: "\f1d2"; } .fa-github:before { content: "\f09b"; } .fa-github-alt:before { content: "\f113"; } .fa-github-square:before { content: "\f092"; } .fa-gitkraken:before { content: "\f3a6"; } .fa-gitlab:before { content: "\f296"; } .fa-gitter:before { content: "\f426"; } .fa-glass-martini:before { content: "\f000"; } .fa-glide:before { content: "\f2a5"; } .fa-glide-g:before { content: "\f2a6"; } .fa-globe:before { content: "\f0ac"; } .fa-gofore:before { content: "\f3a7"; } .fa-golf-ball:before { content: "\f450"; } .fa-goodreads:before { content: "\f3a8"; } .fa-goodreads-g:before { content: "\f3a9"; } .fa-google:before { content: "\f1a0"; } .fa-google-drive:before { content: "\f3aa"; } .fa-google-play:before { content: "\f3ab"; } .fa-google-plus:before { content: "\f2b3"; } .fa-google-plus-g:before { content: "\f0d5"; } .fa-google-plus-square:before { content: "\f0d4"; } .fa-google-wallet:before { content: "\f1ee"; } .fa-graduation-cap:before { content: "\f19d"; } .fa-gratipay:before { content: "\f184"; } .fa-grav:before { content: "\f2d6"; } .fa-gripfire:before { content: "\f3ac"; } .fa-grunt:before { content: "\f3ad"; } .fa-gulp:before { content: "\f3ae"; } .fa-h-square:before { content: "\f0fd"; } .fa-hacker-news:before { content: "\f1d4"; } .fa-hacker-news-square:before { content: "\f3af"; } .fa-hand-holding:before { content: "\f4bd"; } .fa-hand-holding-heart:before { content: "\f4be"; } .fa-hand-holding-usd:before { content: "\f4c0"; } .fa-hand-lizard:before { content: "\f258"; } .fa-hand-paper:before { content: "\f256"; } .fa-hand-peace:before { content: "\f25b"; } .fa-hand-point-down:before { content: "\f0a7"; } .fa-hand-point-left:before { content: "\f0a5"; } .fa-hand-point-right:before { content: "\f0a4"; } .fa-hand-point-up:before { content: "\f0a6"; } .fa-hand-pointer:before { content: "\f25a"; } .fa-hand-rock:before { content: "\f255"; } .fa-hand-scissors:before { content: "\f257"; } .fa-hand-spock:before { content: "\f259"; } .fa-hands:before { content: "\f4c2"; } .fa-hands-helping:before { content: "\f4c4"; } .fa-handshake:before { content: "\f2b5"; } .fa-hashtag:before { content: "\f292"; } .fa-hdd:before { content: "\f0a0"; } .fa-heading:before { content: "\f1dc"; } .fa-headphones:before { content: "\f025"; } .fa-heart:before { content: "\f004"; } .fa-heartbeat:before { content: "\f21e"; } .fa-hips:before { content: "\f452"; } .fa-hire-a-helper:before { content: "\f3b0"; } .fa-history:before { content: "\f1da"; } .fa-hockey-puck:before { content: "\f453"; } .fa-home:before { content: "\f015"; } .fa-hooli:before { content: "\f427"; } .fa-hospital:before { content: "\f0f8"; } .fa-hospital-alt:before { content: "\f47d"; } .fa-hospital-symbol:before { content: "\f47e"; } .fa-hotjar:before { content: "\f3b1"; } .fa-hourglass:before { content: "\f254"; } .fa-hourglass-end:before { content: "\f253"; } .fa-hourglass-half:before { content: "\f252"; } .fa-hourglass-start:before { content: "\f251"; } .fa-houzz:before { content: "\f27c"; } .fa-html5:before { content: "\f13b"; } .fa-hubspot:before { content: "\f3b2"; } .fa-i-cursor:before { content: "\f246"; } .fa-id-badge:before { content: "\f2c1"; } .fa-id-card:before { content: "\f2c2"; } .fa-id-card-alt:before { content: "\f47f"; } .fa-image:before { content: "\f03e"; } .fa-images:before { content: "\f302"; } .fa-imdb:before { content: "\f2d8"; } .fa-inbox:before { content: "\f01c"; } .fa-indent:before { content: "\f03c"; } .fa-industry:before { content: "\f275"; } .fa-info:before { content: "\f129"; } .fa-info-circle:before { content: "\f05a"; } .fa-instagram:before { content: "\f16d"; } .fa-internet-explorer:before { content: "\f26b"; } .fa-ioxhost:before { content: "\f208"; } .fa-italic:before { content: "\f033"; } .fa-itunes:before { content: "\f3b4"; } .fa-itunes-note:before { content: "\f3b5"; } .fa-java:before { content: "\f4e4"; } .fa-jedi-order:before { content: "\f50e"; } .fa-jenkins:before { content: "\f3b6"; } .fa-joget:before { content: "\f3b7"; } .fa-joomla:before { content: "\f1aa"; } .fa-js:before { content: "\f3b8"; } .fa-js-square:before { content: "\f3b9"; } .fa-jsfiddle:before { content: "\f1cc"; } .fa-key:before { content: "\f084"; } .fa-keybase:before { content: "\f4f5"; } .fa-keyboard:before { content: "\f11c"; } .fa-keycdn:before { content: "\f3ba"; } .fa-kickstarter:before { content: "\f3bb"; } .fa-kickstarter-k:before { content: "\f3bc"; } .fa-korvue:before { content: "\f42f"; } .fa-language:before { content: "\f1ab"; } .fa-laptop:before { content: "\f109"; } .fa-laravel:before { content: "\f3bd"; } .fa-lastfm:before { content: "\f202"; } .fa-lastfm-square:before { content: "\f203"; } .fa-leaf:before { content: "\f06c"; } .fa-leanpub:before { content: "\f212"; } .fa-lemon:before { content: "\f094"; } .fa-less:before { content: "\f41d"; } .fa-level-down-alt:before { content: "\f3be"; } .fa-level-up-alt:before { content: "\f3bf"; } .fa-life-ring:before { content: "\f1cd"; } .fa-lightbulb:before { content: "\f0eb"; } .fa-line:before { content: "\f3c0"; } .fa-link:before { content: "\f0c1"; } .fa-linkedin:before { content: "\f08c"; } .fa-linkedin-in:before { content: "\f0e1"; } .fa-linode:before { content: "\f2b8"; } .fa-linux:before { content: "\f17c"; } .fa-lira-sign:before { content: "\f195"; } .fa-list:before { content: "\f03a"; } .fa-list-alt:before { content: "\f022"; } .fa-list-ol:before { content: "\f0cb"; } .fa-list-ul:before { content: "\f0ca"; } .fa-location-arrow:before { content: "\f124"; } .fa-lock:before { content: "\f023"; } .fa-lock-open:before { content: "\f3c1"; } .fa-long-arrow-alt-down:before { content: "\f309"; } .fa-long-arrow-alt-left:before { content: "\f30a"; } .fa-long-arrow-alt-right:before { content: "\f30b"; } .fa-long-arrow-alt-up:before { content: "\f30c"; } .fa-low-vision:before { content: "\f2a8"; } .fa-lyft:before { content: "\f3c3"; } .fa-magento:before { content: "\f3c4"; } .fa-magic:before { content: "\f0d0"; } .fa-magnet:before { content: "\f076"; } .fa-male:before { content: "\f183"; } .fa-mandalorian:before { content: "\f50f"; } .fa-map:before { content: "\f279"; } .fa-map-marker:before { content: "\f041"; } .fa-map-marker-alt:before { content: "\f3c5"; } .fa-map-pin:before { content: "\f276"; } .fa-map-signs:before { content: "\f277"; } .fa-mars:before { content: "\f222"; } .fa-mars-double:before { content: "\f227"; } .fa-mars-stroke:before { content: "\f229"; } .fa-mars-stroke-h:before { content: "\f22b"; } .fa-mars-stroke-v:before { content: "\f22a"; } .fa-mastodon:before { content: "\f4f6"; } .fa-maxcdn:before { content: "\f136"; } .fa-medapps:before { content: "\f3c6"; } .fa-medium:before { content: "\f23a"; } .fa-medium-m:before { content: "\f3c7"; } .fa-medkit:before { content: "\f0fa"; } .fa-medrt:before { content: "\f3c8"; } .fa-meetup:before { content: "\f2e0"; } .fa-meh:before { content: "\f11a"; } .fa-mercury:before { content: "\f223"; } .fa-microchip:before { content: "\f2db"; } .fa-microphone:before { content: "\f130"; } .fa-microphone-slash:before { content: "\f131"; } .fa-microsoft:before { content: "\f3ca"; } .fa-minus:before { content: "\f068"; } .fa-minus-circle:before { content: "\f056"; } .fa-minus-square:before { content: "\f146"; } .fa-mix:before { content: "\f3cb"; } .fa-mixcloud:before { content: "\f289"; } .fa-mizuni:before { content: "\f3cc"; } .fa-mobile:before { content: "\f10b"; } .fa-mobile-alt:before { content: "\f3cd"; } .fa-modx:before { content: "\f285"; } .fa-monero:before { content: "\f3d0"; } .fa-money-bill-alt:before { content: "\f3d1"; } .fa-moon:before { content: "\f186"; } .fa-motorcycle:before { content: "\f21c"; } .fa-mouse-pointer:before { content: "\f245"; } .fa-music:before { content: "\f001"; } .fa-napster:before { content: "\f3d2"; } .fa-neuter:before { content: "\f22c"; } .fa-newspaper:before { content: "\f1ea"; } .fa-nintendo-switch:before { content: "\f418"; } .fa-node:before { content: "\f419"; } .fa-node-js:before { content: "\f3d3"; } .fa-notes-medical:before { content: "\f481"; } .fa-npm:before { content: "\f3d4"; } .fa-ns8:before { content: "\f3d5"; } .fa-nutritionix:before { content: "\f3d6"; } .fa-object-group:before { content: "\f247"; } .fa-object-ungroup:before { content: "\f248"; } .fa-odnoklassniki:before { content: "\f263"; } .fa-odnoklassniki-square:before { content: "\f264"; } .fa-old-republic:before { content: "\f510"; } .fa-opencart:before { content: "\f23d"; } .fa-openid:before { content: "\f19b"; } .fa-opera:before { content: "\f26a"; } .fa-optin-monster:before { content: "\f23c"; } .fa-osi:before { content: "\f41a"; } .fa-outdent:before { content: "\f03b"; } .fa-page4:before { content: "\f3d7"; } .fa-pagelines:before { content: "\f18c"; } .fa-paint-brush:before { content: "\f1fc"; } .fa-palfed:before { content: "\f3d8"; } .fa-pallet:before { content: "\f482"; } .fa-paper-plane:before { content: "\f1d8"; } .fa-paperclip:before { content: "\f0c6"; } .fa-parachute-box:before { content: "\f4cd"; } .fa-paragraph:before { content: "\f1dd"; } .fa-paste:before { content: "\f0ea"; } .fa-patreon:before { content: "\f3d9"; } .fa-pause:before { content: "\f04c"; } .fa-pause-circle:before { content: "\f28b"; } .fa-paw:before { content: "\f1b0"; } .fa-paypal:before { content: "\f1ed"; } .fa-pen-square:before { content: "\f14b"; } .fa-pencil-alt:before { content: "\f303"; } .fa-people-carry:before { content: "\f4ce"; } .fa-percent:before { content: "\f295"; } .fa-periscope:before { content: "\f3da"; } .fa-phabricator:before { content: "\f3db"; } .fa-phoenix-framework:before { content: "\f3dc"; } .fa-phoenix-squadron:before { content: "\f511"; } .fa-phone:before { content: "\f095"; } .fa-phone-slash:before { content: "\f3dd"; } .fa-phone-square:before { content: "\f098"; } .fa-phone-volume:before { content: "\f2a0"; } .fa-php:before { content: "\f457"; } .fa-pied-piper:before { content: "\f2ae"; } .fa-pied-piper-alt:before { content: "\f1a8"; } .fa-pied-piper-hat:before { content: "\f4e5"; } .fa-pied-piper-pp:before { content: "\f1a7"; } .fa-piggy-bank:before { content: "\f4d3"; } .fa-pills:before { content: "\f484"; } .fa-pinterest:before { content: "\f0d2"; } .fa-pinterest-p:before { content: "\f231"; } .fa-pinterest-square:before { content: "\f0d3"; } .fa-plane:before { content: "\f072"; } .fa-play:before { content: "\f04b"; } .fa-play-circle:before { content: "\f144"; } .fa-playstation:before { content: "\f3df"; } .fa-plug:before { content: "\f1e6"; } .fa-plus:before { content: "\f067"; } .fa-plus-circle:before { content: "\f055"; } .fa-plus-square:before { content: "\f0fe"; } .fa-podcast:before { content: "\f2ce"; } .fa-poo:before { content: "\f2fe"; } .fa-portrait:before { content: "\f3e0"; } .fa-pound-sign:before { content: "\f154"; } .fa-power-off:before { content: "\f011"; } .fa-prescription-bottle:before { content: "\f485"; } .fa-prescription-bottle-alt:before { content: "\f486"; } .fa-print:before { content: "\f02f"; } .fa-procedures:before { content: "\f487"; } .fa-product-hunt:before { content: "\f288"; } .fa-pushed:before { content: "\f3e1"; } .fa-puzzle-piece:before { content: "\f12e"; } .fa-python:before { content: "\f3e2"; } .fa-qq:before { content: "\f1d6"; } .fa-qrcode:before { content: "\f029"; } .fa-question:before { content: "\f128"; } .fa-question-circle:before { content: "\f059"; } .fa-quidditch:before { content: "\f458"; } .fa-quinscape:before { content: "\f459"; } .fa-quora:before { content: "\f2c4"; } .fa-quote-left:before { content: "\f10d"; } .fa-quote-right:before { content: "\f10e"; } .fa-r-project:before { content: "\f4f7"; } .fa-random:before { content: "\f074"; } .fa-ravelry:before { content: "\f2d9"; } .fa-react:before { content: "\f41b"; } .fa-readme:before { content: "\f4d5"; } .fa-rebel:before { content: "\f1d0"; } .fa-recycle:before { content: "\f1b8"; } .fa-red-river:before { content: "\f3e3"; } .fa-reddit:before { content: "\f1a1"; } .fa-reddit-alien:before { content: "\f281"; } .fa-reddit-square:before { content: "\f1a2"; } .fa-redo:before { content: "\f01e"; } .fa-redo-alt:before { content: "\f2f9"; } .fa-registered:before { content: "\f25d"; } .fa-rendact:before { content: "\f3e4"; } .fa-renren:before { content: "\f18b"; } .fa-reply:before { content: "\f3e5"; } .fa-reply-all:before { content: "\f122"; } .fa-replyd:before { content: "\f3e6"; } .fa-researchgate:before { content: "\f4f8"; } .fa-resolving:before { content: "\f3e7"; } .fa-retweet:before { content: "\f079"; } .fa-ribbon:before { content: "\f4d6"; } .fa-road:before { content: "\f018"; } .fa-rocket:before { content: "\f135"; } .fa-rocketchat:before { content: "\f3e8"; } .fa-rockrms:before { content: "\f3e9"; } .fa-rss:before { content: "\f09e"; } .fa-rss-square:before { content: "\f143"; } .fa-ruble-sign:before { content: "\f158"; } .fa-rupee-sign:before { content: "\f156"; } .fa-safari:before { content: "\f267"; } .fa-sass:before { content: "\f41e"; } .fa-save:before { content: "\f0c7"; } .fa-schlix:before { content: "\f3ea"; } .fa-scribd:before { content: "\f28a"; } .fa-search:before { content: "\f002"; } .fa-search-minus:before { content: "\f010"; } .fa-search-plus:before { content: "\f00e"; } .fa-searchengin:before { content: "\f3eb"; } .fa-seedling:before { content: "\f4d8"; } .fa-sellcast:before { content: "\f2da"; } .fa-sellsy:before { content: "\f213"; } .fa-server:before { content: "\f233"; } .fa-servicestack:before { content: "\f3ec"; } .fa-share:before { content: "\f064"; } .fa-share-alt:before { content: "\f1e0"; } .fa-share-alt-square:before { content: "\f1e1"; } .fa-share-square:before { content: "\f14d"; } .fa-shekel-sign:before { content: "\f20b"; } .fa-shield-alt:before { content: "\f3ed"; } .fa-ship:before { content: "\f21a"; } .fa-shipping-fast:before { content: "\f48b"; } .fa-shirtsinbulk:before { content: "\f214"; } .fa-shopping-bag:before { content: "\f290"; } .fa-shopping-basket:before { content: "\f291"; } .fa-shopping-cart:before { content: "\f07a"; } .fa-shower:before { content: "\f2cc"; } .fa-sign:before { content: "\f4d9"; } .fa-sign-in-alt:before { content: "\f2f6"; } .fa-sign-language:before { content: "\f2a7"; } .fa-sign-out-alt:before { content: "\f2f5"; } .fa-signal:before { content: "\f012"; } .fa-simplybuilt:before { content: "\f215"; } .fa-sistrix:before { content: "\f3ee"; } .fa-sitemap:before { content: "\f0e8"; } .fa-sith:before { content: "\f512"; } .fa-skyatlas:before { content: "\f216"; } .fa-skype:before { content: "\f17e"; } .fa-slack:before { content: "\f198"; } .fa-slack-hash:before { content: "\f3ef"; } .fa-sliders-h:before { content: "\f1de"; } .fa-slideshare:before { content: "\f1e7"; } .fa-smile:before { content: "\f118"; } .fa-smoking:before { content: "\f48d"; } .fa-snapchat:before { content: "\f2ab"; } .fa-snapchat-ghost:before { content: "\f2ac"; } .fa-snapchat-square:before { content: "\f2ad"; } .fa-snowflake:before { content: "\f2dc"; } .fa-sort:before { content: "\f0dc"; } .fa-sort-alpha-down:before { content: "\f15d"; } .fa-sort-alpha-up:before { content: "\f15e"; } .fa-sort-amount-down:before { content: "\f160"; } .fa-sort-amount-up:before { content: "\f161"; } .fa-sort-down:before { content: "\f0dd"; } .fa-sort-numeric-down:before { content: "\f162"; } .fa-sort-numeric-up:before { content: "\f163"; } .fa-sort-up:before { content: "\f0de"; } .fa-soundcloud:before { content: "\f1be"; } .fa-space-shuttle:before { content: "\f197"; } .fa-speakap:before { content: "\f3f3"; } .fa-spinner:before { content: "\f110"; } .fa-spotify:before { content: "\f1bc"; } .fa-square:before { content: "\f0c8"; } .fa-square-full:before { content: "\f45c"; } .fa-stack-exchange:before { content: "\f18d"; } .fa-stack-overflow:before { content: "\f16c"; } .fa-star:before { content: "\f005"; } .fa-star-half:before { content: "\f089"; } .fa-staylinked:before { content: "\f3f5"; } .fa-steam:before { content: "\f1b6"; } .fa-steam-square:before { content: "\f1b7"; } .fa-steam-symbol:before { content: "\f3f6"; } .fa-step-backward:before { content: "\f048"; } .fa-step-forward:before { content: "\f051"; } .fa-stethoscope:before { content: "\f0f1"; } .fa-sticker-mule:before { content: "\f3f7"; } .fa-sticky-note:before { content: "\f249"; } .fa-stop:before { content: "\f04d"; } .fa-stop-circle:before { content: "\f28d"; } .fa-stopwatch:before { content: "\f2f2"; } .fa-strava:before { content: "\f428"; } .fa-street-view:before { content: "\f21d"; } .fa-strikethrough:before { content: "\f0cc"; } .fa-stripe:before { content: "\f429"; } .fa-stripe-s:before { content: "\f42a"; } .fa-studiovinari:before { content: "\f3f8"; } .fa-stumbleupon:before { content: "\f1a4"; } .fa-stumbleupon-circle:before { content: "\f1a3"; } .fa-subscript:before { content: "\f12c"; } .fa-subway:before { content: "\f239"; } .fa-suitcase:before { content: "\f0f2"; } .fa-sun:before { content: "\f185"; } .fa-superpowers:before { content: "\f2dd"; } .fa-superscript:before { content: "\f12b"; } .fa-supple:before { content: "\f3f9"; } .fa-sync:before { content: "\f021"; } .fa-sync-alt:before { content: "\f2f1"; } .fa-syringe:before { content: "\f48e"; } .fa-table:before { content: "\f0ce"; } .fa-table-tennis:before { content: "\f45d"; } .fa-tablet:before { content: "\f10a"; } .fa-tablet-alt:before { content: "\f3fa"; } .fa-tablets:before { content: "\f490"; } .fa-tachometer-alt:before { content: "\f3fd"; } .fa-tag:before { content: "\f02b"; } .fa-tags:before { content: "\f02c"; } .fa-tape:before { content: "\f4db"; } .fa-tasks:before { content: "\f0ae"; } .fa-taxi:before { content: "\f1ba"; } .fa-teamspeak:before { content: "\f4f9"; } .fa-telegram:before { content: "\f2c6"; } .fa-telegram-plane:before { content: "\f3fe"; } .fa-tencent-weibo:before { content: "\f1d5"; } .fa-terminal:before { content: "\f120"; } .fa-text-height:before { content: "\f034"; } .fa-text-width:before { content: "\f035"; } .fa-th:before { content: "\f00a"; } .fa-th-large:before { content: "\f009"; } .fa-th-list:before { content: "\f00b"; } .fa-themeisle:before { content: "\f2b2"; } .fa-thermometer:before { content: "\f491"; } .fa-thermometer-empty:before { content: "\f2cb"; } .fa-thermometer-full:before { content: "\f2c7"; } .fa-thermometer-half:before { content: "\f2c9"; } .fa-thermometer-quarter:before { content: "\f2ca"; } .fa-thermometer-three-quarters:before { content: "\f2c8"; } .fa-thumbs-down:before { content: "\f165"; } .fa-thumbs-up:before { content: "\f164"; } .fa-thumbtack:before { content: "\f08d"; } .fa-ticket-alt:before { content: "\f3ff"; } .fa-times:before { content: "\f00d"; } .fa-times-circle:before { content: "\f057"; } .fa-tint:before { content: "\f043"; } .fa-toggle-off:before { content: "\f204"; } .fa-toggle-on:before { content: "\f205"; } .fa-trade-federation:before { content: "\f513"; } .fa-trademark:before { content: "\f25c"; } .fa-train:before { content: "\f238"; } .fa-transgender:before { content: "\f224"; } .fa-transgender-alt:before { content: "\f225"; } .fa-trash:before { content: "\f1f8"; } .fa-trash-alt:before { content: "\f2ed"; } .fa-tree:before { content: "\f1bb"; } .fa-trello:before { content: "\f181"; } .fa-tripadvisor:before { content: "\f262"; } .fa-trophy:before { content: "\f091"; } .fa-truck:before { content: "\f0d1"; } .fa-truck-loading:before { content: "\f4de"; } .fa-truck-moving:before { content: "\f4df"; } .fa-tty:before { content: "\f1e4"; } .fa-tumblr:before { content: "\f173"; } .fa-tumblr-square:before { content: "\f174"; } .fa-tv:before { content: "\f26c"; } .fa-twitch:before { content: "\f1e8"; } .fa-twitter:before { content: "\f099"; } .fa-twitter-square:before { content: "\f081"; } .fa-typo3:before { content: "\f42b"; } .fa-uber:before { content: "\f402"; } .fa-uikit:before { content: "\f403"; } .fa-umbrella:before { content: "\f0e9"; } .fa-underline:before { content: "\f0cd"; } .fa-undo:before { content: "\f0e2"; } .fa-undo-alt:before { content: "\f2ea"; } .fa-uniregistry:before { content: "\f404"; } .fa-universal-access:before { content: "\f29a"; } .fa-university:before { content: "\f19c"; } .fa-unlink:before { content: "\f127"; } .fa-unlock:before { content: "\f09c"; } .fa-unlock-alt:before { content: "\f13e"; } .fa-untappd:before { content: "\f405"; } .fa-upload:before { content: "\f093"; } .fa-usb:before { content: "\f287"; } .fa-user:before { content: "\f007"; } .fa-user-alt:before { content: "\f406"; } .fa-user-alt-slash:before { content: "\f4fa"; } .fa-user-astronaut:before { content: "\f4fb"; } .fa-user-check:before { content: "\f4fc"; } .fa-user-circle:before { content: "\f2bd"; } .fa-user-clock:before { content: "\f4fd"; } .fa-user-cog:before { content: "\f4fe"; } .fa-user-edit:before { content: "\f4ff"; } .fa-user-friends:before { content: "\f500"; } .fa-user-graduate:before { content: "\f501"; } .fa-user-lock:before { content: "\f502"; } .fa-user-md:before { content: "\f0f0"; } .fa-user-minus:before { content: "\f503"; } .fa-user-ninja:before { content: "\f504"; } .fa-user-plus:before { content: "\f234"; } .fa-user-secret:before { content: "\f21b"; } .fa-user-shield:before { content: "\f505"; } .fa-user-slash:before { content: "\f506"; } .fa-user-tag:before { content: "\f507"; } .fa-user-tie:before { content: "\f508"; } .fa-user-times:before { content: "\f235"; } .fa-users:before { content: "\f0c0"; } .fa-users-cog:before { content: "\f509"; } .fa-ussunnah:before { content: "\f407"; } .fa-utensil-spoon:before { content: "\f2e5"; } .fa-utensils:before { content: "\f2e7"; } .fa-vaadin:before { content: "\f408"; } .fa-venus:before { content: "\f221"; } .fa-venus-double:before { content: "\f226"; } .fa-venus-mars:before { content: "\f228"; } .fa-viacoin:before { content: "\f237"; } .fa-viadeo:before { content: "\f2a9"; } .fa-viadeo-square:before { content: "\f2aa"; } .fa-vial:before { content: "\f492"; } .fa-vials:before { content: "\f493"; } .fa-viber:before { content: "\f409"; } .fa-video:before { content: "\f03d"; } .fa-video-slash:before { content: "\f4e2"; } .fa-vimeo:before { content: "\f40a"; } .fa-vimeo-square:before { content: "\f194"; } .fa-vimeo-v:before { content: "\f27d"; } .fa-vine:before { content: "\f1ca"; } .fa-vk:before { content: "\f189"; } .fa-vnv:before { content: "\f40b"; } .fa-volleyball-ball:before { content: "\f45f"; } .fa-volume-down:before { content: "\f027"; } .fa-volume-off:before { content: "\f026"; } .fa-volume-up:before { content: "\f028"; } .fa-vuejs:before { content: "\f41f"; } .fa-warehouse:before { content: "\f494"; } .fa-weibo:before { content: "\f18a"; } .fa-weight:before { content: "\f496"; } .fa-weixin:before { content: "\f1d7"; } .fa-whatsapp:before { content: "\f232"; } .fa-whatsapp-square:before { content: "\f40c"; } .fa-wheelchair:before { content: "\f193"; } .fa-whmcs:before { content: "\f40d"; } .fa-wifi:before { content: "\f1eb"; } .fa-wikipedia-w:before { content: "\f266"; } .fa-window-close:before { content: "\f410"; } .fa-window-maximize:before { content: "\f2d0"; } .fa-window-minimize:before { content: "\f2d1"; } .fa-window-restore:before { content: "\f2d2"; } .fa-windows:before { content: "\f17a"; } .fa-wine-glass:before { content: "\f4e3"; } .fa-wolf-pack-battalion:before { content: "\f514"; } .fa-won-sign:before { content: "\f159"; } .fa-wordpress:before { content: "\f19a"; } .fa-wordpress-simple:before { content: "\f411"; } .fa-wpbeginner:before { content: "\f297"; } .fa-wpexplorer:before { content: "\f2de"; } .fa-wpforms:before { content: "\f298"; } .fa-wrench:before { content: "\f0ad"; } .fa-x-ray:before { content: "\f497"; } .fa-xbox:before { content: "\f412"; } .fa-xing:before { content: "\f168"; } .fa-xing-square:before { content: "\f169"; } .fa-y-combinator:before { content: "\f23b"; } .fa-yahoo:before { content: "\f19e"; } .fa-yandex:before { content: "\f413"; } .fa-yandex-international:before { content: "\f414"; } .fa-yelp:before { content: "\f1e9"; } .fa-yen-sign:before { content: "\f157"; } .fa-yoast:before { content: "\f2b1"; } .fa-youtube:before { content: "\f167"; } .fa-youtube-square:before { content: "\f431"; } .sr-only { border: 0; clip: rect(0, 0, 0, 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; } .sr-only-focusable:active, .sr-only-focusable:focus { clip: auto; height: auto; margin: 0; overflow: visible; position: static; width: auto; }

BluePrints/src/main/webapp/css/fontawesome/css/fontawesome.min.css

/*! * Font Awesome Free 5.0.12 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) */ .fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:a 2s infinite linear;animation:a 2s infinite linear}.fa-pulse{-webkit-animation:a 1s infinite steps(8);animation:a 1s infinite steps(8)}@-webkit-keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-aws:before{content:"\f375"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blind:before{content:"\f29d"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-certificate:before{content:"\f0a3"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-square:before{content:"\f14a"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-credit-card:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crosshairs:before{content:"\f05b"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-deviantart:before{content:"\f1bd"}.fa-diagnoses:before{content:"\f470"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drupal:before{content:"\f1a9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-excel:before{content:"\f1c3"}.fa-file-image:before{content:"\f1c5"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fire:before{content:"\f06d"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frown:before{content:"\f119"}.fa-fulcrum:before{content:"\f50b"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-gift:before{content:"\f06b"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-martini:before{content:"\f000"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hashtag:before{content:"\f292"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-heart:before{content:"\f004"}.fa-heartbeat:before{content:"\f21e"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-internet-explorer:before{content:"\f26b"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-joget:before{content:"\f3b7"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-korvue:before{content:"\f42f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-meh:before{content:"\f11a"}.fa-mercury:before{content:"\f223"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-moon:before{content:"\f186"}.fa-motorcycle:before{content:"\f21c"}.fa-mouse-pointer:before{content:"\f245"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-old-republic:before{content:"\f510"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-people-carry:before{content:"\f4ce"}.fa-percent:before{content:"\f295"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-plane:before{content:"\f072"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poo:before{content:"\f2fe"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-r-project:before{content:"\f4f7"}.fa-random:before{content:"\f074"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-rendact:before{content:"\f3e4"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-retweet:before{content:"\f079"}.fa-ribbon:before{content:"\f4d6"}.fa-road:before{content:"\f018"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-rupee-sign:before{content:"\f156"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-scribd:before{content:"\f28a"}.fa-search:before{content:"\f002"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shower:before{content:"\f2cc"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smoking:before{content:"\f48d"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowflake:before{content:"\f2dc"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spinner:before{content:"\f110"}.fa-spotify:before{content:"\f1bc"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-star:before{content:"\f005"}.fa-star-half:before{content:"\f089"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-strava:before{content:"\f428"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-train:before{content:"\f238"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-moving:before{content:"\f4df"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vuejs:before{content:"\f41f"}.fa-warehouse:before{content:"\f494"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-glass:before{content:"\f4e3"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}

BluePrints/src/main/webapp/css/fontawesome/webfonts/fa-brands-400.eot

BluePrints/src/main/webapp/css/fontawesome/webfonts/fa-brands-400.svg

BluePrints/src/main/webapp/css/fontawesome/webfonts/fa-brands-400.ttf

BluePrints/src/main/webapp/css/fontawesome/webfonts/fa-brands-400.woff

BluePrints/src/main/webapp/css/fontawesome/webfonts/fa-brands-400.woff2

BluePrints/src/main/webapp/css/fontawesome/webfonts/fa-regular-400.eot

BluePrints/src/main/webapp/css/fontawesome/webfonts/fa-regular-400.svg

BluePrints/src/main/webapp/css/fontawesome/webfonts/fa-regular-400.ttf

BluePrints/src/main/webapp/css/fontawesome/webfonts/fa-regular-400.woff

BluePrints/src/main/webapp/css/fontawesome/webfonts/fa-regular-400.woff2

BluePrints/src/main/webapp/css/fontawesome/webfonts/fa-solid-900.eot

BluePrints/src/main/webapp/css/fontawesome/webfonts/fa-solid-900.svg

BluePrints/src/main/webapp/css/fontawesome/webfonts/fa-solid-900.ttf

BluePrints/src/main/webapp/css/fontawesome/webfonts/fa-solid-900.woff

BluePrints/src/main/webapp/css/fontawesome/webfonts/fa-solid-900.woff2

BluePrints/src/main/webapp/css/login.css

.login-container { margin: auto; position: relative; top: 50%; transform: perspective(1px) translateY(50%); }

BluePrints/src/main/webapp/css/mapManager.css

.floorList { display: table; height: 100px; width: 100%; text-align: center; border: 2px dashed #f69c55; } .floorList > .floorName { display: table-cell; vertical-align: middle; }

BluePrints/src/main/webapp/css/roomCSS.css

#staffAssignmentList, #staffSection, #roomSection { max-height:200px; overflow-y: auto; overflow-x: hidden; display: block; } #staffAssignmentTable tr, #staffTable tr, #roomTable tr { display:table; width:100%; table-layout:fixed; } #roomTableRow #roomTableCell { padding: 0 !important; }

BluePrints/src/main/webapp/js/floorCommentFunctions.js

function reloadComments(floorId) { $.ajax({ url: "/BluePrints/mapManager/floor/getComments", type: "GET", data: { floorId: floorId }, success: function(html) { $("#commentSection").html(html); }, error: printError }); } function addComment(floorId, activerUserId, msg, successFunction, errorFunction) { $.ajax({ url: "/BluePrints/mapManager/floor/addComment", type: "POST", dataType: "json", data: { floorId: floorId, creatorId: activerUserId, commentMsg: msg }, success: successFunction, error: errorFunction }); } function updateComment(activerUserId, commentId, msg, successFunction, errorFunction) { $.ajax({ url: "/BluePrints/mapManager/floor/updateComment", type: "POST", dataType: "json", data: { commentId: commentId, creatorId: activerUserId, commentMsg: msg }, success: successFunction, error: errorFunction }); }

BluePrints/src/main/webapp/js/mapCore.js

var vectorSource = new ol.source.Vector(); var vectorLayer = getVectorLayer(vectorSource); var floorSource = new ol.source.Vector(); var floorLayer = getVectorLayer(floorSource); var iconStyle = getStyle(); var raster = getRaster(); var map = getMap(raster, vectorLayer, floorLayer); var draw, snap, modify; // global so we can remove them later var typeSelect = document.getElementById('type'); var floorSelector = new ol.interaction.Select({ condition: ol.events.condition.click, layers: function(layer) { return (layer == floorLayer); } }); var defaultRoomStyle = new ol.style.Style({ stroke: new ol.style.Stroke({ color: 'black', width: 2, zIndex: 0 }) }); var floorTransform = new ol.interaction.Transform ( { layers: [floorLayer], translateFeature: true, scale: true, rotate: true, keepAspectRatio: undefined, translate: true, stretch: false, }); var extentGenerator = new ol.interaction.Extent(); /** * Handle change event, difficult to move function oustide of this file. */ typeSelect.onchange = function() { if (typeSelect.value != "None") { //addInteractions(vectorSource, map, draw, snap); modify = new ol.interaction.Modify({ source : vectorSource }); map.addInteraction(modify); draw = new ol.interaction.Draw({ source : vectorSource, type : typeSelect.value }); map.addInteraction(draw); snap = new ol.interaction.Snap({ source : vectorSource }); map.addInteraction(snap); } else { map.removeInteraction(draw); map.removeInteraction(snap); map.removeInteraction(modify); } }; var element = document.getElementById('popup'); var popup = addOverlay(); map.addOverlay(popup); $(element).attr("show", false); /** * This method houses the logic of what should mapped on the map. */ map.on('click', function(evt) { var feature = map.forEachFeatureAtPixel(evt.pixel, function(feature) { return feature; }); if (feature && raster.getVisible()) { if (typeSelect.value == "None") { var coordinates = feature.getGeometry().getCoordinates(); var transformedCords = ol.proj.toLonLat(coordinates); popup.setPosition(coordinates); $(element).popover( { 'placement' : 'top', 'html' : true, 'content' : "Lon: " + transformedCords[0] + "\n" + "Lat: " + transformedCords[1] }); $(element).attr("show", true); $(element).popover('show'); } } else { if (typeSelect.value == "None") { if ($(element).attr("show") == "true") { $(element).attr("show", false); $(element).popover('destroy'); } } } }); /* * Creating Rotate to River Street Control button. */ function rotateToRiver() { map.getView().setRotation(0.639206); } var rotateRiverControl = createControl("R", "Rotate to River Street", rotateToRiver, 9, 70); map.addControl(rotateRiverControl); /* * Creating Control reset zoom to building shape. */ function resetZoom() { map.getView().fit(vectorLayer.getSource().getExtent(), {size:map.getSize(), constrainResolution: false}); } function drawSquare(resultFunction = null) { draw = new ol.interaction.Draw({ source: floorSource, type: "Circle", geometryFunction: ol.interaction.Draw.createRegularPolygon(4) }); draw.on("drawend", function(e) { map.removeInteraction(draw); var roomFeature = e.feature; roomFeature.setStyle(defaultRoomStyle); if(resultFunction != null) { resultFunction(roomFeature); } }) map.addInteraction(draw); } function getSelectedRoomFeatures() { return floorSelector.getFeatures(); } var resetZoomControl = createControl("Z", "Reset Zoom", resetZoom, 9, 100); map.addControl(resetZoomControl);

BluePrints/src/main/webapp/js/openLayersMapFunctions.js

var LONGITUDE = 0; var LATITUDE = 1; function getVectorLayer(vectorSource) { return new ol.layer.Vector({ source : vectorSource, style : new ol.style.Style({ fill : new ol.style.Fill({ color : 'rgba(255,105,180, 0.2)' }), stroke : new ol.style.Stroke({ color : '#FF69B4', width : 2 }), image : new ol.style.Circle({ radius : 7, fill : new ol.style.Fill({ color : '#FF69B4' }) }) }) }); } function getStyle() { return new ol.style.Style({ image : new ol.style.Icon( /** @type {olx.style.IconOptions} */ ({ anchor : [ 0.5, 46 ], anchorXUnits : 'fraction', anchorYUnits : 'pixels', src : 'https://openlayers.org/en/v4.6.5/examples/data/icon.png' })) }); } function getRaster() { return new ol.layer.Tile({ source : new ol.source.OSM() }); } function getMap(raster, vectorLayer, floorLayer) { return new ol.Map({ target : 'map', layers : [ raster, vectorLayer, floorLayer ], view : new ol.View({ center : ol.proj.fromLonLat([ -75.879105, 41.249065 ]), rotation: 0.639206, zoom : 18 }) }); } /** * This function adds the ability to drawS. */ function addInteractions(vectorSource, map, draw, snap) { var modify = new ol.interaction.Modify({ source : vectorSource }); map.addInteraction(modify); draw = new ol.interaction.Draw({ source : vectorSource, type : typeSelect.value }); map.addInteraction(draw); snap = new ol.interaction.Snap({ source : vectorSource }); map.addInteraction(snap); } /** * Creates a control button that can be added to the * map. * * @param labael The text that will be displayed on the button. * @param tipTool The text displayed when hovering over the button. * @param action The function the button will call when pressed. * @param x The x-axis for the control on the map. * @param y The y-axis for the control on the map. * @return the newly create control that can be added to the map. */ function createControl(label, tipTool, action, x, y) { var button = document.createElement('div'); button.innerHTML = '<button class="ol-rotate-reset-river" type="button" title="' + tipTool + '">' + label + '</button>'; button.className = 'ol-unselectable ol-control'; button.style.position="absolute"; button.style.width="24px"; button.style.top = y + "px"; button.style.left = x + "px"; button.addEventListener("click", action, false); var control = new ol.control.Control({ element: button }); return control; } function collectCoordinates(vectorLayer) { var features = vectorLayer.getSource().getFeatures(); return features; } function addOverlay(){ return new ol.Overlay({ element : element, positioning : 'bottom-center', stopEvent : false, offset : [ 0, -50 ] }); } function rehydrateMap(coordinateData, vectorLayer) { var geoJSON = new ol.format.GeoJSON; var coordinateJSON = JSON.parse(coordinateData); var features = geoJSON.readFeatures(coordinateJSON); vectorLayer.getSource().clear(); vectorLayer.getSource().addFeatures(features); } var geoJSON = new ol.format.GeoJSON; function convertJSONtoFeature(coordinateData) { var coordinateJSON = coordinateData.replace(/\\/g, ""); coordinateJSON = coordinateJSON.replace(/^"/g, ""); coordinateJSON = coordinateJSON.replace(/"$/g, ""); var coordinateJSON = JSON.parse(coordinateData); var feature = geoJSON.readFeature(coordinateJSON); feature.setStyle(defaultRoomStyle); return feature; } function convertJSONtoFeatures(coordinateData) { var coordinateJSON = coordinateData.replace(/\\/g, ""); coordinateJSON = coordinateJSON.replace(/^"/g, ""); coordinateJSON = coordinateJSON.replace(/"$/g, ""); var coordinateJSON = JSON.parse(coordinateData); var features = geoJSON.readFeatures(coordinateJSON); return features; } function convertFeaturesToJSON(features) { var coordinateData = geoJSON.writeFeatures(features); coordinateData = JSON.stringify(coordinateData); return coordinateData; } function convertFeatureToJSON(feature) { var coordinateData = geoJSON.writeFeature(feature); coordinateData = JSON.stringify(coordinateData); return coordinateData; } function getRoomFromLayer(roomId, layer, resultFunction) { layer.getSource().getFeatures().forEach(function(feature) { if(feature.get("roomId") == roomId) { resultFunction(feature); } }); }

BluePrints/src/main/webapp/js/roomFunctions.js

function rehydrateRooms(coordinates) { var roomCoordinteData = coordinates.coordinateData; var roomFeature = convertJSONtoFeature(roomCoordinteData); roomFeature.set("roomId", coordinates.id); floorLayer.getSource().addFeature(roomFeature); } function getRoomCoordinates(floorId) { $.ajax({ url: "/BluePrints/room/getRoomCoordinates", type: "GET", dataType: "json", data: {floorId: floorId}, success: function(response) { var roomCoordinates = response["roomCoordinates"]; if(typeof roomCoordinates == 'undefined') { var status = response["status"]; console.log(status); } else { roomCoordinates.forEach(rehydrateRooms); } }, error: printError }); } function addRoom(floorId, roomName, roomCoordinateData, resultsFunction) { $.ajax({ url: "/BluePrints/room/addRoom", type: "POST", dataType: "JSON", data: { floorId : floorId, roomName : roomName, roomCoordinateData : roomCoordinateData }, success: function(resp) { var roomId = resp["roomId"]; if(typeof roomId != 'undefined') { resultsFunction(roomId); } else { resultsFunction(null); } console.log(resp); }, error: printError }); } function getRoom(roomId, resultsFunction) { $.ajax({ url: "/BluePrints/room/getRoom", type: "GET", dataType: "json", data: {roomId: roomId}, success: function(response) { var roomName = response["roomName"]; var roomCoordinateData = response["roomCoordinateData"]; if(typeof roomName != "undefined" && typeof roomCoordinateData != "undefined") { var room = { name: roomName, coordinates: roomCoordinateData }; resultsFunction(room); } else { var status = response["status"]; console.log(status); } }, error: printError }); } function updateRoom(floorId, roomId, roomName, roomCoordinateData) { $.ajax({ url: "/BluePrints/room/updateRoom", type: "POST", dataType: "json", data: { roomId: roomId, roomName: roomName, roomCoordinateData: roomCoordinateData }, success: function(response) { var status = response["status"]; if(status == "ok") { updateRoomTable(floorId); } }, error: printError }); } function deleteRoom(roomId, floorId, roomFeature) { $.ajax({ url: "/BluePrints/room/deleteRoom", type: "POST", dataType: "json", data: { roomId: roomId }, success: function(response) { var status = response["status"]; if(status == "ok") { floorLayer.getSource().removeFeature(roomFeature); deselectRoom(); updateRoomTable(floorId); } }, error: printError }); } function selectRoom(roomId) { $(".roomPanel").removeAttr("hidden"); $(".floorPanel").attr("hidden", ""); getRoom(roomId, function(room) { $("#roomName").val(room.name); $("#roomId").val(roomId); $("#roomNameBreadCrumb").html(room.name); $(".deleteRoomName").html(room.name); getRoomFromLayer(roomId, floorLayer, function(roomFeature){ floorTransform.setActive(true); floorTransform.select(roomFeature); floorSelector.getFeatures().clear(); floorSelector.getFeatures().push(roomFeature); console.log(roomFeature.getStyle()); roomFeature.getStyle().setZIndex(99); }); updateRoomStaff(roomId); }); } function deselectRoom() { floorSelector.getFeatures().forEach(function(roomFeature) { roomFeature.getStyle().setZIndex(0); }); floorSelector.getFeatures().clear(); floorTransform.setActive(false); $(".floorPanel").removeAttr("hidden"); $(".roomPanel").attr("hidden", ""); } function resetFloorInteractions() { map.getInteractions().clear(); var defaultInteractions = ol.interaction.defaults(); defaultInteractions.forEach(function(interaction) { map.addInteraction(interaction); }); map.addInteraction(floorTransform); map.addInteraction(floorSelector); } function promptDuplicate(roomId, floorId) { $("#duplicateModal").modal("show"); $("#duplicateName").val(""); $("#duplicateRoomBtn").attr("roomId", roomId); $("#duplicateRoomBtn").attr("floorId", floorId); } function promoteDelete(roomId) { selectRoom(roomId); $("#confirmDeleteRoom1").modal("show"); } function updateRoomTable(floorId) { $.ajax({ url: "/BluePrints/room/getRooms", type: "GET", dataType: "json", data: {floorId: floorId}, success: function(response) { var rooms = response["rooms"]; if(typeof rooms != 'undefined') { var roomData = ""; if(rooms.length > 0) { for(var i = 0; i < rooms.length; i++) { var roomRowTop = "<tr>"; var roomRowNameData = "<td width='40%'>" + rooms[i].name + "</td>"; var roomViewBtn = "<button class='btn btn-info btn-sm' onclick='selectRoomRow(\"" + rooms[i].id + "\");'><i class='fas fa-eye'></i> View</button>&nbsp;"; var roomDuplicateBtn = "<button class='btn btn-info btn-sm' onclick='promptDuplicate(\"" + rooms[i].id + "\", \"" + floorId + "\");'><i class='far fa-copy'></i> Duplicate</button>&nbsp;"; var roomDeleteBtn = "<button class='btn btn-danger btn-sm' onclick='promoteDelete(\"" + rooms[i].id + "\");'><i class='fas fa-trash'></i> Delete</button>"; var roomRowActionButtons = "<td width='60%'><div class='col-sm-6' style='display: flex;'>" + roomViewBtn + roomDuplicateBtn + roomDeleteBtn + "</div></td>"; var roomRowBottom = "</tr>"; var roomRow = roomRowTop + roomRowNameData + roomRowActionButtons + roomRowBottom ; roomData += roomRow; } } else { roomData = "<tr><td align='center'><b>No Rooms</b></td></tr>"; } $("#roomSection").html(roomData); } else { printError(response["status"]); } }, error: printError }); } function clearFloor(floorId) { $.ajax({ url: "/BluePrints/room/clearFloor", type: "POST", dataType: "json", data: {floorId: floorId}, success: function(response) { var status = response["status"]; if(status == "ok") { floorLayer.getSource().getFeatures().forEach(function(feature) { floorLayer.getSource().removeFeature(feature); }); deselectRoom(); updateRoomTable(floorId); } console.log(status); }, error: printError }); } /** * Room Staff Functions */ function confirmUnassignment(staffId) { var staffName = $(".staffName[staffId='" + staffId + "']").html(); $("#unassignStaffName").html(staffName); $("#unassignStaff").attr("staffId", staffId); $("#confirmUnassignmentModal").modal("show"); console.log($("#confirmUnassignmentModal")); } function unassignStaff(roomId, staffId) { $.ajax({ url: "/BluePrints/room/unassignStaff", type: "POST", dataType: "json", data: { roomId: roomId, staffId: staffId }, success: function(response) { var status = response["status"]; if(status == "ok") { updateRoomStaff(roomId); $("#confirmUnassignmentModal").modal("hide"); } else { printError(status); } }, error: printError }); } function updateRoomStaff(roomId) { getRoomStaff(roomId, function(staff){ var staffData = ""; if(staff.length > 0) { for(var i = 0; i < staff.length; i++) { var staffRow = "<tr><td class='staffName' staffId='" + staff[i].id + "'>" + staff[i].name + "</td><td align='center'>" + "<button class='btn btn-danger' onClick='confirmUnassignment(\"" + staff[i].id + "\")' staffId='" + staff[i].id + "'>Unassign</button>" + "</td></tr>"; staffData += staffRow; } } else { staffData = "<tr><td colspan='4' align='center'><b>No Staff Assigned</b></td></tr>" } $("#staffSection").html(staffData); }); } function getRoomStaff(roomId, resultsFunction) { $.ajax({ url: "/BluePrints/room/getRoomStaff", type: "GET", dataType: "json", data: {roomId: roomId}, success: function(response) { var staff = response["staff"]; if(typeof staff != 'undefined') { resultsFunction(staff); } else { printError(response["status"]); } }, error: printError }); } var staffAssignments = null; function addStaff(staffId) { if(staffAssignments == null) { staffAssignments = []; } staffAssignments.push(staffId); $(".assignmentBtn[staffId='" + staffId + "']").attr("hidden", ""); $(".unassignBtn[staffId='" + staffId + "']").removeAttr("hidden"); } function removeStaff(staffId) { var index = staffAssignments.indexOf(staffId); staffAssignments.splice(index, 1); $(".assignmentBtn[staffId='" + staffId + "']"). removeAttr("hidden"); $(".unassignBtn[staffId='" + staffId + "']").attr("hidden", ""); } function resetStaffList() { $(".assignmentBtn").removeAttr("hidden"); $(".unassignBtn").attr("hidden", ""); staffAssignments = []; } function assignStaff(roomId, staffIds) { console.log(staffIds); $.ajax({ url: "/BluePrints/room/assignStaffToRoom", type: "POST", dataType: "json", data: { roomId: roomId, staffIds: staffIds }, success: function(response) { var status = response["status"]; if(status == "ok") { updateRoomStaff(roomId); $("#addStaffModal").modal("hide"); } else { printError(status); } }, error: printError }); } function getAllStaff(roomId) { $.ajax({ url: "/BluePrints/staff/getAllStaff", type: "GET", dataType: "json", data: {roomId: roomId}, success: function(response) { var staff = response["staff"]; if(typeof staff != 'undefined') { var staffData = ""; if(staff.length > 0) { for(var i = 0; i < staff.length; i++) { var staffRow = "<tr><td>" + staff[i].name + "</td><td>" + staff[i].email + "</td>" + "<td><button class='btn btn-default assignmentBtn' onClick='addStaff(\"" + staff[i].id + "\")' staffId='" + staff[i].id + "'>Add</button>" + "<button class='btn btn-default unassignBtn' onClick='removeStaff(\"" + staff[i].id + "\")' staffId='" + staff[i].id + "' hidden><span class='fas fa-times'></span></button>" + "</td></tr>"; staffData += staffRow; } } else { staffData = "<tr><td colspan='4' align='center'><b>There is no staff to assign.</b></td></tr>"; } $("#staffAssignmentList").html(staffData); } else { printError(response["status"]); } }, error: printError }); }

BluePrints/src/main/webapp/WEB-INF/categories.ftl

Category Management

Categories

Add Category
${category.name} Edit Delete
New Category Category Name: Cancel Add Delete Category

Are you sure you want to delete this category?

Cancel Delete Delete Category

Once this category has been deleted, this action can't be undone. Would you still like to delete this user?

Cancel Delete Edit Category Category Name: Cancel Submit

BluePrints/src/main/webapp/WEB-INF/floorEditor.ftl

Floor Editor

Add Room Room Name: Cancel Add Discarding Changes

All unsaved changes will be discarded, are you sure you want to continue?

Cancel Discard Deleting Room

Are you sure you want to delete Room: ?

Cancel Delete Deleting Room

Once this room is deleted it can't be undo.

Are you sure you still want to delete Room: ?

Cancel Delete Clearing Floor

Are you sure you want to clear this floor?

Total Room: 

Cancel Clear Clearing Floor

Once this floor is cleared, it can't be undo.

Are you sure you still want to clear this floor?

Total Room: 

Cancel Clear Edit Comment Comment: Cancel Save Success: Saved Floor

This floor was successfully saved.

close Error: Saving floor

This floor could not be saved. Please check that your fields are properly filled out and try again

close

BluePrints/src/main/webapp/WEB-INF/getComments.ftl

<#if comments?? && comments?size != 0> <#list comments as comment> <tr> <td> <div class="row"> <div class="col-lg-10"> ${comment.creator.firstName} ${comment.creator.lastName}:<br> <span id="${comment.id}">${comment.message}</span> </div> <div class="col-lg-2" align="center" style="align-items: center; display: flex;"> <a href="javascript:editCommentPopup('${comment.id}')" style="text-decoration: none;" class="editCommentBtn">Edit</a> </div> </div> </td> </tr> </#list> <#else> <tr><td align="center">No Comments Found</td></tr> </#if>

BluePrints/src/main/webapp/WEB-INF/inc/navbar.ftl

<nav class="navbar navbar-expand-lg navbar-light bg-light"> <a class="navbar-brand" href="/BluePrints/mapManager">BluePrints</a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarSupportedContent"> <ul class="navbar-nav col-lg-8"> <li class="nav-item"> <a class="nav-link" href="/BluePrints/users">User Management</a> </li> <li class="nav-item"> <a class="nav-link" href="/BluePrints/mapManager">Manage Maps</a> </li> <li class="nav-item"> <a class="nav-link" href="/BluePrints/categories">Manage Categories</a> </li> </ul> <form name="logoutForm" class="form-inline col-lg-4" action="/BluePrints/logout"> <div class="form-group col-sm-12"> <span class="col-sm-6"><b>Welcome, ${activeUser.firstName!}</b></span> <input class="form-control col-sm-6" type="submit" value="Logout" /> </div> </form> </div> </nav>

BluePrints/src/main/webapp/WEB-INF/index.ftl

BluePrints/src/main/webapp/WEB-INF/login.ftl

BluePrints

Login

Email: Password: Modal title

${error}

Close

BluePrints/src/main/webapp/WEB-INF/mapDisplay.ftl

<div class= "row"> <div class="col-lg-6 col-lg-offset-1"> <form class="form-inline"> <label>Choose Action:</label> <select id="type"> <option value="None">Navigate</option> <#if source?? && source != "viewBtn"> <option value="Polygon">Draw</option> </#if> </select> </form> </div> <div class="col-lg-5"> <div align="right"> <button class="btn btn-primary"id="helpBtn">help</button> </div> </div> </div> <br> <div class="row"> <div class="col-lg-11 col-lg-offset-1" > <div id="map" class="map" style="border: 3px solid black;"> <div id="popup"></div> </div> </div> </div> <div class="modal fade" id="helpInfo"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <span class="modal-title">Instructions</span> </div> <div class="modal-body"> To navigate around the map without drawing, simply select the nagivate option in the drop down. click and drag the cursor around the map to move. If needed to soom, use the mouse wheel. <br> To draw on the map select the draw option in the drop down. Once selected you can create lines but clicking and holding the cursor and dragging it accross the map. Once shape is created give the building a name and select add. </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" id="closeBtnHelp" data-dismiss="modal">close</button> </div> </div> </div> </div> <script type="text/javascript"> $("#helpBtn").click(function(e) { e.preventDefault(); $("#helpInfo").modal("show"); }); $("#closeBtnHelp").click(function(e) { e.preventDefault(); $("#helpInfo").modal("close"); }); </script> <script type="text/javascript" src= "/BluePrints/js/openLayersMapFunctions.js"></script> <script type="text/javascript" src= "/BluePrints/js/mapCore.js"></script>

BluePrints/src/main/webapp/WEB-INF/mapManager.ftl

Map Management

Buidlings

Add Building
${building.name} Delete
Floor ${floor.name} Edit Duplicate Delete
Add Floor
Edit Building Building Name: Cancel Submit Delete Building

Are you sure you want to delete this building?

Cancel Delete Delete Building

Once this building has been deleted, all associated maps for this builidng will be deleted as well. Would you still like to delete this building?

Cancel Delete New Floor Floor: Cancel Add Duplicate Floor Floor: Cancel Add Error: Updating Building

This building could not be updated:

Close Error: Deleting Building

This building could not be deleted:

Close Success: Updated Building

This building was succesfully updated:

Close Success: Deleted Building

This building was succesfully deleted:

Close Success: Add Floor

The floor was successfully added.

Close Delete Floor

Are you sure you want to delete this floor?

Cancel Delete Delete Floor

Once this floor has been deleted, all associated rooms for this flooor will be deleted as well. Would you still like to delete this building?

Cancel Delete

BluePrints/src/main/webapp/WEB-INF/newBuilding.ftl

Create New Building

Building Information Building Name:
${building.name}
Coordinates
Add Coordinate
Order Latitude Longitude
No Coordinates Found
Cancel Add Back Discarding Changes

All unsaved changes will be discarded, are you sure you want to continue?

Cancel Discard Invalid Form

Please, make sure you properly fill out the following fields:

  • Building Name
close Success: Added Building

This building was successfully added to the system.

close Error: Adding Building

This building could not be added. Please check that your fields are properly filled out and try again

close Manually Add Coordinate Position Latitude Longitude close Add Cooridnate

BluePrints/src/main/webapp/WEB-INF/passwordReset.ftl

BluePrints

Password Reset

Email: Old Password: New Password: Confirm Password: Error Close Success Password was successfully reset. Close

BluePrints/src/main/webapp/WEB-INF/users.ftl

User Management

Users

Add User
${user.firstName} ${user.lastName} Edit Role Delete First Name: Last Name: E-mail: Role:
View User First Name: Last Name: E-mail: Role: Close Edit Edit Role Role: ${role.name} Cancel Submit Delete User

Are you sure you want to delete this user?

Cancel Delete Delete User

Once this user has been deleted, this action can't be undone. Would you still like to delete this user?

Cancel Delete New User First Name: Last Name: Email: Role: ${role.name} Cancel Add Active Directory Authorization

Enter you password to complete this action.

Password: Cancel Submit

BluePrints/src/main/webapp/WEB-INF/_FloorMenu.ftl

<div class="card floorPanel"> <div class="card-header"> Floor Information </div> <div class="card-block col-lg-12"> <div class="row"> <div class="container-fluid"> <nav aria-label="breadcrumb"> <ol class="breadcrumb"> <li class="breadcrumb-item"><a href="/BluePrints/mapManager">${floor.building.name}</a></li> <li class="breadcrumb-item active" aria-current="page">Floor ${floor.name}</li> </ol> </nav> </div> </div> <div class="row"> <div class="col-lg-8"> <br><h3><b>Floor: ${floor.name}</b></h3> </div> </div> <div class="row"> <div class="col-lg-12"> <table class="table" border="1" id="roomTable" style="border-collapse: collapse;"> <thead class="thead-dark"> <tr> <th> <div class="row"> <div class="col-sm-6"> <h4><b>Rooms</b></h4> </div> <div class="col-sm-6" align="right"> <button class="btn btn-primary" style="border: 2px solid white; background-color: #212529;" id="drawRoom">Add Room</button> </div> </div> </th> </tr> </thead> <tbody> <tr id="roomTableRow"> <td id="roomTableCell"> <table class='table' border="0"> <thead> <tr><th>Name</th><th>Actions</th></tr> </thead> <tbody id="roomSection"> </tbody> </table> </td> </tr> </tbody> <tbody> <tr> <td> <button class="btn btn-danger" id="clearBtn"> <span class="fas fa-trash-alt"></span> Clear </button> </td> </tr> </tbody> </table> </div> </div> <div class="row"> <div class="col-lg-12"> <table class="table" border="1" id="commentTable"> <thead class="thead-dark"><tr><th>Comments</th></tr></thead> <tbody id="commentSection"> </tbody> <tbody> <tr> <td> <div class="row col-lg-12"> <div class="col-lg-10"> <input type="text" name="commentMsg" id="commentMsg" placeholder="Enter Comment" class="form-control"> </div> <div class="col-lg-2"> <button class="btn btn-secondary" id="sendMessageBtn">Submit</button> </div> </div> </td> </tr> </tbody> </table> </div> </div> <input type="hidden" value="${activeUser.id}" id="editorId"> <div class="row"> <div class="col-lg-12" align="right" style="margin: 0 0 10px -10px;"> <button class="btn btn-secondary back" onclick="window.location='/BluePrints/mapManager'">Back</button> </div> </div> </div> </div>

BluePrints/src/main/webapp/WEB-INF/_RoomMenu.ftl

Room Information
  1. ${floor.building.name}
  2. Floor ${floor.name}
  3. Room: 

Room:

Staff
Add Staff
Delete Duplicate Cancel Save Add Staff
Name Email Action
Close Assign Duplicate Room Room Name: Cancel Duplicate Unassign Staff Are you sure you want to unassign:   Cancel Unassign

BluePrints/target/classes/application.properties

#View Settings spring.freemarker.template-loader-path: /WEB-INF/ spring.freemarker.suffix: .ftl #Database Settings #spring.jpa.database: POSTGRESQL #spring.datasource.platform: postgres #spring.jpa.show-sql:false #spring.datasource.url: jdbc:postgresql://cs480.kings.edu:5432/cs480f17 #spring.datasource.username: cs480f17app #spring.datasource.password: eduECVtPTf7p63m=H3!fvR!*E#Hc6fKF #spring.datasource.driver-class-name: org.postgresql.Driver spring.datasource.url=jdbc:h2:mem:testdb spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password= spring.jpa.database-platform=org.hibernate.dialect.H2Dialect #Server Settings server.contextPath: /BluePrints/ server.port: 8443 server.ssl.key-store: classpath:keystore.p12 server.ssl.key-store-password: eduECVtPTf7p63m=H3!fvR!*E#Hc6fKF server.ssl.keyStoreType: PKCS12 server.ssl.keyAlias: tomcat

BluePrints/target/classes/data.sql

INSERT INTO user_role (role_id, name, permission_level) VALUES ('65b0075f662329afe4bb3e6b73a3eecf', 'Admin', 1); INSERT INTO user_role (role_id, name, permission_level) VALUES ('9cef3e32f0b60dd45e75b4eb6ebca17b', 'Coordinator', 2); INSERT INTO user_role (role_id, name, permission_level) VALUES ('3071704b1cbf8abc1cc0b072dadec49b', 'Faculty', 2); INSERT INTO user_role (role_id, name, permission_level) VALUES ('581c16c93e573343963815258c7c91f9', 'Student', 3); INSERT INTO app_user (user_id, first_name, last_name, email, role_id, password) VALUES ('8b72105565441d6e547b6193cf9782b4', 'Administrator', '', 'admin', '65b0075f662329afe4bb3e6b73a3eecf', '8KZdhebgZAkZ/wnHfFVwx81LDJoQTQjRn1sviayhWw0=$U5+nBQFW1r96veavMNnDvl5G3ALJyY2tuNTuBy/oA9Q='); INSERT INTO building (building_id, created_by, name) VALUES ('73285e99115b46958da135cdc87e5979', '8b72105565441d6e547b6193cf9782b4', 'Administration'); INSERT INTO building (building_id, created_by, name) VALUES ('361f42d188854f4faecc8f7313bd9053', '8b72105565441d6e547b6193cf9782b4', 'McGowan'); INSERT INTO building (building_id, created_by, name) VALUES ('437364cf50994316b66aff02a14b38ca', '8b72105565441d6e547b6193cf9782b4', 'Holy Cross'); INSERT INTO building_coordinate (coordinate_id, coordinate_data, building_id) VALUES ('ddb656bf7f7643a588cc7ce1383a771d', '"{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[[[-8446933.521771798,5049316.046571197],[-8446909.138414914,5049283.497014376],[-8446900.774058463,5049273.995947136],[-8446880.268458366,5049289.703013803],[-8446911.591175789,5049331.528724969],[-8446933.521771798,5049316.046571197]]]},\"properties\":null}]}"', '73285e99115b46958da135cdc87e5979'); INSERT INTO building_coordinate (coordinate_id, coordinate_data, building_id) VALUES ('cd1c46d6f4854ef19246f16af62e4bf6', '"{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[[[-8446963.698534664,5049213.488995077],[-8446941.744568048,5049229.249557793],[-8446953.796394216,5049245.941900484],[-8446949.8529061,5049253.171175872],[-8446935.118684333,5049263.379210815],[-8446954.856229238,5049290.93379666],[-8446974.557279576,5049276.519838015],[-8446980.416161507,5049284.397927668],[-8447002.998708887,5049267.612085324],[-8446963.698534664,5049213.488995077]]]},\"properties\":null}]}"', '361f42d188854f4faecc8f7313bd9053'); INSERT INTO building_coordinate (coordinate_id, coordinate_data, building_id) VALUES ('f8a92fc04ee74945af193f4243420f3c', '"{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[[[-8447002.285586065,5049267.42088277],[-8446963.160327425,5049214.283873965],[-8446928.3826528,5049205.5484992005],[-8446941.237116456,5049229.835559354],[-8446953.171269117,5049245.890968572],[-8446951.351579137,5049252.452020467],[-8446935.775435865,5049264.029929765],[-8446955.067676567,5049290.985433176],[-8446974.656069092,5049276.797209947],[-8446980.712206265,5049284.944731043],[-8447002.285586065,5049267.42088277]]]},\"properties\":null}]}"', '437364cf50994316b66aff02a14b38ca'); INSERT INTO category (category_id, name) VALUES ('faceb0ab63bd4ff69fe69b551133bce8', 'Test2'); INSERT INTO category (category_id, name) VALUES ('4bdd0ad8c4d0461cba5b727050807ad3', 'Edit2'); INSERT INTO floor (floor_id, building_id, floor_name) VALUES ('96027d0799094e909235693eb83c508c', '361f42d188854f4faecc8f7313bd9053', '1'); INSERT INTO floor (floor_id, building_id, floor_name) VALUES ('29c6a5ea13ac4504b66e1ee858bca028', '73285e99115b46958da135cdc87e5979', '2'); INSERT INTO floor (floor_id, building_id, floor_name) VALUES ('44d282fa701342ccb7c27c9637d4bab4', '437364cf50994316b66aff02a14b38ca', '1'); INSERT INTO floor (floor_id, building_id, floor_name) VALUES ('dfdf5f0aec14490a8f14536856591577', '437364cf50994316b66aff02a14b38ca', '2'); INSERT INTO floor_comment (comment_id, floor_id, comment_msg, created_date, created_by) VALUES ('0bd66ed456bd42b0bdf6d296a2da1243', '29c6a5ea13ac4504b66e1ee858bca028', 'Test Comment', '2018-04-16 14:26:19.748', '8b72105565441d6e547b6193cf9782b4'); INSERT INTO floor_comment (comment_id, floor_id, comment_msg, created_date, created_by) VALUES ('61f3af859c39408aa339497fbc93b009', 'dfdf5f0aec14490a8f14536856591577', 'test comment 2', '2018-05-06 23:52:09.769', '8b72105565441d6e547b6193cf9782b4'); INSERT INTO floor_comment (comment_id, floor_id, comment_msg, created_date, created_by) VALUES ('bfb544e1c16442a494a773b8d119af75', 'dfdf5f0aec14490a8f14536856591577', 'test comment 3', '2018-05-07 00:08:51.077', '8b72105565441d6e547b6193cf9782b4'); INSERT INTO floor_comment (comment_id, floor_id, comment_msg, created_date, created_by) VALUES ('d0d3b974afcb4422a3807a14b071c7f6', 'dfdf5f0aec14490a8f14536856591577', 'test comment 4', '2018-05-07 20:57:23.315', '8b72105565441d6e547b6193cf9782b4'); INSERT INTO floor_comment (comment_id, floor_id, comment_msg, created_date, created_by) VALUES ('494c0aba28de4dfc80457a7e7a193d76', 'dfdf5f0aec14490a8f14536856591577', 'test comment 5', '2018-05-08 16:26:01.679', '8b72105565441d6e547b6193cf9782b4'); INSERT INTO floor_comment (comment_id, floor_id, comment_msg, created_date, created_by) VALUES ('edab6a10ca5e4bd889d61c917fa8abe0', '44d282fa701342ccb7c27c9637d4bab4', 'test comment 6', '2018-05-08 17:08:11.382', '8b72105565441d6e547b6193cf9782b4'); INSERT INTO room (room_id, floor_id, room_name) VALUES ('c8c9b303b7b249c092c57bbf7ddaad73', '29c6a5ea13ac4504b66e1ee858bca028', '100'); INSERT INTO room (room_id, floor_id, room_name) VALUES ('bd9eab399db9481c9765d950a0e257a5', '29c6a5ea13ac4504b66e1ee858bca028', '101'); INSERT INTO room (room_id, floor_id, room_name) VALUES ('db4bd3c4790143d79d78a1a59e957f86', '29c6a5ea13ac4504b66e1ee858bca028', '104'); INSERT INTO room (room_id, floor_id, room_name) VALUES ('84cdc682dff645b28207dbf1fbcbe0d8', '29c6a5ea13ac4504b66e1ee858bca028', '105'); INSERT INTO room (room_id, floor_id, room_name) VALUES ('1bf05038bbc447b4982900d7d3c37d47', '44d282fa701342ccb7c27c9637d4bab4', '100'); INSERT INTO room (room_id, floor_id, room_name) VALUES ('4966481651aa444b95f8553210267bed', 'dfdf5f0aec14490a8f14536856591577', '100'); INSERT INTO room_coordinates (room_id, room_coordinates) VALUES ('4966481651aa444b95f8553210267bed', '"{\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[[[-8446935.666030645,5049262.4657801995],[-8446947.292626845,5049280.6099626925],[-8446965.436809339,5049268.983366492],[-8446953.81021314,5049250.839183999],[-8446935.666030645,5049262.4657801995]]]},\"properties\":null}"'); INSERT INTO room_coordinates (room_id, room_coordinates) VALUES ('bd9eab399db9481c9765d950a0e257a5', '"{\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[[[-8446886.766721489,5049339.726678741],[-8446893.168745117,5049348.571188428],[-8446902.013254805,5049342.1691648],[-8446895.611231176,5049333.324655113],[-8446886.766721489,5049339.726678741]]]},\"properties\":{\"roomId\":\"034b815cc6fb4581aacdce7299ac4200\"}}"'); INSERT INTO room_coordinates (room_id, room_coordinates) VALUES ('db4bd3c4790143d79d78a1a59e957f86', '"{\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[[[-8446880.6179965,5049314.081986577],[-8446886.103995256,5049321.107121838],[-8446893.129130518,5049315.62112308],[-8446887.643131763,5049308.595987819],[-8446880.6179965,5049314.081986577]]]},\"properties\":{\"roomId\":\"78a719665e7249f0b26a0020a9b58c12\"}}"'); INSERT INTO room_coordinates (room_id, room_coordinates) VALUES ('84cdc682dff645b28207dbf1fbcbe0d8', '"{\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[[[-8446925.349449974,5049282.291602794],[-8446929.738454485,5049290.0495243715],[-8446937.496376064,5049285.660519859],[-8446933.107371552,5049277.902598281],[-8446925.349449974,5049282.291602794]]]},\"properties\":{\"roomId\":\"abf9bf5684e24630afc01815ba4ba50d\"}}"'); INSERT INTO room_coordinates (room_id, room_coordinates) VALUES ('c8c9b303b7b249c092c57bbf7ddaad73', '"{\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[[[-8446941.656412095,5049301.681679387],[-8446946.045416607,5049309.439600964],[-8446953.803338185,5049305.050596451],[-8446949.414333673,5049297.292674874],[-8446941.656412095,5049301.681679387]]]},\"properties\":null}"'); INSERT INTO room_coordinates (room_id, room_coordinates) VALUES ('1bf05038bbc447b4982900d7d3c37d47', '"{\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[[[-8446935.666030645,5049262.4657801995],[-8446947.292626845,5049280.6099626925],[-8446965.436809339,5049268.983366492],[-8446953.81021314,5049250.839183999],[-8446935.666030645,5049262.4657801995]]]},\"properties\":null}"'); INSERT INTO staff_assigned_to_room (assignment_id, room_id, staff_id) VALUES ('66d8d626c254417f993a863fe2d76073', 'c8c9b303b7b249c092c57bbf7ddaad73', '8761c1d6df23494ca62e5dd25bd7ee1a'); INSERT INTO staff_assigned_to_room (assignment_id, room_id, staff_id) VALUES ('e2bacc0c5d4d401b8d5f32982e2d4d5b', 'db4bd3c4790143d79d78a1a59e957f86', '8761c1d6df23494ca62e5dd25bd7ee1a'); INSERT INTO staff_assigned_to_room (assignment_id, room_id, staff_id) VALUES ('2c7597405c294b43b07b8960e3ea512d', 'db4bd3c4790143d79d78a1a59e957f86', NULL); INSERT INTO staff_assigned_to_room (assignment_id, room_id, staff_id) VALUES ('4cd1bf8eecb54e278e049962f3e5a3f6', '84cdc682dff645b28207dbf1fbcbe0d8', '8761c1d6df23494ca62e5dd25bd7ee1a'); INSERT INTO staff_assigned_to_room (assignment_id, room_id, staff_id) VALUES ('3f829b7ab3074ae19e3dc47aa18de538', '84cdc682dff645b28207dbf1fbcbe0d8', NULL); INSERT INTO staff_assigned_to_room (assignment_id, room_id, staff_id) VALUES ('e014f85ed5824b819c268547748d54e4', '1bf05038bbc447b4982900d7d3c37d47', '2168ac0b9da743e79b96829f54cd87e1'); INSERT INTO staff_assigned_to_room (assignment_id, room_id, staff_id) VALUES ('622b2dd2762e48bda76ad971cee615ae', '1bf05038bbc447b4982900d7d3c37d47', '8761c1d6df23494ca62e5dd25bd7ee1a'); INSERT INTO staff_assigned_to_room (assignment_id, room_id, staff_id) VALUES ('9d1c599155d444f8ad20593d32ba5f9e', '4966481651aa444b95f8553210267bed', '8761c1d6df23494ca62e5dd25bd7ee1a'); INSERT INTO staff_assigned_to_room (assignment_id, room_id, staff_id) VALUES ('7e2ba4b47015404a92615ceb83ce4fab', '4966481651aa444b95f8553210267bed', NULL);

BluePrints/target/classes/edu/kings/cs480/BluePrints/ActiveDirectory/AuthenticatedUser.class

package edu.kings.cs480.BluePrints.ActiveDirectory;
public synchronized class AuthenticatedUser {
    private String kingsid;
    private String firstName;
    private String lastName;
    private String email;
    protected void AuthenticatedUser(javax.naming.directory.Attributes) throws javax.naming.NamingException;
    public String getFirstName();
    public String getLastName();
    public String getEmail();
    public String getKingsId();
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/ActiveDirectory/AuthenticationService.class

package edu.kings.cs480.BluePrints.ActiveDirectory;
public synchronized class AuthenticationService {
    private static String domain;
    static void <clinit>();
    private void AuthenticationService();
    public static javax.naming.ldap.LdapContext authenticate(String, String) throws javax.naming.NamingException;
    public static AuthenticatedUser getUser(String, javax.naming.ldap.LdapContext);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Adapters/BuildingAdapter.class

package edu.kings.cs480.BluePrints.Adapters;
public synchronized class BuildingAdapter {
    private edu.kings.cs480.BluePrints.Database.BuildingRepository buildingRepo;
    private edu.kings.cs480.BluePrints.Database.AppUserRepository userRepo;
    private edu.kings.cs480.BluePrints.Database.CoordinateRepository coordinateRepo;
    public void BuildingAdapter();
    public java.util.List getBuildings();
    public edu.kings.cs480.BluePrints.Database.Building getBuilding(java.util.UUID);
    public boolean updateBuilding(java.util.UUID, String);
    public boolean deleteBuilding(java.util.UUID);
    public edu.kings.cs480.BluePrints.Database.Building addBuilding(String, java.util.UUID);
    public boolean addCoordinates(java.util.UUID, String);
    public boolean updateCoordinates(java.util.UUID, String);
    public edu.kings.cs480.BluePrints.Database.BuildingCoordinate getCoordinates(java.util.UUID);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Adapters/CommentAdapter.class

package edu.kings.cs480.BluePrints.Adapters;
public synchronized class CommentAdapter {
    public edu.kings.cs480.BluePrints.Database.FloorRepository floorRepo;
    public edu.kings.cs480.BluePrints.Database.AppUserRepository userRepo;
    public edu.kings.cs480.BluePrints.Database.CommentRepository commentRepo;
    public void CommentAdapter();
    public boolean addComment(java.util.UUID, java.util.UUID, String);
    public boolean updateComment(java.util.UUID, java.util.UUID, String);
    public java.util.List getFloorComments(java.util.UUID);
    public void clearFloorComments(java.util.UUID);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Adapters/FloorAdapter.class

package edu.kings.cs480.BluePrints.Adapters;
public synchronized class FloorAdapter {
    private edu.kings.cs480.BluePrints.Database.FloorRepository floorRepo;
    private edu.kings.cs480.BluePrints.Database.BuildingRepository buildingRepo;
    public void FloorAdapter();
    public edu.kings.cs480.BluePrints.Database.Floor addFloor(java.util.UUID, String);
    public boolean deleteFloor(java.util.UUID);
    public boolean deleteFloorsInBuilding(edu.kings.cs480.BluePrints.Database.Building);
    public java.util.Map getFloors();
    public edu.kings.cs480.BluePrints.Database.Floor getFloor(java.util.UUID);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Adapters/LoggingAdapter.class

package edu.kings.cs480.BluePrints.Adapters;
public synchronized class LoggingAdapter {
    private static final org.apache.logging.log4j.Logger LOGGER;
    static void <clinit>();
    public void LoggingAdapter();
    public void log(java.util.logging.Level, String);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Adapters/LoginAdapter.class

package edu.kings.cs480.BluePrints.Adapters;
public synchronized class LoginAdapter {
    private UserAdapter userAdapter;
    public void LoginAdapter();
    public boolean checkLogin(org.springframework.ui.Model, javax.servlet.http.HttpSession);
    public boolean login(String, String, javax.servlet.http.HttpSession);
    public edu.kings.cs480.BluePrints.Database.AppUser getActiveUser(javax.servlet.http.HttpSession);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Adapters/Mock/MockStaffAdapter$MockStaff.class

package edu.kings.cs480.BluePrints.Adapters.Mock;
synchronized class MockStaffAdapter$MockStaff implements edu.kings.cs480.BluePrints.Database.Staff {
    private String name;
    private java.util.UUID staffId;
    private String email;
    public void MockStaffAdapter$MockStaff(MockStaffAdapter, String, java.util.UUID, String);
    public String getName();
    public java.util.UUID getStaffId();
    public String getStaffEmail();
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Adapters/Mock/MockStaffAdapter.class

package edu.kings.cs480.BluePrints.Adapters.Mock;
public synchronized class MockStaffAdapter implements edu.kings.cs480.BluePrints.Adapters.StaffAdapter {
    private java.util.HashMap mockStaff;
    public void MockStaffAdapter();
    public edu.kings.cs480.BluePrints.Database.Staff getStaff(java.util.UUID);
    public void deleteStaff(java.util.UUID);
    public java.util.List getAllStaff();
    public void updateStaff(java.util.UUID, String, String);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Adapters/RoomAdapter.class

package edu.kings.cs480.BluePrints.Adapters;
public synchronized class RoomAdapter {
    private edu.kings.cs480.BluePrints.Database.RoomRepository roomRepo;
    private edu.kings.cs480.BluePrints.Database.RoomCoordinateRepository roomCoordinateRepo;
    private FloorAdapter floorAdapter;
    private edu.kings.cs480.BluePrints.Database.StaffAssignmentRepository staffRepo;
    public void RoomAdapter();
    public edu.kings.cs480.BluePrints.Database.Room getRoom(java.util.UUID);
    public java.util.List getAllRooms(java.util.UUID);
    public edu.kings.cs480.BluePrints.Database.Room addRoom(String, java.util.UUID);
    public boolean updateRoom(java.util.UUID, String);
    public boolean deleteRoom(java.util.UUID);
    public boolean addRoomCoordinates(java.util.UUID, String);
    public boolean deleteRoomCoordinates(java.util.UUID);
    public boolean updateRoomCoordinates(java.util.UUID, String);
    public java.util.List getAllRoomCoordinates(java.util.UUID);
    public edu.kings.cs480.BluePrints.Database.RoomCoordinates getRoomCoordinates(java.util.UUID);
    public boolean clearAllFloorRooms(java.util.UUID);
    public java.util.List getRoomAssignments(java.util.UUID);
    public boolean assignStaffToRooms(java.util.UUID, java.util.UUID[]);
    public boolean unassignStaff(java.util.UUID, java.util.UUID);
    public boolean unassignAllStaff(java.util.UUID);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Adapters/SecurityAdapter.class

package edu.kings.cs480.BluePrints.Adapters;
public synchronized class SecurityAdapter {
    private static final int HASH_ITERATIONS;
    private static final int SALT_LENGTH;
    private static final int HASH_LENGTH;
    static void <clinit>();
    public void SecurityAdapter();
    public static String getSaltedHash(String) throws java.security.NoSuchAlgorithmException, java.security.spec.InvalidKeySpecException;
    public static boolean check(String, String) throws java.security.spec.InvalidKeySpecException, java.security.NoSuchAlgorithmException;
    private static String hash(String, byte[]) throws java.security.NoSuchAlgorithmException, java.security.spec.InvalidKeySpecException;
    public static void main(String[]);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Adapters/StaffAdapter.class

package edu.kings.cs480.BluePrints.Adapters;
public abstract interface StaffAdapter {
    public abstract edu.kings.cs480.BluePrints.Database.Staff getStaff(Object);
    public abstract void deleteStaff(Object);
    public abstract java.util.List getAllStaff();
    public abstract void updateStaff(Object, String, String);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Adapters/UserAdapter.class

package edu.kings.cs480.BluePrints.Adapters;
public synchronized class UserAdapter {
    private edu.kings.cs480.BluePrints.Database.AppUserRepository userRepo;
    private edu.kings.cs480.BluePrints.Database.UserRoleRepository roleRepo;
    public void UserAdapter();
    public java.util.List getUserRoles();
    public edu.kings.cs480.BluePrints.Database.AppUser getUser(java.util.UUID);
    public edu.kings.cs480.BluePrints.Database.AppUser getUserByEmail(String);
    public edu.kings.cs480.BluePrints.Database.UserRole getUserRole(java.util.UUID);
    public boolean assignRole(java.util.UUID, java.util.UUID);
    public boolean deleteUser(java.util.UUID);
    public boolean createUser(String, String, String, java.util.UUID);
    public java.util.List getUsers();
    public boolean doesUserExist(String);
    public boolean changeUserPassword(String, String);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/BluePrintsMain.class

package edu.kings.cs480.BluePrints;
public synchronized class BluePrintsMain extends org.springframework.boot.web.support.SpringBootServletInitializer {
    public void BluePrintsMain();
    protected org.springframework.boot.builder.SpringApplicationBuilder configure(org.springframework.boot.builder.SpringApplicationBuilder);
    public static void main(String[]);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/controllers/BluePrintsController.class

package edu.kings.cs480.BluePrints.controllers;
public synchronized class BluePrintsController {
    protected static final String REDIRECT_LOGIN;
    protected static final String REDIRECT_HOME;
    protected edu.kings.cs480.BluePrints.Adapters.LoginAdapter loginAdapter;
    protected edu.kings.cs480.BluePrints.Adapters.LoggingAdapter logger;
    static void <clinit>();
    public void BluePrintsController();
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/controllers/BuildingController.class

package edu.kings.cs480.BluePrints.controllers;
public synchronized class BuildingController extends BluePrintsController {
    private edu.kings.cs480.BluePrints.Adapters.BuildingAdapter buildingAdapter;
    private edu.kings.cs480.BluePrints.Adapters.FloorAdapter floorAdapter;
    public void BuildingController();
    public String displayBuildings(org.springframework.ui.Model, javax.servlet.http.HttpSession);
    public String displayNewBuilding(org.springframework.ui.Model, javax.servlet.http.HttpSession);
    public String getBuildingInfo(java.util.UUID);
    public String updateBuilding(java.util.UUID, String, String);
    public String viewBuilding(java.util.UUID, org.springframework.ui.Model, javax.servlet.http.HttpSession);
    public String deleteBuilding(java.util.UUID);
    public String addBuidling(String, java.util.UUID, String);
    public String getBuildingCoordinates(java.util.UUID);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/controllers/CategoriesController.class

package edu.kings.cs480.BluePrints.controllers;
public synchronized class CategoriesController extends BluePrintsController {
    edu.kings.cs480.BluePrints.Database.CategoryRepository categoryRepo;
    public void CategoriesController();
    public String displayCategories(org.springframework.ui.Model, javax.servlet.http.HttpSession);
    public String editCategory(String, String, java.util.UUID, javax.servlet.http.HttpSession);
    public String deleteCategory(java.util.UUID, javax.servlet.http.HttpSession);
    public String addCategory(String, javax.servlet.http.HttpSession);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/controllers/CommentController.class

package edu.kings.cs480.BluePrints.controllers;
public synchronized class CommentController extends BluePrintsController {
    private edu.kings.cs480.BluePrints.Adapters.CommentAdapter commentAdapter;
    public void CommentController();
    public String newFloor(java.util.UUID, java.util.UUID, String);
    public String updateComment(java.util.UUID, java.util.UUID, String);
    public String getComments(java.util.UUID, org.springframework.ui.Model);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/controllers/FloorController.class

package edu.kings.cs480.BluePrints.controllers;
public synchronized class FloorController extends BluePrintsController {
    private edu.kings.cs480.BluePrints.Adapters.RoomAdapter roomAdapter;
    private edu.kings.cs480.BluePrints.Adapters.FloorAdapter floorAdapter;
    private edu.kings.cs480.BluePrints.Adapters.CommentAdapter commentAdapter;
    public void FloorController();
    public String newFloor(java.util.UUID, String);
    public String deleteFloor(java.util.UUID);
    public String duplicateFloor(java.util.UUID, String);
    public String floorEditor(java.util.UUID, org.springframework.ui.Model, javax.servlet.http.HttpSession);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/controllers/LoginController.class

package edu.kings.cs480.BluePrints.controllers;
public synchronized class LoginController extends BluePrintsController {
    public void LoginController();
    public String index(org.springframework.ui.Model, javax.servlet.http.HttpSession);
    public String displayLogin(org.springframework.ui.Model, javax.servlet.http.HttpSession);
    public String submitLogin(String, String, org.springframework.ui.Model, javax.servlet.http.HttpSession);
    public String logout(org.springframework.ui.Model, javax.servlet.http.HttpSession);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/controllers/RoomController.class

package edu.kings.cs480.BluePrints.controllers;
public synchronized class RoomController {
    edu.kings.cs480.BluePrints.Adapters.RoomAdapter roomAdapter;
    private edu.kings.cs480.BluePrints.Adapters.StaffAdapter staffAdapter;
    public void RoomController();
    public String getRoom(java.util.UUID);
    public String clearFloor(java.util.UUID);
    public String deleteRoom(java.util.UUID);
    public String updateRoom(java.util.UUID, String, String);
    public String addRoom(java.util.UUID, String, String);
    public String getRoomCoordinates(java.util.UUID);
    public String getRooms(java.util.UUID);
    public String assignStaffToRoom(java.util.UUID, java.util.UUID[]);
    public String getRoomStaff(java.util.UUID);
    public String unassignStaff(java.util.UUID, java.util.UUID);
    public String unassignAllStaff(java.util.UUID);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/controllers/StaffController.class

package edu.kings.cs480.BluePrints.controllers;
public synchronized class StaffController extends BluePrintsController {
    private edu.kings.cs480.BluePrints.Adapters.StaffAdapter staffAdapter;
    private edu.kings.cs480.BluePrints.Adapters.RoomAdapter roomAdapter;
    public void StaffController();
    public String getAllStaff(java.util.UUID);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/controllers/TestDisplayMap.class

package edu.kings.cs480.BluePrints.controllers;
public synchronized class TestDisplayMap {
    public void TestDisplayMap();
    public String index();
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/controllers/UserManagementController.class

package edu.kings.cs480.BluePrints.controllers;
public synchronized class UserManagementController extends BluePrintsController {
    private edu.kings.cs480.BluePrints.Adapters.UserAdapter userAdapter;
    public void UserManagementController();
    public String getUserInformation(java.util.UUID);
    public String updateUserInformation(java.util.UUID, java.util.UUID);
    public String deleteUser(java.util.UUID);
    public String addUser(String, String, String, java.util.UUID, javax.servlet.http.HttpSession);
    public String displayUsers(org.springframework.ui.Model, javax.servlet.http.HttpSession);
    public String displayPasswordReset(org.springframework.ui.Model, javax.servlet.http.HttpSession);
    public String changeUserPassword(String, String, String, javax.servlet.http.HttpSession);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Database/AppUser.class

package edu.kings.cs480.BluePrints.Database;
public synchronized class AppUser {
    private java.util.UUID id;
    private String firstName;
    private String lastName;
    private String email;
    private String password;
    private UserRole role;
    public void AppUser(String, String, String);
    public void AppUser();
    public java.util.UUID getId();
    public String getFirstName();
    public void setFirstName(String);
    public String getLastName();
    public void setLastName(String);
    public String getEmail();
    public void setEmail(String);
    public UserRole getRole();
    public void setRole(UserRole);
    public String getPassword();
    public void setPassword(String);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Database/AppUserRepository.class

package edu.kings.cs480.BluePrints.Database;
public abstract interface AppUserRepository extends org.springframework.data.jpa.repository.JpaRepository {
    public abstract AppUser findByEmail(String);
    public abstract org.springframework.data.domain.Page findAll(org.springframework.data.domain.Pageable);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Database/Building.class

package edu.kings.cs480.BluePrints.Database;
public synchronized class Building {
    private java.util.UUID id;
    private String name;
    private AppUser creator;
    public void Building();
    public void Building(String, AppUser);
    public String getName();
    public void setName(String);
    public java.util.UUID getId();
    public AppUser getCreator();
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Database/BuildingCoordinate.class

package edu.kings.cs480.BluePrints.Database;
public synchronized class BuildingCoordinate {
    private java.util.UUID id;
    private String coordinateData;
    private Building building;
    public void BuildingCoordinate();
    public void BuildingCoordinate(Building, String);
    public String getCoordinateData();
    public void setCoordinateData(String);
    public java.util.UUID getId();
    public Building getBuilding();
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Database/BuildingRepository.class

package edu.kings.cs480.BluePrints.Database;
public abstract interface BuildingRepository extends org.springframework.data.jpa.repository.JpaRepository {
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Database/Category.class

package edu.kings.cs480.BluePrints.Database;
public synchronized class Category {
    private java.util.UUID categoryID;
    private String name;
    public void Category();
    public void Category(String);
    public java.util.UUID getCategoryID();
    public String getName();
    public void setName(String);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Database/CategoryRepository.class

package edu.kings.cs480.BluePrints.Database;
public abstract interface CategoryRepository extends org.springframework.data.jpa.repository.JpaRepository {
    public abstract Category findByCategoryID(java.util.UUID);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Database/Comment.class

package edu.kings.cs480.BluePrints.Database;
public synchronized class Comment {
    private java.util.UUID id;
    private String commentMsg;
    private Floor floor;
    private AppUser creator;
    private java.util.Date createdDate;
    public void Comment(Floor, AppUser, String);
    public void Comment();
    public java.util.UUID getId();
    public String getMessage();
    public void setMessage(String);
    public Floor getFloor();
    public AppUser getCreator();
    public void setCreator(AppUser);
    public java.util.Date getDate();
    public void setDate(java.util.Date);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Database/CommentRepository.class

package edu.kings.cs480.BluePrints.Database;
public abstract interface CommentRepository extends org.springframework.data.jpa.repository.JpaRepository {
    public abstract java.util.List findByFloorIdOrderByCreatedDateAsc(java.util.UUID);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Database/CoordinateRepository.class

package edu.kings.cs480.BluePrints.Database;
public abstract interface CoordinateRepository extends org.springframework.data.jpa.repository.JpaRepository {
    public abstract BuildingCoordinate findByBuilding(Building);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Database/Floor.class

package edu.kings.cs480.BluePrints.Database;
public synchronized class Floor {
    private java.util.UUID id;
    private String floorName;
    private Building building;
    public void Floor(Building, String);
    public void Floor();
    public java.util.UUID getId();
    public String getName();
    public Building getBuilding();
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Database/FloorRepository.class

package edu.kings.cs480.BluePrints.Database;
public abstract interface FloorRepository extends org.springframework.data.jpa.repository.JpaRepository {
    public abstract java.util.List findByBuilding(Building);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Database/Room.class

package edu.kings.cs480.BluePrints.Database;
public synchronized class Room {
    private java.util.UUID id;
    private String name;
    private Floor floor;
    public void Room();
    public void Room(String, Floor);
    public java.util.UUID getId();
    public String getName();
    public void setName(String);
    public Floor getFloor();
    public void setFloor(Floor);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Database/RoomCoordinateRepository.class

package edu.kings.cs480.BluePrints.Database;
public abstract interface RoomCoordinateRepository extends org.springframework.data.jpa.repository.JpaRepository {
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Database/RoomCoordinates.class

package edu.kings.cs480.BluePrints.Database;
public synchronized class RoomCoordinates {
    private java.util.UUID id;
    private String coordinateData;
    public void RoomCoordinates();
    public void RoomCoordinates(java.util.UUID, String);
    public java.util.UUID getId();
    public String getCoordinateData();
    public void setCoordinateData(String);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Database/RoomRepository.class

package edu.kings.cs480.BluePrints.Database;
public abstract interface RoomRepository extends org.springframework.data.jpa.repository.JpaRepository {
    public abstract java.util.List findByFloor(Floor);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Database/Staff.class

package edu.kings.cs480.BluePrints.Database;
public abstract interface Staff {
    public abstract String getName();
    public abstract Object getStaffId();
    public abstract String getStaffEmail();
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Database/StaffAssignment.class

package edu.kings.cs480.BluePrints.Database;
public synchronized class StaffAssignment implements java.io.Serializable {
    private static final long serialVersionUID = 2620119567850306216;
    private java.util.UUID assignmentId;
    private Room room;
    private java.util.UUID staffId;
    public void StaffAssignment();
    public void StaffAssignment(Room, java.util.UUID);
    public java.util.UUID getId();
    public Room getRoom();
    public java.util.UUID getStaffId();
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Database/StaffAssignmentRepository.class

package edu.kings.cs480.BluePrints.Database;
public abstract interface StaffAssignmentRepository extends org.springframework.data.jpa.repository.JpaRepository {
    public abstract java.util.List findByRoom(Room);
    public abstract StaffAssignment findByStaffIdAndRoom(java.util.UUID, Room);
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Database/UserRole.class

package edu.kings.cs480.BluePrints.Database;
public synchronized class UserRole {
    private java.util.UUID id;
    private String name;
    private int permissionLevel;
    protected void UserRole();
    public java.util.UUID getId();
    public String getName();
    public int getPermissionLevel();
}

BluePrints/target/classes/edu/kings/cs480/BluePrints/Database/UserRoleRepository.class

package edu.kings.cs480.BluePrints.Database;
public abstract interface UserRoleRepository extends org.springframework.data.jpa.repository.JpaRepository {
}

BluePrints/target/classes/keystore.p12

BluePrints/target/classes/log4j2.xml

logs ${log-path}/archive

BluePrints/target/m2e-wtp/web-resources/META-INF/MANIFEST.MF

Manifest-Version: 1.0 Built-By: AD Build-Jdk: 11.0.1 Implementation-Title: BluePrints Implementation-Version: 1.0 Implementation-Vendor-Id: edu.kings.cs480 Implementation-Vendor: Pivotal Software, Inc. Implementation-URL: http://maven.apache.org Main-Class: edu.kings.cs480.BluePrints.BluePrintsMain Created-By: Maven Integration for Eclipse

BluePrints/target/m2e-wtp/web-resources/META-INF/maven/edu.kings.cs480/BluePrints/pom.properties

#Generated by Maven Integration for Eclipse #Wed May 01 19:22:00 EDT 2019 m2e.projectLocation=C\:\\Users\\AD\\git\\CS300-S19-aa_final\\BluePrints m2e.projectName=BluePrints groupId=edu.kings.cs480 artifactId=BluePrints version=1.0

BluePrints/target/m2e-wtp/web-resources/META-INF/maven/edu.kings.cs480/BluePrints/pom.xml

4.0.0 edu.kings.cs480 BluePrints war BluePrints http://maven.apache.org edu.kings.cs480.BluePrints.BluePrintsMain UTF-8 1.8 org.springframework.boot spring-boot-starter-parent 1.5.9.RELEASE org.springframework.boot spring-boot-starter-tomcat provided org.springframework.boot spring-boot-starter-data-jpa org.apache.tomcat.embed tomcat-embed-jasper provided com.unboundid unboundid-ldapsdk org.springframework.boot spring-boot-starter-freemarker org.webjars bootstrap 4.0.0-beta.3 org.webjars.bower popper.js 1.12.9 org.json json org.postgresql postgresql org.webjars datatables 1.10.16 runtime org.springframework.boot spring-boot-starter-log4j2 org.apache.logging.log4j log4j-slf4j-impl com.h2database h2 runtime javax.xml.bind jaxb-api runtime 2.3.0 org.webjars jquery 3.0.0 runtime org.springframework.boot spring-boot-maven-plugin 1.0

BluePrints/WebContent/META-INF/MANIFEST.MF

Manifest-Version: 1.0 Class-Path: