Browse Source

Base code for docs service

Drowsito 5 months ago
commit
28d50879cd
100 changed files with 32926 additions and 0 deletions
  1. 57 0
      .classpath
  2. 5 0
      .gitignore
  3. 39 0
      .project
  4. 14 0
      .vscode/launch.json
  5. 17 0
      .vscode/settings.json
  6. 286 0
      mvnw
  7. 161 0
      mvnw.cmd
  8. 135 0
      notas.md
  9. 183 0
      pom.xml
  10. 109 0
      reporte_config.md
  11. 1796 0
      reporte_domain.md
  12. 143 0
      reporte_general.md
  13. 1420 0
      reporte_service.md
  14. 1650 0
      reporte_web.md
  15. 167 0
      src/main/java/META-INF/additional-spring-configuration-metadata.json
  16. 15 0
      src/main/java/es/uv/saic/SaicApplication.java
  17. 55 0
      src/main/java/es/uv/saic/config/ApplicationLocaleResolver.java
  18. 26 0
      src/main/java/es/uv/saic/config/AuthSuccessHandler.java
  19. 43 0
      src/main/java/es/uv/saic/config/Globals.java
  20. 22 0
      src/main/java/es/uv/saic/config/SchedulerConfig.java
  21. 150 0
      src/main/java/es/uv/saic/config/SecurityConfig.java
  22. 49 0
      src/main/java/es/uv/saic/config/WebConfig.java
  23. 147 0
      src/main/java/es/uv/saic/domain/Acreditacio.java
  24. 52 0
      src/main/java/es/uv/saic/domain/AcreditacioPK.java
  25. 78 0
      src/main/java/es/uv/saic/domain/Categoria.java
  26. 93 0
      src/main/java/es/uv/saic/domain/Document.java
  27. 31 0
      src/main/java/es/uv/saic/domain/DocumentRepository.java
  28. 119 0
      src/main/java/es/uv/saic/domain/Indicador.java
  29. 133 0
      src/main/java/es/uv/saic/domain/Instancia.java
  30. 149 0
      src/main/java/es/uv/saic/domain/InstanciaTasca.java
  31. 212 0
      src/main/java/es/uv/saic/domain/Organ.java
  32. 64 0
      src/main/java/es/uv/saic/domain/OrganEquivalent.java
  33. 61 0
      src/main/java/es/uv/saic/domain/OrganEquivalentPK.java
  34. 51 0
      src/main/java/es/uv/saic/domain/OrganPK.java
  35. 126 0
      src/main/java/es/uv/saic/domain/Plantilla.java
  36. 62 0
      src/main/java/es/uv/saic/domain/PlantillaComentario.java
  37. 66 0
      src/main/java/es/uv/saic/domain/PlantillaConversation.java
  38. 24 0
      src/main/java/es/uv/saic/domain/PlantillaRepository.java
  39. 198 0
      src/main/java/es/uv/saic/domain/Proces.java
  40. 124 0
      src/main/java/es/uv/saic/domain/Rol.java
  41. 256 0
      src/main/java/es/uv/saic/domain/Tasca.java
  42. 42 0
      src/main/java/es/uv/saic/domain/Tipus.java
  43. 210 0
      src/main/java/es/uv/saic/domain/Usuari.java
  44. 90 0
      src/main/java/es/uv/saic/domain/UsuariRepository.java
  45. 127 0
      src/main/java/es/uv/saic/domain/UsuarisRol.java
  46. 64 0
      src/main/java/es/uv/saic/domain/UsuarisRolRepository.java
  47. 27 0
      src/main/java/es/uv/saic/dto/CategoriaDTO.java
  48. 40 0
      src/main/java/es/uv/saic/dto/DocumentDTO.java
  49. 42 0
      src/main/java/es/uv/saic/dto/DocumentTmpDTO.java
  50. 40 0
      src/main/java/es/uv/saic/dto/IndicadorEnquestaDTO.java
  51. 15 0
      src/main/java/es/uv/saic/dto/IndicadorEnquestaValorDTO.java
  52. 32 0
      src/main/java/es/uv/saic/dto/PdfDTO.java
  53. 11 0
      src/main/java/es/uv/saic/dto/TascaAsignadaDTO.java
  54. 50 0
      src/main/java/es/uv/saic/dto/TascaDTO.java
  55. 19 0
      src/main/java/es/uv/saic/dto/TascaInformeTransferDTO.java
  56. 160 0
      src/main/java/es/uv/saic/service/AuthProvider.java
  57. 87 0
      src/main/java/es/uv/saic/service/DocumentService.java
  58. 192 0
      src/main/java/es/uv/saic/service/PlantillaService.java
  59. 104 0
      src/main/java/es/uv/saic/service/UsuariService.java
  60. 177 0
      src/main/java/es/uv/saic/service/UsuarisRolService.java
  61. 98 0
      src/main/java/es/uv/saic/web/DocumentController.java
  62. 830 0
      src/main/java/es/uv/saic/web/DownloadController.java
  63. 30 0
      src/main/java/es/uv/saic/web/PlantillaController.java
  64. 44 0
      src/main/resources/application-dev.properties
  65. 51 0
      src/main/resources/application-local.properties
  66. 45 0
      src/main/resources/application-prod.properties
  67. 67 0
      src/main/resources/application.properties
  68. 461 0
      src/main/resources/messages.properties
  69. 468 0
      src/main/resources/messages_ca.properties
  70. 462 0
      src/main/resources/messages_es.properties
  71. 3106 0
      src/main/resources/static/css/app.css
  72. 429 0
      src/main/resources/static/css/bootstrap-select/bootstrap-select.css
  73. 0 0
      src/main/resources/static/css/bootstrap-select/bootstrap-select.css.map
  74. 5 0
      src/main/resources/static/css/bootstrap-select/bootstrap-select.min.css
  75. 3719 0
      src/main/resources/static/css/bootstrap/bootstrap-grid.css
  76. 0 0
      src/main/resources/static/css/bootstrap/bootstrap-grid.css.map
  77. 5 0
      src/main/resources/static/css/bootstrap/bootstrap-grid.min.css
  78. 0 0
      src/main/resources/static/css/bootstrap/bootstrap-grid.min.css.map
  79. 331 0
      src/main/resources/static/css/bootstrap/bootstrap-reboot.css
  80. 0 0
      src/main/resources/static/css/bootstrap/bootstrap-reboot.css.map
  81. 6 0
      src/main/resources/static/css/bootstrap/bootstrap-reboot.min.css
  82. 0 0
      src/main/resources/static/css/bootstrap/bootstrap-reboot.min.css.map
  83. 10038 0
      src/main/resources/static/css/bootstrap/bootstrap.css
  84. 0 0
      src/main/resources/static/css/bootstrap/bootstrap.css.map
  85. 5 0
      src/main/resources/static/css/bootstrap/bootstrap.min.css
  86. 0 0
      src/main/resources/static/css/bootstrap/bootstrap.min.css.map
  87. 208 0
      src/main/resources/static/css/bootstrap/dataTables.bootstrap4.min.css
  88. 0 0
      src/main/resources/static/css/bootstrap/responsive.dataTables.min.css
  89. 1 0
      src/main/resources/static/css/bootstrap/rowReorder.dataTables.min.css
  90. 477 0
      src/main/resources/static/css/datepicker/bootstrap-datepicker.css
  91. 0 0
      src/main/resources/static/css/datepicker/bootstrap-datepicker.css.map
  92. 6 0
      src/main/resources/static/css/datepicker/bootstrap-datepicker.min.css
  93. 510 0
      src/main/resources/static/css/datepicker/bootstrap-datepicker.standalone.css
  94. 0 0
      src/main/resources/static/css/datepicker/bootstrap-datepicker.standalone.css.map
  95. 6 0
      src/main/resources/static/css/datepicker/bootstrap-datepicker.standalone.min.css
  96. 683 0
      src/main/resources/static/css/datepicker/bootstrap-datepicker3.css
  97. 0 0
      src/main/resources/static/css/datepicker/bootstrap-datepicker3.css.map
  98. 6 0
      src/main/resources/static/css/datepicker/bootstrap-datepicker3.min.css
  99. 712 0
      src/main/resources/static/css/datepicker/bootstrap-datepicker3.standalone.css
  100. 0 0
      src/main/resources/static/css/datepicker/bootstrap-datepicker3.standalone.css.map

+ 57 - 0
.classpath

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="target/classes" path="src/main/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+			<attribute name="optional" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+			<attribute name="test" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+			<attribute name="test" value="true"/>
+			<attribute name="optional" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" path="target/generated-sources/annotations">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+			<attribute name="ignore_optional_problems" value="true"/>
+			<attribute name="m2e-apt" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/test-classes" path="target/generated-test-sources/test-annotations">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+			<attribute name="ignore_optional_problems" value="true"/>
+			<attribute name="m2e-apt" value="true"/>
+			<attribute name="test" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>

+ 5 - 0
.gitignore

@@ -0,0 +1,5 @@
+/target/**
+.deployables
+.settings
+markdonwGen.py
+/target/

+ 39 - 0
.project

@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>UV_SAIC</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.springframework.ide.eclipse.boot.validation.springbootbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+	<filteredResources>
+		<filter>
+			<id>1743099718695</id>
+			<name></name>
+			<type>30</type>
+			<matcher>
+				<id>org.eclipse.core.resources.regexFilterMatcher</id>
+				<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
+</projectDescription>

+ 14 - 0
.vscode/launch.json

@@ -0,0 +1,14 @@
+{
+    "configurations": [
+        {
+            "type": "java",
+            "name": "Spring Boot-SaicApplication<saic>",
+            "request": "launch",
+            "cwd": "${workspaceFolder}",
+            "mainClass": "es.uv.saic.SaicApplication",
+            "projectName": "saic",
+            "envFile": "${workspaceFolder}/.env",
+            "args": "--spring.profiles.active=local"
+        }
+    ]
+}

+ 17 - 0
.vscode/settings.json

@@ -0,0 +1,17 @@
+{
+    "sqltools.connections": [
+        {
+            "server": "coddono.uv.es",
+            "port": 9042,
+            "previewLimit": 50,
+            "driver": "Cassandra",
+            "name": "coddono",
+            "database": "acd425",
+            "username": "acd425",
+            "password": "acd425"
+        }
+    ],
+    "java.configuration.updateBuildConfiguration": "interactive",
+    "java.compile.nullAnalysis.mode": "automatic",
+    "java.dependency.syncWithFolderExplorer": false
+}

+ 286 - 0
mvnw

@@ -0,0 +1,286 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#    https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven2 Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+#   JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+#   M2_HOME - location of maven2's installed home dir
+#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
+#     e.g. to debug Maven itself, use
+#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+  if [ -f /etc/mavenrc ] ; then
+    . /etc/mavenrc
+  fi
+
+  if [ -f "$HOME/.mavenrc" ] ; then
+    . "$HOME/.mavenrc"
+  fi
+
+fi
+
+# OS specific support.  $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+  CYGWIN*) cygwin=true ;;
+  MINGW*) mingw=true;;
+  Darwin*) darwin=true
+    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+    if [ -z "$JAVA_HOME" ]; then
+      if [ -x "/usr/libexec/java_home" ]; then
+        export JAVA_HOME="`/usr/libexec/java_home`"
+      else
+        export JAVA_HOME="/Library/Java/Home"
+      fi
+    fi
+    ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+  if [ -r /etc/gentoo-release ] ; then
+    JAVA_HOME=`java-config --jre-home`
+  fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+  ## resolve links - $0 may be a link to maven's home
+  PRG="$0"
+
+  # need this for relative symlinks
+  while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+      PRG="$link"
+    else
+      PRG="`dirname "$PRG"`/$link"
+    fi
+  done
+
+  saveddir=`pwd`
+
+  M2_HOME=`dirname "$PRG"`/..
+
+  # make it fully qualified
+  M2_HOME=`cd "$M2_HOME" && pwd`
+
+  cd "$saveddir"
+  # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --unix "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Mingw, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME="`(cd "$M2_HOME"; pwd)`"
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+  # TODO classpath?
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+  javaExecutable="`which javac`"
+  if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+    # readlink(1) is not available as standard on Solaris 10.
+    readLink=`which readlink`
+    if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+      if $darwin ; then
+        javaHome="`dirname \"$javaExecutable\"`"
+        javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+      else
+        javaExecutable="`readlink -f \"$javaExecutable\"`"
+      fi
+      javaHome="`dirname \"$javaExecutable\"`"
+      javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+      JAVA_HOME="$javaHome"
+      export JAVA_HOME
+    fi
+  fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+  if [ -n "$JAVA_HOME"  ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+      # IBM's JDK on AIX uses strange locations for the executables
+      JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+    fi
+  else
+    JAVACMD="`which java`"
+  fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+  echo "Error: JAVA_HOME is not defined correctly." >&2
+  echo "  We cannot execute $JAVACMD" >&2
+  exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+  echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+  if [ -z "$1" ]
+  then
+    echo "Path not specified to find_maven_basedir"
+    return 1
+  fi
+
+  basedir="$1"
+  wdir="$1"
+  while [ "$wdir" != '/' ] ; do
+    if [ -d "$wdir"/.mvn ] ; then
+      basedir=$wdir
+      break
+    fi
+    # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+    if [ -d "${wdir}" ]; then
+      wdir=`cd "$wdir/.."; pwd`
+    fi
+    # end of workaround
+  done
+  echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+  if [ -f "$1" ]; then
+    echo "$(tr -s '\n' ' ' < "$1")"
+  fi
+}
+
+BASE_DIR=`find_maven_basedir "$(pwd)"`
+if [ -z "$BASE_DIR" ]; then
+  exit 1;
+fi
+
+##########################################################################################
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
+##########################################################################################
+if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Found .mvn/wrapper/maven-wrapper.jar"
+    fi
+else
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
+    fi
+    jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
+    while IFS="=" read key value; do
+      case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
+      esac
+    done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Downloading from: $jarUrl"
+    fi
+    wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
+
+    if command -v wget > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found wget ... using wget"
+        fi
+        wget "$jarUrl" -O "$wrapperJarPath"
+    elif command -v curl > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found curl ... using curl"
+        fi
+        curl -o "$wrapperJarPath" "$jarUrl"
+    else
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Falling back to using Java to download"
+        fi
+        javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
+        if [ -e "$javaClass" ]; then
+            if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Compiling MavenWrapperDownloader.java ..."
+                fi
+                # Compiling the Java class
+                ("$JAVA_HOME/bin/javac" "$javaClass")
+            fi
+            if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                # Running the downloader
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Running MavenWrapperDownloader.java ..."
+                fi
+                ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
+            fi
+        fi
+    fi
+fi
+##########################################################################################
+# End of extension
+##########################################################################################
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+if [ "$MVNW_VERBOSE" = true ]; then
+  echo $MAVEN_PROJECTBASEDIR
+fi
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --path --windows "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+    MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+  $MAVEN_OPTS \
+  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+  "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

+ 161 - 0
mvnw.cmd

@@ -0,0 +1,161 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements.  See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership.  The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License.  You may obtain a copy of the License at
+@REM
+@REM    https://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied.  See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven2 Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM     e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM set title of command window
+title %0
+@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
+FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO (
+	IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B 
+)
+
+@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
+if exist %WRAPPER_JAR% (
+    echo Found %WRAPPER_JAR%
+) else (
+    echo Couldn't find %WRAPPER_JAR%, downloading it ...
+	echo Downloading from: %DOWNLOAD_URL%
+    powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"
+    echo Finished downloading %WRAPPER_JAR%
+)
+@REM End of extension
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%

+ 135 - 0
notas.md

@@ -0,0 +1,135 @@
+# Notas
+## DataController -> SAIC_DATA
+ - DataService -> SAIC_DATA
+ - OrganService -> SAIC_CORE
+ - IndicadorEnquestaTmpService -> SAIC_CORE
+ - IndicadorEnquestaService -> SAIC_CORE
+ - DataSourceService -> SAIC_DATA
+ ### Llamadas a OrganService a convertir - ✅
+    - ln 114 getActiveCentres() GET - ✅
+    - ln 115 getTitulations() GET - ✅
+    - ln 201 findByRuct(Integer ruct) POST - ✅
+
+ ### Llamadas a IndicadorEnquestaTmpService a convertir - ✅
+    - ln 95 deleteByEnquestaCursAmbitEstudi(String enquesta, Integer curs, String ambit, String estudi) DELETE - ✅
+    - ln 106 findByEnquestaCursAmbitEstudi(String enquesta, Integer curs, String ambit, String estudi) POST - ✅
+    - ln 150 deleteFromCurrent(String enquesta) DELETE - ✅
+    - ln 153 deleteFromPending(String enquesta) DELETE - ✅
+    - ln 163 deleteDuplicates(String enquesta) DELETE  - ✅
+
+ ### Llamadas a IndicadorEnquestaService a convertir - ¿No se usa? - ✅
+    - ln 215 findByEnquestaCursAmbitEstudi(String enquesta, Integer curs, String ambit, String estudi) POST - ✅
+    - ln 218 findByEnquestaCursAmbitEstudiCentre(String enquesta, Integer curs, String ambit, String estudi, Integer centre) POST - ✅
+    - ln 221 findByEnquestaCursAmbitEstudiCentreTitulacio(String enquesta, Integer curs, String ambit, String estudi, Integer centre, Integer titulacio) POST - ✅
+
+## DashboardController -> SAIC_CORE
+ - OrganService -> SAIC_CORE
+ - UsuarisRolService -> SAIC_CORE
+ - InformeService -> SAIC_CORE
+ - InstanciaService -> SAIC_CORE
+ - CategoriaService -> SAIC_CORE
+ - DocumentService -> SAIC_DOCS
+ - IndicadorService -> SAIC_CORE
+ - IndicadorEnquestaService -> SAIC_CORE
+ - GraficaService -> SAIC_CORE
+ - LinkService -> SAIC_CORE
+
+ ### Llamadas a DocumentService a convertir - ✅
+    - ln 335 findByCategoriaOrgan(Integer idCategoria, Integer lugar, String tlugar) POST - ✅
+    - ln 425 findByCategoriaOrgan(Integer idCategoria, Integer lugar, String tlugar) POST - ✅
+    - ln 435 save(Document doc) POST - ✅
+    - ln 436 upload(Integer idDocument, Integer idCategoria, Integer lugar, String tlugar, MultipartFile file) POST - ✅
+    - ln 438 save(Document doc) POST - ✅
+    - ln ??? archive(Document doc) POST - ✅
+## DownloadController -> SAIC_DOCS
+ - InstanciaTascaService -> SAIC_CORE
+ - IndicadorEnquestaService -> SAIC_CORE
+ - TascaService -> SAIC_CORE
+ - IndicadorService -> SAIC_CORE
+ - ProcesService -> SAIC_CORE
+ - PlantillaService -> SAIC_CORE
+ - OrganService -> SAIC_CORE
+ - DocumentService -> SAIC_DOCS
+
+ ### Llamadas a InstanciaTascaService a convertir - ✅
+    - ln 110 findById(Integer idInstanciaTasca) POST - ✅
+    - ln 169 getLastByProcName(String nomProces, Integer lugar, Integer lugarOrgan, String organAmbit) POST - ✅
+    - ln 196 findById(Integer idInstanciaTasca) POST - ✅
+    - ln 534 findById(Integer idInstanciaTasca) POST - ✅
+
+ ### Llamadas a IndicadorEnquestaService a convertir - ✅
+    - ln 290 getAllInds(Integer idTitulacio, Integer idCentre, IntegerCurs) POST - ✅
+    - ln 348 getAllInds(Integer idTitulacio, Integer idCentre, IntegerCurs) POST - ✅
+
+ ### Llamadas a TascaService a convertir - ✅
+    - ln 378 getByProcesTascap(Integer idProces, Integer idTascap) POST - ✅
+
+ ### Llamadas a IndicadorService a convertir - ✅
+    - ln 281 getFromTitulacion(String idTitulacio.toString(), Integer curs) POST - ✅
+    - ln 339 getFromTitulacion(String idTitulacio.toString(), Integer curs) POST - ✅
+ 
+ ### Llamadas a ProcesService a convertir - ✅
+    - ln 379 findByID(Integer idProces) POST - ✅
+    
+ ### Llamadas a PlantillaService a convertir
+    - ln 538 toPdf(String instanciaTasca.getText(),Optional<BigInteger> Optional.of(idTascai)) POST
+    - ln 554 toPDF(String content, Optional<BigInteger> idtascai) POST
+
+ ### Llamadas a OrganService a convertir - ✅
+    - ln 167 findById(String tlugar, Integer idTitulacio) POST - ✅
+    - ln 247 getTitulacionsByTypeCentre(Integer lugar, Integer ambit) POST - ✅
+    - ln 380 findByID(String tlugar, Integer idTitulacio) POST - ✅
+    - ln 381 findByID(String tlugar, Integer idTutulacio) POST - ✅
+    - ln 420 getTitulacionsByTypeCentre(Integer lugar, Integer ambit) POST - ✅
+    - ln 460 findByID(String tlugar, Integer idTitulacio) POST - ✅
+    - ln 461 findByID(String tlugar, Integer idTutulacio) POST - ✅
+    - ln 503 getTitulacionsByTypeCentre(Integer lugar, Integer ambit) POST - ✅
+ ### Llamadas a DocumentService a convertir  - ✅
+   -
+   -
+   -
+   
+# Servicios que necesitan un nuevo controlador: 
+## IndicadorController -> ASIC_CORE
+ ### IndicadorEnquestaTmpService endpoints:
+    - deleteByEnquestaCursAmbitEstudi(String enquesta, Integer curs, String ambit, String estudi) DELETE
+    - deleteFromCurrent(String enquesta) DELETE
+    - deleteFromPending(String enquesta) DELETE
+    - deleteDuplicates(String enquesta) DELETE
+ ### IndicadorEnquestaService endpoints:
+    - getAllInds(Organ o, Integer curs) POST
+    - getAllInds(Integer idTitulacio, Integer idCentre, IntegerCurs) POST 
+    - findByEnquestaCursAmbitEstudi(String enquesta, Integer curs, String ambit, String estudi) POST
+    - findByEnquestaCursAmbitEstudiCentre(String enquesta, Integer curs, String ambit, String estudi, Integer centre) POST
+    - findByEnquestaCursAmbitEstudiCentreTitulacio(String enquesta, Integer curs, String ambit, String estudi, Integer centre, Integer titulacio) POST
+ ### IndicadorService endpoints:
+    - getFromTitulacion(String idTitulacio.toString(), Integer curs) POST
+
+## OrganController -> ASIC_CORE
+ ### OrganService endpoints:
+    - getActiveCentres() GET
+    - getTitulations() GET
+    - findByRuct(Integer ruct) POST  -> AHORA ES "getAllIndsByRuct"
+    - findById(String tlugar, Integer idTitulacio) POST
+    - getTitulacionsByTypeCentre(Integer lugar, Integer ambit) POST
+
+## TascaController -> ASIC_CORE
+ ### InstanciaTascaService endpoints:
+    - findById(Integer idInstanciaTasca) POST
+    - getLastByProcName(String nomProces, Integer lugar, Integer lugarOrgan, String organAmbit) POST
+ ### TascaService endpoints:
+    - getByProcesTascap(Integer idProces, Integer idTascap) POST
+
+## ProcesController -> ASIC_CORE
+ ### ProcesService
+    - findByID(Integer idProces) POST
+
+## DocumenController -> ASIC_DOCS
+ ### DocumentService endpoints:
+    - save(Document doc) POST
+    - findByCategoriaOrgan(Integer idCategoria, Integer lugar, String tlugar) POST 
+    - upload(Integer idDocument, Integer idCategoria, Integer lugar, String tlugar, MultipartFile file) POST
+
+## PlantillaController -> ASIC_DOCS
+ ### PlantillaService
+    - toPdf(String instanciaTasca.getText(),Optional<BigInteger> Optional.of(idTascai)) POST

+ 183 - 0
pom.xml

@@ -0,0 +1,183 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.springframework.boot</groupId>
+		<artifactId>spring-boot-starter-parent</artifactId>
+		<version>3.3.0</version>
+		<relativePath/> <!-- lookup parent from repository -->
+	</parent>
+	<groupId>es.uv.saic</groupId>
+	<artifactId>saic</artifactId>
+	<version>3.0.0</version>
+	<name>saic</name>
+	<description>saic</description>
+
+	<properties>
+		<java.version>17</java.version>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+	</properties>
+	
+	<dependencies>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-web</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-devtools</artifactId>
+			<scope>runtime</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-test</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-actuator</artifactId>
+		</dependency>
+		<dependency>
+	        <groupId>de.codecentric</groupId>
+	        <artifactId>spring-boot-admin-starter-client</artifactId>
+	        <version>3.3.0</version>
+    	</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-thymeleaf</artifactId>
+		</dependency>
+		<dependency>
+		    <groupId>org.springframework.boot</groupId>
+		    <artifactId>spring-boot-properties-migrator</artifactId>
+		    <scope>runtime</scope>
+		</dependency>
+		<dependency>
+		    <groupId>nz.net.ultraq.thymeleaf</groupId>
+		    <artifactId>thymeleaf-layout-dialect</artifactId>
+		</dependency>
+		<dependency>
+		    <groupId>org.thymeleaf.extras</groupId>
+		    <artifactId>thymeleaf-extras-springsecurity6</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-security</artifactId>
+		</dependency>
+		<dependency>
+		    <groupId>org.springframework.security</groupId>
+		    <artifactId>spring-security-ldap</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.postgresql</groupId>
+			<artifactId>postgresql</artifactId>
+			<scope>runtime</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-data-jpa</artifactId>
+		</dependency>
+		<dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-mail</artifactId>
+        </dependency>
+			
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-configuration-processor</artifactId>
+			<optional>true</optional>
+		</dependency>
+		
+		<dependency>
+		  <groupId>junit</groupId>
+		  <artifactId>junit</artifactId>
+		  <scope>test</scope>
+		</dependency>
+		
+		<dependency>
+		  <groupId>fr.opensagres.xdocreport</groupId>
+		  <artifactId>fr.opensagres.xdocreport.document.docx</artifactId>
+		  <version>2.0.0</version>
+		</dependency>
+				
+		<dependency>
+		  <groupId>fr.opensagres.xdocreport</groupId>
+		  <artifactId>fr.opensagres.xdocreport.template.velocity</artifactId>
+		  <version>2.0.0</version>
+		</dependency>	
+		
+		<dependency>
+		    <groupId>com.mysql</groupId>
+		    <artifactId>mysql-connector-j</artifactId>
+		</dependency>
+		
+		<dependency>
+			<groupId>org.jsoup</groupId>
+			<artifactId>jsoup</artifactId>
+			<version>1.15.3</version>
+		</dependency>
+				
+		<dependency>
+		    <groupId>org.apache.commons</groupId>
+		    <artifactId>commons-csv</artifactId>
+		    <version>1.11.0</version>
+		</dependency>
+		
+		<dependency>
+		    <groupId>org.apache.commons</groupId>
+		    <artifactId>commons-io</artifactId>
+		    <version>1.3.2</version>
+		</dependency>
+		
+		<dependency>
+		    <groupId>commons-io</groupId>
+		    <artifactId>commons-io</artifactId>
+		    <version>2.16.1</version>
+		</dependency>
+		<!-- 
+		<dependency>
+		    <groupId>org.jacoco</groupId> 
+		    <artifactId>jacoco-maven-plugin</artifactId>
+		    <version>0.8.12</version>
+		</dependency>
+	  	 -->
+	</dependencies>
+	
+
+	<build>
+		<finalName>uv_saic</finalName>
+		<plugins>
+			<plugin>
+				<groupId>org.springframework.boot</groupId>
+				<artifactId>spring-boot-maven-plugin</artifactId>
+				<configuration>
+					<parameters>true</parameters>
+				</configuration>
+			</plugin>
+			<!-- 
+			<plugin>
+			    <groupId>org.jacoco</groupId>
+			    <artifactId>jacoco-maven-plugin</artifactId>
+			    <version>0.8.12</version>
+			    <executions>
+			        <execution>
+			            <id>jacoco-initialize</id>
+			            <goals>
+			                <goal>prepare-agent</goal>
+			            </goals>
+			        </execution>
+			        <execution>
+			            <id>jacoco-site</id>
+			            <phase>package</phase>
+			            <goals>
+			                <goal>report</goal>
+			            </goals>
+			        </execution>
+			    </executions>
+			</plugin>
+			-->
+		</plugins>
+	</build>
+
+
+</project>

+ 109 - 0
reporte_config.md

@@ -0,0 +1,109 @@
+# 📁 Reporte de carpeta: `config`
+
+> Detalle de clases, métodos y comentarios extraídos automáticamente
+
+
+### 🧩 Clase: `ApplicationLocaleResolver` <a name='applicationlocaleresolver'></a>
+**Ubicación:** `src\main\java\es\uv\saic\config\ApplicationLocaleResolver.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `resolveLocale()` — ⚪ Interno
+- `setLocale()` — ⚪ Interno
+- `determineDefaultLocale()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `AuthSuccessHandler` <a name='authsuccesshandler'></a>
+**Ubicación:** `src\main\java\es\uv\saic\config\AuthSuccessHandler.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `onAuthenticationSuccess()` — ⚪ Interno
+```
+//360
+```
+- `if()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Globals` <a name='globals'></a>
+**Ubicación:** `src\main\java\es\uv\saic\config\Globals.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+//private String filePath = "/DATA/saic-data/files/";
+```
+- `getFilePath()` — ⚪ Interno
+- `getFileName()` — ⚪ Interno
+- `getCurrentYear()` — ⚪ Interno
+- `Date()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `SchedulerConfig` <a name='schedulerconfig'></a>
+**Ubicación:** `src\main\java\es\uv\saic\config\SchedulerConfig.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `configureTasks()` — ⚪ Interno
+- `ThreadPoolTaskScheduler()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `SecurityConfig` <a name='securityconfig'></a>
+**Ubicación:** `src\main\java\es\uv\saic\config\SecurityConfig.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `filterChain()` — ⚪ Interno
+- `AuthSuccessHandler()` — ⚪ Interno
+- `hasIpAddress()` — ⚪ Interno
+- `IpAddressMatcher()` — ⚪ Interno
+- `AuthorizationDecision()` — ⚪ Interno
+- `authenticationManager()` — ⚪ Interno
+- `sessionRegistry()` — ⚪ Interno
+- `SessionRegistryImpl()` — ⚪ Interno
+- `contextSource()` — ⚪ Interno
+- `DefaultSpringSecurityContextSource()` — ⚪ Interno
+- `passwordEncoder()` — ⚪ Interno
+- `BCryptPasswordEncoder()` — ⚪ Interno
+- `httpSessionEventPublisher()` — ⚪ Interno
+- `HttpSessionEventPublisher()` — ⚪ Interno
+- `concurrentSession()` — ⚪ Interno
+- `ConcurrentSessionControlAuthenticationStrategy()` — ⚪ Interno
+- `SessionFixationProtectionStrategy()` — ⚪ Interno
+- `RegisterSessionAuthenticationStrategy()` — ⚪ Interno
+- `CompositeSessionAuthenticationStrategy()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `WebConfig` <a name='webconfig'></a>
+**Ubicación:** `src\main\java\es\uv\saic\config\WebConfig.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `localeResolver()` — ⚪ Interno
+- `ApplicationLocaleResolver()` — ⚪ Interno
+- `localeChangeInterceptor()` — ⚪ Interno
+- `LocaleChangeInterceptor()` — ⚪ Interno
+- `addInterceptors()` — ⚪ Interno
+- `forwardedHeaderFilter()` — ⚪ Interno
+- `ForwardedHeaderFilter()` — ⚪ Interno
+
+---
+
+
+# 📈 Estadísticas finales
+
+- Total de clases: 6
+- Total de métodos: 37
+- Total de comentarios: 2
+
+✅ **Fin del reporte de carpeta.**

+ 1796 - 0
reporte_domain.md

@@ -0,0 +1,1796 @@
+# 📁 Reporte de carpeta: `domain`
+
+> Detalle de clases, métodos y comentarios extraídos automáticamente
+
+
+### 🧩 Clase: `Acreditacio` <a name='acreditacio'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Acreditacio.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Acreditacio()` — ⚪ Interno
+- `getTlugar()` — ⚪ Interno
+- `setTlugar()` — ⚪ Interno
+- `getLugar()` — ⚪ Interno
+- `setLugar()` — ⚪ Interno
+- `getCursImpla()` — ⚪ Interno
+- `setCursImpla()` — ⚪ Interno
+- `getDataVerif()` — ⚪ Interno
+- `setDataVerif()` — ⚪ Interno
+- `getDataRenov()` — ⚪ Interno
+- `setDataRenov()` — ⚪ Interno
+- `getDataAcred()` — ⚪ Interno
+- `setDataAcred()` — ⚪ Interno
+- `getDataSegui()` — ⚪ Interno
+- `setDataSegui()` — ⚪ Interno
+- `getGrup()` — ⚪ Interno
+- `setGrup()` — ⚪ Interno
+- `getGrupCurs()` — ⚪ Interno
+- `setGrupCurs()` — ⚪ Interno
+- `getInter()` — ⚪ Interno
+- `setInter()` — ⚪ Interno
+- `getGrupNum()` — ⚪ Interno
+- `setGrupNum()` — ⚪ Interno
+- `getRecom()` — ⚪ Interno
+- `setRecom()` — ⚪ Interno
+- `getSegui()` — ⚪ Interno
+- `setSegui()` — ⚪ Interno
+- `getSerialversionuid()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `AcreditacioPK` <a name='acreditaciopk'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\AcreditacioPK.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `AcreditacioPK()` — ⚪ Interno
+- `AcreditacioPK()` — ⚪ Interno
+- `getTlugar()` — ⚪ Interno
+- `setTlugar()` — ⚪ Interno
+- `getLugar()` — ⚪ Interno
+- `setLugar()` — ⚪ Interno
+- `hashCode()` — ⚪ Interno
+- `equals()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `AcreditacioTransfer` <a name='acreditaciotransfer'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\AcreditacioTransfer.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `AcreditacioTransfer()` — ⚪ Interno
+- `AcreditacioTransfer()` — ⚪ Interno
+- `getIdAcreditacio()` — ⚪ Interno
+- `setIdAcreditacio()` — ⚪ Interno
+- `getRuct()` — ⚪ Interno
+- `setRuct()` — ⚪ Interno
+- `getTambit()` — ⚪ Interno
+- `setTambit()` — ⚪ Interno
+- `getNomCas()` — ⚪ Interno
+- `setNomCas()` — ⚪ Interno
+- `getNomVal()` — ⚪ Interno
+- `setNomVal()` — ⚪ Interno
+- `getGrup()` — ⚪ Interno
+- `setGrup()` — ⚪ Interno
+- `getGrupNum()` — ⚪ Interno
+- `setGrupNum()` — ⚪ Interno
+- `getGrupCurs()` — ⚪ Interno
+- `setGrupCurs()` — ⚪ Interno
+- `getInter()` — ⚪ Interno
+- `setInter()` — ⚪ Interno
+- `getDataVerif()` — ⚪ Interno
+- `setDataVerif()` — ⚪ Interno
+- `getDataRenov()` — ⚪ Interno
+- `setDataRenov()` — ⚪ Interno
+- `getDataSegui()` — ⚪ Interno
+- `setDataSegui()` — ⚪ Interno
+- `getDataAcred()` — ⚪ Interno
+- `setDataAcred()` — ⚪ Interno
+- `getCursImpla()` — ⚪ Interno
+- `setCursImpla()` — ⚪ Interno
+- `getDataVerifStr()` — ⚪ Interno
+- `setDataVerifStr()` — ⚪ Interno
+- `getDataRenovStr()` — ⚪ Interno
+- `setDataRenovStr()` — ⚪ Interno
+- `getDataSeguiStr()` — ⚪ Interno
+- `setDataSeguiStr()` — ⚪ Interno
+- `getDataAcredStr()` — ⚪ Interno
+- `setDataAcredStr()` — ⚪ Interno
+- `getLugar()` — ⚪ Interno
+- `setLugar()` — ⚪ Interno
+- `getLugarCentre()` — ⚪ Interno
+- `setLugarCentre()` — ⚪ Interno
+- `getNomCentreCas()` — ⚪ Interno
+- `setNomCentreCas()` — ⚪ Interno
+- `getNomCentreVal()` — ⚪ Interno
+- `setNomCentreVal()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `AnyDimensioDTO` <a name='anydimensiodto'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\AnyDimensioDTO.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `AnyDimensioDTO()` — ⚪ Interno
+- `AnyDimensioDTO()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getChildren()` — ⚪ Interno
+- `setChildren()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Calendari` <a name='calendari'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Calendari.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Calendari()` — ⚪ Interno
+- `Calendari()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+- `Calendari()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+- `getIdCalendari()` — ⚪ Interno
+- `setIdCalendari()` — ⚪ Interno
+- `getTipus()` — ⚪ Interno
+- `setTipus()` — ⚪ Interno
+- `getTitolCas()` — ⚪ Interno
+- `setTitolCas()` — ⚪ Interno
+- `getTitolVal()` — ⚪ Interno
+- `setTitolVal()` — ⚪ Interno
+- `getAmbit()` — ⚪ Interno
+- `setAmbit()` — ⚪ Interno
+- `getData()` — ⚪ Interno
+- `setData()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+- `getDataStr()` — ⚪ Interno
+- `setDataStr()` — ⚪ Interno
+- `getIdProces()` — ⚪ Interno
+- `setIdProces()` — ⚪ Interno
+- `getTitulacions()` — ⚪ Interno
+- `setTitulacions()` — ⚪ Interno
+- `getCentres()` — ⚪ Interno
+- `setCentres()` — ⚪ Interno
+- `getColor()` — ⚪ Interno
+- `setColor()` — ⚪ Interno
+- `getStatus()` — ⚪ Interno
+- `setStatus()` — ⚪ Interno
+- `getSerialversionuid()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Categoria` <a name='categoria'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Categoria.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Categoria()` — ⚪ Interno
+- `Categoria()` — ⚪ Interno
+- `getIdCategoria()` — ⚪ Interno
+- `setIdCategoria()` — ⚪ Interno
+- `getTipus()` — ⚪ Interno
+- `setTipus()` — ⚪ Interno
+- `getNomVal()` — ⚪ Interno
+- `setNomVal()` — ⚪ Interno
+- `getNomCas()` — ⚪ Interno
+- `setNomCas()` — ⚪ Interno
+- `getPare()` — ⚪ Interno
+- `setPare()` — ⚪ Interno
+- `getOrdre()` — ⚪ Interno
+- `setOrdre()` — ⚪ Interno
+- `getTambit()` — ⚪ Interno
+- `setTambit()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `CategoriaDocumentDTO` <a name='categoriadocumentdto'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\CategoriaDocumentDTO.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `CategoriaDocumentDTO()` — ⚪ Interno
+- `CategoriaDocumentDTO()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getChildren()` — ⚪ Interno
+- `setChildren()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `CategoriaPareDTO` <a name='categoriaparedto'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\CategoriaPareDTO.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `CategoriaPareDTO()` — ⚪ Interno
+- `CategoriaPareDTO()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getChildren()` — ⚪ Interno
+- `setChildren()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Datasource` <a name='datasource'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Datasource.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Datasource()` — ⚪ Interno
+- `Datasource()` — ⚪ Interno
+- `getId()` — ⚪ Interno
+- `setId()` — ⚪ Interno
+- `getNom()` — ⚪ Interno
+- `setNom()` — ⚪ Interno
+- `getDriver()` — ⚪ Interno
+- `setDriver()` — ⚪ Interno
+- `getConn()` — ⚪ Interno
+- `setConn()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `DimensioInstanciesDTO` <a name='dimensioinstanciesdto'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\DimensioInstanciesDTO.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `DimensioInstanciesDTO()` — ⚪ Interno
+- `DimensioInstanciesDTO()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getChildren()` — ⚪ Interno
+- `setChildren()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Indicador` <a name='indicador'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Dimension.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Dimension()` — ⚪ Interno
+- `Dimension()` — ⚪ Interno
+- `getTitulacion()` — ⚪ Interno
+- `setTitulacion()` — ⚪ Interno
+- `getDimension()` — ⚪ Interno
+- `setDimension()` — ⚪ Interno
+- `getIndicadores()` — ⚪ Interno
+- `setIndicadores()` — ⚪ Interno
+- `add()` — ⚪ Interno
+- `get()` — ⚪ Interno
+- `isEmpty()` — ⚪ Interno
+- `set()` — ⚪ Interno
+- `size()` — ⚪ Interno
+- `newIndicador()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `getIndicador()` — ⚪ Interno
+- `setIndicador()` — ⚪ Interno
+- `getValores()` — ⚪ Interno
+- `add()` — ⚪ Interno
+- `isEmpty()` — ⚪ Interno
+- `size()` — ⚪ Interno
+- `addCursoValor()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `addSubindicador()` — ⚪ Interno
+- `getSubindicadores()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `getCurso()` — ⚪ Interno
+- `setCurso()` — ⚪ Interno
+- `getValor()` — ⚪ Interno
+- `setValor()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `CursoValor` <a name='cursovalor'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Dimension.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Dimension()` — ⚪ Interno
+- `Dimension()` — ⚪ Interno
+- `getTitulacion()` — ⚪ Interno
+- `setTitulacion()` — ⚪ Interno
+- `getDimension()` — ⚪ Interno
+- `setDimension()` — ⚪ Interno
+- `getIndicadores()` — ⚪ Interno
+- `setIndicadores()` — ⚪ Interno
+- `add()` — ⚪ Interno
+- `get()` — ⚪ Interno
+- `isEmpty()` — ⚪ Interno
+- `set()` — ⚪ Interno
+- `size()` — ⚪ Interno
+- `newIndicador()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `getIndicador()` — ⚪ Interno
+- `setIndicador()` — ⚪ Interno
+- `getValores()` — ⚪ Interno
+- `add()` — ⚪ Interno
+- `isEmpty()` — ⚪ Interno
+- `size()` — ⚪ Interno
+- `addCursoValor()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `addSubindicador()` — ⚪ Interno
+- `getSubindicadores()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `getCurso()` — ⚪ Interno
+- `setCurso()` — ⚪ Interno
+- `getValor()` — ⚪ Interno
+- `setValor()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Dimension` <a name='dimension'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Dimension.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Dimension()` — ⚪ Interno
+- `Dimension()` — ⚪ Interno
+- `getTitulacion()` — ⚪ Interno
+- `setTitulacion()` — ⚪ Interno
+- `getDimension()` — ⚪ Interno
+- `setDimension()` — ⚪ Interno
+- `getIndicadores()` — ⚪ Interno
+- `setIndicadores()` — ⚪ Interno
+- `add()` — ⚪ Interno
+- `get()` — ⚪ Interno
+- `isEmpty()` — ⚪ Interno
+- `set()` — ⚪ Interno
+- `size()` — ⚪ Interno
+- `newIndicador()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `getIndicador()` — ⚪ Interno
+- `setIndicador()` — ⚪ Interno
+- `getValores()` — ⚪ Interno
+- `add()` — ⚪ Interno
+- `isEmpty()` — ⚪ Interno
+- `size()` — ⚪ Interno
+- `addCursoValor()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `addSubindicador()` — ⚪ Interno
+- `getSubindicadores()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `getCurso()` — ⚪ Interno
+- `setCurso()` — ⚪ Interno
+- `getValor()` — ⚪ Interno
+- `setValor()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Document` <a name='document'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Document.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getIdDocument()` — ⚪ Interno
+- `setIdDocument()` — ⚪ Interno
+- `getCategoria()` — ⚪ Interno
+- `setCategoria()` — ⚪ Interno
+- `getOrgan()` — ⚪ Interno
+- `setOrgan()` — ⚪ Interno
+- `getNom()` — ⚪ Interno
+- `setNom()` — ⚪ Interno
+- `getRuta()` — ⚪ Interno
+- `setRuta()` — ⚪ Interno
+- `getData()` — ⚪ Interno
+- `setData()` — ⚪ Interno
+- `isVisible()` — ⚪ Interno
+- `setVisible()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `DocumentDTO` <a name='documentdto'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\DocumentDTO.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `DocumentDTO()` — ⚪ Interno
+- `DocumentDTO()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getRuta()` — ⚪ Interno
+- `setRuta()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `DocumentTemplate` <a name='documenttemplate'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\DocumentTemplate.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `DocumentTemplate()` — ⚪ Interno
+- `getCentre()` — ⚪ Interno
+- `getCurs()` — ⚪ Interno
+- `getLogo()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `DummyDataTransfer` <a name='dummydatatransfer'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\DummyDataTransfer.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getValue()` — ⚪ Interno
+- `setValue()` — ⚪ Interno
+- `getText2()` — ⚪ Interno
+- `setText2()` — ⚪ Interno
+- `getValue2()` — ⚪ Interno
+- `setValue2()` — ⚪ Interno
+- `getText3()` — ⚪ Interno
+- `setText3()` — ⚪ Interno
+- `getValue3()` — ⚪ Interno
+- `setValue3()` — ⚪ Interno
+- `equals()` — ⚪ Interno
+- `hashCode()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Email` <a name='email'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Email.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getUsusari()` — ⚪ Interno
+- `setUsusari()` — ⚪ Interno
+- `getInstanciaTasca()` — ⚪ Interno
+- `setInstanciaTasca()` — ⚪ Interno
+- `getTo()` — ⚪ Interno
+- `setTo()` — ⚪ Interno
+- `getSubject()` — ⚪ Interno
+- `setSubject()` — ⚪ Interno
+- `getBody()` — ⚪ Interno
+- `setBody()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `EvidenciaIndicadorEnquesta` <a name='evidenciaindicadorenquesta'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\EvidenciaIndicadorEnquesta.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `EvidenciaIndicadorEnquesta()` — ⚪ Interno
+- `getId()` — ⚪ Interno
+- `setId()` — ⚪ Interno
+- `getMedia()` — ⚪ Interno
+- `setMedia()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `EvidenciaIndicadorEnquestaPK` <a name='evidenciaindicadorenquestapk'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\EvidenciaIndicadorEnquestaPK.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `EvidenciaIndicadorEnquestaPK()` — ⚪ Interno
+- `getProces()` — ⚪ Interno
+- `setProces()` — ⚪ Interno
+- `getEvidencia()` — ⚪ Interno
+- `setEvidencia()` — ⚪ Interno
+- `getEnquesta()` — ⚪ Interno
+- `setEnquesta()` — ⚪ Interno
+- `getIndicador()` — ⚪ Interno
+- `setIndicador()` — ⚪ Interno
+- `getSerialversionuid()` — ⚪ Interno
+- `equals()` — ⚪ Interno
+- `hashCode()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `EvidenciaTransfer` <a name='evidenciatransfer'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\EvidenciaTransfer.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getEvidencia()` — ⚪ Interno
+- `setEvidencia()` — ⚪ Interno
+- `getCodiEvidencia()` — ⚪ Interno
+- `setCodiEvidencia()` — ⚪ Interno
+- `getData()` — ⚪ Interno
+- `setData()` — ⚪ Interno
+- `getNomProces()` — ⚪ Interno
+- `setNomProces()` — ⚪ Interno
+- `getIdTascai()` — ⚪ Interno
+- `setIdTascai()` — ⚪ Interno
+- `getNomEvidenciaCas()` — ⚪ Interno
+- `setNomEvidenciaCas()` — ⚪ Interno
+- `getNomEvidenciaVal()` — ⚪ Interno
+- `setNomEvidenciaVal()` — ⚪ Interno
+- `getCurs()` — ⚪ Interno
+- `setCurs()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Grafica` <a name='grafica'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Grafica.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Grafica()` — ⚪ Interno
+- `getIdGrafica()` — ⚪ Interno
+- `setIdGrafica()` — ⚪ Interno
+- `getDimensio()` — ⚪ Interno
+- `setDimensio()` — ⚪ Interno
+- `getEnquesta()` — ⚪ Interno
+- `setEnquesta()` — ⚪ Interno
+- `getIndicador()` — ⚪ Interno
+- `setIndicador()` — ⚪ Interno
+- `getG()` — ⚪ Interno
+- `setG()` — ⚪ Interno
+- `getNomCas()` — ⚪ Interno
+- `setNomCas()` — ⚪ Interno
+- `getNomVal()` — ⚪ Interno
+- `setNomVal()` — ⚪ Interno
+- `getUnitats()` — ⚪ Interno
+- `setUnitats()` — ⚪ Interno
+- `isNegar()` — ⚪ Interno
+- `setNegar()` — ⚪ Interno
+- `isLikert()` — ⚪ Interno
+- `setLikert()` — ⚪ Interno
+- `getOrdre()` — ⚪ Interno
+- `setOrdre()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `GraficaPK` <a name='graficapk'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\GraficaPK.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `GraficaPK()` — ⚪ Interno
+- `getIdGrafica()` — ⚪ Interno
+- `setIdGrafica()` — ⚪ Interno
+- `getEstudi()` — ⚪ Interno
+- `setEstudi()` — ⚪ Interno
+- `getAmbit()` — ⚪ Interno
+- `setAmbit()` — ⚪ Interno
+- `hashCode()` — ⚪ Interno
+- `equals()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Indicador` <a name='indicador'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Indicador.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Indicador()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `getDimension()` — ⚪ Interno
+- `setDimension()` — ⚪ Interno
+- `getIndicador()` — ⚪ Interno
+- `setIndicador()` — ⚪ Interno
+- `getValor()` — ⚪ Interno
+- `setValor()` — ⚪ Interno
+- `getAmbit()` — ⚪ Interno
+- `setAmbit()` — ⚪ Interno
+- `getValores()` — ⚪ Interno
+- `setValores()` — ⚪ Interno
+- `addCursoValor()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `obtenerValor()` — ⚪ Interno
+- `maxCursoValor()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `getPeriodo()` — ⚪ Interno
+- `setPeriodo()` — ⚪ Interno
+- `getCurso()` — ⚪ Interno
+- `setValor()` — ⚪ Interno
+- `getValor()` — ⚪ Interno
+- `setValor()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `CursoValor` <a name='cursovalor'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Indicador.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Indicador()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `getDimension()` — ⚪ Interno
+- `setDimension()` — ⚪ Interno
+- `getIndicador()` — ⚪ Interno
+- `setIndicador()` — ⚪ Interno
+- `getValor()` — ⚪ Interno
+- `setValor()` — ⚪ Interno
+- `getAmbit()` — ⚪ Interno
+- `setAmbit()` — ⚪ Interno
+- `getValores()` — ⚪ Interno
+- `setValores()` — ⚪ Interno
+- `addCursoValor()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `obtenerValor()` — ⚪ Interno
+- `maxCursoValor()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `getPeriodo()` — ⚪ Interno
+- `setPeriodo()` — ⚪ Interno
+- `getCurso()` — ⚪ Interno
+- `setValor()` — ⚪ Interno
+- `getValor()` — ⚪ Interno
+- `setValor()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `IndicadorEnquesta` <a name='indicadorenquesta'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\IndicadorEnquesta.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `IndicadorEnquesta()` — ⚪ Interno
+- `getId()` — ⚪ Interno
+- `setId()` — ⚪ Interno
+- `getTitulacio()` — ⚪ Interno
+- `setTitulacio()` — ⚪ Interno
+- `getCentre()` — ⚪ Interno
+- `setCentre()` — ⚪ Interno
+- `getCurs()` — ⚪ Interno
+- `setCurs()` — ⚪ Interno
+- `getEnquesta()` — ⚪ Interno
+- `setEnquesta()` — ⚪ Interno
+- `getIndicador()` — ⚪ Interno
+- `setIndicador()` — ⚪ Interno
+- `getValor()` — ⚪ Interno
+- `setValor()` — ⚪ Interno
+- `getNum()` — ⚪ Interno
+- `setNum()` — ⚪ Interno
+- `getAmbit()` — ⚪ Interno
+- `setAmbit()` — ⚪ Interno
+- `getTipus()` — ⚪ Interno
+- `setTipus()` — ⚪ Interno
+- `getEstudi()` — ⚪ Interno
+- `setEstudi()` — ⚪ Interno
+- `getCursd()` — ⚪ Interno
+- `setCursd()` — ⚪ Interno
+- `getCursEnquesta()` — ⚪ Interno
+- `setCursEnquesta()` — ⚪ Interno
+- `getCentreOrigen()` — ⚪ Interno
+- `setCentreOrigen()` — ⚪ Interno
+- `getTitulacioOrigen()` — ⚪ Interno
+- `setTitulacioOrigen()` — ⚪ Interno
+- `getNenq()` — ⚪ Interno
+- `setNenq()` — ⚪ Interno
+- `getRuct()` — ⚪ Interno
+- `setRuct()` — ⚪ Interno
+- `getData()` — ⚪ Interno
+- `setData()` — ⚪ Interno
+- `equals()` — ⚪ Interno
+- `hashCode()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `IndicadorEnquestaTmp` <a name='indicadorenquestatmp'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\IndicadorEnquestaTmp.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `IndicadorEnquestaTmp()` — ⚪ Interno
+- `getId()` — ⚪ Interno
+- `setId()` — ⚪ Interno
+- `getTitulacio()` — ⚪ Interno
+- `setTitulacio()` — ⚪ Interno
+- `getCentre()` — ⚪ Interno
+- `setCentre()` — ⚪ Interno
+- `getCurs()` — ⚪ Interno
+- `setCurs()` — ⚪ Interno
+- `getEnquesta()` — ⚪ Interno
+- `setEnquesta()` — ⚪ Interno
+- `getIndicador()` — ⚪ Interno
+- `setIndicador()` — ⚪ Interno
+- `getValor()` — ⚪ Interno
+- `setValor()` — ⚪ Interno
+- `getNum()` — ⚪ Interno
+- `setNum()` — ⚪ Interno
+- `getAmbit()` — ⚪ Interno
+- `setAmbit()` — ⚪ Interno
+- `getTipus()` — ⚪ Interno
+- `setTipus()` — ⚪ Interno
+- `getEstudi()` — ⚪ Interno
+- `setEstudi()` — ⚪ Interno
+- `getCursd()` — ⚪ Interno
+- `setCursd()` — ⚪ Interno
+- `getUsuari()` — ⚪ Interno
+- `setUsuari()` — ⚪ Interno
+- `getData()` — ⚪ Interno
+- `setData()` — ⚪ Interno
+- `getCursEnquesta()` — ⚪ Interno
+- `setCursEnquesta()` — ⚪ Interno
+- `getCentreOrigen()` — ⚪ Interno
+- `setCentreOrigen()` — ⚪ Interno
+- `getTitulacioOrigen()` — ⚪ Interno
+- `setTitulacioOrigen()` — ⚪ Interno
+- `getNenq()` — ⚪ Interno
+- `setNenq()` — ⚪ Interno
+- `getRuct()` — ⚪ Interno
+- `setRuct()` — ⚪ Interno
+- `equals()` — ⚪ Interno
+- `hashCode()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Informe` <a name='informe'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Informe.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Informe()` — ⚪ Interno
+- `getIdInforme()` — ⚪ Interno
+- `setIdInforme()` — ⚪ Interno
+- `getNom()` — ⚪ Interno
+- `setNom()` — ⚪ Interno
+- `getTitolCas()` — ⚪ Interno
+- `setTitolCas()` — ⚪ Interno
+- `getTitolVal()` — ⚪ Interno
+- `setTitolVal()` — ⚪ Interno
+- `getDescripcioCas()` — ⚪ Interno
+- `setDescripcioCas()` — ⚪ Interno
+- `getDescripcioVal()` — ⚪ Interno
+- `setDescripcioVal()` — ⚪ Interno
+- `isCombinat()` — ⚪ Interno
+- `setCombinat()` — ⚪ Interno
+- `getGrupWeb()` — ⚪ Interno
+- `setGrupWeb()` — ⚪ Interno
+- `getProcessos()` — ⚪ Interno
+- `setProcessos()` — ⚪ Interno
+- `getOrdre()` — ⚪ Interno
+- `setOrdre()` — ⚪ Interno
+- `getTambit()` — ⚪ Interno
+- `setTambit()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InformeProcesPK` <a name='informeprocespk'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\InformeProcesPK.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `InformeProcesPK()` — ⚪ Interno
+- `InformeProcesPK()` — ⚪ Interno
+- `getIdInforme()` — ⚪ Interno
+- `setIdInforme()` — ⚪ Interno
+- `getNomProces()` — ⚪ Interno
+- `setNomProces()` — ⚪ Interno
+- `equals()` — ⚪ Interno
+- `hashCode()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InformeProcessos` <a name='informeprocessos'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\InformeProcessos.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `InformeProcessos()` — ⚪ Interno
+- `getIdInforme()` — ⚪ Interno
+- `setIdInforme()` — ⚪ Interno
+- `getNomProces()` — ⚪ Interno
+- `setNomProces()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Instancia` <a name='instancia'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Instancia.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Instancia()` — ⚪ Interno
+- `getIdInstancia()` — ⚪ Interno
+- `setIdInstancia()` — ⚪ Interno
+- `getCentre()` — ⚪ Interno
+- `setCentre()` — ⚪ Interno
+- `getEstat()` — ⚪ Interno
+- `setEstat()` — ⚪ Interno
+- `getTitulacio()` — ⚪ Interno
+- `setTitulacio()` — ⚪ Interno
+- `getData()` — ⚪ Interno
+- `setData()` — ⚪ Interno
+- `getOrgan()` — ⚪ Interno
+- `setOrgan()` — ⚪ Interno
+- `getProces()` — ⚪ Interno
+- `setProces()` — ⚪ Interno
+- `getInstanciaTasca()` — ⚪ Interno
+- `setInstanciaTasca()` — ⚪ Interno
+- `addInstanciaTasca()` — ⚪ Interno
+- `removeInstanciaTasca()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InstanciaDTO` <a name='instanciadto'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\InstanciaDTO.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `InstanciaDTO()` — ⚪ Interno
+- `InstanciaDTO()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `getIdInstancia()` — ⚪ Interno
+- `setIdInstancia()` — ⚪ Interno
+- `getCentre()` — ⚪ Interno
+- `setCentre()` — ⚪ Interno
+- `getEstat()` — ⚪ Interno
+- `setEstat()` — ⚪ Interno
+- `getTitulacio()` — ⚪ Interno
+- `setTitulacio()` — ⚪ Interno
+- `getTlugar()` — ⚪ Interno
+- `setTlugar()` — ⚪ Interno
+- `getLugar()` — ⚪ Interno
+- `setLugar()` — ⚪ Interno
+- `getNomProces()` — ⚪ Interno
+- `setNomProces()` — ⚪ Interno
+- `getDescVal()` — ⚪ Interno
+- `setDescVal()` — ⚪ Interno
+- `getDescCas()` — ⚪ Interno
+- `setDescCas()` — ⚪ Interno
+- `getAmbit()` — ⚪ Interno
+- `setAmbit()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getIdInstanciaTasca()` — ⚪ Interno
+- `setIdInstanciaTasca()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InstanciaGanttDTO` <a name='instanciaganttdto'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\InstanciaGanttDTO.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `InstanciaGanttDTO()` — ⚪ Interno
+- `InstanciaGanttDTO()` — ⚪ Interno
+- `getId()` — ⚪ Interno
+- `setId()` — ⚪ Interno
+- `getName()` — ⚪ Interno
+- `setName()` — ⚪ Interno
+- `getStart()` — ⚪ Interno
+- `setStart()` — ⚪ Interno
+- `getEnd()` — ⚪ Interno
+- `setEnd()` — ⚪ Interno
+- `getProgress()` — ⚪ Interno
+- `setProgress()` — ⚪ Interno
+- `getCustom_class()` — ⚪ Interno
+- `setCustom_class()` — ⚪ Interno
+- `getDependencies()` — ⚪ Interno
+- `setDependencies()` — ⚪ Interno
+- `getType()` — ⚪ Interno
+- `setType()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `FROM` <a name='from'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\InstanciaRepository.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findAllIds()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `findOlders()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `findOlders()` — ⚪ Interno
+- `findByIdProces()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `findByOrganCursNom()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `findByCentreCursNom()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `MAX()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `MAX()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `EXTRACT()` — ⚪ Interno
+- `EXTRACT()` — ⚪ Interno
+- `findByOrganBetweenCurs()` — ⚪ Interno
+- `FROM()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `filterSupervisables()` — ⚪ Interno
+- `FROM()` — ⚪ Interno
+- `filterSupervisable()` — ⚪ Interno
+- `FROM()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `filterSupervisablesByEvidencies()` — ⚪ Interno
+- `AS()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `AS()` — ⚪ Interno
+- `instantiateT()` — ⚪ Interno
+- `AS()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `AS()` — ⚪ Interno
+- `instantiateC()` — ⚪ Interno
+- `AS()` — ⚪ Interno
+- `AS()` — ⚪ Interno
+- `instantiateU()` — ⚪ Interno
+- `AS()` — ⚪ Interno
+- `tasquesi()` — ⚪ Interno
+- `instantiateTasks()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `activateInstantiatedTask()` — ⚪ Interno
+- `deleteInstance()` — ⚪ Interno
+- `clearInstance()` — ⚪ Interno
+- `getId()` — ⚪ Interno
+- `getName()` — ⚪ Interno
+- `getTitCas()` — ⚪ Interno
+- `getTitVal()` — ⚪ Interno
+- `getStart()` — ⚪ Interno
+- `getEnd()` — ⚪ Interno
+- `getProgress()` — ⚪ Interno
+- `getCustom_class()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InstanciaTasca` <a name='instanciatasca'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\InstanciaTasca.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `InstanciaTasca()` — ⚪ Interno
+- `getIdInstanciaTasca()` — ⚪ Interno
+- `setIdInstanciaTasca()` — ⚪ Interno
+- `getDataFet()` — ⚪ Interno
+- `setDataFet()` — ⚪ Interno
+- `getData()` — ⚪ Interno
+- `setData()` — ⚪ Interno
+- `getDataMod()` — ⚪ Interno
+- `setDataMod()` — ⚪ Interno
+- `getVersion()` — ⚪ Interno
+- `setVersion()` — ⚪ Interno
+- `getEstat()` — ⚪ Interno
+- `setEstat()` — ⚪ Interno
+- `getEvidencia()` — ⚪ Interno
+- `setEvidencia()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getInstancia()` — ⚪ Interno
+- `setInstancia()` — ⚪ Interno
+- `getTasca()` — ⚪ Interno
+- `setTasca()` — ⚪ Interno
+- `getUsuari()` — ⚪ Interno
+- `setUsuari()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InstanciaTascaTransfer` <a name='instanciatascatransfer'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\InstanciaTascaTransfer.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getIdInstanciaTasca()` — ⚪ Interno
+- `setIdInstanciaTasca()` — ⚪ Interno
+- `getEstat()` — ⚪ Interno
+- `setEstat()` — ⚪ Interno
+- `getIdTascap()` — ⚪ Interno
+- `setIdTascap()` — ⚪ Interno
+- `getCentre()` — ⚪ Interno
+- `setCentre()` — ⚪ Interno
+- `getTitulacio()` — ⚪ Interno
+- `setTitulacio()` — ⚪ Interno
+- `getDataLim()` — ⚪ Interno
+- `setDataLim()` — ⚪ Interno
+- `getCodiEvidencia()` — ⚪ Interno
+- `setCodiEvidencia()` — ⚪ Interno
+- `getNomEvidenciaCas()` — ⚪ Interno
+- `setNomEvidenciaCas()` — ⚪ Interno
+- `getNomEvidenciaVal()` — ⚪ Interno
+- `setNomEvidenciaVal()` — ⚪ Interno
+- `getTitolCas()` — ⚪ Interno
+- `setTitolCas()` — ⚪ Interno
+- `getTitolVal()` — ⚪ Interno
+- `setTitolVal()` — ⚪ Interno
+- `getDescripcioCas()` — ⚪ Interno
+- `setDescripcioCas()` — ⚪ Interno
+- `getDescripcioVal()` — ⚪ Interno
+- `setDescripcioVal()` — ⚪ Interno
+- `getDataFet()` — ⚪ Interno
+- `setDataFet()` — ⚪ Interno
+- `getUsuariFet()` — ⚪ Interno
+- `setUsuariFet()` — ⚪ Interno
+- `getIsAssignedToUser()` — ⚪ Interno
+- `setAssignedToUser()` — ⚪ Interno
+- `getIsExpired()` — ⚪ Interno
+- `setIsExpired()` — ⚪ Interno
+- `getIdTasca()` — ⚪ Interno
+- `setIdTasca()` — ⚪ Interno
+- `getIdProces()` — ⚪ Interno
+- `setIdProces()` — ⚪ Interno
+- `getTipus()` — ⚪ Interno
+- `setTipus()` — ⚪ Interno
+- `getEvidencia()` — ⚪ Interno
+- `setEvidencia()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getOldEvidences()` — ⚪ Interno
+- `setOldEvidences()` — ⚪ Interno
+- `getDescripcioRolCas()` — ⚪ Interno
+- `setDescripcioRolCas()` — ⚪ Interno
+- `getDescripcioRolVal()` — ⚪ Interno
+- `setDescripcioRolVal()` — ⚪ Interno
+- `getVersions()` — ⚪ Interno
+- `setVersions()` — ⚪ Interno
+- `getEstatInstancia()` — ⚪ Interno
+- `setEstatInstancia()` — ⚪ Interno
+- `getOpcions()` — ⚪ Interno
+- `setOpcions()` — ⚪ Interno
+- `getDataMod()` — ⚪ Interno
+- `setDataMod()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InstanciaTascaVer` <a name='instanciatascaver'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\InstanciaTascaVer.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `InstanciaTascaVer()` — ⚪ Interno
+- `InstanciaTascaVer()` — ⚪ Interno
+- `getIdInstanciaTasca()` — ⚪ Interno
+- `setIdInstanciaTasca()` — ⚪ Interno
+- `getUsuari()` — ⚪ Interno
+- `setUsuari()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getDataMod()` — ⚪ Interno
+- `setDataMod()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InstanciaTascaVerPK` <a name='instanciatascaverpk'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\InstanciaTascaVerPK.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `InstanciaTascaVerPK()` — ⚪ Interno
+- `InstanciaTascaVerPK()` — ⚪ Interno
+- `getIdInstanciaTasca()` — ⚪ Interno
+- `setIdInstanciaTasca()` — ⚪ Interno
+- `getdataMod()` — ⚪ Interno
+- `setDataMod()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InstanciaTascaVersioTransfer` <a name='instanciatascaversiotransfer'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\InstanciaTascaVersioTransfer.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getIdInstanciaTasca()` — ⚪ Interno
+- `setIdInstanciaTasca()` — ⚪ Interno
+- `getUsuariFet()` — ⚪ Interno
+- `setUsuariFet()` — ⚪ Interno
+- `getDataFet()` — ⚪ Interno
+- `setDataFet()` — ⚪ Interno
+- `getVersio()` — ⚪ Interno
+- `setVersio()` — ⚪ Interno
+- `getNomEvidenciaVal()` — ⚪ Interno
+- `setNomEvidenciaVal()` — ⚪ Interno
+- `getNomEvidenciaCas()` — ⚪ Interno
+- `setNomEvidenciaCas()` — ⚪ Interno
+- `getCodiEvidencia()` — ⚪ Interno
+- `setCodiEvidencia()` — ⚪ Interno
+- `getEstat()` — ⚪ Interno
+- `setEstat()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InstanciaTransfer` <a name='instanciatransfer'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\InstanciaTransfer.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getIdInstancia()` — ⚪ Interno
+- `setIdInstancia()` — ⚪ Interno
+- `getIdProces()` — ⚪ Interno
+- `setIdProces()` — ⚪ Interno
+- `getNomProces()` — ⚪ Interno
+- `setNomProces()` — ⚪ Interno
+- `getTitolCas()` — ⚪ Interno
+- `setTitolCas()` — ⚪ Interno
+- `getTitolVal()` — ⚪ Interno
+- `setTitolVal()` — ⚪ Interno
+- `getDescripcioCas()` — ⚪ Interno
+- `setDescripcioCas()` — ⚪ Interno
+- `getDescripcioVal()` — ⚪ Interno
+- `setDescripcioVal()` — ⚪ Interno
+- `getCentreCas()` — ⚪ Interno
+- `setCentreCas()` — ⚪ Interno
+- `getCentreVal()` — ⚪ Interno
+- `setCentreVal()` — ⚪ Interno
+- `getTitulacioCas()` — ⚪ Interno
+- `setTitulacioCas()` — ⚪ Interno
+- `getTitulacioVal()` — ⚪ Interno
+- `setTitulacioVal()` — ⚪ Interno
+- `getRuct()` — ⚪ Interno
+- `setRuct()` — ⚪ Interno
+- `getEstat()` — ⚪ Interno
+- `setEstat()` — ⚪ Interno
+- `getCursAvaluat()` — ⚪ Interno
+- `setCursAvaluat()` — ⚪ Interno
+- `getCursActivacio()` — ⚪ Interno
+- `setCursActivacio()` — ⚪ Interno
+- `getNomTascaActivaCas()` — ⚪ Interno
+- `setNomTascaActivaCas()` — ⚪ Interno
+- `getDataTascaActiva()` — ⚪ Interno
+- `setDataTascaActiva()` — ⚪ Interno
+- `getDataLimTascaActiva()` — ⚪ Interno
+- `setDataLimTascaActiva()` — ⚪ Interno
+- `getNomTascaActivaVal()` — ⚪ Interno
+- `setNomTascaActivaVal()` — ⚪ Interno
+- `getDescTascaActivaCas()` — ⚪ Interno
+- `setDescTascaActivaCas()` — ⚪ Interno
+- `getDescTascaActivaVal()` — ⚪ Interno
+- `setDescTascaActivaVal()` — ⚪ Interno
+- `getIdTascapActiva()` — ⚪ Interno
+- `setIdTascapActiva()` — ⚪ Interno
+- `getTascaActivaExpired()` — ⚪ Interno
+- `setTascaActivaExpired()` — ⚪ Interno
+- `getTascaActivaAssignedToUser()` — ⚪ Interno
+- `setTascaActivaAssignedToUser()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Link` <a name='link'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Link.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Link()` — ⚪ Interno
+- `getId()` — ⚪ Interno
+- `setId()` — ⚪ Interno
+- `getRuct()` — ⚪ Interno
+- `setRuct()` — ⚪ Interno
+- `getToken()` — ⚪ Interno
+- `setToken()` — ⚪ Interno
+- `getLink()` — ⚪ Interno
+- `setLink()` — ⚪ Interno
+- `getData()` — ⚪ Interno
+- `setData()` — ⚪ Interno
+- `getDataExp()` — ⚪ Interno
+- `setDataExp()` — ⚪ Interno
+- `getVisites()` — ⚪ Interno
+- `setVisites()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Noticia` <a name='noticia'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Noticia.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Noticia()` — ⚪ Interno
+- `getIdNoticia()` — ⚪ Interno
+- `setIdNoticia()` — ⚪ Interno
+- `getTextoC()` — ⚪ Interno
+- `setTextoC()` — ⚪ Interno
+- `getTextoV()` — ⚪ Interno
+- `setTextoV()` — ⚪ Interno
+- `getTituloC()` — ⚪ Interno
+- `setTituloC()` — ⚪ Interno
+- `getTituloV()` — ⚪ Interno
+- `setTituloV()` — ⚪ Interno
+- `getVisible()` — ⚪ Interno
+- `setVisible()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Organ` <a name='organ'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Organ.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Organ()` — ⚪ Interno
+- `getId()` — ⚪ Interno
+- `setId()` — ⚪ Interno
+- `getActiu()` — ⚪ Interno
+- `setActiu()` — ⚪ Interno
+- `getNomCas()` — ⚪ Interno
+- `setNomCas()` — ⚪ Interno
+- `getNomVal()` — ⚪ Interno
+- `setNomVal()` — ⚪ Interno
+- `getRuct()` — ⚪ Interno
+- `setRuct()` — ⚪ Interno
+- `getTambit()` — ⚪ Interno
+- `setTambit()` — ⚪ Interno
+- `getOrgan()` — ⚪ Interno
+- `setOrgan()` — ⚪ Interno
+- `getOrgansFill()` — ⚪ Interno
+- `addOrganFill()` — ⚪ Interno
+- `removeOrganFill()` — ⚪ Interno
+- `setOrgansFill()` — ⚪ Interno
+- `getInstancies()` — ⚪ Interno
+- `setInstancies()` — ⚪ Interno
+- `addInstancia()` — ⚪ Interno
+- `removeInstancia()` — ⚪ Interno
+- `getUsuarisRols()` — ⚪ Interno
+- `setUsuarisRols()` — ⚪ Interno
+- `addUsuarisRol()` — ⚪ Interno
+- `removeUsuarisRol()` — ⚪ Interno
+- `getAcreditacio()` — ⚪ Interno
+- `setAcreditacio()` — ⚪ Interno
+- `getCodis()` — ⚪ Interno
+- `setCodis()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `OrganEquivalent` <a name='organequivalent'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\OrganEquivalent.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `OrganEquivalent()` — ⚪ Interno
+- `getTlugar()` — ⚪ Interno
+- `setTlugar()` — ⚪ Interno
+- `getLugar()` — ⚪ Interno
+- `setLugar()` — ⚪ Interno
+- `getTlugarEq()` — ⚪ Interno
+- `setTlugarEq()` — ⚪ Interno
+- `getLugarEq()` — ⚪ Interno
+- `setLugarEq()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `OrganEquivalentPK` <a name='organequivalentpk'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\OrganEquivalentPK.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `OrganEquivalentPK()` — ⚪ Interno
+- `getTlugar()` — ⚪ Interno
+- `setTlugar()` — ⚪ Interno
+- `getLugar()` — ⚪ Interno
+- `setLugar()` — ⚪ Interno
+- `getTlugarEq()` — ⚪ Interno
+- `setTlugarEq()` — ⚪ Interno
+- `getLugarEq()` — ⚪ Interno
+- `setLugarEq()` — ⚪ Interno
+- `hashCode()` — ⚪ Interno
+- `equals()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `OrganPK` <a name='organpk'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\OrganPK.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `OrganPK()` — ⚪ Interno
+- `getTlugar()` — ⚪ Interno
+- `setTlugar()` — ⚪ Interno
+- `getLugar()` — ⚪ Interno
+- `setLugar()` — ⚪ Interno
+- `equals()` — ⚪ Interno
+- `hashCode()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Plantilla` <a name='plantilla'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Plantilla.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getIdPlantilla()` — ⚪ Interno
+- `setIdPlantilla()` — ⚪ Interno
+- `getVersio()` — ⚪ Interno
+- `setVersio()` — ⚪ Interno
+- `getCodi()` — ⚪ Interno
+- `setCodi()` — ⚪ Interno
+- `getNomCas()` — ⚪ Interno
+- `setNomCas()` — ⚪ Interno
+- `getNomVal()` — ⚪ Interno
+- `setNomVal()` — ⚪ Interno
+- `getData_creacio()` — ⚪ Interno
+- `setData_creacio()` — ⚪ Interno
+- `getData_mod()` — ⚪ Interno
+- `setData_mod()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getAmbit()` — ⚪ Interno
+- `setAmbit()` — ⚪ Interno
+- `getSerialversionuid()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `PlantillaComentario` <a name='plantillacomentario'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\PlantillaComentario.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `PlantillaComentario()` — ⚪ Interno
+- `PlantillaComentario()` — ⚪ Interno
+- `getUid()` — ⚪ Interno
+- `setUid()` — ⚪ Interno
+- `getAuthor()` — ⚪ Interno
+- `setAuthor()` — ⚪ Interno
+- `getAuthorName()` — ⚪ Interno
+- `setAuthorName()` — ⚪ Interno
+- `getContent()` — ⚪ Interno
+- `setContent()` — ⚪ Interno
+- `getCreatedAt()` — ⚪ Interno
+- `setCreatedAt()` — ⚪ Interno
+- `getModifiedAt()` — ⚪ Interno
+- `setModifiedAt()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `PlantillaConversation` <a name='plantillaconversation'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\PlantillaConversation.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `PlantillaConversation()` — ⚪ Interno
+- `PlantillaConversation()` — ⚪ Interno
+- `getUid()` — ⚪ Interno
+- `setUid()` — ⚪ Interno
+- `getComments()` — ⚪ Interno
+- `setComments()` — ⚪ Interno
+- `add()` — ⚪ Interno
+- `addAll()` — ⚪ Interno
+- `addAll()` — ⚪ Interno
+- `clear()` — ⚪ Interno
+- `contains()` — ⚪ Interno
+- `get()` — ⚪ Interno
+- `remove()` — ⚪ Interno
+- `size()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Proces` <a name='proces'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Proces.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Proces()` — ⚪ Interno
+- `getIdProces()` — ⚪ Interno
+- `setIdProces()` — ⚪ Interno
+- `getAmbit()` — ⚪ Interno
+- `setAmbit()` — ⚪ Interno
+- `getCursActivacio()` — ⚪ Interno
+- `setCursActivacio()` — ⚪ Interno
+- `getCursAvaluat()` — ⚪ Interno
+- `setCursAvaluat()` — ⚪ Interno
+- `getDescripcioCas()` — ⚪ Interno
+- `setDescripcioCas()` — ⚪ Interno
+- `getDescripcioVal()` — ⚪ Interno
+- `setDescripcioVal()` — ⚪ Interno
+- `getNomProces()` — ⚪ Interno
+- `setNomProces()` — ⚪ Interno
+- `getTitolCas()` — ⚪ Interno
+- `setTitolCas()` — ⚪ Interno
+- `getTitolVal()` — ⚪ Interno
+- `setTitolVal()` — ⚪ Interno
+- `getComentaris()` — ⚪ Interno
+- `setComentaris()` — ⚪ Interno
+- `getVersio()` — ⚪ Interno
+- `setVersio()` — ⚪ Interno
+- `getSubTitol()` — ⚪ Interno
+- `setSubTitol()` — ⚪ Interno
+- `getInstancies()` — ⚪ Interno
+- `setInstancies()` — ⚪ Interno
+- `addInstancia()` — ⚪ Interno
+- `removeInstancia()` — ⚪ Interno
+- `getTasques()` — ⚪ Interno
+- `setTasques()` — ⚪ Interno
+- `addTasca()` — ⚪ Interno
+- `removeTasca()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Rol` <a name='rol'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Rol.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Rol()` — ⚪ Interno
+- `getIdRol()` — ⚪ Interno
+- `setIdRol()` — ⚪ Interno
+- `getAmbit()` — ⚪ Interno
+- `setAmbit()` — ⚪ Interno
+- `getDescripcioCas()` — ⚪ Interno
+- `setDescripcioCas()` — ⚪ Interno
+- `getDescripcioVal()` — ⚪ Interno
+- `setDescripcioVal()` — ⚪ Interno
+- `getNomRol()` — ⚪ Interno
+- `setNomRol()` — ⚪ Interno
+- `getTasques()` — ⚪ Interno
+- `setTasques()` — ⚪ Interno
+- `addTasque()` — ⚪ Interno
+- `removeTasque()` — ⚪ Interno
+- `getUsuarisRols()` — ⚪ Interno
+- `setUsuarisRols()` — ⚪ Interno
+- `addUsuarisRol()` — ⚪ Interno
+- `removeUsuarisRol()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `ScheduledTasks` <a name='scheduledtasks'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\ScheduledTasks.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `sendInstanceMails()` — ⚪ Interno
+- `sendReminderMails()` — ⚪ Interno
+- `Email()` — ⚪ Interno
+- `sendCalendarMails()` — ⚪ Interno
+- `closeExpiredTasks()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `SupervisionSearchParams` <a name='supervisionsearchparams'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\SupervisionSearchParams.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `SupervisionSearchParams()` — ⚪ Interno
+- `getCentres()` — ⚪ Interno
+- `setCentres()` — ⚪ Interno
+- `getCursos()` — ⚪ Interno
+- `setCursos()` — ⚪ Interno
+- `getTitulacions()` — ⚪ Interno
+- `setTitulacions()` — ⚪ Interno
+- `getProcediments()` — ⚪ Interno
+- `setProcediments()` — ⚪ Interno
+- `getEvidencies()` — ⚪ Interno
+- `setEvidencies()` — ⚪ Interno
+- `getSearchType()` — ⚪ Interno
+- `setSearchType()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `SysStatus` <a name='sysstatus'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\SysStatus.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getIdStatus()` — ⚪ Interno
+- `setIdStatus()` — ⚪ Interno
+- `getTimestamp()` — ⚪ Interno
+- `setTimestamp()` — ⚪ Interno
+- `getType()` — ⚪ Interno
+- `setType()` — ⚪ Interno
+- `getMsg()` — ⚪ Interno
+- `setMsg()` — ⚪ Interno
+- `getErr()` — ⚪ Interno
+- `setErr()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Tasca` <a name='tasca'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Tasca.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Tasca()` — ⚪ Interno
+- `getIdTasca()` — ⚪ Interno
+- `setIdTasca()` — ⚪ Interno
+- `getCodiEvidencia()` — ⚪ Interno
+- `setCodiEvidencia()` — ⚪ Interno
+- `getDataLim()` — ⚪ Interno
+- `setDataLim()` — ⚪ Interno
+- `getDescripcioCas()` — ⚪ Interno
+- `setDescripcioCas()` — ⚪ Interno
+- `getDescripcioVal()` — ⚪ Interno
+- `setDescripcioVal()` — ⚪ Interno
+- `getIdTascaSeg()` — ⚪ Interno
+- `setIdTascaSeg()` — ⚪ Interno
+- `getIdTascaSeg2()` — ⚪ Interno
+- `setIdTascaSeg2()` — ⚪ Interno
+- `getIdTascap()` — ⚪ Interno
+- `setIdTascap()` — ⚪ Interno
+- `getNomEvidenciaCas()` — ⚪ Interno
+- `setNomEvidenciaCas()` — ⚪ Interno
+- `getNomEvidenciaVal()` — ⚪ Interno
+- `setNomEvidenciaVal()` — ⚪ Interno
+- `getTitolCas()` — ⚪ Interno
+- `setTitolCas()` — ⚪ Interno
+- `getTitolVal()` — ⚪ Interno
+- `setTitolVal()` — ⚪ Interno
+- `getProces()` — ⚪ Interno
+- `setProces()` — ⚪ Interno
+- `getRol()` — ⚪ Interno
+- `setRol()` — ⚪ Interno
+- `getTipus()` — ⚪ Interno
+- `setTipus()` — ⚪ Interno
+- `getInstancies()` — ⚪ Interno
+- `setInstancies()` — ⚪ Interno
+- `addInstancia()` — ⚪ Interno
+- `removeInstancia()` — ⚪ Interno
+- `isExpired()` — ⚪ Interno
+- `Date()` — ⚪ Interno
+- `Date()` — ⚪ Interno
+- `setOpcions()` — ⚪ Interno
+- `getOpcions()` — ⚪ Interno
+- `setInforme()` — ⚪ Interno
+- `getInforme()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `TascaVersioTransfer` <a name='tascaversiotransfer'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\TascaVersioTransfer.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `TascaVersioTransfer()` — ⚪ Interno
+- `getIdInstanciaTasca()` — ⚪ Interno
+- `setIdInstanciaTasca()` — ⚪ Interno
+- `getUsuariFet()` — ⚪ Interno
+- `setUsuariFet()` — ⚪ Interno
+- `getDataFet()` — ⚪ Interno
+- `setDataFet()` — ⚪ Interno
+- `getVersion()` — ⚪ Interno
+- `setVersion()` — ⚪ Interno
+- `getNomEvidenciaVal()` — ⚪ Interno
+- `setNomEvidenciaVal()` — ⚪ Interno
+- `getNomEvidenciaCas()` — ⚪ Interno
+- `setNomEvidenciaCas()` — ⚪ Interno
+- `getCodiEvidencia()` — ⚪ Interno
+- `setCodiEvidencia()` — ⚪ Interno
+- `getEstat()` — ⚪ Interno
+- `setEstat()` — ⚪ Interno
+- `getTipus()` — ⚪ Interno
+- `setTipus()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Tipus` <a name='tipus'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Tipus.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Tipus()` — ⚪ Interno
+- `getTipus()` — ⚪ Interno
+- `setTipus()` — ⚪ Interno
+- `getDescripcio()` — ⚪ Interno
+- `setDescripcio()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `TreeDTOAny` <a name='treedtoany'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\TreeDTOAny.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `TreeDTOAny()` — ⚪ Interno
+- `TreeDTOAny()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getChildren()` — ⚪ Interno
+- `setChildren()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `TreeDTODimensio` <a name='treedtodimensio'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\TreeDTODimensio.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `TreeDTODimensio()` — ⚪ Interno
+- `TreeDTODimensio()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getChildren()` — ⚪ Interno
+- `setChildren()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `TreeDTOInstancia` <a name='treedtoinstancia'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\TreeDTOInstancia.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `TreeDTOInstancia()` — ⚪ Interno
+- `TreeDTOInstancia()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `getIdInstancia()` — ⚪ Interno
+- `setIdInstancia()` — ⚪ Interno
+- `getCentre()` — ⚪ Interno
+- `setCentre()` — ⚪ Interno
+- `getEstat()` — ⚪ Interno
+- `setEstat()` — ⚪ Interno
+- `getTitulacio()` — ⚪ Interno
+- `setTitulacio()` — ⚪ Interno
+- `getTlugar()` — ⚪ Interno
+- `setTlugar()` — ⚪ Interno
+- `getLugar()` — ⚪ Interno
+- `setLugar()` — ⚪ Interno
+- `getNomProces()` — ⚪ Interno
+- `setNomProces()` — ⚪ Interno
+- `getDescVal()` — ⚪ Interno
+- `setDescVal()` — ⚪ Interno
+- `getDescCas()` — ⚪ Interno
+- `setDescCas()` — ⚪ Interno
+- `getAmbit()` — ⚪ Interno
+- `setAmbit()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getIdInstanciaTasca()` — ⚪ Interno
+- `setIdInstanciaTasca()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `TreeDTOOrgan` <a name='treedtoorgan'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\TreeDTOOrgan.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `TreeDTOOrgan()` — ⚪ Interno
+- `TreeDTOOrgan()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getChildren()` — ⚪ Interno
+- `setChildren()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Usuari` <a name='usuari'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Usuari.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Usuari()` — ⚪ Interno
+- `getUsuari()` — ⚪ Interno
+- `setUsuari()` — ⚪ Interno
+- `getClau()` — ⚪ Interno
+- `setClau()` — ⚪ Interno
+- `getCognoms()` — ⚪ Interno
+- `setCognoms()` — ⚪ Interno
+- `getEmail()` — ⚪ Interno
+- `setEmail()` — ⚪ Interno
+- `getLdap()` — ⚪ Interno
+- `setLdap()` — ⚪ Interno
+- `getNom()` — ⚪ Interno
+- `setNom()` — ⚪ Interno
+- `getDataUltim()` — ⚪ Interno
+- `setDataUltim()` — ⚪ Interno
+- `getLocale()` — ⚪ Interno
+- `setLocale()` — ⚪ Interno
+- `getInstanciesTasques()` — ⚪ Interno
+- `setInstanciesTasques()` — ⚪ Interno
+- `addInstanciaTasca()` — ⚪ Interno
+- `removeInstanciaTasca()` — ⚪ Interno
+- `getUsuarisRols()` — ⚪ Interno
+- `setUsuariRols()` — ⚪ Interno
+- `addRol()` — ⚪ Interno
+- `removeRol()` — ⚪ Interno
+- `isGranted()` — ⚪ Interno
+- `setGranted()` — ⚪ Interno
+- `isAdmin()` — ⚪ Interno
+- `setAdmin()` — ⚪ Interno
+- `isDataTest()` — ⚪ Interno
+- `setDataTest()` — ⚪ Interno
+- `equals()` — ⚪ Interno
+- `hashCode()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `UsuarisRol` <a name='usuarisrol'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\UsuarisRol.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `UsuarisRol()` — ⚪ Interno
+- `getIdUsuariRol()` — ⚪ Interno
+- `setIdUsuariRol()` — ⚪ Interno
+- `getFin()` — ⚪ Interno
+- `setFin()` — ⚪ Interno
+- `getInici()` — ⚪ Interno
+- `setInici()` — ⚪ Interno
+- `getNum()` — ⚪ Interno
+- `setNum()` — ⚪ Interno
+- `getSupervisor()` — ⚪ Interno
+- `setSupervisor()` — ⚪ Interno
+- `getVigent()` — ⚪ Interno
+- `setVigent()` — ⚪ Interno
+- `getOrgan()` — ⚪ Interno
+- `setOrgan()` — ⚪ Interno
+- `getRol()` — ⚪ Interno
+- `setRol()` — ⚪ Interno
+- `getUsuari()` — ⚪ Interno
+- `setUsuari()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Wiki` <a name='wiki'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Wiki.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Wiki()` — ⚪ Interno
+- `getIdWiki()` — ⚪ Interno
+- `setIdWiki()` — ⚪ Interno
+- `getData()` — ⚪ Interno
+- `setData()` — ⚪ Interno
+- `getDataMod()` — ⚪ Interno
+- `setDataMod()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getCategoria()` — ⚪ Interno
+- `setCategoria()` — ⚪ Interno
+
+---
+
+
+# 📈 Estadísticas finales
+
+- Total de clases: 64
+- Total de métodos: 1118
+- Total de comentarios: 0
+
+✅ **Fin del reporte de carpeta.**

+ 143 - 0
reporte_general.md

@@ -0,0 +1,143 @@
+# 🧾 Reporte General de Clases Java
+
+> Control de revisión y estructura por carpetas
+
+
+## 📂 Carpeta: `config`
+
+- [`ApplicationLocaleResolver`](reporte_config.md#-clase-applicationlocaleresolver-) — ⚠️ *Pendiente*
+- [`AuthSuccessHandler`](reporte_config.md#-clase-authsuccesshandler-) — ⚠️ *Pendiente*
+- [`Globals`](reporte_config.md#-clase-globals-) — ⚠️ *Pendiente*
+- [`SchedulerConfig`](reporte_config.md#-clase-schedulerconfig-) — ⚠️ *Pendiente*
+- [`SecurityConfig`](reporte_config.md#-clase-securityconfig-) — ⚠️ *Pendiente*
+- [`WebConfig`](reporte_config.md#-clase-webconfig-) — ⚠️ *Pendiente*
+
+## 📂 Carpeta: `domain`
+
+- [`Acreditacio`](reporte_domain.md#-clase-acreditacio-) — ⚠️ *Pendiente*
+- [`AcreditacioPK`](reporte_domain.md#-clase-acreditaciopk-) — ⚠️ *Pendiente*
+- [`AcreditacioTransfer`](reporte_domain.md#-clase-acreditaciotransfer-) — ⚠️ *Pendiente*
+- [`AnyDimensioDTO`](reporte_domain.md#-clase-anydimensiodto-) — ⚠️ *Pendiente*
+- [`Calendari`](reporte_domain.md#-clase-calendari-) — ⚠️ *Pendiente*
+- [`Categoria`](reporte_domain.md#-clase-categoria-) — ⚠️ *Pendiente*
+- [`CategoriaDocumentDTO`](reporte_domain.md#-clase-categoriadocumentdto-) — ⚠️ *Pendiente*
+- [`CategoriaPareDTO`](reporte_domain.md#-clase-categoriaparedto-) — ⚠️ *Pendiente*
+- [`Datasource`](reporte_domain.md#-clase-datasource-) — ⚠️ *Pendiente*
+- [`DimensioInstanciesDTO`](reporte_domain.md#-clase-dimensioinstanciesdto-) — ⚠️ *Pendiente*
+- [`Indicador`](reporte_domain.md#-clase-indicador-) — ⚠️ *Pendiente*
+- [`CursoValor`](reporte_domain.md#-clase-cursovalor-) — ⚠️ *Pendiente*
+- [`Dimension`](reporte_domain.md#-clase-dimension-) — ⚠️ *Pendiente*
+- [`Document`](reporte_domain.md#-clase-document-) — ⚠️ *Pendiente*
+- [`DocumentDTO`](reporte_domain.md#-clase-documentdto-) — ⚠️ *Pendiente*
+- [`DocumentTemplate`](reporte_domain.md#-clase-documenttemplate-) — ⚠️ *Pendiente*
+- [`DummyDataTransfer`](reporte_domain.md#-clase-dummydatatransfer-) — ⚠️ *Pendiente*
+- [`Email`](reporte_domain.md#-clase-email-) — ⚠️ *Pendiente*
+- [`EvidenciaIndicadorEnquesta`](reporte_domain.md#-clase-evidenciaindicadorenquesta-) — ⚠️ *Pendiente*
+- [`EvidenciaIndicadorEnquestaPK`](reporte_domain.md#-clase-evidenciaindicadorenquestapk-) — ⚠️ *Pendiente*
+- [`EvidenciaTransfer`](reporte_domain.md#-clase-evidenciatransfer-) — ⚠️ *Pendiente*
+- [`Grafica`](reporte_domain.md#-clase-grafica-) — ⚠️ *Pendiente*
+- [`GraficaPK`](reporte_domain.md#-clase-graficapk-) — ⚠️ *Pendiente*
+- [`Indicador`](reporte_domain.md#-clase-indicador-) — ⚠️ *Pendiente*
+- [`CursoValor`](reporte_domain.md#-clase-cursovalor-) — ⚠️ *Pendiente*
+- [`IndicadorEnquesta`](reporte_domain.md#-clase-indicadorenquesta-) — ⚠️ *Pendiente*
+- [`IndicadorEnquestaTmp`](reporte_domain.md#-clase-indicadorenquestatmp-) — ⚠️ *Pendiente*
+- [`Informe`](reporte_domain.md#-clase-informe-) — ⚠️ *Pendiente*
+- [`InformeProcesPK`](reporte_domain.md#-clase-informeprocespk-) — ⚠️ *Pendiente*
+- [`InformeProcessos`](reporte_domain.md#-clase-informeprocessos-) — ⚠️ *Pendiente*
+- [`Instancia`](reporte_domain.md#-clase-instancia-) — ⚠️ *Pendiente*
+- [`InstanciaDTO`](reporte_domain.md#-clase-instanciadto-) — ⚠️ *Pendiente*
+- [`InstanciaGanttDTO`](reporte_domain.md#-clase-instanciaganttdto-) — ⚠️ *Pendiente*
+- [`FROM`](reporte_domain.md#-clase-from-) — ⚠️ *Pendiente*
+- [`InstanciaTasca`](reporte_domain.md#-clase-instanciatasca-) — ⚠️ *Pendiente*
+- [`InstanciaTascaTransfer`](reporte_domain.md#-clase-instanciatascatransfer-) — ⚠️ *Pendiente*
+- [`InstanciaTascaVer`](reporte_domain.md#-clase-instanciatascaver-) — ⚠️ *Pendiente*
+- [`InstanciaTascaVerPK`](reporte_domain.md#-clase-instanciatascaverpk-) — ⚠️ *Pendiente*
+- [`InstanciaTascaVersioTransfer`](reporte_domain.md#-clase-instanciatascaversiotransfer-) — ⚠️ *Pendiente*
+- [`InstanciaTransfer`](reporte_domain.md#-clase-instanciatransfer-) — ⚠️ *Pendiente*
+- [`Link`](reporte_domain.md#-clase-link-) — ⚠️ *Pendiente*
+- [`Noticia`](reporte_domain.md#-clase-noticia-) — ⚠️ *Pendiente*
+- [`Organ`](reporte_domain.md#-clase-organ-) — ⚠️ *Pendiente*
+- [`OrganEquivalent`](reporte_domain.md#-clase-organequivalent-) — ⚠️ *Pendiente*
+- [`OrganEquivalentPK`](reporte_domain.md#-clase-organequivalentpk-) — ⚠️ *Pendiente*
+- [`OrganPK`](reporte_domain.md#-clase-organpk-) — ⚠️ *Pendiente*
+- [`Plantilla`](reporte_domain.md#-clase-plantilla-) — ⚠️ *Pendiente*
+- [`PlantillaComentario`](reporte_domain.md#-clase-plantillacomentario-) — ⚠️ *Pendiente*
+- [`PlantillaConversation`](reporte_domain.md#-clase-plantillaconversation-) — ⚠️ *Pendiente*
+- [`Proces`](reporte_domain.md#-clase-proces-) — ⚠️ *Pendiente*
+- [`Rol`](reporte_domain.md#-clase-rol-) — ⚠️ *Pendiente*
+- [`ScheduledTasks`](reporte_domain.md#-clase-scheduledtasks-) — ⚠️ *Pendiente*
+- [`SupervisionSearchParams`](reporte_domain.md#-clase-supervisionsearchparams-) — ⚠️ *Pendiente*
+- [`SysStatus`](reporte_domain.md#-clase-sysstatus-) — ⚠️ *Pendiente*
+- [`Tasca`](reporte_domain.md#-clase-tasca-) — ⚠️ *Pendiente*
+- [`TascaVersioTransfer`](reporte_domain.md#-clase-tascaversiotransfer-) — ⚠️ *Pendiente*
+- [`Tipus`](reporte_domain.md#-clase-tipus-) — ⚠️ *Pendiente*
+- [`TreeDTOAny`](reporte_domain.md#-clase-treedtoany-) — ⚠️ *Pendiente*
+- [`TreeDTODimensio`](reporte_domain.md#-clase-treedtodimensio-) — ⚠️ *Pendiente*
+- [`TreeDTOInstancia`](reporte_domain.md#-clase-treedtoinstancia-) — ⚠️ *Pendiente*
+- [`TreeDTOOrgan`](reporte_domain.md#-clase-treedtoorgan-) — ⚠️ *Pendiente*
+- [`Usuari`](reporte_domain.md#-clase-usuari-) — ⚠️ *Pendiente*
+- [`UsuarisRol`](reporte_domain.md#-clase-usuarisrol-) — ⚠️ *Pendiente*
+- [`Wiki`](reporte_domain.md#-clase-wiki-) — ⚠️ *Pendiente*
+
+## 📂 Carpeta: `service`
+
+- [`AcreditacioService`](reporte_service.md#-clase-acreditacioservice-) — ⚠️ *Pendiente*
+- [`AuthProvider`](reporte_service.md#-clase-authprovider-) — ⚠️ *Pendiente*
+- [`CalendariService`](reporte_service.md#-clase-calendariservice-) — ⚠️ *Pendiente*
+- [`CategoriaService`](reporte_service.md#-clase-categoriaservice-) — ⚠️ *Pendiente*
+- [`DataService`](reporte_service.md#-clase-dataservice-) — ⚠️ *Pendiente*
+- [`DatasourceService`](reporte_service.md#-clase-datasourceservice-) — ⚠️ *Pendiente*
+- [`DocumentService`](reporte_service.md#-clase-documentservice-) — ⚠️ *Pendiente*
+- [`EmailService`](reporte_service.md#-clase-emailservice-) — ⚠️ *Pendiente*
+- [`EvidenciaIndicadorEnquestaService`](reporte_service.md#-clase-evidenciaindicadorenquestaservice-) — ⚠️ *Pendiente*
+- [`GraficaService`](reporte_service.md#-clase-graficaservice-) — ⚠️ *Pendiente*
+- [`IndicadorEnquestaService`](reporte_service.md#-clase-indicadorenquestaservice-) — ⚠️ *Pendiente*
+- [`IndicadorEnquestaTmpService`](reporte_service.md#-clase-indicadorenquestatmpservice-) — ⚠️ *Pendiente*
+- [`IndicadorService`](reporte_service.md#-clase-indicadorservice-) — ⚠️ *Pendiente*
+- [`InformeService`](reporte_service.md#-clase-informeservice-) — ⚠️ *Pendiente*
+- [`InstanciaService`](reporte_service.md#-clase-instanciaservice-) — ⚠️ *Pendiente*
+- [`InstanciaTascaService`](reporte_service.md#-clase-instanciatascaservice-) — ⚠️ *Pendiente*
+- [`InstanciaTascaVerService`](reporte_service.md#-clase-instanciatascaverservice-) — ⚠️ *Pendiente*
+- [`LinkService`](reporte_service.md#-clase-linkservice-) — ⚠️ *Pendiente*
+- [`NoticiaService`](reporte_service.md#-clase-noticiaservice-) — ⚠️ *Pendiente*
+- [`OrganService`](reporte_service.md#-clase-organservice-) — ⚠️ *Pendiente*
+- [`ParserService`](reporte_service.md#-clase-parserservice-) — ⚠️ *Pendiente*
+- [`PlantillaService`](reporte_service.md#-clase-plantillaservice-) — ⚠️ *Pendiente*
+- [`ProcesService`](reporte_service.md#-clase-processervice-) — ⚠️ *Pendiente*
+- [`RolService`](reporte_service.md#-clase-rolservice-) — ⚠️ *Pendiente*
+- [`SysStatusService`](reporte_service.md#-clase-sysstatusservice-) — ⚠️ *Pendiente*
+- [`TascaService`](reporte_service.md#-clase-tascaservice-) — ⚠️ *Pendiente*
+- [`TipusService`](reporte_service.md#-clase-tipusservice-) — ⚠️ *Pendiente*
+- [`UsuariService`](reporte_service.md#-clase-usuariservice-) — ⚠️ *Pendiente*
+- [`UsuarisRolService`](reporte_service.md#-clase-usuarisrolservice-) — ⚠️ *Pendiente*
+- [`WikiService`](reporte_service.md#-clase-wikiservice-) — ⚠️ *Pendiente*
+
+## 📂 Carpeta: `web`
+
+- [`AdminController`](reporte_web.md#-clase-admincontroller-) — ⚠️ *Pendiente*
+- [`AjaxController`](reporte_web.md#-clase-ajaxcontroller-) — ⚠️ *Pendiente*
+- [`DashboardController`](reporte_web.md#-clase-dashboardcontroller-) — ⚠️ *Pendiente*
+- [`DataController`](reporte_web.md#-clase-datacontroller-) — ⚠️ *Pendiente*
+- [`DownloadController`](reporte_web.md#-clase-downloadcontroller-) — ⚠️ *Pendiente*
+- [`ExportController`](reporte_web.md#-clase-exportcontroller-) — ⚠️ *Pendiente*
+- [`IndexController`](reporte_web.md#-clase-indexcontroller-) — ⚠️ *Pendiente*
+- [`KeepAliveController`](reporte_web.md#-clase-keepalivecontroller-) — ⚠️ *Pendiente*
+- [`LoginController`](reporte_web.md#-clase-logincontroller-) — ⚠️ *Pendiente*
+- [`ManagersController`](reporte_web.md#-clase-managerscontroller-) — ⚠️ *Pendiente*
+- [`ParseController`](reporte_web.md#-clase-parsecontroller-) — ⚠️ *Pendiente*
+- [`ProceduresController`](reporte_web.md#-clase-procedurescontroller-) — ⚠️ *Pendiente*
+- [`ActiveSession`](reporte_web.md#-clase-activesession-) — ⚠️ *Pendiente*
+- [`PendingEmail`](reporte_web.md#-clase-pendingemail-) — ⚠️ *Pendiente*
+- [`StatsController`](reporte_web.md#-clase-statscontroller-) — ⚠️ *Pendiente*
+- [`SupervisionController`](reporte_web.md#-clase-supervisioncontroller-) — ⚠️ *Pendiente*
+- [`TestController`](reporte_web.md#-clase-testcontroller-) — ⚠️ *Pendiente*
+- [`WikiController`](reporte_web.md#-clase-wikicontroller-) — ⚠️ *Pendiente*
+
+# 📊 Resumen General
+
+- `config`: 6 clases, 37 métodos, 2 comentarios
+- `domain`: 64 clases, 1118 métodos, 0 comentarios
+- `service`: 30 clases, 438 métodos, 8 comentarios
+- `web`: 18 clases, 347 métodos, 112 comentarios
+
+**Total general:** 118 clases | 1940 métodos | 122 comentarios detectados**

+ 1420 - 0
reporte_service.md

@@ -0,0 +1,1420 @@
+# 📁 Reporte de carpeta: `service`
+
+> Detalle de clases, métodos y comentarios extraídos automáticamente
+
+
+### 🧩 Clase: `AcreditacioService` <a name='acreditacioservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\AcreditacioService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getById()` — ⚪ Interno
+- `AcreditacioPK()` — ⚪ Interno
+- `getAll()` — ⚪ Interno
+- `getNextsCurrentYear()` — ⚪ Interno
+- `getByCursGrup()` — ⚪ Interno
+- `getByCursGrupTambit()` — ⚪ Interno
+- `getByCurs()` — ⚪ Interno
+- `getByOrgan()` — ⚪ Interno
+- `getByCentre()` — ⚪ Interno
+- `save()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `AuthProvider` <a name='authprovider'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\AuthProvider.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `authenticate()` — ⚪ Interno
+- `SimpleGrantedAuthority()` — ⚪ Interno
+- `SimpleGrantedAuthority()` — ⚪ Interno
+- `SimpleGrantedAuthority()` — ⚪ Interno
+- `SimpleGrantedAuthority()` — ⚪ Interno
+- `UsernamePasswordAuthenticationToken()` — ⚪ Interno
+- `BadCredentialsException()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `InitialDirContext()` — ⚪ Interno
+- `SearchControls()` — ⚪ Interno
+- `BadCredentialsException()` — ⚪ Interno
+- `BadCredentialsException()` — ⚪ Interno
+- `BadCredentialsException()` — ⚪ Interno
+- `Date()` — ⚪ Interno
+- `SimpleGrantedAuthority()` — ⚪ Interno
+- `SimpleGrantedAuthority()` — ⚪ Interno
+- `SimpleGrantedAuthority()` — ⚪ Interno
+- `UsernamePasswordAuthenticationToken()` — ⚪ Interno
+- `AuthenticationServiceException()` — ⚪ Interno
+- `BadCredentialsException()` — ⚪ Interno
+- `supports()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `CalendariService` <a name='calendariservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\CalendariService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getAll()` — ⚪ Interno
+- `findById()` — ⚪ Interno
+- `getNextEvents()` — ⚪ Interno
+- `save()` — ⚪ Interno
+- `delete()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `CategoriaService` <a name='categoriaservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\CategoriaService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getAll()` — ⚪ Interno
+- `findById()` — ⚪ Interno
+- `findFirstLevel()` — ⚪ Interno
+- `findFirstLevelAndU()` — ⚪ Interno
+- `findByTipusTambit()` — ⚪ Interno
+- `findByTipusTambitAndU()` — ⚪ Interno
+- `findByPareTambit()` — ⚪ Interno
+- `findByPareTambitAndU()` — ⚪ Interno
+- `save()` — ⚪ Interno
+- `delete()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `DataService` <a name='dataservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\DataService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `DataService()` — ⚪ Interno
+- `doImport()` — ⚪ Interno
+- `StringBuilder()` — ⚪ Interno
+```
+/*  1) Comprobar columnas obligatorias  */
+List<String> mandatoryColumns = new ArrayList<String>();
+List<String> knownColumns = new ArrayList<String>();
+if(clau.equals("ruct")) {
+this.setColumnsRuct(ambit, knownColumns, mandatoryColumns);
+}
+else {
+this.setColumnsCod(ambit, knownColumns, mandatoryColumns);
+}
+
+if(!this.checkColumns(header, mandatoryColumns, errors, locale)) {
+return errors.append("[ERROR] " + (locale.equals("es") ? "Se han encontrado errores en el fichero proporcionado. No se ha importado ningún registro. " : "S'han trobat errors al fitxer proporcionat. No s'ha importat cap registre.")).append("<br>").toString();
+}
+
+/*  2) Eliminar las columnas obligatorias, conocidas e ignoradas. El resto se consideran indicadores a importar */
+knownColumns.addAll(mandatoryColumns);
+knownColumns.addAll(ignoredColumns);
+for(String c : knownColumns) {
+headerInds.removeIf(v->v.equalsIgnoreCase(c));
+}
+
+/*  3) Comprobar valores y tipos  */
+if(!this.checkValues(records, ambit, clau, errors, locale)) {
+return errors.append(("[ERROR] " + (locale.equals("es") ? "Se han encontrado errores en el fichero proporcionado. No se ha importado ningún registro. " : "S'han trobat errors al fitxer proporcionat. No s'ha importat cap registre."))).append("<br>").toString();
+}
+
+/*  4) Importar datos  */
+Integer numRecords = 0;
+Integer numTuples = 0;
+for (CSVRecord record : records) {
+Map<String, String> recordMap = new LinkedCaseInsensitiveMap<>();
+recordMap.putAll(record.toMap());
+String c = ambit.equals("T") || ambit.equals("C") ? translateCentre(recordMap.get("centre")) : null;
+String t = ambit.equals("T") ? translateTitulacio(recordMap.get("titulacio")) : null;  
+String type = recordMap.get("tipus");
+Integer curs = Integer.parseInt(recordMap.get("curs").replaceAll("\\D+",""));
+
+String cursEnquesta = recordMap.containsKey("curs_enquesta") ? recordMap.get("curs_enquesta") : null;
+    String titulacioOrigen = recordMap.containsKey("titulacio_origen") ? recordMap.get("titulacio_origen") : null;
+    String centreOrigen = recordMap.containsKey("centre_origen") ? recordMap.get("centre_origen") : null;
+    Integer nenq = recordMap.containsKey("nenq") ? Integer.parseInt(recordMap.get("nenq").replaceAll("\\D+","")) : null;
+    String ructStr = recordMap.containsKey("ruct") ? recordMap.get("ruct").replaceAll("\\D+","") : null;
+String cursd = recordMap.containsKey("cursd") ? recordMap.get("cursd") : null;
+    Integer ruct = null;
+    
+    if(ructStr != null) {
+    if(!(ructStr.isBlank() || ructStr.isEmpty() || ructStr.equals("NULL") || ructStr.equals("null"))) {
+    ruct = Integer.parseInt(ructStr);
+}
+    }
+
+Integer centre;
+    Integer titulacio;
+if(clau.equals("ruct") && ambit.equals("T") && ruct != null) {
+Organ o = this.orgs.findByRuct(ruct);
+if(o == null) {
+errors.append("[WARNING] " + (locale.equals("es") ? "No se ha encontrado el RUCT "+ructStr+", se omiten los registros de esta entrada." : "No s'ha trobat el RUCT "+ructStr+", s'ometen els registres d'aquesta entrada.")).append("<br>").toString();
+continue;
+}
+titulacio = o.getId().getLugar();
+centre = o.getOrgan().getId().getLugar();
+}
+else{
+centre = ambit.equals("T") || ambit.equals("C") ? Integer.parseInt(c.replaceAll("\\D+","")) : null;
+    titulacio = ambit.equals("T") ? Integer.parseInt(t) : null;
+if(!this.orgs.exists("T", titulacio)){
+errors.append("[WARNING] " + (locale.equals("es") ? "No se ha encontrado la titulación con código "+titulacio+" pero se importa igualmente." : "No s'ha trobat la titulació amb codi "+titulacio+" però s'importa igualment")).append("<br>").toString();
+}
+}
+    
+    if(header.contains("cursd")) {
+    cursd = recordMap.get("cursd").replaceAll("\\D+","");
+    }
+for(String r : headerInds) {
+IndicadorEnquestaTmp ie = new IndicadorEnquestaTmp();
+        ie.setEnquesta(enquesta);
+    ie.setTitulacio(titulacio);
+    ie.setCentre(centre);
+    ie.setCurs(curs);
+    ie.setAmbit(ambit); 
+    ie.setEstudi(estudi);
+        ie.setIndicador(r.replace("_min", "").replace("_max", "").toLowerCase());
+        ie.setNum(null);
+        ie.setCursd(cursd);
+        ie.setTipus(type);
+        ie.setUsuari(usuari.getUsuari());
+        ie.setData(new Timestamp(System.currentTimeMillis()));
+        ie.setCursEnquesta(cursEnquesta);
+        ie.setTitulacioOrigen(titulacioOrigen);
+        ie.setCentreOrigen(centreOrigen);
+        ie.setNenq(nenq);
+        ie.setRuct(ruct);
+        
+        try {
+        ie.setValor(record.get(r).replace(",", "."));
+        }
+        catch(Exception ex) {
+        ie.setValor(null);
+        }
+        
+        iets.save(ie);
+        numRecords++;
+}
+numTuples++;
+}
+
+/*  5) Notificar administradores y usuario implicado  */
+this.sendNotificacion(usuari, enquesta, ambit, estudi);
+if(!usuari.isAdmin()){
+this.sendConfirmation(usuari.getUsuari(), enquesta, ambit, estudi);
+}
+
+errors.append("[INFO] " + (locale.equals("es") ? ("Se han importado "+numRecords.toString()+" nuevos registros para un total de "+numTuples.toString()+" titulaciones") : ("[INFO] S'han importat "+numRecords.toString()+" nous registres per a un total de "+numTuples.toString()+" titulacions")));
+return errors.toString();
+}
+
+public String doDbImport(Integer dbOrigen, String vista, Integer srcCurs, Integer dstCurs, Usuari usuari, String enquesta, String ambit, 
+ String estudi, String locale, String clau, List<String> ignoredColumns) throws SQLException, ClassNotFoundException {
+
+StringBuilder errors = new StringBuilder();
+Datasource source = this.dss.findById(dbOrigen);
+if(source == null){
+return errors.append("[ERROR] " + (locale.equals("es") ? "No se ha proporcionado un origen de datos válido." : "No s'ha proporcionat un origen de dades vàlid.")).append("<br>").toString();
+}
+String query = "SELECT * FROM "+vista+ " WHERE curs = "+srcCurs;
+Class.forName(source.getDriver());
+Integer numRecords = 0;
+Integer numTuples = 0;
+try (Connection connection = DriverManager.getConnection(source.getConn())) {
+
+/*  1) Ejecutar consulta  */
+Statement statement = connection.createStatement();
+ResultSet resultset = statement.executeQuery(query);
+
+ResultSetMetaData resultMetadata = resultset.getMetaData();
+int columns = resultMetadata.getColumnCount();
+
+/*  2) Obtener resultados para procesar online y cerrar conexión  */
+RowSetFactory factory = RowSetProvider.newFactory();
+CachedRowSet result = factory.createCachedRowSet();
+result.populate(resultset);
+connection.close();
+
+/*  3) Comprobar columnas obligatorias  */
+List<String> mandatoryColumns = new ArrayList<String>();
+List<String> knownColumns = new ArrayList<String>();
+if(clau.equals("ruct")) {
+this.setColumnsRuct(ambit, knownColumns, mandatoryColumns);
+}
+else {
+this.setColumnsCod(ambit, knownColumns, mandatoryColumns);
+}
+
+List<String> allColNames = new ArrayList<String>();
+for(int i = 1; i <= columns; i++){
+allColNames.add(resultMetadata.getColumnLabel(i).toLowerCase());
+}
+List<String> colnames = new ArrayList<String>(allColNames);
+
+if(!this.checkColumns(colnames, mandatoryColumns, errors, locale)) {
+return errors.append("[ERROR] " + (locale.equals("es") ? "Se han encontrado errores al procesar la vista seleccionada. No se ha importado ningún registro. " : "S'han trobat errors al processar la vista seleccionada. No s'ha importat cap registre.")).append("<br>").toString();
+}
+
+knownColumns.addAll(mandatoryColumns);
+knownColumns.addAll(ignoredColumns);
+for(String c : knownColumns) {
+colnames.removeIf(v->v.equalsIgnoreCase(c));
+}
+
+if(ambit.equals("T") && !clau.equals("ruct")){
+return errors.append("[ERROR] " + (locale.equals("es") ? "Los datos de titulación deben de importarse por código RUCT" : "Les dades de titulació s'han d'importar per códi RUCT.")).append("<br>").toString();
+}
+
+/*  4) Importar datos  */
+while(result.next()) {
+Integer ruct = null;
+Integer titulacio = null;
+Integer centre = null;
+String c = ambit.equals("C") ? translateCentre(result.getString("centre")) : null;
+boolean isValid = true; 
+
+if(ambit.equals("T")) {
+String ructStr = result.getString("ruct");
+if(ructStr != null) {
+if(!(ructStr.isBlank() || ructStr.isEmpty() || ructStr.equals("NULL") || ructStr.equals("null"))) {
+ruct = Integer.parseInt(ructStr);
+}
+else{
+isValid = false;
+}
+}
+else{
+isValid = false;
+}
+Organ o = this.orgs.findByRuct(ruct);
+if(o == null) {
+errors.append("[WARNING] " + (locale.equals("es") ? "No se ha encontrado el RUCT "+ructStr+", se omiten los registros de esta entrada." : "No s'ha trobat el RUCT "+ructStr+", s'ometen els registres d'aquesta entrada.")).append("<br>").toString();
+continue;
+}
+titulacio = o.getId().getLugar();
+centre = o.getOrgan().getId().getLugar();
+}
+else if(ambit.equals("C")) {
+centre = ambit.equals("T") || ambit.equals("C") ? Integer.parseInt(c.replaceAll("\\D+","")) : null;
+if(centre == null){
+isValid = false;
+}
+}
+
+if(isValid) {
+Integer curs = dstCurs == null ? result.getInt("curs") : dstCurs;
+String tipus = allColNames.contains("tipus") ? result.getString("tipus") : "avg";
+String cursEnquesta = allColNames.contains("curs_enquesta") ? result.getString("curs_enquesta") : null;
+String titulacioOrigen = allColNames.contains("titulacio_origen") ? result.getString("titulacio_origen") : null;
+String centreOrigen = allColNames.contains("centre_origen") ? result.getString("centre_origen") : null;
+Integer nenq = allColNames.contains("nenq") ? result.getInt("nenq") : null;
+String cursd = allColNames.contains("cursd") ? result.getString("cursd") : null;
+for(String colName : colnames) {
+IndicadorEnquestaTmp ie = new IndicadorEnquestaTmp();
+
+ie.setEnquesta(enquesta);
+ie.setTitulacio(titulacio);
+ie.setCentre(centre);
+ie.setCurs(curs);
+ie.setAmbit(ambit); 
+ie.setEstudi(estudi);
+ie.setIndicador(colName.replace("_min", "").replace("_max", "").toLowerCase());
+ie.setNum(null);
+ie.setCursd(cursd);
+ie.setTipus(tipus);
+ie.setUsuari(usuari.getUsuari());
+ie.setData(new Timestamp(System.currentTimeMillis()));
+ie.setCursEnquesta(cursEnquesta);
+ie.setTitulacioOrigen(titulacioOrigen);
+ie.setCentreOrigen(centreOrigen);
+ie.setNenq(nenq);
+ie.setRuct(ruct);
+
+try {
+ie.setValor(result.getString(colName).replace(",", "."));
+}
+catch(Exception ex) {
+ie.setValor(null);
+}
+
+iets.save(ie);
+numRecords++;
+} 
+numTuples++;  
+}
+}
+}
+
+/*  5) Notificar administradores y usuario implicado  */
+this.sendNotificacion(usuari, enquesta, ambit, estudi);
+if(!usuari.isAdmin()){
+this.sendConfirmation(usuari.getUsuari(), enquesta, ambit, estudi);
+}
+errors.append("[INFO] " + (locale.equals("es") ? ("Se han importado "+numRecords.toString()+" nuevos registros para un total de "+numTuples.toString()+" titulaciones") : ("[INFO] S'han importat "+numRecords.toString()+" nous registres per a un total de "+numTuples.toString()+" titulacions")));
+return errors.toString();
+}
+
+public List<String> listTableColumns(Integer dbOrigen, String vista, String locale) throws SQLException, ClassNotFoundException {
+
+Datasource source = this.dss.findById(dbOrigen);
+String query = "SELECT * FROM "+vista+" LIMIT 1;";
+Class.forName(source.getDriver());
+List<String> colNames = new ArrayList<String>();
+try (Connection connection = DriverManager.getConnection(source.getConn())) {
+
+Statement statement = connection.createStatement();
+ResultSet resultset = statement.executeQuery(query);
+
+ResultSetMetaData resultMetadata = resultset.getMetaData();
+int columns = resultMetadata.getColumnCount();
+
+for(int i = 1; i <= columns; i++){
+colNames.add(resultMetadata.getColumnLabel(i));
+}
+
+}
+
+return colNames;
+}
+
+public List<IndicadorEnquestaTmpRepository.IndicadorEnquestaTmpDup> checkDuplicates(String enquesta) {
+return this.iets.checkDuplicates(enquesta);
+}
+
+public Integer consolidateByEnquesta(String enquesta) {
+if(this.iets.checkDuplicates(enquesta).size() > 0) {
+return -1;
+}
+else {
+Integer i = this.ies.consolidateByEnquesta(enquesta);
+this.iets.deleteByEnquesta(enquesta);
+return i;
+}
+}
+
+public Integer countByEnquesta(String enquesta) {
+return this.iets.countByEnquesta(enquesta);
+}
+
+public List<IndicadorEnquestaTmpRepository.IndicadorEnquestaTmpDup> checkIntegrity(String enquesta){
+return this.iets.checkIntegrity(enquesta);
+}
+
+public Integer deleteFromCurrent(String enquesta){
+return this.iets.deleteFromCurrent(enquesta);
+}
+
+public Integer deleteFromPending(String enquesta){
+return this.iets.deleteFromPending(enquesta);
+}
+
+private void setColumnsCod(String ambit, List<String> knownColumns, List<String> mandatoryColumns) {
+knownColumns.addAll(Arrays.asList("ruct", "curs_enquesta", "centre_origen", "titulacio_origen", "nenq", "cursd"));
+if(ambit.equals("U")) {
+mandatoryColumns.addAll(Arrays.asList("curs", "tipus"));
+}
+else if(ambit.equals("C")) {
+mandatoryColumns.addAll(Arrays.asList("curs", "centre", "tipus"));
+}
+else {
+mandatoryColumns.addAll(Arrays.asList("curs", "titulacio", "centre", "tipus"));
+}
+}
+
+private void setColumnsRuct(String ambit, List<String> knownColumns, List<String> mandatoryColumns) {
+knownColumns.addAll(Arrays.asList("curs_enquesta", "centre_origen", "titulacio_origen", "nenq", "cursd"));
+if(ambit.equals("U")) {
+mandatoryColumns.addAll(Arrays.asList("curs", "tipus"));
+}
+else if(ambit.equals("C")) {
+mandatoryColumns.addAll(Arrays.asList("curs", "tipus", "ruct"));
+knownColumns.add("centre");
+}
+else {
+mandatoryColumns.addAll(Arrays.asList("curs", "tipus", "ruct"));
+knownColumns.addAll(Arrays.asList("centre", "titulacio"));
+}
+}
+
+private boolean checkColumns(List<String> header, List<String> mandatoryColumns, StringBuilder errors, String locale) {
+boolean isvalid = true;
+for(String c : mandatoryColumns) {
+if(!header.stream().anyMatch(c::equalsIgnoreCase)) {
+isvalid = false;
+    errors.append((locale.equals("es") ? "[ERROR] No se ha encontrado la columna " : "[ERROR] No s'ha trobat la columna ") +c).append("<br>");
+    }
+}
+return isvalid;
+}
+
+private boolean checkValues(List<CSVRecord> records, String ambit, String clau, StringBuilder errors, String locale) {
+boolean isvalid = true;
+Integer numRecords = 0;
+for (CSVRecord record : records) {
+Map<String, String> recordMap = new LinkedCaseInsensitiveMap<>();
+recordMap.putAll(record.toMap());
+
+String type = recordMap.get("tipus");
+numRecords++;
+
+if((ambit.equals("T") || ambit.equals("C")) && !clau.equals("ruct")) {
+String c = recordMap.get("centre");
+c = translateCentre(c);
+if(!StringUtils.isNumeric(c.replace("C", ""))) {
+isvalid = false;
+errors.append("[ERROR] " + (locale.equals("es") ? "En la linea " : "A la línia ") + numRecords.toString() + ": " + (locale.equals("es") ? c+" no es un valor válido para la columna centre." : c+" no es un valor vàlid per la columna centre.")).append("<br>");
+} 
+}
+
+if(ambit.equals("T")) {
+String t = recordMap.get("titulacio");
+if(!clau.equals("ruct")) {
+t = translateTitulacio(t);
+if(!StringUtils.isNumeric(t)) {
+isvalid = false;
+errors.append("[ERROR] " + (locale.equals("es") ? "En la linea " : "A la línia ") + numRecords.toString() + ": " + (locale.equals("es") ? t+" no es un valor válido para la columna titulacio." : t+" no es un valor vàlid per la columna titulacio.")).append("<br>");
+}
+}
+else {
+String ructStr = recordMap.get("ruct");
+if(!ructStr.isBlank() && ructStr.isEmpty() && ructStr.equals("NULL") && ructStr.equals("null") && !StringUtils.isNumeric(t)) {
+isvalid = false;
+errors.append("[ERROR] " + (locale.equals("es") ? "En la linea " : "A la línia ") + numRecords.toString() + ": " + (locale.equals("es") ? ructStr+" no es un valor válido para la columna ruct." : ructStr+" no es un valor vàlid per la columna ruct.")).append("<br>");
+}
+}
+}
+
+if(!type.equals("avg") && !type.equals("min") && !type.equals("max")) {
+isvalid = false;
+errors.append("[ERROR] " + (locale.equals("es") ? "En la linea " : "A la línia ") + numRecords.toString() + ": " + (locale.equals("es") ? type+" no es un valor válido para la columna tipus." : type+" no es un valor vàlid per la columna tipus.")).append("<br>");
+}
+}
+return isvalid;
+}
+
+private void sendNotificacion(Usuari usuari, String enquesta, String ambit, String estudi) {
+try {
+this.ems.sendMail("saic@uv.es", "[SYS] Datos pendientes de consolidar", "Estimado/a administrador: \n"
++ "\n"
++ "El usuario "+usuari.getUsuari()+" ha importado nuevos datos referentes a: \n"
++ "Origen: "+enquesta+"\n"
++ "Ámbito: "+ambit+"\n"
++ "Tipo titulación: "+estudi+"\n"
++ "\n"
++ "Acceda a https://saic.uv.es y realice las acciones pertinentes para consolidar los datos. ");
+} catch (MessagingException e) {
+e.printStackTrace();
+}
+}
+
+private void sendConfirmation(String to, String enquesta, String ambit, String estudi) {
+try {
+this.ems.sendMail(to, "[SYS] Nuevos datos importados", "Estimado/a usuario: \n"
++ "\n"
++ "Se han importado correctamente nuevos datos referentes a: \n"
++ "Origen: "+enquesta+"\n"
++ "Ámbito: "+ambit+"\n"
++ "Tipo titulación: "+estudi+"\n"
++ "\n"
++ "Los datos se quedarán en estado pendiente de consolidar hasta que un administrador inicie el proceso de consolidación.");
+} catch (MessagingException e) {
+e.printStackTrace();
+}
+}
+
+/* Exepciones en el código de titulación que hay que traducir a código SAIC */
+```
+- `translateTitulacio()` — ⚪ Interno
+```
+/* Exepciones en el código de centro que hay que traducir a código SAIC */
+```
+- `translateCentre()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `DatasourceService` <a name='datasourceservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\DatasourceService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findAll()` — ⚪ Interno
+- `findById()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `DocumentService` <a name='documentservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\DocumentService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getAll()` — ⚪ Interno
+- `findById()` — ⚪ Interno
+- `findAllByCategoriaOrgan()` — ⚪ Interno
+- `findByCategoriaOrgan()` — ⚪ Interno
+- `findByCategoriaNom()` — ⚪ Interno
+- `findByCategoriaTipus()` — ⚪ Interno
+- `archive()` — ⚪ Interno
+- `archiveByOrgan()` — ⚪ Interno
+- `exists()` — ⚪ Interno
+- `save()` — ⚪ Interno
+- `delete()` — ⚪ Interno
+- `upload()` — ⚪ Interno
+- `File()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `EmailService` <a name='emailservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\EmailService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `EmailService()` — ⚪ Interno
+- `sendActiveTaskNext()` — ⚪ Interno
+- `addEmail()` — ⚪ Interno
+- `getNextEmail()` — ⚪ Interno
+- `getPendingQueue()` — ⚪ Interno
+- `pendingQueueIsEmpty()` — ⚪ Interno
+- `sendMail()` — ⚪ Interno
+- `SimpleMailMessage()` — ⚪ Interno
+- `sendNewTaskMail()` — ⚪ Interno
+- `Qualitat()` — ⚪ Interno
+```
+//saic.uv.es per a accedir al Sistema d'Assegurament Intern de l
+```
+- `Qualitat()` — ⚪ Interno
+- `Calidad()` — ⚪ Interno
+```
+//saic.uv.es para acceder al Sistema de Aseguramiento Interno de l
+```
+- `Calidad()` — ⚪ Interno
+- `sendCalendarMail()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `EvidenciaIndicadorEnquestaService` <a name='evidenciaindicadorenquestaservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\EvidenciaIndicadorEnquestaService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getIndicadors()` — ⚪ Interno
+- `getByProcesEvidencia()` — ⚪ Interno
+- `getAll()` — ⚪ Interno
+- `removeByProcesEvidencia()` — ⚪ Interno
+- `save()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `GraficaService` <a name='graficaservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\GraficaService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findLikeAmbit()` — ⚪ Interno
+- `findLikeAmbitAndEstudi()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `IndicadorEnquestaService` <a name='indicadorenquestaservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\IndicadorEnquestaService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findAll()` — ⚪ Interno
+- `findTypes()` — ⚪ Interno
+- `findByEnquestaCursAmbitEstudi()` — ⚪ Interno
+- `findByEnquestaCursAmbitEstudiCentre()` — ⚪ Interno
+- `findByEnquestaCursAmbitEstudiCentreTitulacio()` — ⚪ Interno
+- `getAssociatedInds()` — ⚪ Interno
+- `getAllInds()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `getAllInds()` — ⚪ Interno
+- `getGraphData()` — ⚪ Interno
+- `getGraphData()` — ⚪ Interno
+- `contains()` — ⚪ Interno
+- `deleteCentroNoAdscrito()` — ⚪ Interno
+- `deleteByEnquesta()` — ⚪ Interno
+- `deleteByEnquestaCurs()` — ⚪ Interno
+- `fixBiennials()` — ⚪ Interno
+- `consolidateByEnquesta()` — ⚪ Interno
+- `deleteAll()` — ⚪ Interno
+- `save()` — ⚪ Interno
+- `saveAll()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `IndicadorEnquestaTmpService` <a name='indicadorenquestatmpservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\IndicadorEnquestaTmpService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findAll()` — ⚪ Interno
+- `findByEnquestaCursAmbitEstudi()` — ⚪ Interno
+- `deleteByEnquesta()` — ⚪ Interno
+- `deleteByEnquestaCursAmbitEstudi()` — ⚪ Interno
+- `checkDuplicates()` — ⚪ Interno
+- `deleteFromCurrent()` — ⚪ Interno
+- `deleteFromPending()` — ⚪ Interno
+- `deleteDuplicates()` — ⚪ Interno
+- `countByEnquesta()` — ⚪ Interno
+- `checkIntegrity()` — ⚪ Interno
+- `deleteAll()` — ⚪ Interno
+- `save()` — ⚪ Interno
+- `saveAll()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `IndicadorService` <a name='indicadorservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\IndicadorService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `IndicadorService()` — ⚪ Interno
+- `getFromTitulacion()` — ⚪ Interno
+- `URL()` — ⚪ Interno
+- `String()` — ⚪ Interno
+- `extract()` — ⚪ Interno
+- `InputSource()` — ⚪ Interno
+```
+// has subin
+```
+- `for()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `getGraphData()` — ⚪ Interno
+- `URL()` — ⚪ Interno
+- `String()` — ⚪ Interno
+- `extractAll()` — ⚪ Interno
+- `InputSource()` — ⚪ Interno
+```
+// has subin
+```
+- `for()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InformeService` <a name='informeservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\InformeService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findByGrupWeb()` — ⚪ Interno
+- `findByGrupWebTambit()` — ⚪ Interno
+- `findById()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InstanciaService` <a name='instanciaservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\InstanciaService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findByID()` — ⚪ Interno
+- `getReportFromInstancia()` — ⚪ Interno
+- `filterSupervisables()` — ⚪ Interno
+- `filterSupervisable()` — ⚪ Interno
+- `filterSupervisablesByEvidencies()` — ⚪ Interno
+- `save()` — ⚪ Interno
+- `findAll()` — ⚪ Interno
+- `findAllIds()` — ⚪ Interno
+- `findByOrganCursNom()` — ⚪ Interno
+- `findByCentreCursNom()` — ⚪ Interno
+- `findByIdProces()` — ⚪ Interno
+- `findByOrganBetweenCurs()` — ⚪ Interno
+- `exists()` — ⚪ Interno
+- `exists()` — ⚪ Interno
+- `instantiateT()` — ⚪ Interno
+- `BigInteger()` — ⚪ Interno
+- `instantiateC()` — ⚪ Interno
+- `BigInteger()` — ⚪ Interno
+- `instantiateU()` — ⚪ Interno
+- `BigInteger()` — ⚪ Interno
+- `deleteInstance()` — ⚪ Interno
+- `clearInstance()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InstanciaTascaService` <a name='instanciatascaservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\InstanciaTascaService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findByInstancia()` — ⚪ Interno
+- `findByInstanciaTascap()` — ⚪ Interno
+- `findOlderVersions()` — ⚪ Interno
+- `TascaVersioTransfer()` — ⚪ Interno
+- `findActiveByInstancia()` — ⚪ Interno
+- `findActivesByType()` — ⚪ Interno
+- `isUserAuthorized()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `getReportFromProcesOrgan()` — ⚪ Interno
+- `getReportFromNomProcesOrgan()` — ⚪ Interno
+- `system()` — ⚪ Interno
+- `ProcessBuilder()` — ⚪ Interno
+- `ProcessBuilder()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `ProcessBuilder()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `File()` — ⚪ Interno
+- `File()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `saveChanges()` — ⚪ Interno
+- `Date()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `Date()` — ⚪ Interno
+- `InstanciaTasca()` — ⚪ Interno
+- `Date()` — ⚪ Interno
+- `BigInteger()` — ⚪ Interno
+- `Email()` — ⚪ Interno
+- `findOlderByProces()` — ⚪ Interno
+- `EvidenciaTransfer()` — ⚪ Interno
+- `findById()` — ⚪ Interno
+- `getPastTasks()` — ⚪ Interno
+- `getNext()` — ⚪ Interno
+- `getUsers()` — ⚪ Interno
+- `getLastByProcName()` — ⚪ Interno
+- `deactivateAll()` — ⚪ Interno
+- `remove()` — ⚪ Interno
+- `removeAllVersions()` — ⚪ Interno
+- `save()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InstanciaTascaVerService` <a name='instanciatascaverservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\InstanciaTascaVerService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findById()` — ⚪ Interno
+- `findByIdInstanciaTasca()` — ⚪ Interno
+- `save()` — ⚪ Interno
+- `delete()` — ⚪ Interno
+- `deleteByIdInstancia()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `LinkService` <a name='linkservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\LinkService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findAll()` — ⚪ Interno
+- `findById()` — ⚪ Interno
+- `findByToken()` — ⚪ Interno
+- `findByRuct()` — ⚪ Interno
+- `increase()` — ⚪ Interno
+- `save()` — ⚪ Interno
+- `delete()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `NoticiaService` <a name='noticiaservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\NoticiaService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findAll()` — ⚪ Interno
+- `findVisibles()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `OrganService` <a name='organservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\OrganService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findByID()` — ⚪ Interno
+- `findByRuct()` — ⚪ Interno
+- `exists()` — ⚪ Interno
+- `findAll()` — ⚪ Interno
+- `findCurrentCentres()` — ⚪ Interno
+- `findTitulacionsByCentre()` — ⚪ Interno
+- `getTitulacions()` — ⚪ Interno
+- `getCentres()` — ⚪ Interno
+- `getActiveCentres()` — ⚪ Interno
+- `getTitulacionsByCentre()` — ⚪ Interno
+- `getUsuariTitulacions()` — ⚪ Interno
+- `getUsuariCentres()` — ⚪ Interno
+- `getTitulacionsByCentres()` — ⚪ Interno
+- `getTitulacionsByTypeCentre()` — ⚪ Interno
+- `findActiveTitulacionsByCentreTambit()` — ⚪ Interno
+- `getEquivalents()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `ParserService` <a name='parserservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\ParserService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `ParserService()` — ⚪ Interno
+- `doParse()` — ⚪ Interno
+- `parseOtros()` — ⚪ Interno
+- `parsePas()` — ⚪ Interno
+- `parseEvalProf()` — ⚪ Interno
+- `parseGrauFromUqServer()` — ⚪ Interno
+- `parseMasterFromUqServer()` — ⚪ Interno
+- `parseDoctorado()` — ⚪ Interno
+- `execute()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `IndicadorEnquesta()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `executeRows()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `IndicadorEnquesta()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `translate()` — ⚪ Interno
+- `parseGrauDades1er()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `parseGrauDades3er()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `parseGrauDadesGraduats()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `parseGrauProfes()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `parseDadesPas()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `parseMasterData()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+```
+/*+ "AND a.TIT NOT IN(SELECT DISTINCT(TIT) FROM MDB_master.Mitjanes_final_codigeneric) "
++ "UNION "
++ "SELECT 'data' AS enquesta, b.tit AS tit, c.cmostrar AS centre, CONCAT('20', RIGHT(ACURS, 2)) AS curs, null AS cursd, 'T' AS ambit, 'm' AS estudi, "
++ "IT01 AS it01, IT02 AS it02, IT03 AS it03, IT04 AS it04, IT05 AS it05, IT06 AS it06, "
++ "IT07 AS it07, IT08 AS it08, IT09 AS it09, IT10 AS it10, IT11 AS it11, IT12 AS it12, "
++ "IT13 AS it13, IT14 AS it14, IT15 AS it15, IT16 AS it16, IT17 AS it17, IT18 AS it18, "
++ "IT19 AS it19, IT21 AS it21, IT22 AS it22, IT23 AS it23, IT24 AS it24, IT25 AS it25, "
++ "IT26 AS it26, IT27 AS it27, IT28 AS it28, IT29 AS it29, IT30 AS it30, IT30 AS it30, "
++ "IT31 AS it31, IT32 AS it32, IT33 AS it33, G_satis AS g_satis, G_RelQP AS g_relqp, "
++ "G_QProf AS g_qprof, G_Postg AS g_postg, G_Interes AS g_interes, G_Util AS g_util, gcovidm AS gcovid "
++ "FROM MDB_master.Mitjanes_final_codigeneric a "
++ "LEFT JOIN MDB_master.ESTUDIS b ON a.tit = b.tit "
++ "LEFT JOIN MDB_master.Centre c ON b.centre = c.centre "
++ "WHERE Total >= 3 AND CONCAT('20', RIGHT(ACURS, 2)) >= "+year+";",*/
+
+"SELECT 'data' AS enquesta, NULL AS tit, b.cmostrar AS centre, CONCAT('20', RIGHT(ACURS, 2)) AS curs, null AS cursd, 'C' AS ambit, 'm' AS estudi, "
++ "IT01 AS it01, IT02 AS it02, IT03 AS it03, IT04 AS it04, IT05 AS it05, IT06 AS it06, "
++ "IT07 AS it07, IT08 AS it08, IT09 AS it09, IT10 AS it10, IT11 AS it11, IT12 AS it12, IT13 AS it13, "
++ "IT14 AS it14, IT15 AS it15, IT16 AS it16, IT17 AS it17, IT18 AS it18, IT19 AS it19, "
++ "IT21 AS it21, IT22 AS it22, IT23 AS it23, IT24 AS it24, IT25 AS it25, IT26 AS it26, "
++ "IT27 AS it27, IT28 AS it28, IT29 AS it29, IT30 AS it30, IT30 AS it30, IT31 AS it31, "
++ "IT32 AS it32, IT33 AS it33, G_satis AS g_satis, G_RelQP AS g_relqp, G_QProf AS g_qprof, "
++ "G_Postg AS g_postg, G_Interes AS g_interes, G_Util AS g_util "
++ "FROM MDB_master.Mitjanes_final_xcentre a "
++ "LEFT JOIN MDB_master.Centre b ON a.centre = b.centre WHERE CONCAT('20', RIGHT(ACURS, 2)) >= "+year+";",
+
+"SELECT 'data' AS enquesta, NULL AS tit, NULL AS centre, CONCAT('20', RIGHT(ACURS, 2)) AS curs, null AS cursd, 'U' AS ambit, 'm' AS estudi, "
++ "IT01 AS it01, IT02 AS it02, IT03 AS it03, IT04 AS it04, IT05 AS it05, IT06 AS it06, "
++ "IT07 AS it07, IT08 AS it08, IT09 AS it09, IT10 AS it10, IT11 AS it11, IT12 AS it12, IT13 AS it13, "
++ "IT14 AS it14, IT15 AS it15, IT16 AS it16, IT17 AS it17, IT18 AS it18, IT19 AS it19, "
++ "IT21 AS it21, IT22 AS it22, IT23 AS it23, IT24 AS it24, IT25 AS it25, IT26 AS it26, "
++ "IT27 AS it27, IT28 AS it28, IT29 AS it29, IT30 AS it30, IT30 AS it30, IT31 AS it31, "
++ "IT32 AS it32, IT33 AS it33, G_satis AS g_satis, G_RelQP AS g_relqp, G_QProf AS g_qprof, "
++ "G_Postg AS g_postg, G_Interes AS g_interes, G_Util AS g_util "
++ "FROM MDB_master.Mitjanes_final_global "
++ "WHERE CONCAT('20', RIGHT(ACURS, 2)) >= "+year+";",
+
+"SELECT 'data' AS enquesta, NULL AS tit, b.cmostrar AS centre, CONCAT('20', RIGHT(ACURS, 2)) AS curs, null AS cursd, 'C' AS ambit, 'm' AS estudi, "
++ "max_it13m AS it13_max, min_it13m AS it13_min, max_it14m AS it14_max, min_it14m AS it14_min, "
++ "max_it15m AS it15_max, min_it15m AS it15_min, max_it16m AS it16_max, min_it16m AS it16_min, "
++ "max_it17m AS it17_max, min_it17m AS it17_min "
++ "FROM MDB_master.MinMax_final_xcentre a "
++ "LEFT JOIN MDB_master.Centre b ON a.centre = b.centre WHERE CONCAT('20', RIGHT(ACURS, 2)) >= "+year+";"};
+
+return this.execute(statement, queries);
+}
+
+private int parseMasterDataG(Connection connection, String year) throws SQLException {
+
+Statement statement = connection.createStatement();
+String[] queries = {
+"SELECT 'data_g' AS enquesta, b.tit AS tit, c.cmostrar AS centre, CONCAT('20', RIGHT(cursf, 2)) AS curs, null AS cursd, 'T' AS ambit, 'm' AS estudi, "
++ "IT01m_pf AS it01_pf, IT02m_pf AS it02_pf, IT03m_pf AS it03_pf, IT04m_comp AS it04_comp, "
++ "IT04m_comp AS it05_comp, IT06m_comp AS it06_comp, IT07m_comp AS it07_comp, "
++ "IT08m_comp AS it08_comp, IT09m_comp AS it09_comp, IT10m_comp AS it10_comp, "
++ "IT11m_de AS it11_de, IT12m_de AS it12_de, IT13m_de AS it13_de, IT14m_de AS it14_de, "
++ "IT15m_de AS it15_de, IT16m_de AS it16_de, (IT17_pe_S/(IT17_pe_S+IT17_pe_N))*100 AS it17_pe, "
++ "IT18m_pe AS it18_pe, IT19m_pe AS it19_pe, IT20m_pe AS it20_pe, IT21m_pe AS it21_pe, "
++ "IT22m_pe AS it22_pe, IT23m_pe AS it23_pe, (IT24_mob_S/(IT24_mob_S+IT24_mob_N))*100 AS it24_mob, "
++ "IT25_mob1 AS it25_mob1, IT25_mob2 AS it25_mob2, IT25_mob3 AS it25_mob3, IT25_mob4 AS it25_mob4, "
++ "IT26m_mob AS it26_mob, IT27m_mob AS it27_mob, IT28m_mob AS it28_mob, IT29m_mob AS it29_mob, "
++ "IT30m_mob AS it30_mob, IT26m_mob AS it26_mob, IT31m_mob AS it31_mob, IT32m_mob AS it32_mob, "
++ "IT33m_mob AS it33_mob, IT34m_tfm AS it34_tfm, IT35m_tfm AS it35_tfm, IT36m_tfm AS it36_tfm, "
++ "IT37m_tfm AS it37_tfm, IT38m_tfm AS it38_tfm, IT40m_treb AS it40_treb, IT41m_treb AS it41_treb, "
++ "IT41m_treb AS it41_treb, IT42m_treb AS it42_treb, IT43m_treb AS it43_treb, gm_Qprof AS g_qprof, "
++ "gm_instal AS g_instal, gm_exp AS g_exp, gm_recomana AS g_recomana "
++ "FROM MDB_master.Mitjanes_Gxtitcursf a "
++ "LEFT JOIN MDB_master.ESTUDIS b ON a.tit = b.tit "
++ "LEFT JOIN MDB_master.Centre c ON b.centre = c.centre WHERE CONCAT('20', RIGHT(cursf, 2)) >= "+year+";",
+
+"SELECT 'data_g' AS enquesta, NULL AS tit, b.cmostrar AS centre, CONCAT('20', RIGHT(cursf, 2)) AS curs, null AS cursd, 'C' AS ambit, 'm' AS estudi, "
++ "IT01m_pf AS it01_pf, IT02m_pf AS it02_pf, IT03m_pf AS it03_pf, IT04m_comp AS it04_comp, "
++ "IT04m_comp AS it05_comp, IT06m_comp AS it06_comp, IT07m_comp AS it07_comp, "
++ "IT08m_comp AS it08_comp, IT09m_comp AS it09_comp, IT10m_comp AS it10_comp, "
++ "IT11m_de AS it11_de, IT12m_de AS it12_de, IT13m_de AS it13_de, IT14m_de AS it14_de, "
++ "IT15m_de AS it15_de, IT16m_de AS it16_de, (IT17_pe_S/(IT17_pe_S+IT17_pe_N))*100 AS it17_pe, "
++ "IT18m_pe AS it18_pe, IT19m_pe AS it19_pe, IT20m_pe AS it20_pe, IT21m_pe AS it21_pe, "
++ "IT22m_pe AS it22_pe, IT23m_pe AS it23_pe, (IT24_mob_S/(IT24_mob_S+IT24_mob_N))*100 AS it24_mob, "
++ "IT25_mob1 AS it25_mob1, IT25_mob2 AS it25_mob2, IT25_mob3 AS it25_mob3, IT25_mob4 AS it25_mob4, "
++ "IT26m_mob AS it26_mob, IT27m_mob AS it27_mob, IT28m_mob AS it28_mob, IT29m_mob AS it29_mob, "
++ "IT30m_mob AS it30_mob, IT26m_mob AS it26_mob, IT31m_mob AS it31_mob, IT32m_mob AS it32_mob, "
++ "IT33m_mob AS it33_mob, IT34m_tfm AS it34_tfm, IT35m_tfm AS it35_tfm, IT36m_tfm AS it36_tfm, "
++ "IT37m_tfm AS it37_tfm, IT38m_tfm AS it38_tfm, IT40m_treb AS it40_treb, IT41m_treb AS it41_treb, "
++ "IT41m_treb AS it41_treb, IT42m_treb AS it42_treb, IT43m_treb AS it43_treb, gm_Qprof AS g_qprof, "
++ "gm_instal AS g_instal, gm_exp AS g_exp, gm_recomana AS g_recomana "
++ "FROM MDB_master.Mitjanes_Gxcentrecursf a "
++ "LEFT JOIN MDB_master.Centre b ON a.centre = b.centre WHERE CONCAT('20', RIGHT(cursf, 2)) >= "+year+";",
+
+"SELECT 'data_g' AS enquesta, NULL AS tit, NULL AS centre, CONCAT('20', RIGHT(cursf, 2)) AS curs, null AS cursd, 'U' AS ambit, 'm' AS estudi, "
++ "IT01m_pf AS it01_pf, IT02m_pf AS it02_pf, IT03m_pf AS it03_pf, IT04m_comp AS it04_comp, "
++ "IT04m_comp AS it05_comp, IT06m_comp AS it06_comp, IT07m_comp AS it07_comp, "
++ "IT08m_comp AS it08_comp, IT09m_comp AS it09_comp, IT10m_comp AS it10_comp, "
++ "IT11m_de AS it11_de, IT12m_de AS it12_de, IT13m_de AS it13_de, IT14m_de AS it14_de, "
++ "IT15m_de AS it15_de, IT16m_de AS it16_de, (IT17_pe_S/(IT17_pe_S+IT17_pe_N))*100 AS it17_pe, "
++ "IT18m_pe AS it18_pe, IT19m_pe AS it19_pe, IT20m_pe AS it20_pe, IT21m_pe AS it21_pe, "
++ "IT22m_pe AS it22_pe, IT23m_pe AS it23_pe, (IT24_mob_S/(IT24_mob_S+IT24_mob_N))*100 AS it24_mob, "
++ "IT25_mob1 AS it25_mob1, IT25_mob2 AS it25_mob2, IT25_mob3 AS it25_mob3, IT25_mob4 AS it25_mob4, "
++ "IT26m_mob AS it26_mob, IT27m_mob AS it27_mob, IT28m_mob AS it28_mob, IT29m_mob AS it29_mob, "
++ "IT30m_mob AS it30_mob, IT26m_mob AS it26_mob, IT31m_mob AS it31_mob, IT32m_mob AS it32_mob, "
++ "IT33m_mob AS it33_mob, IT34m_tfm AS it34_tfm, IT35m_tfm AS it35_tfm, IT36m_tfm AS it36_tfm, "
++ "IT37m_tfm AS it37_tfm, IT38m_tfm AS it38_tfm, IT40m_treb AS it40_treb, IT41m_treb AS it41_treb, "
++ "IT41m_treb AS it41_treb, IT42m_treb AS it42_treb, IT43m_treb AS it43_treb, gm_Qprof AS g_qprof, "
++ "gm_instal AS g_instal, gm_exp AS g_exp, gm_recomana AS g_recomana "
++ "FROM MDB_master.Mitjanes_Gxcursf WHERE CONCAT('20', RIGHT(cursf, 2)) >= "+year+";",
+
+"SELECT 'data_g' AS enquesta, NULL AS tit, b.cmostrar AS centre, CONCAT('20', RIGHT(cursf, 2)) AS curs, null AS cursd, 'C' AS ambit, 'm' AS estudi, "
++ "max_IT26m_mob AS it26_mob_max, min_IT26m_mob AS it26_mob_min, "
++ "max_IT27m_mob AS it27_mob_max, min_IT27m_mob AS it27_mob_min, "
++ "max_IT28m_mob AS it28_mob_max, min_IT28m_mob AS it28_mob_min, "
++ "max_IT29m_mob AS it29_mob_max, min_IT29m_mob AS it29_mob_min, "
++ "max_IT30m_mob AS it30_mob_max, min_IT30m_mob AS it30_mob_min, "
++ "max_IT31m_mob AS it31_mob_max, min_IT31m_mob AS it31_mob_min, "
++ "max_IT32m_mob AS it32_mob_max, min_IT32m_mob AS it32_mob_min, "
++ "max_IT33m_mob AS it33_mob_max, min_IT33m_mob AS it33_mob_min, "
++ "max_gm_instal AS g_instal_max, min_gm_instal AS g_instal_min "
++ "FROM MDB_master.MinMax_Gxcursfcentre a "
++ "LEFT JOIN MDB_master.Centre b ON a.centre = b.centre WHERE CONCAT('20', RIGHT(cursf, 2)) >= "+year+";"
+};
+
+return this.execute(statement, queries);
+}
+
+private int parseMasterProfes(Connection connection, String year) throws SQLException {
+
+Statement statement = connection.createStatement();
+String[] queries = {
+"SELECT 'profes_tancades' AS enquesta, b.tit AS tit, c.cmostrar AS centre, CONCAT('20', RIGHT(ACURS, 2)) AS curs, null AS cursd, 'T' AS ambit, 'm' AS estudi, "
++ "A1 AS a1, A2 AS a2, A3 AS a3, A4 AS a4, A5 AS a5, A6 AS a6, A7 AS a7, A8 AS a8, A9 AS a9, A10 AS a10, "
++ "A11 AS a11, A12 as a12, A13 AS a13, A14 AS a14, A15_1 AS a15_1, A15_2 AS a15_2, A15_3 AS a15_3, "
++ "A15_4 AS a15_4, A15_5 AS a15_5, A16 AS a16, A17 AS a17, A18 AS a18, A19 AS a19, A20 AS a20, "
++ "A21 AS a21, A26 AS a26, A27 AS a27, A28 AS a28, A29 AS a29, A30 AS a30, A31 AS a31, A32 AS a32 "
++ "FROM MDB_master.Mitjanes_profesXtit a "
++ "LEFT JOIN MDB_master.ESTUDIS b ON a.tit = b.tit "
++ "LEFT JOIN MDB_master.Centre c ON b.centre = c.centre WHERE CONCAT('20', RIGHT(ACURS, 2)) >= "+year+";",
+
+"SELECT 'profes_tancades' AS enquesta, NULL AS tit, c.cmostrar AS centre, CONCAT('20', RIGHT(ACURS, 2)) AS curs, null AS cursd, 'C' AS ambit, 'm' AS estudi, "
++ "A1 AS a1, A2 AS a2, A3 AS a3, A4 AS a4, A5 AS a5, A6 AS a6, A7 AS a7, A8 AS a8, A9 AS a9, A10 AS a10, "
++ "A11 AS a11, A12 as a12, A13 AS a13, A14 AS a14, A15_1 AS a15_1, A15_2 AS a15_2, A15_3 AS a15_3, "
++ "A15_4 AS a15_4, A15_5 AS a15_5, A16 AS a16, A17 AS a17, A18 AS a18, A19 AS a19, A20 AS a20, "
++ "A21 AS a21, A26 AS a26, A27 AS a27, A28 AS a28, A29 AS a29, A30 AS a30, A31 AS a31, A32 AS a32 "
++ "FROM MDB_master.Mitjanes_profesxCurscentre a "
++ "LEFT JOIN MDB_master.periodesCurs p ON p.curs = CONCAT('20', RIGHT(ACURS, 2)) "
++ "LEFT JOIN MDB_master.Centre c ON a.centre = c.centre WHERE p.ProfesComplet = 1 AND CONCAT('20', RIGHT(ACURS, 2)) >= "+year+";",
+
+"SELECT 'profes_tancades' AS enquesta, NULL AS tit, NULL AS centre, CONCAT('20', RIGHT(ACURS, 2)) AS curs, null AS cursd, 'U' AS ambit, 'm' AS estudi,"
++ "A1 AS a1, A2 AS a2, A3 AS a3, A4 AS a4, A5 AS a5, A6 AS a6, A7 AS a7, A8 AS a8, A9 AS a9, A10 AS a10, "
++ "A11 AS a11, A12 as a12, A13 AS a13, A14 AS a14, A15_1 AS a15_1, A15_2 AS a15_2, A15_3 AS a15_3, "
++ "A15_4 AS a15_4, A15_5 AS a15_5, A16 AS a16, A17 AS a17, A18 AS a18, A19 AS a19, A20 AS a20, "
++ "A21 AS a21, A26 AS a26, A27 AS a27, A28 AS a28, A29 AS a29, A30 AS a30, A31 AS a31, A32 AS a32 "
++ "FROM MDB_master.Mitjanes_profesxCurs a"
++ "LEFT JOIN MDB_master.periodesCurs p ON p.curs = CONCAT('20', RIGHT(ACURS, 2)) "
++ "WHERE p.ProfesComplet = 1 AND CONCAT('20', RIGHT(ACURS, 2)) >= "+year+";",
+
+"SELECT 'profes_tancades' AS enquesta, NULL AS tit, c.cmostrar AS centre, CONCAT('20', RIGHT(ACURS, 2)) AS curs, null AS cursd, 'C' AS ambit, 'm' AS estudi, "
++ "max_A16m AS a16_max, min_A16m AS a16_min, max_A17m AS a17_max, min_A17m AS a17_min, "
++ "max_A19m AS a19_max, min_A19m AS a19_min "
++ "FROM MDB_master.MinMax_profesxCurscentre a "
++ "LEFT JOIN MDB_master.periodesCurs p ON p.curs = CONCAT('20', RIGHT(ACURS, 2)) "
++ "LEFT JOIN MDB_master.Centre c ON a.centre = c.centre WHERE p.ProfesComplet = 1 AND CONCAT('20', RIGHT(ACURS, 2)) >= "+year+";"};
+
+return this.execute(statement, queries);
+}
+
+
+private int parseEvalProfBD(Connection connection, String year) throws SQLException {
+ 
+Statement statement = connection.createStatement();
+String[] queries = {
+"SELECT 'evalprof' AS enquesta, t.cod_titula AS tit, c.cod_actual AS centre, CONCAT('20', anyo) AS curs, null AS cursd, 'T' AS ambit, tipus AS estudi, "
++ "it01, it02, it03, it04, it05, it06, it07, it08, it09, it10, it11, it12, it13, it14, b1, b2, b3, b4, b5, b6, global "
++ "FROM MDB_evalProf.MediasTitulacion m "
++ "LEFT JOIN MDB_evalProf.Titulaciones t ON m.estudio = t.estudio "
++ "LEFT JOIN MDB_evalProf.Centros c ON t.cod_centro = c.cod_centro "
++ "WHERE c.cod_actual IS NOT NULL AND c.cod_actual <> '' AND num_encues >= 3 AND CONCAT('20', anyo) >= "+year+"; ",
+
+"SELECT 'evalprof' AS enquesta, NULL AS tit, c.cod_actual AS centre, CONCAT('20', anyo) AS curs, null AS cursd, 'C' AS ambit, tipus AS estudi, "
++ "it01, it02, it03, it04, it05, it06, it07, it08, it09, it10, it11, it12, it13, it14, b1, b2, b3, b4, b5, b6, global "
++ "FROM MDB_evalProf.MediasCentro m "
++ "LEFT JOIN MDB_evalProf.Centros c ON m.centre = c.cod_centro "
++ "LEFT JOIN MDB_master.periodesCurs p ON p.curs = CONCAT('20', anyo) "
++ "WHERE c.cod_actual IS NOT NULL AND c.cod_actual <> '' AND CONCAT('20', anyo) >= "+year+"; ",
+
+"SELECT 'evalprof' AS enquesta, NULL AS tit, NULL AS centre, CONCAT('20', anyo) AS curs, null AS cursd, 'U' AS ambit, tipus AS estudi, "
++ "it01, it02, it03, it04, it05, it06, it07, it08, it09, it10, it11, it12, it13, it14, b1, b2, b3, b4, b5, b6, global "
++ "FROM MDB_evalProf.MediasUniversidad "
++ "LEFT JOIN MDB_master.periodesCurs p ON p.curs = CONCAT('20', anyo) "
++ "WHERE CONCAT('20', anyo) >= "+year+"; "};
+
+return this.execute(statement, queries);
+
+}
+
+private int parseOtrosProfes(Connection connection) throws SQLException {
+ 
+Statement statement = connection.createStatement();
+String[] queries = {
+"SELECT 'otros' AS enquesta, t.cod_titula AS tit, c.cod_actual AS centre, curs, null AS cursd, ambit, estudi, "
++ "I_RH2_06, I_RH2_07, I_RH2_08, I_RH2_profcursos, I_RH2_totpdi "
++ "FROM MDB_otros.profesorado m "
++ "LEFT JOIN MDB_evalProf.Titulaciones t ON m.titulacion = t.estudio "
++ "LEFT JOIN MDB_evalProf.Centros c ON t.cod_centro = c.cod_centro "
++ "WHERE c.cod_actual IS NOT NULL AND c.cod_actual <> '';"};
+
+return this.execute(statement, queries);
+
+}
+
+private int parseOtrosEncuestas(Connection connection) throws SQLException {
+ 
+Statement statement = connection.createStatement();
+String[] queries = {
+"SELECT 'enquestes' AS enquesta, titulacio AS tit, centre, curs, null AS cursd, ambit, estudi, "
++ "1er_modul_cod, 1er_modul_nom, 1er_modul_obs, 3er_modul_cod, 3er_modul_nom, 3er_modul_obs "
++ "FROM MDB_otros.asignaturas_encuestas;"};
+
+return this.execute(statement, queries);
+
+}
+
+private int parseOtrosTasas(Connection connection) throws SQLException {
+ 
+Statement statement = connection.createStatement();
+String[] queries = {
+"SELECT 'otros' AS enquesta, t.cod_titula AS tit, c.cod_actual AS centre, curs, null AS cursd, ambit, estudi, "
++ "i_oe1_nb_nuevos, i_oe1_nb_plazas, i_oe1_tasa_mat, i_oe1_tasa_ofedem "
++ "FROM MDB_otros.tasas m "
++ "LEFT JOIN MDB_evalProf.Titulaciones t ON m.titulacion = t.estudio "
++ "LEFT JOIN MDB_evalProf.Centros c ON t.cod_centro = c.cod_centro "
++ "WHERE c.cod_actual IS NOT NULL AND c.cod_actual <> '';"};
+
+return this.execute(statement, queries);
+
+}
+
+private int parseOtrosDocentia(Connection connection) throws SQLException {
+ 
+Statement statement = connection.createStatement();
+String[] queries = {
+"SELECT *  "
++ "FROM MDB_otros.docentia_evaluacion "
++ "WHERE centre IS NOT NULL;"};
+
+return this.execute(statement, queries);
+
+}
+
+/* ToDo */
+```
+- `parseDocEstud()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `parseDocEtesi()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `parseDocProf()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `parseDocTasas()` — ⚪ Interno
+- `parseDocInds()` — ⚪ Interno
+- `parseDocRecom()` — ⚪ Interno
+- `LOWER()` — ⚪ Interno
+- `doAction()` — ⚪ Interno
+- `precargaEvalProf()` — ⚪ Interno
+- `CAST()` — ⚪ Interno
+- `CAST()` — ⚪ Interno
+- `CAST()` — ⚪ Interno
+- `precargaMaster()` — ⚪ Interno
+- `precargaDoctorado()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `PlantillaService` <a name='plantillaservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\PlantillaService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `DecimalFormat()` — ⚪ Interno
+- `findAll()` — ⚪ Interno
+- `findByID()` — ⚪ Interno
+- `findByVersioCodiAmbit()` — ⚪ Interno
+- `save()` — ⚪ Interno
+- `delete()` — ⚪ Interno
+- `isUsed()` — ⚪ Interno
+- `addTemplateData()` — ⚪ Interno
+- `data()` — ⚪ Interno
+- `addTemplateData()` — ⚪ Interno
+- `data()` — ⚪ Interno
+- `addHeaderData()` — ⚪ Interno
+- `ClassPathResource()` — ⚪ Interno
+- `ClassPathResource()` — ⚪ Interno
+- `iterateLoopAttr()` — ⚪ Interno
+- `iterateLoopTag()` — ⚪ Interno
+- `replaceValues()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `Element()` — ⚪ Interno
+- `getTemplateData()` — ⚪ Interno
+- `replaceValuesLoop()` — ⚪ Interno
+- `formatValue()` — ⚪ Interno
+- `savePDF()` — ⚪ Interno
+- `File()` — ⚪ Interno
+- `PrintWriter()` — ⚪ Interno
+- `ProcessBuilder()` — ⚪ Interno
+- `toPDF()` — ⚪ Interno
+- `File()` — ⚪ Interno
+- `File()` — ⚪ Interno
+- `PrintWriter()` — ⚪ Interno
+- `ProcessBuilder()` — ⚪ Interno
+- `parseComments()` — ⚪ Interno
+- `String()` — ⚪ Interno
+- `ObjectMapper()` — ⚪ Interno
+- `replaceSection()` — ⚪ Interno
+- `extractTemplateAnchor()` — ⚪ Interno
+- `clear()` — ⚪ Interno
+- `asString()` — ⚪ Interno
+- `InputStreamReader()` — ⚪ Interno
+- `UncheckedIOException()` — ⚪ Interno
+- `readFileToString()` — ⚪ Interno
+- `DefaultResourceLoader()` — ⚪ Interno
+- `asString()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `ProcesService` <a name='processervice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\ProcesService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findByID()` — ⚪ Interno
+- `findByName()` — ⚪ Interno
+- `findByNameCurs()` — ⚪ Interno
+- `getAll()` — ⚪ Interno
+- `getSupervisableCursos()` — ⚪ Interno
+- `getSupervisableProcedures()` — ⚪ Interno
+- `save()` — ⚪ Interno
+- `deleteById()` — ⚪ Interno
+- `delete()` — ⚪ Interno
+- `getFlowDiagram()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `RolService` <a name='rolservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\RolService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findAll()` — ⚪ Interno
+- `findOne()` — ⚪ Interno
+- `findAssignables()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `SysStatusService` <a name='sysstatusservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\SysStatusService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findAll()` — ⚪ Interno
+- `findByType()` — ⚪ Interno
+- `log()` — ⚪ Interno
+- `SysStatus()` — ⚪ Interno
+- `Timestamp()` — ⚪ Interno
+- `err()` — ⚪ Interno
+- `SysStatus()` — ⚪ Interno
+- `Timestamp()` — ⚪ Interno
+- `warn()` — ⚪ Interno
+- `SysStatus()` — ⚪ Interno
+- `Timestamp()` — ⚪ Interno
+- `save()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `TascaService` <a name='tascaservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\TascaService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findAll()` — ⚪ Interno
+- `findByProces()` — ⚪ Interno
+- `getByID()` — ⚪ Interno
+- `getByProcesTascap()` — ⚪ Interno
+- `getAllEvidencies()` — ⚪ Interno
+- `getEvidenciesByCentreTitulacioCurs()` — ⚪ Interno
+- `getEvidencesByProcedure()` — ⚪ Interno
+- `getAllAvailableEvidences()` — ⚪ Interno
+- `create()` — ⚪ Interno
+- `save()` — ⚪ Interno
+- `deleteById()` — ⚪ Interno
+- `delete()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `TipusService` <a name='tipusservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\TipusService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findAll()` — ⚪ Interno
+- `findOne()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `UsuariService` <a name='usuariservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\UsuariService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findAll()` — ⚪ Interno
+- `findByUsername()` — ⚪ Interno
+- `hasActiveRol()` — ⚪ Interno
+- `getActiveInstanciaTasques()` — ⚪ Interno
+- `getActiveInstancies()` — ⚪ Interno
+- `getSupervisableProcessos()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+```
+// Role
+```
+- `especiales()` — ⚪ Interno
+- `getSupervisableCentres()` — ⚪ Interno
+- `getInstanceAsignedUsers()` — ⚪ Interno
+- `findByRolCentre()` — ⚪ Interno
+- `save()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `UsuarisRolService` <a name='usuarisrolservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\UsuarisRolService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findAll()` — ⚪ Interno
+- `exists()` — ⚪ Interno
+- `find()` — ⚪ Interno
+- `findActive()` — ⚪ Interno
+- `findLast()` — ⚪ Interno
+- `findLastNum()` — ⚪ Interno
+- `hasActiveRol()` — ⚪ Interno
+- `findActiveRols()` — ⚪ Interno
+- `isGrantedUser()` — ⚪ Interno
+- `isGrantedSupervisor()` — ⚪ Interno
+- `isAdminUser()` — ⚪ Interno
+- `isDataTestUser()` — ⚪ Interno
+- `hasActiveRol()` — ⚪ Interno
+- `hasActiveRoles()` — ⚪ Interno
+- `hasActiveAmbit()` — ⚪ Interno
+- `hasAssociatedProcs()` — ⚪ Interno
+- `findAssociatedProcs()` — ⚪ Interno
+- `findManagerByCentre()` — ⚪ Interno
+- `findManagerByTitulacio()` — ⚪ Interno
+- `findManagerByCentres()` — ⚪ Interno
+- `findManagerByTitulacions()` — ⚪ Interno
+- `getSpecialRoles()` — ⚪ Interno
+- `save()` — ⚪ Interno
+- `delete()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `WikiService` <a name='wikiservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\WikiService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findByCategoria()` — ⚪ Interno
+- `save()` — ⚪ Interno
+
+---
+
+
+# 📈 Estadísticas finales
+
+- Total de clases: 30
+- Total de métodos: 438
+- Total de comentarios: 8
+
+✅ **Fin del reporte de carpeta.**

+ 1650 - 0
reporte_web.md

@@ -0,0 +1,1650 @@
+# 📁 Reporte de carpeta: `web`
+
+> Detalle de clases, métodos y comentarios extraídos automáticamente
+
+
+### 🧩 Clase: `AdminController` <a name='admincontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\AdminController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+// GET para conseguir todas las instancias del sistema en ese momento.
+```
+- `getInstances()` — 🟢 Endpoint
+```
+// Función utilizada para conseguir las instancias que tiene todo el sistema
+```
+- `loadInstanceData()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+```
+// POST que recoge los campos introducidos en los inputs (Proceso, centro y titulación) y busca las instancias relacionadas
+```
+- `instantiate()` — 🟢 Endpoint
+- `Email()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `Email()` — ⚪ Interno
+- `if()` — ⚪ Interno
+```
+// Type T procedure for one whole categor
+```
+- `place()` — ⚪ Interno
+- `Email()` — ⚪ Interno
+- `if()` — ⚪ Interno
+```
+// Type C procedure for all active place
+```
+- `for()` — ⚪ Interno
+- `Email()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `Email()` — ⚪ Interno
+```
+// GET que recoge todos los procedimientos del sistema
+```
+- `getProcedures()` — 🟢 Endpoint
+```
+// Función utilizada en el GET que recoge todos los procedimientos
+```
+- `loadProceduresData()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+```
+// POST que elimina una instancia concreta
+```
+- `deleteInstance()` — 🟢 Endpoint
+```
+// POST que reinicia una instancia por completo
+```
+- `clearInstance()` — 🟢 Endpoint
+- `Email()` — ⚪ Interno
+```
+// POST que establece que una instancia ha sido cerrada, cambiandole su estado
+```
+- `closeInstance()` — 🟢 Endpoint
+```
+// POST que se encarga de eliminar una tarea concreta de una instancia
+```
+- `removeTask()` — 🟢 Endpoint
+```
+// POST que se encarga de reiniciar por completo una tarea de una instancia
+```
+- `clearTask()` — 🟢 Endpoint
+```
+// POST que reinicia una tarea del procedimiento, eliminando datos anteriores y creando una nueva vesión de esta
+```
+- `reloadTask()` — 🟢 Endpoint
+- `InstanciaTasca()` — ⚪ Interno
+- `Email()` — ⚪ Interno
+```
+// POST que tiene como objetivo reactivar una tarea
+```
+- `activateTask()` — 🟢 Endpoint
+- `InstanciaTasca()` — ⚪ Interno
+- `Email()` — ⚪ Interno
+```
+// POST que edita la información de una tarea ya existente
+```
+- `editTask()` — 🟢 Endpoint
+- `InstanciaTasca()` — ⚪ Interno
+- `Email()` — ⚪ Interno
+- `getMailing()` — 🟢 Endpoint
+- `sendMails()` — 🟢 Endpoint
+- `Email()` — ⚪ Interno
+```
+// POST para la creación de un procedimiento nuevo
+```
+- `newProcedure()` — 🟢 Endpoint
+- `Proces()` — ⚪ Interno
+- `Tasca()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+```
+// POST para editar un procedimiento ya existente
+```
+- `editProcedure()` — 🟢 Endpoint
+- `Tasca()` — ⚪ Interno
+- `Tasca()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+```
+// POST que elimina un procedimiento
+```
+- `removeProcedure()` — 🟢 Endpoint
+```
+// POST que le eliminar un usuario concreto del sitema
+```
+- `removeUserrole()` — 🟢 Endpoint
+```
+// POST para añadir un nuevo usuario al sistema
+```
+- `newUserrole()` — 🟢 Endpoint
+- `Usuari()` — ⚪ Interno
+- `UsuarisRol()` — ⚪ Interno
+- `UsuarisRol()` — ⚪ Interno
+- `UsuarisRol()` — ⚪ Interno
+- `UsuarisRol()` — ⚪ Interno
+- `getTemplates()` — 🟢 Endpoint
+```
+// GET que recoge todas las plantillas actuales del sistema
+```
+- `getTemplates2()` — 🟢 Endpoint
+- `File()` — ⚪ Interno
+- `File()` — ⚪ Interno
+- `File()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `loadTemplateData()` — ⚪ Interno
+```
+// POST que redefine que indicadores están asociados a una evidencia dentro de un proceso
+```
+- `updateTemplateInds()` — 🟢 Endpoint
+- `EvidenciaIndicadorEnquesta()` — ⚪ Interno
+- `EvidenciaIndicadorEnquestaPK()` — ⚪ Interno
+```
+// GET para abrir el editor de plantillas
+```
+- `getTemplateEditor()` — 🟢 Endpoint
+- `testTemplateEditor()` — 🟢 Endpoint
+```
+// GET para la carga del calendario
+```
+- `calendar()` — 🟢 Endpoint
+- `acreditacionsByCurs()` — 🟢 Endpoint
+- `AcreditacioTransfer()` — ⚪ Interno
+- `AcreditacioTransfer()` — ⚪ Interno
+- `AcreditacioTransfer()` — ⚪ Interno
+- `UpdateAcreditacio()` — 🟢 Endpoint
+- `SimpleDateFormat()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `AjaxController` <a name='ajaxcontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\AjaxController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getActiveCentres()` — 🟢 Endpoint
+- `DummyDataTransfer()` — ⚪ Interno
+- `getActiveTitulationsByCenter()` — 🟢 Endpoint
+- `DummyDataTransfer()` — ⚪ Interno
+```
+// POST que buscar titulaciones que se encuentren asociadas a uno o varios centros
+```
+- `getTitulationsByCenter()` — 🟢 Endpoint
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+```
+// POST que se utiliza para conseguir los cursos a partir de la titulación
+```
+- `getYearsByCenterTitulation()` — 🟢 Endpoint
+- `DummyDataTransfer()` — ⚪ Interno
+```
+// POST que se utiliza para conseguir los procedimiento que se han llevado a cabo por cursos y por titulación
+```
+- `getProceduresByCenterTitulationYear()` — 🟢 Endpoint
+- `DummyDataTransfer()` — ⚪ Interno
+```
+// POST para buscar pas evidencias a partir del año, centro y titulación
+```
+- `getEvidencesByCenterTitulationYear()` — 🟢 Endpoint
+- `DummyDataTransfer()` — ⚪ Interno
+```
+// POST que recoge toda las titulaciones que contiene un centro para el manager
+```
+- `getCenterTitulations()` — 🟢 Endpoint
+- `getTitulationsByCenters()` — 🟢 Endpoint
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `getTitulationsByCenter()` — 🟢 Endpoint
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `getAllTitulationsByCenter()` — 🟢 Endpoint
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+```
+// POST para encontrar el centro a partir de los procedimientos
+```
+- `getAllCentresByAmbit()` — 🟢 Endpoint
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+```
+// POST para encontrar un procedimiento concreto
+```
+- `findProcedure()` — 🟢 Endpoint
+- `Proces()` — ⚪ Interno
+- `if()` — ⚪ Interno
+```
+// POST para encontar las plantillas concretas para cierta titulación, centro o procedimiento
+```
+- `findTemplates()` — 🟢 Endpoint
+- `findTemplatesInds()` — 🟢 Endpoint
+```
+// GET para renderizar el formulario de cración de nueva tarea
+```
+- `newTaskForm()` — 🟢 Endpoint
+- `newUserRoleForm()` — 🟢 Endpoint
+- `findTemplate()` — 🟢 Endpoint
+```
+// GET para comprobar si una plantilla esta siendo usada
+```
+- `isTemplateUsed()` — 🟢 Endpoint
+```
+// POST para crear el form de creación de plantilla
+```
+- `formTemplate()` — 🟢 Endpoint
+- `Plantilla()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+```
+// DELETE para eliminar una plantilla concreta
+```
+- `formTemplateRemove()` — 🟢 Endpoint
+```
+// POST para guadar una de las plantillas
+```
+- `templateSave()` — 🟢 Endpoint
+- `if()` — ⚪ Interno
+- `Plantilla()` — ⚪ Interno
+- `saveTemplate()` — 🟢 Endpoint
+```
+// POST para añadir un evento al calendario
+```
+- `calendarAddEvent()` — 🟢 Endpoint
+- `SimpleDateFormat()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+- `Calendari()` — ⚪ Interno
+```
+// POST que actualiza el evento ddel calendario
+```
+- `calendarAddEvent()` — 🟢 Endpoint
+- `SimpleDateFormat()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+```
+// GET que recoge todos los eventos del calendario
+```
+- `calendarGetEvents()` — 🟢 Endpoint
+```
+// DELETE que elimina un evento del calendario
+```
+- `calendarDeleteEvent()` — 🟢 Endpoint
+```
+// POST para instanciar un proceso desde el calendario
+```
+- `instantiate()` — 🟢 Endpoint
+- `BigInteger()` — ⚪ Interno
+- `Email()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `BigInteger()` — ⚪ Interno
+- `Email()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `BigInteger()` — ⚪ Interno
+- `Email()` — ⚪ Interno
+- `Date()` — ⚪ Interno
+- `Date()` — ⚪ Interno
+- `groupedTitToText()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `DashboardController` <a name='dashboardcontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\DashboardController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+// GET para cargar el dashboard con toda su información
+```
+- `getOrganList()` — 🟢 Endpoint
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+```
+//GET para mostrar el dashboard a partir de un numero ruct
+```
+- `getDashboardOrgan()` — 🟢 Endpoint
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `loadReports()` — ⚪ Interno
+- `AnyDimensioDTO()` — ⚪ Interno
+- `TreeDTOAny()` — ⚪ Interno
+- `TreeDTOOrgan()` — ⚪ Interno
+- `TreeDTOInstancia()` — ⚪ Interno
+- `compare()` — ⚪ Interno
+- `TreeDTOOrgan()` — ⚪ Interno
+- `TreeDTOInstancia()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `TreeDTODimensio()` — ⚪ Interno
+- `InstanciaDTO()` — ⚪ Interno
+- `DimensioInstanciesDTO()` — ⚪ Interno
+```
+// GET para conseguir la documentación ya a aportada a partir del id de la tituación
+```
+- `loadDocuments()` — 🟢 Endpoint
+- `CategoriaDocumentDTO()` — ⚪ Interno
+- `DocumentDTO()` — ⚪ Interno
+- `DocumentDTO()` — ⚪ Interno
+- `loadGantt()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `compare()` — ⚪ Interno
+- `getDocumentChildCats()` — 🟢 Endpoint
+- `getDocumentChildCatsU()` — 🟢 Endpoint
+```
+// POST para guardar un documento en el sistema
+```
+- `uploadDocument()` — 🟢 Endpoint
+- `Document()` — ⚪ Interno
+- `Date()` — ⚪ Interno
+```
+// POST para añadir un documento a un centro cocncreto
+```
+- `archiveDocuments()` — 🟢 Endpoint
+```
+// GET para conseguir todos los graficos a partir de un RUCT
+```
+- `getGraphDataList()` — 🟢 Endpoint
+```
+//GET para conseguir todos los datos concretos de tasas para las tablas
+```
+- `getGraphDataTaxes()` — 🟢 Endpoint
+```
+//GET para conseguir todos los datos concretos de cada gráfico
+```
+- `getGraphData()` — 🟢 Endpoint
+- `Indicador()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `getLinks()` — 🟢 Endpoint
+- `createLink()` — 🟢 Endpoint
+- `SimpleDateFormat()` — ⚪ Interno
+- `Link()` — ⚪ Interno
+- `Date()` — ⚪ Interno
+- `deleteLink()` — 🟢 Endpoint
+```
+// Función encargada de cargar a los managers a partir del centro y titulación
+```
+- `loadManagers()` — ⚪ Interno
+- `compare()` — ⚪ Interno
+- `compare()` — ⚪ Interno
+```
+// Función para comprobar si un usario esta permitido para hacer una acción
+```
+- `isSuitable()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+```
+// Función para saber el tamaño de un documento concreto
+```
+- `getSize()` — ⚪ Interno
+- `FileSystemResource()` — ⚪ Interno
+- `bytesToHuman()` — ⚪ Interno
+- `StringCharacterIterator()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `DataController` <a name='datacontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\DataController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+// GET que carga la interfaz relacionada con toda la importación de datos
+```
+- `renderImport()` — 🟢 Endpoint
+```
+// POST encargado de importar los datos que han sido adjuntados
+```
+- `uploadFile()` — 🟢 Endpoint
+- `InputStreamReader()` — ⚪ Interno
+- `if()` — ⚪ Interno
+```
+// POST encargado de eliminar unos datos concretos
+```
+- `delete()` — 🟢 Endpoint
+```
+// POST encargado de mostrar los datos por pantalla
+```
+- `show()` — 🟢 Endpoint
+```
+// GET para mostrar el formulario de busqueda de datos
+```
+- `current()` — 🟢 Endpoint
+```
+//GET para cargar el apartado de coonsolidate
+```
+- `consolidate()` — 🟢 Endpoint
+- `check()` — ⚪ Interno
+```
+// POST que soluciona problemas de integridad que puedan tener los datos
+```
+- `fixIntegrityIssues()` — 🟢 Endpoint
+- `if()` — ⚪ Interno
+```
+// POST que soluciona problemas de duplicados que puedan tener los datos
+```
+- `fixDuplicatesIssues()` — 🟢 Endpoint
+```
+// POST que consolida los datos pasadas por la encuesta
+```
+- `consolidate()` — 🟢 Endpoint
+```
+// POST que comprueba los datos a partir de la encuesta
+```
+- `countByEnquesta()` — 🟢 Endpoint
+```
+// POST para mostrar los datos en columnas
+```
+- `listTableColumns()` — 🟢 Endpoint
+```
+// GET que muestra los datos de un curso que se ha elegido
+```
+- `show()` — 🟢 Endpoint
+```
+// POST que muestra los datos del curso actual
+```
+- `currentShow()` — 🟢 Endpoint
+- `if()` — ⚪ Interno
+- `getDatasources()` — 🟢 Endpoint
+
+---
+
+
+### 🧩 Clase: `DownloadController` <a name='downloadcontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\DownloadController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+/*
+ * Download a file associated with a task instance
+ * @param model
+ * @param idInstanciaTasca The ID of the task instance
+ * @param response HttpServletResponse
+ * @return A FileSystemResource representing the file to download
+ */
+```
+- `download()` — 🟢 Endpoint
+- `FileSystemResource()` — ⚪ Interno
+- `FileSystemResource()` — ⚪ Interno
+- `FileNotFoundException()` — ⚪ Interno
+```
+/*
+ * Download a document by its ID
+ * @param model
+ * @param idDocument The ID of the document to download
+ * @param response HttpServletResponse
+ * @return A FileSystemResource representing the document to download
+ */
+```
+- `downloadDocument()` — 🟢 Endpoint
+- `FileSystemResource()` — ⚪ Interno
+- `FileNotFoundException()` — ⚪ Interno
+```
+/*
+ * Download the latest report for a given process and degree
+ * @param model
+ * @param idTitulacio The ID of the degree
+ * @param nomProces The name of the process
+ * @param response HttpServletResponse
+ * @return A FileSystemResource representing the report to download
+ */
+```
+- `downloadReport()` — 🟢 Endpoint
+- `File()` — ⚪ Interno
+- `FileSystemResource()` — ⚪ Interno
+- `FileSystemResource()` — ⚪ Interno
+```
+/*
+ * Download a populated template for a given task instance
+ * @param model
+ * @param idTascai The ID of the task instance
+ * @param response HttpServletResponse
+ * @return A byte array representing the populated template to download
+ */
+```
+- `downloadTemplate()` — 🟢 Endpoint
+```
+/* Check if specific template exists */
+Integer idTitulacio = it.getInstancia().getTitulacio();
+String templatePath = this.templatePath+tasca.getCodiEvidencia().replace(".", "_")+".docx";
+if(it.getInstancia().getOrgan().getTambit().equals("G") | idTitulacio == 1) {
+File f = new File(this.templatePath+"/T1/"+tasca.getCodiEvidencia().replace(".", "_")+".docx");
+if(f.exists() && !f.isDirectory()) { 
+templatePath = this.templatePath+"/T1/"+tasca.getCodiEvidencia().replace(".", "_")+".docx";
+}
+}
+else if(it.getInstancia().getOrgan().getTambit().equals("M") | idTitulacio == 2) {
+File f = new File(this.templatePath+"/T2/"+tasca.getCodiEvidencia().replace(".", "_")+".docx");
+if(f.exists() && !f.isDirectory()) { 
+templatePath = this.templatePath+"/T2/"+tasca.getCodiEvidencia().replace(".", "_")+".docx";
+}
+}
+
+File f = new File(templatePath);
+if(!f.exists()) {
+FileNotFoundException e = new FileNotFoundException("No se ha encontrado la plantilla "+tasca.getCodiEvidencia()+".docx");
+e.setStackTrace(new StackTraceElement[0]);
+throw e;
+}
+
+InputStream in = new FileInputStream(f);
+IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in, reportId, TemplateEngineKind.Velocity);
+FieldsMetadata metadata = new FieldsMetadata();
+metadata.addFieldAsImage("logo");
+report.setFieldsMetadata(metadata);
+IContext context = report.createContext();
+IImageProvider img;
+if(new File(this.logoPath+"C"+Integer.toString(it.getInstancia().getCentre())+".png").exists()) {
+img = new FileImageProvider(new File(this.logoPath+"C"+Integer.toString(it.getInstancia().getCentre())+".png"));
+}
+else {
+img = new FileImageProvider(new File(this.logoPath+"C0.png"));
+}
+context.put("logo", img);
+context.put("centre", it.getInstancia().getOrgan().getOrgan().getNomVal());
+context.put("titulacio", it.getInstancia().getOrgan().getNomCas());
+context.put("curs", Integer.toString(it.getInstancia().getProces().getCursAvaluat()-1)+" - "+Integer.toString(it.getInstancia().getProces().getCursAvaluat()));
+context.put("curs_anterior", Integer.toString(it.getInstancia().getProces().getCursAvaluat()-2)+" - "+Integer.toString(it.getInstancia().getProces().getCursAvaluat()-1));
+
+Proces proces = it.getInstancia().getProces();
+Integer idCentre = it.getInstancia().getCentre();
+
+if(tasca.getTipus().getTipus() == 14) { // Iterable template task
+List<Organ> titulacions = new ArrayList<Organ>();
+Integer ambit = idTitulacio/(int)1000;
+titulacions = os.getTitulacionsByTypeCentre(it.getInstancia().getOrgan().getOrgan().getId().getLugar(), ambit);
+List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();
+for(Organ x : titulacions) {
+HashMap<String, String> t = getTemplateDataArray(x.getId().getLugar(), idCentre, proces.getCursAvaluat());
+t.put("titulacio", x.getNomCas());
+data.add(t);
+} 
+context.put("data", data);
+getTemplateData(idTitulacio, idCentre, proces.getCursAvaluat(), context);
+}
+else { // NO iterable template task
+getTemplateData(idTitulacio, idCentre, proces.getCursAvaluat(), context);
+}
+
+ByteArrayOutputStream out = new ByteArrayOutputStream();  
+report.process(context, out);
+    response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\""+tasca.getCodiEvidencia()+".docx\"");
+
+return out.toByteArray();
+
+}
+
+/*
+ * Populate the template data into the context
+ * @param idTitulacio The ID of the degree
+ * @param idCentre The ID of the center
+ * @param curs The academic year
+ * @param context The IContext to populate
+ */
+```
+- `getTemplateData()` — ⚪ Interno
+```
+/*  Indicadores del data warehouse */
+try {
+List<Indicador> indicadores;
+indicadores = this.is.getFromTitulacion(idTitulacio.toString(), curs);
+for(Indicador i : indicadores) { 
+context.put(i.getIndicador(), i.getValor());
+}
+} 
+catch(Exception e) { }
+
+/*  Indicadores de encuestas  */
+List<IndicadorEnquestaRepository.IndicadorEnquestaValor> enquestesT;
+enquestesT = this.ies.getAllInds(idTitulacio, idCentre, curs);
+
+for(IndicadorEnquestaRepository.IndicadorEnquestaValor i : enquestesT) {
+String indicador = i.getAmbit().equals("t") ? (i.getEnquesta()+"_"+i.getIndicador()) : (i.getEnquesta()+"_"+i.getIndicador()+"_"+i.getAmbit());
+indicador = i.getTipus().equals("avg") ? indicador : (indicador += "_"+i.getTipus());
+indicador = i.getCursd() == null ? indicador : (indicador += "_"+i.getCursd());
+context.put(indicador, formatValue(i.getValor()));
+}
+}
+
+/*
+ * Format a value for template insertion
+ * @param v The value to format
+ * @return The formatted value
+ */
+```
+- `formatValue()` — ⚪ Interno
+```
+/*
+ * Get template data as a HashMap
+ * @param idTitulacio The ID of the degree
+ * @param idCentre The ID of the center
+ * @param curs The academic year
+ * @return A HashMap containing the template data
+ */
+private HashMap<String, String> getTemplateDataArray(Integer idTitulacio, Integer idCentre, Integer curs) {
+
+HashMap<String, String> info = new HashMap<String, String>();
+
+/*  Indicadores del data warehouse */
+try {
+List<Indicador> indicadores;
+indicadores = this.is.getFromTitulacion(idTitulacio.toString(), curs);
+for(Indicador i : indicadores) { 
+info.put(i.getIndicador(), i.getValor());
+}
+} 
+catch(Exception e) { }
+
+/*  Indicadores de encuestas  */
+List<IndicadorEnquestaRepository.IndicadorEnquestaValor> enquestesT;
+enquestesT = this.ies.getAllInds(idTitulacio, idCentre, curs);
+
+for(IndicadorEnquestaRepository.IndicadorEnquestaValor i : enquestesT) {
+String indicador = i.getAmbit().equals("t") ? (i.getEnquesta()+"_"+i.getIndicador()) : (i.getEnquesta()+"_"+i.getIndicador()+"_"+i.getAmbit());
+indicador = i.getTipus().equals("avg") ? indicador : (indicador += "_"+i.getTipus());
+indicador = i.getCursd() == null ? indicador : (indicador += "_"+i.getCursd());
+info.put(indicador, formatValue(i.getValor()));
+}
+
+return info;
+}
+
+/*
+ * Test endpoint to generate a populated template for a given task (id of task)
+ * @param model
+ * @param idTitulacio The ID of the degree
+ * @param idCentre The ID of the center
+ * @param idTascap The ID of the task
+ * @param idProces The ID of the process
+ * @param response HttpServletResponse
+ * @return A byte array representing the populated template
+ */
+```
+- `testTemplate()` — 🟢 Endpoint
+```
+/* Check if specific template exists */
+String templatePath = this.templatePath+tasca.getCodiEvidencia().replace(".", "_")+".docx";
+if(titulacio.getTambit().equals("G") | idTitulacio == 1) {
+File f = new File(this.templatePath+"/T1/"+tasca.getCodiEvidencia().replace(".", "_")+".docx");
+if(f.exists() && !f.isDirectory()) { 
+templatePath = this.templatePath+"/T1/"+tasca.getCodiEvidencia().replace(".", "_")+".docx";
+}
+}
+else if(titulacio.getTambit().equals("M") | idTitulacio == 2) {
+File f = new File(this.templatePath+"/T2/"+tasca.getCodiEvidencia().replace(".", "_")+".docx");
+if(f.exists() && !f.isDirectory()) { 
+templatePath = this.templatePath+"/T2/"+tasca.getCodiEvidencia().replace(".", "_")+".docx";
+}
+}
+
+InputStream in = new FileInputStream(new File(templatePath));
+IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in, reportId, TemplateEngineKind.Velocity);
+FieldsMetadata metadata = new FieldsMetadata();
+metadata.addFieldAsImage("logo");
+report.setFieldsMetadata(metadata);
+IContext context = report.createContext();
+IImageProvider img;
+if(new File(this.logoPath+"C"+Integer.toString(idCentre)+".png").exists()) {
+img = new FileImageProvider(new File(this.logoPath+"C"+Integer.toString(idCentre)+".png"));
+}
+else {
+img = new FileImageProvider(new File(this.logoPath+"C0.png"));
+}
+context.put("logo", img);
+context.put("centre", centre.getNomVal());
+context.put("titulacio", titulacio.getNomVal());
+context.put("curs", Integer.toString(proces.getCursAvaluat()-1)+" - "+Integer.toString(proces.getCursAvaluat()));
+context.put("curs_anterior", Integer.toString(proces.getCursAvaluat()-2)+" - "+Integer.toString(proces.getCursAvaluat()-1));
+
+if(tasca.getTipus().getTipus() == 14) { // Iterable template task
+List<Organ> titulacions = new ArrayList<Organ>();
+titulacions = os.getTitulacionsByTypeCentre(centre.getId().getLugar(), ambit);
+List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();
+for(Organ x : titulacions) {
+HashMap<String, String> t = getTemplateDataArray(x.getId().getLugar(), idCentre, proces.getCursAvaluat());
+t.put("titulacio", x.getNomCas());
+data.add(t);
+}
+context.put("data", data);
+getTemplateData(idTitulacio, idCentre, proces.getCursAvaluat(), context);
+}
+else { // NO iterable template task
+getTemplateData(idTitulacio, idCentre, proces.getCursAvaluat(), context);
+}
+
+ByteArrayOutputStream out = new ByteArrayOutputStream();  
+report.process(context, out);
+    response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\""+tasca.getCodiEvidencia()+".docx\"");
+
+return out.toByteArray();
+
+}
+
+/*
+ * Test endpoint to generate a populated template for a given degree and evidence (Type of task)
+ * @param model
+ * @param idTitulacio The ID of the degree
+ * @param idCentre The ID of the center
+ * @param evidencia The name of the evidence
+ * @param curs The academic year
+ * @param tipusTasca The type of task
+ * @param response HttpServletResponse
+ * @return A byte array representing the populated template
+ */
+```
+- `testTemplate()` — 🟢 Endpoint
+```
+/* Check if specific template exists */
+String templatePath = this.templatePath+evidencia.replace(".", "_").replace(" (G)", "").replace(" (M)", "")+".docx";
+if(idTitulacio < 2000 | idTitulacio == 1) {
+File f = new File(this.templatePath+"/T1/"+evidencia.replace(".", "_").replace(" (G)", "").replace(" (M)", "")+".docx");
+if(f.exists() && !f.isDirectory()) { 
+templatePath = this.templatePath+"/T1/"+evidencia.replace(".", "_").replace(" (G)", "").replace(" (M)", "")+".docx";
+}
+ambit = 1;
+}
+else if((idTitulacio >= 2000 & idTitulacio < 3000) | idTitulacio == 2) {
+File f = new File(this.templatePath+"/T2/"+evidencia.replace(".", "_").replace(" (G)", "").replace(" (M)", "")+".docx");
+if(f.exists() && !f.isDirectory()) { 
+templatePath = this.templatePath+"/T2/"+evidencia.replace(".", "_").replace(" (G)", "").replace(" (M)", "")+".docx";
+}
+ambit = 2;
+}
+
+InputStream in = new FileInputStream(new File(templatePath));
+IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in, reportId, TemplateEngineKind.Velocity);
+FieldsMetadata metadata = new FieldsMetadata();
+metadata.addFieldAsImage("logo");
+report.setFieldsMetadata(metadata);
+IContext context = report.createContext();
+IImageProvider img;
+if(new File(this.logoPath+"C"+Integer.toString(idCentre)+".png").exists()) {
+img = new FileImageProvider(new File(this.logoPath+"C"+Integer.toString(idCentre)+".png"));
+}
+else {
+img = new FileImageProvider(new File(this.logoPath+"C0.png"));
+}
+context.put("logo", img);
+context.put("centre", centre.getNomVal());
+context.put("titulacio", titulacio.getNomVal());
+context.put("curs", Integer.toString(curs-1)+" - "+Integer.toString(curs));
+context.put("curs_anterior", Integer.toString(curs-2)+" - "+Integer.toString(curs-1));
+
+if(tipusTasca == 14) { // Iterable template task
+List<Organ> titulacions = new ArrayList<Organ>();
+titulacions = os.getTitulacionsByTypeCentre(centre.getId().getLugar(), ambit);
+List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();
+for(Organ x : titulacions) {
+HashMap<String, String> t = getTemplateDataArray(x.getId().getLugar(), idCentre, curs);
+t.put("titulacio", x.getNomCas());
+data.add(t);
+}
+context.put("data", data);
+getTemplateData(idTitulacio, idCentre, curs, context);
+}
+else { // NO iterable template task
+getTemplateData(idTitulacio, idCentre, curs, context);
+}
+
+ByteArrayOutputStream out = new ByteArrayOutputStream();  
+report.process(context, out);
+    response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\""+evidencia+".docx\"");
+
+return out.toByteArray();
+
+}
+
+/*
+ * Generate a PDF from the content of a task instance (unused)
+ * @param model
+ * @param idTascai The ID of the task instance
+ * @param response HttpServletResponse
+ * @return A byte array representing the generated PDF
+ */
+```
+- `downloadTemplatePdf()` — 🟢 Endpoint
+```
+/*
+ * Generate a PDF preview from provided content
+ * @param model
+ * @param content The content to convert to PDF
+ * @param idtascai Optional ID of the task instance for context
+ * @param response HttpServletResponse
+ */
+```
+- `downloadTemplatePdf()` — 🟢 Endpoint
+
+---
+
+
+### 🧩 Clase: `ExportController` <a name='exportcontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\ExportController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+/*
+ * Export data for a given process and task as CSV
+ * @param model
+ * @param auth Authentication
+ * @param response HttpServletResponse
+ * @param id_p Process ID
+ * @param id_t Task ID
+ */
+```
+- `exportData()` — 🟢 Endpoint
+```
+//@GetMapping("/export/{id_p}/{id_t}")  
+//public void exportData(Model model, Authentication auth, HttpServletResponse response, 
+//@PathVariable Integer id_p, @PathVariable Integer id_t) throws IOException {
+//if(!((Usuari)auth.getPrincipal()).isAdmin() & !((Usuari)auth.getPrincipal()).isDataTest()) {
+//return;
+//}
+//
+//response.setContentType("text/csv");
+//        response.setCharacterEncoding("UTF-8");
+//        response.setHeader("Content-Disposition", "attachment; filename=data_export.csv");
+//
+//PrintWriter pw = response.getWriter();
+//Proces p = this.ps.findByID(id_p);
+//List<Instancia> ins = p.getInstancies();
+//List<String[]> lines = new ArrayList<>();
+//if(p.getNomProces().equals("SAEM")) {
+//String[] header = {"centre", "titulacio", "cod_int", "nom_int", "per_int", "obs_int", "cod_fin", "nom_fin", "per_fin", "obs_fin", "data_fi_docencia"};
+//lines.add(header);
+//}
+//else {
+//String[] header = {"centre", "titulacio", "cod_assignatura_1er", "nom_assignatura_1er", "obs_assignatura_1er", "cod_assignatura_3er", "nom_assignatura_3er", "obs_assignatura_3er"};
+//lines.add(header);
+//}
+//
+//for(Instancia i : ins) {
+//InstanciaTasca it = i.getInstanciaTasca().stream()
+//     .filter(c -> id_t.equals(c.getTasca().getIdTascap()))
+//     .findAny()
+//     .orElse(null);
+//if(it == null) {
+//continue;
+//}
+//if(!it.getEstat().equals("E")){
+//continue;
+//}
+//
+//System.out.println(it.getText());
+//Document doc = Jsoup.parseBodyFragment(it.getText());
+//        int size = lines.get(0).length;
+//        String[] line = new String[size];
+//        line[0] = i.getCentre().toString();
+//line[1] = i.getTitulacio().toString();
+//String[] ids = {"", "",
+////"ind_enquestes_1er_modul_cod", "ind_enquestes_1er_modul_nom", "ind_enquestes_1er_modul_per", "ind_enquestes_1er_modul_obs", 
+//        //"ind_enquestes_3er_modul_cod", "ind_enquestes_3er_modul_nom", "ind_enquestes_3er_modul_per", "ind_enquestes_3er_modul_obs", 
+//    "ind_enquestes_1er_modul_cod", "ind_enquestes_1er_modul_nom", "ind_enquestes_1er_modul_obs", 
+//        "ind_enquestes_3er_modul_cod", "ind_enquestes_3er_modul_nom", "ind_enquestes_3er_modul_obs", 
+//        "mceEditable"};
+//
+//for(int x = 2; x<=8; x++) {
+//if(ids[x].startsWith("ind_")) {
+//try {
+//if(ids[x].equals("ind_enquestes_1er_modul_obs")) {
+//line[x] = doc.getElementById("ind_enquestes_1er_modul_nom").nextElementSibling().text();
+//}
+//else {
+//System.out.println(doc.getElementById(ids[x]));
+//line[x] = doc.getElementById(ids[x]).text();
+//}
+//
+//}
+//catch(Exception e) {
+//line[x] = "[error]";
+//System.out.println("instancia: "+i.getIdInstancia().toString()+", centre: "+i.getCentre().toString()+", titulacio: "+i.getTitulacio().toString());
+//}
+//}/*
+//else {
+//try {
+//line[x] = doc.getElementsByClass(ids[x]).last().text();
+//}
+//catch(Exception e) {
+//line[x] = "[error]";
+//System.out.println("instancia: "+i.getIdInstancia().toString()+", centre: "+i.getCentre().toString()+", titulacio: "+i.getTitulacio().toString());
+//}
+//}*/
+//}
+//
+//lines.add(line);    
+//}
+//
+//lines.stream()
+//         .map(this::convertToCSV)
+//         .forEach(pw::println);
+//pw.close();
+//pw.flush();
+//}
+
+/*
+ * Export data for a given process and task as CSV (not used)
+ * @param model
+ * @param auth Authentication
+ * @param response HttpServletResponse
+ * @param id_p Process ID
+ * @param id_t Task ID
+ */
+```
+- `exportData2()` — 🟢 Endpoint
+```
+/*
+ * Convert an array of Strings to a single CSV line, escaping special characters
+ * @param data Array of Strings to convert
+ * @return A single CSV line as a String
+ */
+```
+- `convertToCSV()` — ⚪ Interno
+```
+/*
+ * Escape special characters in a String for CSV format
+ * @param data The String to escape
+ * @return The escaped String
+ */
+```
+- `escapeSpecialCharacters()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `IndexController` <a name='indexcontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\IndexController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+/*
+ * Redirect root to /procedures if authenticated, to /login otherwise
+ * @param model
+ * @param auth Authentication
+ * @return "procedures" if authenticated, "redirect: login" otherwise
+ */
+```
+- `getHome()` — 🟢 Endpoint
+
+---
+
+
+### 🧩 Clase: `KeepAliveController` <a name='keepalivecontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\KeepAliveController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+/*
+ * Simple endpoint to check if the user session is still active.
+ * Returns "alive" if the user
+ * is authenticated, "0" otherwise.
+ * @param model
+ * @param auth Authentication
+ * @return "alive" if the user is
+ * authenticated, "0" otherwise.
+ */
+```
+- `getItems()` — 🟢 Endpoint
+
+---
+
+
+### 🧩 Clase: `LoginController` <a name='logincontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\LoginController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `get()` — 🟢 Endpoint
+
+---
+
+
+### 🧩 Clase: `ManagersController` <a name='managerscontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\ManagersController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+/*
+ * Load the managers administration page data into the model
+ * - List of centres and titulacions the logged user can manage
+ * - List of all users
+ * - List of assignable roles
+ * - If there are search results in the session, load them too
+ * - If there is a roleExists attribute in the session, load it too
+ * - The view is managers.html
+ */
+```
+- `managersForm()` — 🟢 Endpoint
+```
+/*
+ * Process the search form submission and load the results into the model
+ * @Param centres List of centre ids to search managers in
+ * @Param titulacions List of titulacion ids to search managers in
+ * @Return The view component list_managers
+ */
+```
+- `managersSearch()` — 🟢 Endpoint
+```
+/*
+ * Load the search results into the model
+ * @Param model The model to load the data into
+ * @Param centres List of centre ids to search managers in
+ * @Param titulacions List of titulacion ids to search managers in
+ */
+```
+- `loadManagers()` — ⚪ Interno
+- `compare()` — ⚪ Interno
+- `compare()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `ParseController` <a name='parsecontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\ParseController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+/*
+ * Load the parsing options page data into the model
+ * @param model
+ * @param auth Authentication
+ * @param err Optional error message
+ * @param ok Optional success message
+ * @return The name of the view to render
+ */
+```
+- `getParse()` — 🟢 Endpoint
+- `if()` — ⚪ Interno
+```
+/*
+ * Parse a given table from a given database for a given year
+ * @param model
+ * @param auth Authentication
+ * @param response HttpServletResponse
+ * @param database The database to parse from
+ * @param table The table to parse from
+ * @param year The year to parse from
+ */
+```
+- `doParse()` — 🟢 Endpoint
+```
+/*
+ * Parse table depending on the action requested: mediasCentroNP, bienalesProfesGrado, etc
+ * @param model
+ * @param auth Authentication
+ * @param response HttpServletResponse
+ * @param action The action to perform
+ */
+```
+- `doAction()` — 🟢 Endpoint
+```
+/*
+ * Method to delete survey indicators from the database
+ * @param model
+ * @param auth Authentication
+ * @param response HttpServletResponse
+ * @param action The survey to delete indicators from
+ * @param year The year of the survey to delete indicators from (0 for all years)
+ */
+```
+- `doDelete()` — 🟢 Endpoint
+
+---
+
+
+### 🧩 Clase: `ProceduresController` <a name='procedurescontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\ProceduresController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+/* Redirect root to /procedures */
+```
+- `getRoot()` — 🟢 Endpoint
+```
+/*
+ * Load the list of active procedure instances for the logged-in user
+ * 
+ * @param model 
+ * @param auth Authentication
+ * @param session HttpSession
+ * @param _new Optional parameter to indicate a new access
+ * @return The name of the view to render
+ */
+```
+- `getActiveInstances()` — 🟢 Endpoint
+- `InstanciaTransfer()` — ⚪ Interno
+```
+/*
+ * Loads a procedure instance and its tasks
+ * 
+ * @param model 
+ * @param auth Authentication
+ * @param session HttpSession
+ * @param id Instancia ID Instance to load
+ * @return The name of the view to render
+ */
+```
+- `getInstance()` — 🟢 Endpoint
+```
+/*
+ * Updates a task instance with evidence files (for specific task types)
+ * 
+ * @param model
+ * @param auth Authentication
+ * @param session HttpSession
+ * @param id Instancia ID Instance to load
+ * @param params Form parameters
+ * @param evidencias List of evidence files (if any)
+ * @return The number of files uploaded (as a String)
+ * @throws IllegalStateException
+ * @throws IOException
+ * @throws InterruptedException
+ */
+```
+- `updateInstanciaTascaEvidencia()` — 🟢 Endpoint
+- `BigInteger()` — ⚪ Interno
+```
+/* Tipos de tarea permitidas */
+final Set<Integer> suitable = Set.of(1, 12, 14);
+
+boolean newTask = (suitable.contains(it.getTasca().getTipus().getTipus())) && it.getEstat().equals("E") && 
+   (((Usuari)auth.getPrincipal()).isAdmin() || ((Usuari)auth.getPrincipal()).isGranted());
+
+if(suitable.contains(it.getTasca().getTipus().getTipus())) {   // Evidencia iterable
+String fileName = "";
+
+if(evidencias.size() > 1) {
+fileName = (newTask ? it.getIdInstanciaTasca().add(new BigInteger("1")).toString() : it.getIdInstanciaTasca().toString()) + ".zip";
+try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(filePath+fileName))) {
+    for(MultipartFile f : evidencias) {
+    File tempFile = File.createTempFile("saic", "temp");
+    tempFile.deleteOnExit();
+    f.transferTo(tempFile);
+        zipOut.putNextEntry(new ZipEntry(f.getOriginalFilename()));
+        Files.copy(Paths.get(tempFile.getAbsolutePath()), zipOut);
+    }
+}
+}
+else if(evidencias.size() == 1){
+MultipartFile evidencia = evidencias.get(0);
+fileName = (newTask ? it.getIdInstanciaTasca().add(new BigInteger("1")).toString() : it.getIdInstanciaTasca().toString()) + "." +
+FilenameUtils.getExtension(evidencia.getOriginalFilename());
+evidencia.transferTo(new File(filePath+fileName));
+}
+else {
+return "0";
+}
+
+if(newTask){
+InstanciaTasca itNew = new InstanciaTasca();
+itNew.setUsuari((Usuari)auth.getPrincipal());
+itNew.setDataFet(new Date(System.currentTimeMillis()));
+itNew.setData(new Date(System.currentTimeMillis()));
+itNew.setEstat("E");
+itNew.setEvidencia(fileName);
+itNew.setInstancia(it.getInstancia());
+itNew.setTasca(it.getTasca());
+itNew.setVersion(it.getVersion()+1);
+itNew.setIdInstanciaTasca(it.getIdInstanciaTasca().add(new BigInteger("1")));
+its.save(itNew);
+}
+else {
+it.setEvidencia(fileName);
+it.setEstat("E");
+this.saveChanges(model, auth, session, it);
+}
+}
+
+return Integer.toString(evidencias.size()); 
+}
+
+/*
+ * Updates a task instance
+ * 
+ * @param model 
+ * @param auth Authentication
+ * @param session HttpSession
+ * @param id Instancia ID Instance to load
+ * @param params Form parameters
+ * @param evidencias List of evidence files (if any)
+ * @return The name of the view to render
+ */
+```
+- `updateInstanciaTasca()` — 🟢 Endpoint
+- `BigInteger()` — ⚪ Interno
+- `if()` — ⚪ Interno
+```
+// SI/N
+```
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+```
+/*
+ * Saves changes to a task instance
+ * 
+ * @param model 
+ * @param auth Authentication
+ * @param session HttpSession
+ * @param it InstanciaTasca to save
+ */
+```
+- `saveChanges()` — ⚪ Interno
+```
+/*
+ * Saves a draft of a task instance (for specific task types)
+ * 
+ * @param model
+ * @param auth Authentication
+ * @param session HttpSession
+ * @param id Instancia ID Instance to load
+ * @param text Text content of the draft
+ * @param manual Whether the save was manually triggered by the user
+ * @return The timestamp of the save operation formatted as a String
+ */
+```
+- `saveDraft()` — 🟢 Endpoint
+- `Date()` — ⚪ Interno
+- `InstanciaTascaVer()` — ⚪ Interno
+- `Timestamp()` — ⚪ Interno
+```
+/*
+ * Loads a procedure instance and its tasks into the model
+ * @param model
+ * @param auth Authentication
+ * @param id Instancia ID Instance to load
+ * @return The name of the view to render
+ */
+```
+- `loadProcedure()` — ⚪ Interno
+- `InstanciaTransfer()` — ⚪ Interno
+- `InstanciaTascaTransfer()` — ⚪ Interno
+```
+/* Comprobar estado evidencia, si vacío inyectar contenido de plantilla asociada */
+if(it.getText() == null && active) {
+itt.setText(pls.addTemplateData(it, p.getText()));
+}
+else if(active){
+itt.setText(it.getText());
+}
+}
+else {
+itt.setCodiEvidencia(it.getTasca().getCodiEvidencia());
+itt.setNomEvidenciaCas(it.getTasca().getNomEvidenciaCas());
+itt.setNomEvidenciaVal(it.getTasca().getNomEvidenciaVal());
+itt.setEvidencia(it.getEvidencia());
+}
+
+if(it.getUsuari() != null) {
+itt.setUsuariFet(it.getUsuari().getNom() + " " + it.getUsuari().getCognoms());
+}
+else {
+itt.setUsuariFet("");
+}
+itt.setAssignedToUser(its.isUserAuthorized(((Usuari)auth.getPrincipal()), itt.getIdInstanciaTasca()));
+itt.setOldEvidences(its.findOlderByProces(it.getInstancia().getCentre(), it.getInstancia().getTitulacio(), it.getInstancia().getProces().getNomProces(), i.getProces().getCursActivacio(), this.pls));
+itt.setVersions(its.findOlderVersions(it.getInstancia().getIdInstancia(), it.getTasca().getIdTasca(), it.getVersion(), this.pls));
+tasks.add(itt);
+}
+model.addAttribute("tasks", tasks);
+model.addAttribute("flow", this.getFlowDiagram(i.getProces()));
+}
+
+/*
+ * Get all drafts for a given task instance
+ * @param model
+ * @param auth Authentication
+ * @param session HttpSession
+ * @param id InstanciaTasca ID to load drafts for
+ * @return The name of the view to render
+ */
+```
+- `getDrafts()` — 🟢 Endpoint
+```
+/*
+ * Get a specific draft for a given task instance
+ * @param model
+ * @param auth Authentication
+ * @param session HttpSession
+ * @param id InstanciaTasca ID to load drafts for
+ * @param dataMod Timestamp of the draft to load
+ * @return The InstanciaTascaVer object representing the draft
+ */
+```
+- `getDraft()` — 🟢 Endpoint
+```
+/*
+ * Restore a specific draft for a given task instance
+ * @param model
+ * @param auth Authentication
+ * @param session HttpSession
+ * @param id InstanciaTasca ID to restore draft for
+ * @param dataMod Timestamp of the draft to restore
+ * @return "1" if successful, "0" otherwise
+ */
+```
+- `restoreDraft()` — 🟢 Endpoint
+```
+/*
+ * Generate a flow diagram for a given process
+ * @param proces The process to generate the flow diagram for
+ * @return A String containing the flow diagram
+ */
+```
+- `getFlowDiagram()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `ActiveSession` <a name='activesession'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\StatsController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `setId()` — ⚪ Interno
+- `setUsername()` — ⚪ Interno
+- `setFullName()` — ⚪ Interno
+- `setNpi()` — ⚪ Interno
+- `setExpired()` — ⚪ Interno
+- `setLastRequest()` — ⚪ Interno
+- `getId()` — ⚪ Interno
+- `getUsername()` — ⚪ Interno
+- `getFullName()` — ⚪ Interno
+- `getNpi()` — ⚪ Interno
+- `getExpired()` — ⚪ Interno
+- `getLastRequest()` — ⚪ Interno
+- `setUsername()` — ⚪ Interno
+- `setFullName()` — ⚪ Interno
+- `setEmail()` — ⚪ Interno
+- `getUsername()` — ⚪ Interno
+- `getFullName()` — ⚪ Interno
+- `getEmail()` — ⚪ Interno
+```
+/*
+ * Renders the admin stats page
+ * 
+ * @param model The model to pass data to the view
+ * @param auth The authentication object
+ * @return The name of the view to render
+ */
+```
+- `getStats()` — 🟢 Endpoint
+- `ActiveSession()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+- `PendingEmail()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `PendingEmail` <a name='pendingemail'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\StatsController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `setId()` — ⚪ Interno
+- `setUsername()` — ⚪ Interno
+- `setFullName()` — ⚪ Interno
+- `setNpi()` — ⚪ Interno
+- `setExpired()` — ⚪ Interno
+- `setLastRequest()` — ⚪ Interno
+- `getId()` — ⚪ Interno
+- `getUsername()` — ⚪ Interno
+- `getFullName()` — ⚪ Interno
+- `getNpi()` — ⚪ Interno
+- `getExpired()` — ⚪ Interno
+- `getLastRequest()` — ⚪ Interno
+- `setUsername()` — ⚪ Interno
+- `setFullName()` — ⚪ Interno
+- `setEmail()` — ⚪ Interno
+- `getUsername()` — ⚪ Interno
+- `getFullName()` — ⚪ Interno
+- `getEmail()` — ⚪ Interno
+```
+/*
+ * Renders the admin stats page
+ * 
+ * @param model The model to pass data to the view
+ * @param auth The authentication object
+ * @return The name of the view to render
+ */
+```
+- `getStats()` — 🟢 Endpoint
+- `ActiveSession()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+- `PendingEmail()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `StatsController` <a name='statscontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\StatsController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `setId()` — ⚪ Interno
+- `setUsername()` — ⚪ Interno
+- `setFullName()` — ⚪ Interno
+- `setNpi()` — ⚪ Interno
+- `setExpired()` — ⚪ Interno
+- `setLastRequest()` — ⚪ Interno
+- `getId()` — ⚪ Interno
+- `getUsername()` — ⚪ Interno
+- `getFullName()` — ⚪ Interno
+- `getNpi()` — ⚪ Interno
+- `getExpired()` — ⚪ Interno
+- `getLastRequest()` — ⚪ Interno
+- `setUsername()` — ⚪ Interno
+- `setFullName()` — ⚪ Interno
+- `setEmail()` — ⚪ Interno
+- `getUsername()` — ⚪ Interno
+- `getFullName()` — ⚪ Interno
+- `getEmail()` — ⚪ Interno
+```
+/*
+ * Renders the admin stats page
+ * 
+ * @param model The model to pass data to the view
+ * @param auth The authentication object
+ * @return The name of the view to render
+ */
+```
+- `getStats()` — 🟢 Endpoint
+- `ActiveSession()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+- `PendingEmail()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `SupervisionController` <a name='supervisioncontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\SupervisionController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+/*
+ * Renders the supervision page
+ * 
+ * @param model The model to pass data to the view
+ * @param auth The authentication object
+ * @param session The HTTP session
+ * @return The name of the view to render
+ */
+```
+- `supervisionForm()` — 🟢 Endpoint
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+```
+/*
+ * Handles the supervision search form submission
+ * 
+ * @param model The model to pass data to the view
+ * @param auth The authentication object
+ * @param centres The selected centers
+ * @param cursos The selected years
+ * @param titulacions The selected titulacions
+ * @param procediments The selected procedures
+ * @param evidencies The selected evidences
+ * @param searchType The type of search (by procedures or evidences)
+ * @param session The HTTP session
+ * @return The name of the view to render
+ */
+```
+- `supervisionSearch()` — 🟢 Endpoint
+- `SupervisionSearchParams()` — ⚪ Interno
+```
+/*
+ * Restores the previous search results from the session
+ * 
+ * @param model The model to pass data to the view
+ * @param auth The authentication object
+ * @param session The HTTP session
+ * @return The name of the view to render
+ */
+```
+- `restoreSearch()` — 🟢 Endpoint
+```
+/*
+ * Loads the search results based on the provided filters
+ * 
+ * @param model The model to pass data to the view
+ * @param auth The authentication object
+ * @param centres The selected centers
+ * @param titulacions The selected titulacions
+ * @param cursos The selected years
+ * @param procediments The selected procedures
+ * @param evidencies The selected evidences
+ * @param searchType The type of search (by procedures or evidences)
+ */
+```
+- `loadResults()` — ⚪ Interno
+- `InstanciaTransfer()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `TestController` <a name='testcontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\TestController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+/*
+ * Generates PDFs for all instances of a given process and task for admin user
+ * 
+ * @param auth The authentication object
+ * @return A string indicating the result of the operation
+ * @throws FileNotFoundException If a required file is not found
+ * @throws IOException If an I/O error occurs
+ * @throws InterruptedException If the thread is interrupted
+ */
+```
+- `generatePDF()` — 🟢 Endpoint
+
+---
+
+
+### 🧩 Clase: `WikiController` <a name='wikicontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\WikiController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+/*
+ * Renders the wiki page
+ * 
+ * @param model The model to pass data to the view
+ * @param auth The authentication object
+ * @return The name of the view to render
+ */
+```
+- `renderWiki()` — 🟢 Endpoint
+```
+/*
+ * Renders the wiki editor page
+ * 
+ * @param model The model to pass data to the view
+ * @param auth The authentication object
+ * @return The name of the view to render
+ */
+```
+- `renderWikiEditor()` — 🟢 Endpoint
+```
+/*
+ * Returns the wiki text for a given category
+ * 
+ * @param model The model to pass data to the view
+ * @param auth The authentication object
+ * @param categoria The category of the wiki
+ * @return The wiki text
+ */
+```
+- `renderWiki()` — 🟢 Endpoint
+```
+/*
+ * Updates the wiki text for a given category
+ * 
+ * @param model The model to pass data to the view
+ * @param auth The authentication object
+ * @param cat The category of the wiki
+ * @param text The new wiki text
+ * @return The updated wiki object
+ */
+```
+- `updateWiki()` — 🟢 Endpoint
+
+---
+
+
+# 📈 Estadísticas finales
+
+- Total de clases: 18
+- Total de métodos: 347
+- Total de comentarios: 112
+
+✅ **Fin del reporte de carpeta.**

+ 167 - 0
src/main/java/META-INF/additional-spring-configuration-metadata.json

@@ -0,0 +1,167 @@
+{"properties": [
+  {
+    "name": "saic.data.filePath",
+    "type": "java.lang.String",
+    "description": "Path to store uploaded evidences"
+  },
+  {
+    "name": "saic.data.templates.filePath",
+    "type": "java.lang.String",
+    "description": "Path in where templates are stored"
+  },
+  {
+    "name": "saic.data.templates.logoPath",
+    "type": "java.lang.String",
+    "description": "Path in where logos are stored"
+  },
+  {
+    "name": "saic.mailer.reminder.enabled",
+    "type": "java.lang.String",
+    "description": "Enables or disables the mailer reminders (when assigned task is expired)"
+  },
+  {
+    "name": "saic.mailer.queue.enabled",
+    "type": "java.lang.String",
+    "description": "Enables or disables the mailer queue"
+  },
+  {
+    "name": "saic.mailer.calendar.enabled",
+    "type": "java.lang.String",
+    "description": "Enables or disables the email reminders related to the calendar (instance planifier)"
+  },
+  {
+    "name": "saic.mailer.maxMailsPerRound",
+    "type": "java.lang.String",
+    "description": "Defines de max number of emails that will be sended in a single round"
+  },
+  {
+    "name": "saic.parser.surveys.path",
+    "type": "java.lang.String",
+    "description": "A description for 'saic.parser.surveys.path'"
+  },
+  {
+    "name": "saic.uqserver.dbname.grau",
+    "type": "java.lang.String",
+    "description": "Defines the DB name for 'grau'"
+  },
+  {
+    "name": "saic.uqserver.dbname.master",
+    "type": "java.lang.String",
+    "description": "Defines the DB name for 'master'"
+  },
+  {
+    "name": "saic.uqserver.host",
+    "type": "java.lang.String",
+    "description": "A description for 'saic.uqserver.host'"
+  },
+  {
+    "name": "saic.uqserver.user",
+    "type": "java.lang.String",
+    "description": "Defines the final survey DB username"
+  },
+  {
+    "name": "saic.uqserver.passwd",
+    "type": "java.lang.String",
+    "description": "Defines the final survey DB password"
+  },
+  {
+    "name": "saic.uqserver2.host",
+    "type": "java.lang.String",
+    "description": "Defines the intermediate survey DB host"
+  },
+  {
+    "name": "saic.uqserver2.user",
+    "type": "java.lang.String",
+    "description": "Defines the intermediate survey DB username"
+  },
+  {
+    "name": "saic.uqserver2.passwd",
+    "type": "java.lang.String",
+    "description": "Defines the intermediate survey DB password"
+  },
+  {
+    "name": "saic.uqserver2.dbname.prof",
+    "type": "java.lang.String",
+    "description": "Defines de DB name for 'prof'"
+  },
+  {
+    "name": "saic.uqserver2.dbname.otros",
+    "type": "java.lang.String",
+    "description": "Defines de DB name for 'otros'"
+  },
+  {
+    "name": "saic.uqserver2.dbname.doct",
+    "type": "java.lang.String",
+    "description": "Defines the DB name for 'doctorado'"
+  },
+  {
+    "name": "saic.uqserver2.dbname.master",
+    "type": "java.lang.String",
+    "description": "Defines the DB name for 'master'"
+  },
+  {
+    "name": "saic.data.doctorado",
+    "type": "java.lang.String",
+    "description": "Defines the path to 'doctorado' data files"
+  },
+  {
+    "name": "saic.data.evdocente",
+    "type": "java.lang.String",
+    "description": "Defines the path to 'evdocente' data files"
+  },
+  {
+    "name": "saic.data.master",
+    "type": "java.lang.String",
+    "description": "Defines the path to 'master' data files"
+  },
+  {
+    "name": "saic.scheduler.expired.enabled",
+    "type": "java.lang.String",
+    "description": "Enables or disables the email reminders related to procedure tasks expiration"
+  },
+  {
+    "name": "saic.data.tmpPath",
+    "type": "java.lang.String",
+    "description": "Path to the temporal directory"
+  },
+  {
+    "name": "saic.data.templates.fileNotFound",
+    "type": "java.lang.String",
+    "description": "Path to the file that will be returned when the requested file does not exist"
+  },
+  {
+    "name": "saic.parser.surveys.enabled",
+    "type": "java.lang.String",
+    "description": "Enables or disables the surveys related scheduled tasks"
+  },
+  {
+    "name": "saic.actuator.validIp",
+    "type": "java.lang.String",
+    "description": "Actuator endpoints access will be restricted to the specified IP address"
+  },
+  {
+    "name": "saic.url.public",
+    "type": "java.lang.String",
+    "description": "A description for 'saic.url.public'"
+  },
+  {
+    "name": "saic.url.domain",
+    "type": "java.lang.String",
+    "description": "A description for 'saic.url.domain'"
+  },
+  {
+    "name": "saic.url.core.domain",
+    "type": "java.lang.String",
+    "description": "A description for 'saic.url.core.domain'"
+  },
+  {
+    "name": "saic.url.data.domain",
+    "type": "java.lang.String",
+    "description": "A description for 'saic.url.data.domain'"
+  },
+  {
+    "name": "saic.url.docs.domain",
+    "type": "java.lang.String",
+    "description": "A description for 'saic.url.docs.domain'"
+  }
+]}

+ 15 - 0
src/main/java/es/uv/saic/SaicApplication.java

@@ -0,0 +1,15 @@
+package es.uv.saic;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+@SpringBootApplication
+@EnableScheduling
+public class SaicApplication {
+	
+	public static void main(String[] args) {
+		SpringApplication.run(SaicApplication.class, args);
+	}
+
+}

+ 55 - 0
src/main/java/es/uv/saic/config/ApplicationLocaleResolver.java

@@ -0,0 +1,55 @@
+package es.uv.saic.config;
+
+import java.util.Locale;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AnonymousAuthenticationToken;
+import org.springframework.security.core.context.SecurityContext;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.web.servlet.i18n.SessionLocaleResolver;
+
+import es.uv.saic.domain.Usuari;
+import es.uv.saic.service.UsuariService;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+
+@Configuration
+public class ApplicationLocaleResolver extends SessionLocaleResolver {
+    @Autowired
+    UsuariService us;
+
+    @Override
+    public Locale resolveLocale(HttpServletRequest request) {
+        SecurityContext securityContext = SecurityContextHolder.getContext();
+        Locale userLocale = Locale.forLanguageTag("ca"); 
+        if(!(securityContext.getAuthentication() instanceof AnonymousAuthenticationToken)) {
+        	Usuari usuari = ((Usuari)securityContext.getAuthentication().getPrincipal());
+        	String locale = usuari.getLocale();
+        	userLocale = locale == null ? userLocale : Locale.forLanguageTag(locale);
+        }
+        
+        return userLocale;
+    }
+
+    @Override
+    public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
+        super.setLocale(request, response, locale);
+
+        SecurityContext securityContext = SecurityContextHolder.getContext();
+        if(!(securityContext.getAuthentication() instanceof AnonymousAuthenticationToken)) {
+        	Usuari usuari = ((Usuari)securityContext.getAuthentication().getPrincipal());
+	        usuari.setLocale(locale.toLanguageTag());
+	        us.save(usuari);
+        }        
+    }
+    
+    @Override
+    protected Locale determineDefaultLocale(HttpServletRequest request) {
+    	if (this.getDefaultLocale() == null) {
+    		Locale locale = this.resolveLocale(request);
+    		this.setDefaultLocale(locale);
+    	}
+    	return this.getDefaultLocale();
+    }
+}

+ 26 - 0
src/main/java/es/uv/saic/config/AuthSuccessHandler.java

@@ -0,0 +1,26 @@
+package es.uv.saic.config;
+
+import java.io.IOException;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+
+import org.springframework.security.core.Authentication;
+import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
+import org.springframework.security.web.savedrequest.DefaultSavedRequest;
+
+public class AuthSuccessHandler implements AuthenticationSuccessHandler{
+	
+	@Override
+	public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication auth)
+	        throws IOException,  ServletException {
+	    request.getSession(false).setMaxInactiveInterval(3600); //3600
+		if(request.getSession().getAttribute("SPRING_SECURITY_SAVED_REQUEST") != null){
+			DefaultSavedRequest defaultSavedRequest = (DefaultSavedRequest) request.getSession().getAttribute("SPRING_SECURITY_SAVED_REQUEST");
+	    	response.sendRedirect(defaultSavedRequest.getRedirectUrl());
+		}
+		else{
+			response.sendRedirect(request.getContextPath()+"/procedures?_new=1");
+		}
+	}
+}

+ 43 - 0
src/main/java/es/uv/saic/config/Globals.java

@@ -0,0 +1,43 @@
+package es.uv.saic.config;
+
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.Date;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+
+@Configuration
+@ConfigurationProperties(prefix="globals")
+public class Globals {
+
+	private String filePath = "/tmp/uploads/";
+	//private String filePath = "/DATA/saic-data/files/";
+
+	public String getFilePath() {
+		return filePath;
+	}
+	
+	public String getFileName(String npi, int curs, int informe, String apartat, int item) {
+		return npi+"_"+Integer.toString(curs)+"_"+Integer.toString(informe)+"_"+apartat+Integer.toString(item);
+	}
+	
+	public int getCurrentYear() {
+
+		Date date = new Date();
+		LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+		int month = localDate.getMonthValue();
+		int year = localDate.getYear();
+		
+		if(month < 9) {
+			return year-1;
+		}
+		else {
+			return year;
+		}
+	}
+	
+
+	
+}

+ 22 - 0
src/main/java/es/uv/saic/config/SchedulerConfig.java

@@ -0,0 +1,22 @@
+package es.uv.saic.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.SchedulingConfigurer;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
+import org.springframework.scheduling.config.ScheduledTaskRegistrar;
+
+@Configuration
+public class SchedulerConfig implements SchedulingConfigurer {
+    private final int POOL_SIZE = 10;
+
+    @Override
+    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
+        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
+
+        threadPoolTaskScheduler.setPoolSize(this.POOL_SIZE);
+        threadPoolTaskScheduler.setThreadNamePrefix("saic-mailer-");
+        threadPoolTaskScheduler.initialize();
+
+        scheduledTaskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
+    }
+}

+ 150 - 0
src/main/java/es/uv/saic/config/SecurityConfig.java

@@ -0,0 +1,150 @@
+package es.uv.saic.config;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authorization.AuthorizationDecision;
+import org.springframework.security.authorization.AuthorizationManager;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.http.SessionCreationPolicy;
+import org.springframework.security.core.session.SessionRegistry;
+import org.springframework.security.core.session.SessionRegistryImpl;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.ldap.DefaultSpringSecurityContextSource;
+import org.springframework.security.web.SecurityFilterChain;
+import org.springframework.security.web.access.intercept.RequestAuthorizationContext;
+import org.springframework.security.web.authentication.session.CompositeSessionAuthenticationStrategy;
+import org.springframework.security.web.authentication.session.ConcurrentSessionControlAuthenticationStrategy;
+import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy;
+import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy;
+import org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy;
+import org.springframework.security.web.session.HttpSessionEventPublisher;
+import org.springframework.security.web.util.matcher.IpAddressMatcher;
+
+import es.uv.saic.service.AuthProvider;
+import jakarta.servlet.http.HttpServletRequest;
+
+
+@Configuration
+@EnableWebSecurity
+@EnableMethodSecurity
+public class SecurityConfig {
+
+	@Autowired
+	AuthProvider authProvider;
+	
+	@Value("${saic.actuator.validIp}")
+	private String validIp;
+	
+	@Bean
+	public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
+		http.authorizeHttpRequests((auth) -> auth
+	        	.requestMatchers("/", "/css/**", "/js/**", "/img/**", "/logos/*", "/logos/**").permitAll()
+	        	.requestMatchers("/login**").permitAll()
+	        	.requestMatchers("/keepalive").permitAll()
+	        	.requestMatchers("/actuator/**").access(hasIpAddress(this.validIp))
+	        )
+	        .authorizeHttpRequests((auth)-> auth
+	            //.anyRequest().fullyAuthenticated()
+				.anyRequest().permitAll()
+	        )
+	        .formLogin((form) -> form
+	            .loginPage("/login")
+	            .defaultSuccessUrl("/procedures?_new=1",true)
+	            .failureUrl("/login?error=noauth")
+	            .successHandler(new AuthSuccessHandler())
+	            .permitAll()
+	        )
+	        .logout((logout) -> logout
+	        	.logoutSuccessUrl("/login")
+	        	.invalidateHttpSession(true)
+	        	.clearAuthentication(true)
+	        	.deleteCookies("JSESSIONID")
+                .deleteCookies("SESSION")
+             )
+	        .csrf((csrf) -> csrf.disable());
+		
+		http.sessionManagement((session) -> session
+				.sessionAuthenticationErrorUrl("/login?error=expired")
+				.invalidSessionUrl("/login?error=expired")
+				.maximumSessions(1)
+				.expiredUrl("/login?error=expired")
+				.maxSessionsPreventsLogin(false)
+			    .sessionRegistry(sessionRegistry())
+		    )
+			.sessionManagement((session) -> session
+				.sessionAuthenticationStrategy(concurrentSession())
+			    .sessionFixation()
+			    .newSession()
+			    .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
+			);
+	
+		http.headers((headers) -> headers
+				.frameOptions((options) -> options.sameOrigin())
+		    );
+	
+	    return http.build();
+	}
+	
+	private static AuthorizationManager<RequestAuthorizationContext> hasIpAddress(String ipAddress) {
+        IpAddressMatcher ipAddressMatcher = new IpAddressMatcher(ipAddress);
+        return (authentication, context) -> {
+            HttpServletRequest request = context.getRequest();
+            return new AuthorizationDecision(ipAddressMatcher.matches(request));
+        };
+    }
+	    
+    @Bean
+    public AuthenticationManager authenticationManager(HttpSecurity http) throws Exception {
+        return http.getSharedObject(AuthenticationManagerBuilder.class)
+        		   .authenticationProvider(authProvider)
+        		   .build();
+    }
+    
+    @Bean
+    public SessionRegistry sessionRegistry() {
+        return new SessionRegistryImpl();
+    }
+    
+    @Bean
+    public DefaultSpringSecurityContextSource contextSource() {
+        return  new DefaultSpringSecurityContextSource(
+                Collections.singletonList("ldap://ldap.uv.es"), "dc=uv,dc=es");
+    }
+    
+    @Bean
+    public PasswordEncoder passwordEncoder() {
+        return new BCryptPasswordEncoder();
+    }
+    
+    @Bean
+    public HttpSessionEventPublisher httpSessionEventPublisher() {
+        return new HttpSessionEventPublisher();
+    }
+     
+    @Bean
+    public CompositeSessionAuthenticationStrategy concurrentSession() {
+
+         ConcurrentSessionControlAuthenticationStrategy concurrentAuthenticationStrategy = new ConcurrentSessionControlAuthenticationStrategy(sessionRegistry());
+         concurrentAuthenticationStrategy.setMaximumSessions(1);
+         concurrentAuthenticationStrategy.setExceptionIfMaximumExceeded(true);
+         List<SessionAuthenticationStrategy> delegateStrategies = new ArrayList<SessionAuthenticationStrategy>();
+         delegateStrategies.add(concurrentAuthenticationStrategy);
+         delegateStrategies.add(new SessionFixationProtectionStrategy());
+         delegateStrategies.add(new RegisterSessionAuthenticationStrategy(sessionRegistry()));
+
+         CompositeSessionAuthenticationStrategy authenticationStrategy =  new CompositeSessionAuthenticationStrategy(delegateStrategies);
+         return authenticationStrategy;
+     }
+	
+}

+ 49 - 0
src/main/java/es/uv/saic/config/WebConfig.java

@@ -0,0 +1,49 @@
+package es.uv.saic.config;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.autoconfigure.web.servlet.ConditionalOnMissingFilterBean;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.Ordered;
+import org.springframework.web.filter.ForwardedHeaderFilter;
+import org.springframework.web.servlet.LocaleResolver;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
+
+import jakarta.servlet.DispatcherType;
+
+@Configuration
+public class WebConfig implements WebMvcConfigurer{
+	
+	@Bean(name = "localeResolver")
+	public LocaleResolver localeResolver() {
+	    return new ApplicationLocaleResolver();
+	}
+	
+	@Bean
+	public LocaleChangeInterceptor localeChangeInterceptor() {
+	    LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
+	    lci.setParamName("lang");
+	    return lci;
+	}
+	
+	@Override
+	public void addInterceptors(InterceptorRegistry registry) {
+	    registry.addInterceptor(localeChangeInterceptor());
+	}
+	
+	@Bean
+	@ConditionalOnMissingFilterBean(ForwardedHeaderFilter.class)
+	@ConditionalOnProperty(value = "server.forward-headers-strategy", havingValue = "native")
+	public FilterRegistrationBean<ForwardedHeaderFilter> forwardedHeaderFilter() {
+	    ForwardedHeaderFilter filter = new ForwardedHeaderFilter();
+	    FilterRegistrationBean<ForwardedHeaderFilter> registration = new FilterRegistrationBean<>(filter);
+	    registration.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.ASYNC, DispatcherType.ERROR);
+	    registration.setOrder(Ordered.HIGHEST_PRECEDENCE);
+	    return registration;
+	}
+	
+	
+}

+ 147 - 0
src/main/java/es/uv/saic/domain/Acreditacio.java

@@ -0,0 +1,147 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.IdClass;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
+
+@Entity
+@Table(name="acreditacions")
+@NamedQuery(name="Acreditacio.findAll", query="SELECT t FROM Acreditacio t")
+@IdClass(AcreditacioPK.class)
+public class Acreditacio  implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+	
+	@Id
+	private String tlugar;
+	
+	@Id
+	private Integer lugar;
+	
+	@Column(name="curs_impla")
+	private Integer cursImpla;
+	
+	@Column(name="data_verif")
+	@Temporal(TemporalType.TIMESTAMP)
+	private Date dataVerif;
+	
+	@Column(name="data_renov")
+	@Temporal(TemporalType.TIMESTAMP)
+	private Date dataRenov;
+	
+	@Column(name="data_acred")
+	@Temporal(TemporalType.TIMESTAMP)
+	private Date dataAcred;
+	
+	@Column(name="data_segui")
+	@Temporal(TemporalType.TIMESTAMP)
+	private Date dataSegui;
+	
+	private String grup;
+	
+	@Column(name="grup_num")
+	private Integer grupNum;
+	
+	@Column(name="grup_curs")
+	private Integer grupCurs;
+	
+	private Boolean inter;
+
+	private Boolean recom;
+
+	private Boolean segui;
+		
+	public Acreditacio() {}
+	
+
+	public String getTlugar() {
+		return tlugar;
+	}
+	public void setTlugar(String tlugar) {
+		this.tlugar = tlugar;
+	}
+	public Integer getLugar() {
+		return lugar;
+	}
+	public void setLugar(Integer lugar) {
+		this.lugar = lugar;
+	}
+	public Integer getCursImpla() {
+		return cursImpla;
+	}
+	public void setCursImpla(Integer cursImpla) {
+		this.cursImpla = cursImpla;
+	}
+	public Date getDataVerif() {
+		return dataVerif;
+	}
+	public void setDataVerif(Date dataVerif) {
+		this.dataVerif = dataVerif;
+	}
+	public Date getDataRenov() {
+		return dataRenov;
+	}
+	public void setDataRenov(Date dataRenov) {
+		this.dataRenov = dataRenov;
+	}
+	public Date getDataAcred() {
+		return dataAcred;
+	}
+	public void setDataAcred(Date dataAcred) {
+		this.dataAcred = dataAcred;
+	}
+	public Date getDataSegui() {
+		return dataSegui;
+	}
+	public void setDataSegui(Date dataSegui) {
+		this.dataSegui = dataSegui;
+	}
+	public String getGrup() {
+		return grup;
+	}
+	public void setGrup(String grup) {
+		this.grup = grup;
+	}
+	public Integer getGrupCurs() {
+		return grupCurs;
+	}
+	public void setGrupCurs(Integer grupCurs) {
+		this.grupCurs = grupCurs;
+	}
+	public Boolean getInter() {
+		return inter;
+	}
+	public void setInter(Boolean inter) {
+		this.inter = inter;
+	}
+	public Integer getGrupNum() {
+		return grupNum;
+	}
+	public void setGrupNum(Integer grupNum) {
+		this.grupNum = grupNum;
+	}
+	public Boolean getRecom() {
+		return recom;
+	}
+	public void setRecom(Boolean recom) {
+		this.recom = recom;
+	}
+	public Boolean getSegui() {
+		return segui;
+	}
+	public void setSegui(Boolean segui) {
+		this.segui = segui;
+	}
+	public static long getSerialversionuid() {
+		return serialVersionUID;
+	}
+	
+}

+ 52 - 0
src/main/java/es/uv/saic/domain/AcreditacioPK.java

@@ -0,0 +1,52 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+public class AcreditacioPK implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	private String tlugar;
+	private Integer lugar;
+	
+	public AcreditacioPK() {}
+	
+	public AcreditacioPK(String tlugar, Integer lugar) {
+		this.tlugar = tlugar;
+		this.lugar = lugar;
+	}
+
+	public String getTlugar() {
+		return tlugar;
+	}
+
+	public void setTlugar(String tlugar) {
+		this.tlugar = tlugar;
+	}
+
+	public Integer getLugar() {
+		return lugar;
+	}
+
+	public void setLugar(Integer lugar) {
+		this.lugar = lugar;
+	}
+
+	@Override
+	public int hashCode() {
+		return Objects.hash(lugar, tlugar);
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		AcreditacioPK other = (AcreditacioPK) obj;
+		return Objects.equals(lugar, other.lugar) && Objects.equals(tlugar, other.tlugar);
+	}
+
+}

+ 78 - 0
src/main/java/es/uv/saic/domain/Categoria.java

@@ -0,0 +1,78 @@
+package es.uv.saic.domain;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+
+@Entity
+@Table(name="categories")
+@NamedQuery(name="Categoria.findAll", query="SELECT i FROM Categoria i")
+public class Categoria {
+
+	@Id
+	@Column(name="id_categoria")
+	private Integer idCategoria;
+	private Integer pare;
+	private Integer ordre;
+	private String tipus;
+	private String nomVal;
+	private String nomCas;
+	private String tambit;
+	
+	public Categoria() {}
+	
+	public Categoria(Integer idCategoria, Integer pare, Integer ordre, String tipus, String nomVal, String nomCas, String tambit) {
+		this.idCategoria = idCategoria;
+		this.tipus = tipus;
+		this.nomVal = nomVal;
+		this.nomCas = nomCas;
+		this.pare = pare;
+		this.ordre = ordre;
+		this.tambit = tambit;
+	}
+	
+	public Integer getIdCategoria() {
+		return idCategoria;
+	}
+	public void setIdCategoria(Integer idCategoria) {
+		this.idCategoria = idCategoria;
+	}
+	public String getTipus() {
+		return tipus;
+	}
+	public void setTipus(String tipus) {
+		this.tipus = tipus;
+	}
+	public String getNomVal() {
+		return nomVal;
+	}
+	public void setNomVal(String nomVal) {
+		this.nomVal = nomVal;
+	}
+	public String getNomCas() {
+		return nomCas;
+	}
+	public void setNomCas(String nomCas) {
+		this.nomCas = nomCas;
+	}
+	public Integer getPare() {
+		return pare;
+	}
+	public void setPare(Integer pare) {
+		this.pare = pare;
+	}
+	public Integer getOrdre() {
+		return ordre;
+	}
+	public void setOrdre(Integer ordre) {
+		this.ordre = ordre;
+	}
+	public String getTambit() {
+		return tambit;
+	}
+	public void setTambit(String tambit) {
+		this.tambit = tambit;
+	}
+}

+ 93 - 0
src/main/java/es/uv/saic/domain/Document.java

@@ -0,0 +1,93 @@
+package es.uv.saic.domain;
+
+import java.util.Date;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.JoinColumns;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+@Entity
+@Table(name="documents")
+@NamedQuery(name="Document.findAll", query="SELECT i FROM Document i")
+public class Document {
+	
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+	@Column(name="id_document")
+	private Integer idDocument;
+	
+	@ManyToOne 
+	@JoinColumn(name="id_categoria")
+	private Categoria categoria;
+	
+	@ManyToOne
+	@JoinColumns({
+		@JoinColumn(name="lugar", referencedColumnName="lugar"),
+		@JoinColumn(name="tlugar", referencedColumnName="tlugar")
+		})
+	@JsonIgnore
+	private Organ organ;
+	
+	private String nom;
+	
+	private String ruta;
+	
+	private Date data;
+	
+	private boolean visible;
+	
+
+	public Integer getIdDocument() {
+		return idDocument;
+	}
+	public void setIdDocument(Integer idDocument) {
+		this.idDocument = idDocument;
+	}
+	public Categoria getCategoria() {
+		return categoria;
+	}
+	public void setCategoria(Categoria categoria) {
+		this.categoria = categoria;
+	}
+	public Organ getOrgan() {
+		return organ;
+	}
+	public void setOrgan(Organ organ) {
+		this.organ = organ;
+	}
+	public String getNom() {
+		return nom;
+	}
+	public void setNom(String nom) {
+		this.nom = nom;
+	}
+	public String getRuta() {
+		return ruta;
+	}
+	public void setRuta(String ruta) {
+		this.ruta = ruta;
+	}
+	public Date getData() {
+		return data;
+	}
+	public void setData(Date data) {
+		this.data = data;
+	}
+	public boolean isVisible() {
+		return visible;
+	}
+	public void setVisible(boolean visible) {
+		this.visible = visible;
+	}
+	
+	
+}

+ 31 - 0
src/main/java/es/uv/saic/domain/DocumentRepository.java

@@ -0,0 +1,31 @@
+package es.uv.saic.domain;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+@Repository
+public interface DocumentRepository  extends JpaRepository<Document, Integer> {
+	
+	@Query(value="SELECT * FROM documents WHERE id_categoria = ?1 AND ((lugar = ?2 AND tlugar = ?3) OR lugar = 0) AND visible LIMIT 1;", nativeQuery=true)
+	Document findByCategoriaOrgan(Integer categoria, Integer lugar, String tlugar); 
+	
+	@Query(value="SELECT * FROM documents WHERE id_categoria = ?1 AND ((lugar = ?2 AND tlugar = ?3) OR lugar = 0) AND visible", nativeQuery=true)
+	List<Document> findAllByCategoriaOrgan(Integer categoria, Integer lugar, String tlugar);
+	
+	@Query(value="SELECT * FROM documents d LEFT JOIN categories c ON d.id_categoria = c.id_categoria WHERE c.nom_val = ?1 AND visible", nativeQuery=true)
+	List<Document> findByCategoriaNom(String nom); 
+	
+	@Query(value="SELECT * FROM documents d LEFT JOIN categories c ON d.id_categoria = c.id_categoria WHERE c.tipus = ?1 AND visible", nativeQuery=true)
+	List<Document> findByCategoriaTipus(String tipus); 
+	
+	@Transactional
+    @Modifying(flushAutomatically = true, clearAutomatically = true)
+	@Query(value="UPDATE documents SET visible = false WHERE lugar = ?1 AND tlugar = ?2", nativeQuery=true)
+	void archiveByOrgan(Integer lugar, String tlugar);
+
+}

+ 119 - 0
src/main/java/es/uv/saic/domain/Indicador.java

@@ -0,0 +1,119 @@
+package es.uv.saic.domain;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Optional;
+
+public class Indicador {
+	
+	private String dimension;
+	private String indicador;
+	private String valor;
+	private String ambit;
+	private List<CursoValor> valores;
+	
+	public Indicador() {
+		this.valores = new ArrayList<CursoValor>();
+	}
+	
+	public Indicador(String dimension, String indicador, String valor) {
+		this.dimension = dimension;
+		this.indicador = indicador;
+		this.valor = valor;
+		this.valores = new ArrayList<CursoValor>();
+	}
+
+	public String getDimension() {
+		return dimension;
+	}
+	
+	public void setDimension(String dimension) {
+		this.dimension = dimension;
+	}
+	
+	public String getIndicador() {
+		return indicador;
+	}
+
+	public void setIndicador(String indicador) {
+		this.indicador = indicador;
+	}
+
+	public String getValor() {
+		return valor;
+	}
+
+	public void setValor(String valor) {
+		this.valor = valor;
+	}
+	
+	public String getAmbit() {
+		return ambit;
+	}
+
+	public void setAmbit(String ambit) {
+		this.ambit = ambit;
+	}
+
+	public List<CursoValor> getValores() {
+		return valores;
+	}
+
+	public void setValores(List<CursoValor> valores) {
+		this.valores = valores;
+	}
+	
+	public void addCursoValor(String curso, String valor) {
+		this.valores.add(new CursoValor(curso, valor));
+	}
+	
+	public void obtenerValor() {
+		this.valor = this.maxCursoValor().getValor().toString();
+	}
+	
+	public CursoValor maxCursoValor() {
+		Optional<CursoValor> v = this.valores.stream().max(Comparator.comparing(CursoValor::getCurso));
+		if(v.isPresent()) {
+			return v.get();
+		}
+		else {
+			return null;
+		}
+	}
+
+
+	public class CursoValor{
+		private String periodo;
+		private String valor;
+		private Integer curso;
+		
+		public CursoValor(){ }
+		
+		public CursoValor(String periodo, String valor) {
+			this.periodo = periodo;
+			this.valor = valor;
+			this.curso = Integer.parseInt(periodo.split("-")[1]);
+		}
+		
+		public String getPeriodo() {
+			return periodo;
+		}
+		public void setPeriodo(String periodo) {
+			this.periodo = periodo;
+		}
+		public Integer getCurso() {
+			return curso;
+		}
+		public void setValor(Integer curso) {
+			this.curso = curso;
+		}
+		public String getValor() {
+			return valor;
+		}
+		public void setValor(String valor) {
+			this.valor = valor;
+		}
+	}
+
+}

+ 133 - 0
src/main/java/es/uv/saic/domain/Instancia.java

@@ -0,0 +1,133 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+import java.math.BigInteger;
+
+import jakarta.persistence.*;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * The persistent class for the instancies database table.
+ * 
+ */
+@Entity
+@Table(name="instancies")
+@NamedQuery(name="Instancia.findAll", query="SELECT i FROM Instancia i")
+public class Instancia implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@Column(name="id_instancia")
+	private BigInteger idInstancia;
+
+	private Integer centre;
+
+	private String estat;
+
+	private Integer titulacio;
+	
+	@Temporal(TemporalType.DATE)
+	@Column(name="data")
+	private Date data;
+
+	//bi-directional many-to-one association to Organ
+	@ManyToOne
+	@JoinColumns({
+		@JoinColumn(name="lugar", referencedColumnName="lugar"),
+		@JoinColumn(name="tlugar", referencedColumnName="tlugar")
+		})
+	private Organ organ;
+
+	//bi-directional many-to-one association to Proces
+	@ManyToOne
+	@JoinColumn(name="id_proces")
+	private Proces proces;
+
+	//bi-directional many-to-one association to InstanciaTasca
+	@OneToMany(mappedBy="instancia")
+	private List<InstanciaTasca> instanciesTasques;
+
+	public Instancia() {
+	}
+
+	public BigInteger getIdInstancia() {
+		return this.idInstancia;
+	}
+
+	public void setIdInstancia(BigInteger idInstancia) {
+		this.idInstancia = idInstancia;
+	}
+
+	public Integer getCentre() {
+		return this.centre;
+	}
+
+	public void setCentre(Integer centre) {
+		this.centre = centre;
+	}
+
+	public String getEstat() {
+		return this.estat;
+	}
+
+	public void setEstat(String estat) {
+		this.estat = estat;
+	}
+
+	public Integer getTitulacio() {
+		return this.titulacio;
+	}
+
+	public void setTitulacio(Integer titulacio) {
+		this.titulacio = titulacio;
+	}
+	
+	public Date getData() {
+		return data;
+	}
+
+	public void setData(Date data) {
+		this.data = data;
+	}
+
+	public Organ getOrgan() {
+		return this.organ;
+	}
+
+	public void setOrgan(Organ organ) {
+		this.organ = organ;
+	}
+
+	public Proces getProces() {
+		return this.proces;
+	}
+
+	public void setProces(Proces proces) {
+		this.proces = proces;
+	}
+
+	public List<InstanciaTasca> getInstanciaTasca() {
+		return this.instanciesTasques;
+	}
+
+	public void setInstanciaTasca(List<InstanciaTasca> instanciaTasca) {
+		this.instanciesTasques = instanciaTasca;
+	}
+
+	public InstanciaTasca addInstanciaTasca(InstanciaTasca instanciaTasca) {
+		getInstanciaTasca().add(instanciaTasca);
+		instanciaTasca.setInstancia(this);
+
+		return instanciaTasca;
+	}
+
+	public InstanciaTasca removeInstanciaTasca(InstanciaTasca instanciaTasca) {
+		getInstanciaTasca().remove(instanciaTasca);
+		instanciaTasca.setInstancia(null);
+
+		return instanciaTasca;
+	}
+
+}

+ 149 - 0
src/main/java/es/uv/saic/domain/InstanciaTasca.java

@@ -0,0 +1,149 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+import java.math.BigInteger;
+
+import jakarta.persistence.*;
+import java.util.Date;
+
+/**
+ * The persistent class for the tasquesi database table.
+ * 
+ */
+@Entity
+@Table(name="tasquesi")
+@NamedQuery(name="InstanciaTasca.findAll", query="SELECT t FROM InstanciaTasca t")
+public class InstanciaTasca implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@Column(name="id_tascai")
+	private BigInteger idInstanciaTasca;
+
+	@Temporal(TemporalType.DATE)
+	@Column(name="data_fet")
+	private Date dataFet;
+	
+	@Temporal(TemporalType.DATE)
+	@Column(name="data")
+	private Date data;
+	
+	@Temporal(TemporalType.TIMESTAMP)
+	@Column(name="data_mod")
+	private Date dataMod;
+	
+	private Integer version;
+
+	private String estat;
+
+	private String evidencia;
+	
+	private String text;
+
+	//bi-directional many-to-one association to Instancia
+	@ManyToOne
+	@JoinColumn(name="id_instancia")
+	private Instancia instancia;
+
+	//bi-directional many-to-one association to Tasca
+	@ManyToOne
+	@JoinColumn(name="id_tasca")
+	private Tasca tasca;
+
+	//bi-directional many-to-one association to Usuari
+	@ManyToOne
+	@JoinColumn(name="usuari_fet")
+	private Usuari usuari;
+
+	public InstanciaTasca() {
+	}
+
+	public BigInteger getIdInstanciaTasca() {
+		return this.idInstanciaTasca;
+	}
+
+	public void setIdInstanciaTasca(BigInteger idInstanciaTasca) {
+		this.idInstanciaTasca = idInstanciaTasca;
+	}
+
+	public Date getDataFet() {
+		return this.dataFet;
+	}
+
+	public void setDataFet(Date dataFet) {
+		this.dataFet = dataFet;
+	}
+	
+	public Date getData() {
+		return this.data;
+	}
+
+	public void setData(Date data) {
+		this.data = data;
+	}
+	
+	public Date getDataMod() {
+		return dataMod;
+	}
+
+	public void setDataMod(Date dataMod) {
+		this.dataMod = dataMod;
+	}
+
+	public Integer getVersion() {
+		return this.version;
+	}
+
+	public void setVersion(Integer version) {
+		this.version = version;
+	}
+	
+	public String getEstat() {
+		return this.estat;
+	}
+
+	public void setEstat(String estat) {
+		this.estat = estat;
+	}
+
+	public String getEvidencia() {
+		return this.evidencia;
+	}
+
+	public void setEvidencia(String evidencia) {
+		this.evidencia = evidencia;
+	}
+	
+	public String getText() {
+		return this.text;
+	}
+
+	public void setText(String text) {
+		this.text = text;
+	}
+
+	public Instancia getInstancia() {
+		return this.instancia;
+	}
+
+	public void setInstancia(Instancia instancia) {
+		this.instancia = instancia;
+	}
+
+	public Tasca getTasca() {
+		return this.tasca;
+	}
+
+	public void setTasca(Tasca tasca) {
+		this.tasca = tasca;
+	}
+
+	public Usuari getUsuari() {
+		return this.usuari;
+	}
+
+	public void setUsuari(Usuari usuari) {
+		this.usuari = usuari;
+	}
+
+}

+ 212 - 0
src/main/java/es/uv/saic/domain/Organ.java

@@ -0,0 +1,212 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+import jakarta.persistence.*;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Entity
+@Table(name="organs")
+@NamedQuery(name="Organ.findAll", query="SELECT o FROM Organ o")
+public class Organ implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@EmbeddedId
+	private OrganPK id;
+
+	private Boolean actiu;
+
+	@Column(name="nom_cas")
+	private String nomCas;
+
+	@Column(name="nom_val")
+	private String nomVal;
+
+	private Integer ruct;
+	
+	private String tambit;
+
+	//bi-directional many-to-one association to Instancia
+	@OneToMany(mappedBy="organ")
+	private List<Instancia> instancias;
+	
+	//bi-directional many-to-one association to Organ
+	@ManyToOne
+	@JoinColumns({
+		@JoinColumn(name="lugar2", referencedColumnName="lugar"),
+		@JoinColumn(name="tlugar2", referencedColumnName="tlugar")
+		})
+	private Organ organ;
+
+	//bi-directional many-to-one association to Organ
+	@OneToMany(mappedBy="organ")
+	private List<Organ> organsFill;
+	
+	@OneToMany()
+	@JoinColumns({
+		@JoinColumn(name="lugar", referencedColumnName="lugar"),
+		@JoinColumn(name="tlugar", referencedColumnName="tlugar")
+		})
+	private List<OrganEquivalent> organsEquivalents;
+
+	//bi-directional many-to-one association to UsuarisRol
+	@OneToMany(mappedBy="organ")
+	
+	private List<UsuarisRol> usuarisRols;
+	
+	@OneToOne()
+	@JoinColumns({
+		@JoinColumn(name="lugar", referencedColumnName="lugar"),
+		@JoinColumn(name="tlugar", referencedColumnName="tlugar")
+	})
+	private Acreditacio acreditacio;
+	
+	@Transient
+	private String codis;
+
+	public Organ() {}
+
+	public OrganPK getId() {
+		return this.id;
+	}
+
+	public void setId(OrganPK id) {
+		this.id = id;
+	}
+
+	public Boolean getActiu() {
+		return this.actiu;
+	}
+
+	public void setActiu(Boolean actiu) {
+		this.actiu = actiu;
+	}
+
+	public String getNomCas() {
+		return this.nomCas;
+	}
+
+	public void setNomCas(String nomCas) {
+		this.nomCas = nomCas;
+	}
+
+	public String getNomVal() {
+		return this.nomVal;
+	}
+
+	public void setNomVal(String nomVal) {
+		this.nomVal = nomVal;
+	}
+
+	public Integer getRuct() {
+		return this.ruct;
+	}
+
+	public void setRuct(Integer ruct) {
+		this.ruct = ruct;
+	}
+	
+	public String getTambit() {
+		return this.tambit;
+	}
+
+	public void setTambit(String tambit) {
+		this.tambit = tambit;
+	}
+
+	public Organ getOrgan() {
+		return this.organ;
+	}
+
+	public void setOrgan(Organ organ) {
+		this.organ = organ;
+	}
+
+	public List<Organ> getOrgansFill() {
+		return organsFill;
+	}
+	
+	public Organ addOrganFill(Organ o) {
+		this.getOrgansFill().add(o);
+		return o;
+	}
+	
+	public Organ removeOrganFill(Organ o) {
+		this.getOrgansFill().remove(o);
+		return o;
+	}
+
+	public void setOrgansFill(List<Organ> organsFill) {
+		this.organsFill = organsFill;
+	}
+
+	public List<Instancia> getInstancies() {
+		return this.instancias;
+	}
+
+	public void setInstancies(List<Instancia> instancias) {
+		this.instancias = instancias;
+	}
+
+	public Instancia addInstancia(Instancia instancia) {
+		this.getInstancies().add(instancia);
+		instancia.setOrgan(this);
+
+		return instancia;
+	}
+
+	public Instancia removeInstancia(Instancia instancia) {
+		this.getInstancies().remove(instancia);
+		instancia.setOrgan(null);
+
+		return instancia;
+	}
+
+	public List<UsuarisRol> getUsuarisRols() {
+		return this.usuarisRols;
+	}
+
+	public void setUsuarisRols(List<UsuarisRol> usuarisRols) {
+		this.usuarisRols = usuarisRols;
+	}
+
+	public UsuarisRol addUsuarisRol(UsuarisRol usuarisRol) {
+		getUsuarisRols().add(usuarisRol);
+		usuarisRol.setOrgan(this);
+
+		return usuarisRol;
+	}
+
+	public UsuarisRol removeUsuarisRol(UsuarisRol usuarisRol) {
+		getUsuarisRols().remove(usuarisRol);
+		usuarisRol.setOrgan(null);
+
+		return usuarisRol;
+	}
+	
+	public Acreditacio getAcreditacio() {
+		return acreditacio;
+	}
+
+	public void setAcreditacio(Acreditacio acreditacio) {
+		this.acreditacio = acreditacio;
+	}
+
+	@Transient
+	public String getCodis() {
+		return codis;
+	}
+	
+	@Transient
+	public void setCodis() {
+		this.codis = organsEquivalents.stream()
+									  .map(i->i.getLugarEq().toString())
+									  .collect(Collectors.joining(", "));
+		if(this.codis.isEmpty()) {
+			this.codis = this.getId().getLugar().toString();
+		}
+		else {
+			this.codis = this.getId().getLugar().toString() +", "+ this.codis;
+		}
+	}
+}

+ 64 - 0
src/main/java/es/uv/saic/domain/OrganEquivalent.java

@@ -0,0 +1,64 @@
+package es.uv.saic.domain;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.IdClass;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+
+@Entity
+@Table(name="organs_equivalents")
+@NamedQuery(name="OrganEquivalent.findAll", query="SELECT o FROM OrganEquivalent o")
+@IdClass(OrganEquivalentPK.class)
+public class OrganEquivalent {
+
+	@Id
+	private String tlugar;
+	
+	@Id
+	private Integer lugar;
+	
+	@Id
+	@Column(name="tlugar_eq")
+	private String tlugarEq;
+	
+	@Id
+	@Column(name="lugar_eq")
+	private Integer lugarEq;
+	
+	public OrganEquivalent() {}
+
+	public String getTlugar() {
+		return tlugar;
+	}
+
+	public void setTlugar(String tlugar) {
+		this.tlugar = tlugar;
+	}
+
+	public Integer getLugar() {
+		return lugar;
+	}
+
+	public void setLugar(Integer lugar) {
+		this.lugar = lugar;
+	}
+
+	public String getTlugarEq() {
+		return tlugarEq;
+	}
+
+	public void setTlugarEq(String tlugarEq) {
+		this.tlugarEq = tlugarEq;
+	}
+
+	public Integer getLugarEq() {
+		return lugarEq;
+	}
+
+	public void setLugarEq(Integer lugarEq) {
+		this.lugarEq = lugarEq;
+	}
+	
+}

+ 61 - 0
src/main/java/es/uv/saic/domain/OrganEquivalentPK.java

@@ -0,0 +1,61 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+public class OrganEquivalentPK implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	private String tlugar;
+	private Integer lugar;
+	private String tlugarEq;
+	private Integer lugarEq;
+	
+	public OrganEquivalentPK() {}
+	
+	public String getTlugar() {
+		return tlugar;
+	}
+	public void setTlugar(String tlugar) {
+		this.tlugar = tlugar;
+	}
+	public Integer getLugar() {
+		return lugar;
+	}
+	public void setLugar(Integer lugar) {
+		this.lugar = lugar;
+	}
+	public String getTlugarEq() {
+		return tlugarEq;
+	}
+	public void setTlugarEq(String tlugarEq) {
+		this.tlugarEq = tlugarEq;
+	}
+	public Integer getLugarEq() {
+		return lugarEq;
+	}
+	public void setLugarEq(Integer lugarEq) {
+		this.lugarEq = lugarEq;
+	}
+
+	@Override
+	public int hashCode() {
+		return Objects.hash(lugar, lugarEq, tlugar, tlugarEq);
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		OrganEquivalentPK other = (OrganEquivalentPK) obj;
+		return Objects.equals(lugar, other.lugar) && Objects.equals(lugarEq, other.lugarEq)
+				&& Objects.equals(tlugar, other.tlugar) && Objects.equals(tlugarEq, other.tlugarEq);
+	}
+	
+	
+
+}

+ 51 - 0
src/main/java/es/uv/saic/domain/OrganPK.java

@@ -0,0 +1,51 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+import jakarta.persistence.*;
+
+@Embeddable
+public class OrganPK implements Serializable {
+	//default serial version id, required for serializable classes.
+	private static final long serialVersionUID = 1L;
+
+	private String tlugar;
+
+	private Integer lugar;
+
+	public OrganPK() {
+	}
+	public String getTlugar() {
+		return this.tlugar;
+	}
+	public void setTlugar(String tlugar) {
+		this.tlugar = tlugar;
+	}
+	public Integer getLugar() {
+		return this.lugar;
+	}
+	public void setLugar(Integer lugar) {
+		this.lugar = lugar;
+	}
+
+	public boolean equals(Object other) {
+		if (this == other) {
+			return true;
+		}
+		if (!(other instanceof OrganPK)) {
+			return false;
+		}
+		OrganPK castOther = (OrganPK)other;
+		return 
+			this.tlugar.equals(castOther.tlugar)
+			&& this.lugar.equals(castOther.lugar);
+	}
+
+	public int hashCode() {
+		final int prime = 31;
+		int hash = 17;
+		hash = hash * prime + this.tlugar.hashCode();
+		hash = hash * prime + this.lugar.hashCode();
+		
+		return hash;
+	}
+}

+ 126 - 0
src/main/java/es/uv/saic/domain/Plantilla.java

@@ -0,0 +1,126 @@
+package es.uv.saic.domain;
+
+import java.sql.Timestamp;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+
+@Entity
+@Table(name="plantilles")
+@NamedQuery(name="Plantilla.findAll", query="SELECT t FROM Plantilla t")
+public class Plantilla {
+
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+	@Column(name="id_plantilla")
+	private Integer idPlantilla;
+	
+	@Column(name="versio")
+	private Integer versio;
+	
+	@Column(name="codi")
+	private String codi;
+	
+	@Column(name="nom_cas")
+	private String nomCas;
+	
+	@Column(name="nom_val")
+	private String nomVal;
+	
+	@Column(name="data_creacio")
+	private Timestamp data_creacio;
+	
+	@Column(name="data_mod")
+	private Timestamp data_mod;
+	
+	@Column(name="text")
+	private String text;
+	
+	@Column(name="ambit")
+	private String ambit;
+
+	public Integer getIdPlantilla() {
+		return idPlantilla;
+	}
+
+	public void setIdPlantilla(Integer idPlantilla) {
+		this.idPlantilla = idPlantilla;
+	}
+
+	public Integer getVersio() {
+		return versio;
+	}
+
+	public void setVersio(Integer versio) {
+		this.versio = versio;
+	}
+
+	public String getCodi() {
+		return codi;
+	}
+
+	public void setCodi(String codi) {
+		this.codi = codi;
+	}
+
+	public String getNomCas() {
+		return nomCas;
+	}
+
+	public void setNomCas(String nomCas) {
+		this.nomCas = nomCas;
+	}
+
+	public String getNomVal() {
+		return nomVal;
+	}
+
+	public void setNomVal(String nomVal) {
+		this.nomVal = nomVal;
+	}
+
+	public Timestamp getData_creacio() {
+		return data_creacio;
+	}
+
+	public void setData_creacio(Timestamp data_creacio) {
+		this.data_creacio = data_creacio;
+	}
+
+	public Timestamp getData_mod() {
+		return data_mod;
+	}
+
+	public void setData_mod(Timestamp data_mod) {
+		this.data_mod = data_mod;
+	}
+
+	public String getText() {
+		return text;
+	}
+
+	public void setText(String text) {
+		this.text = text;
+	}
+
+	public String getAmbit() {
+		return ambit;
+	}
+
+	public void setAmbit(String ambit) {
+		this.ambit = ambit;
+	}
+
+	public static long getSerialversionuid() {
+		return serialVersionUID;
+	}
+	
+	
+}

+ 62 - 0
src/main/java/es/uv/saic/domain/PlantillaComentario.java

@@ -0,0 +1,62 @@
+package es.uv.saic.domain;
+
+public class PlantillaComentario {
+	
+	private String uid;
+	private String author;
+	private String authorName;
+	private String content;
+	private String createdAt;
+	private String modifiedAt;
+	
+	public PlantillaComentario() {}
+	
+	public PlantillaComentario(String uid, String author, String authorName, String content, String createdAt,
+			String modifiedAt) {
+		this.uid = uid;
+		this.author = author;
+		this.authorName = authorName;
+		this.content = content;
+		this.createdAt = createdAt;
+		this.modifiedAt = modifiedAt;
+	}
+	public String getUid() {
+		return uid;
+	}
+	public void setUid(String uid) {
+		this.uid = uid;
+	}
+	public String getAuthor() {
+		return author;
+	}
+	public void setAuthor(String author) {
+		this.author = author;
+	}
+	public String getAuthorName() {
+		return authorName;
+	}
+	public void setAuthorName(String authorName) {
+		this.authorName = authorName;
+	}
+	public String getContent() {
+		return content;
+	}
+	public void setContent(String content) {
+		this.content = content;
+	}
+	public String getCreatedAt() {
+		return createdAt;
+	}
+	public void setCreatedAt(String createdAt) {
+		this.createdAt = createdAt;
+	}
+	public String getModifiedAt() {
+		return modifiedAt;
+	}
+	public void setModifiedAt(String modifiedAt) {
+		this.modifiedAt = modifiedAt;
+	}
+	
+	
+
+}

+ 66 - 0
src/main/java/es/uv/saic/domain/PlantillaConversation.java

@@ -0,0 +1,66 @@
+package es.uv.saic.domain;
+
+import java.util.Collection;
+import java.util.List;
+
+public class PlantillaConversation {
+
+	private String uid;
+	private List<PlantillaComentario> comments;
+	
+	public PlantillaConversation() {}
+	
+	public PlantillaConversation(String uid, List<PlantillaComentario> comments) {
+		this.uid = uid;
+		this.comments = comments;
+	}
+
+	public String getUid() {
+		return uid;
+	}
+
+	public void setUid(String uid) {
+		this.uid = uid;
+	}
+
+	public List<PlantillaComentario> getComments() {
+		return comments;
+	}
+
+	public void setComments(List<PlantillaComentario> comments) {
+		this.comments = comments;
+	}
+	
+	public boolean add(PlantillaComentario arg0) {
+		return comments.add(arg0);
+	}
+
+	public boolean addAll(Collection<? extends PlantillaComentario> arg0) {
+		return comments.addAll(arg0);
+	}
+
+	public boolean addAll(int arg0, Collection<? extends PlantillaComentario> arg1) {
+		return comments.addAll(arg0, arg1);
+	}
+
+	public void clear() {
+		comments.clear();
+	}
+
+	public boolean contains(Object arg0) {
+		return comments.contains(arg0);
+	}
+
+	public PlantillaComentario get(int arg0) {
+		return comments.get(arg0);
+	}
+
+	public PlantillaComentario remove(int arg0) {
+		return comments.remove(arg0);
+	}
+
+	public int size() {
+		return comments.size();
+	}
+	
+}

+ 24 - 0
src/main/java/es/uv/saic/domain/PlantillaRepository.java

@@ -0,0 +1,24 @@
+package es.uv.saic.domain;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+
+@Repository
+public interface PlantillaRepository extends JpaRepository<Plantilla, Integer> {
+
+	Plantilla findByIdPlantilla(Integer idPlantilla);
+	
+	@Query(value=("SELECT * FROM plantilles WHERE "
+			+ "id_plantilla IN(SELECT CAST(codi_evidencia AS INTEGER) FROM tasques WHERE tipus = 11 AND codi_evidencia IS NOT NULL) "
+			+ "AND id_plantilla = ?1"), nativeQuery=true)
+	List<Plantilla> findUsedByIdPlantilla(Integer idPlantilla);
+	
+	@Query(value=("SELECT * FROM plantilles WHERE "
+			+ "versio = ?1 AND codi = ?2 AND ambit = ?3"), nativeQuery=true)
+	Plantilla findByVersioCodiAmbit(Integer versio, String codi, String ambit);
+	
+}

+ 198 - 0
src/main/java/es/uv/saic/domain/Proces.java

@@ -0,0 +1,198 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+import jakarta.persistence.*;
+import java.util.List;
+
+
+@Entity
+@Table(name="processos")
+@NamedQuery(name="Proces.findAll", query="SELECT p FROM Proces p")
+public class Proces implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@Column(name="id_proces")
+	private Integer idProces;
+
+	private String ambit;
+
+	@Column(name="curs_activacio")
+	private Integer cursActivacio;
+
+	@Column(name="curs_avaluat")
+	private Integer cursAvaluat;
+
+	@Column(name="descripcio_cas")
+	private String descripcioCas;
+
+	@Column(name="descripcio_val")
+	private String descripcioVal;
+
+	@Column(name="nom_proces")
+	private String nomProces;
+
+	@Column(name="titol_cas")
+	private String titolCas;
+
+	@Column(name="titol_val")
+	private String titolVal;
+	
+	private String comentaris;
+
+	private String versio;
+
+	@Column(name="sub_titol")
+	private String subTitol;
+
+	//bi-directional many-to-one association to Instancia
+	@OneToMany(mappedBy="proces")
+	private List<Instancia> instancies;
+
+	//bi-directional many-to-one association to Tasca
+	@OneToMany(mappedBy="proces")
+	private List<Tasca> tasques;	
+
+	public Proces() {}
+
+	public Integer getIdProces() {
+		return this.idProces;
+	}
+
+	public void setIdProces(Integer idProces) {
+		this.idProces = idProces;
+	}
+
+	public String getAmbit() {
+		return this.ambit;
+	}
+
+	public void setAmbit(String ambit) {
+		this.ambit = ambit;
+	}
+
+	public Integer getCursActivacio() {
+		return this.cursActivacio;
+	}
+
+	public void setCursActivacio(Integer cursActivacio) {
+		this.cursActivacio = cursActivacio;
+	}
+
+	public Integer getCursAvaluat() {
+		return this.cursAvaluat;
+	}
+
+	public void setCursAvaluat(Integer cursAvaluat) {
+		this.cursAvaluat = cursAvaluat;
+	}
+
+	public String getDescripcioCas() {
+		return this.descripcioCas;
+	}
+
+	public void setDescripcioCas(String descripcioCas) {
+		this.descripcioCas = descripcioCas;
+	}
+
+	public String getDescripcioVal() {
+		return this.descripcioVal;
+	}
+
+	public void setDescripcioVal(String descripcioVal) {
+		this.descripcioVal = descripcioVal;
+	}
+
+	public String getNomProces() {
+		return this.nomProces;
+	}
+
+	public void setNomProces(String nomProces) {
+		this.nomProces = nomProces;
+	}
+
+	public String getTitolCas() {
+		return this.titolCas;
+	}
+
+	public void setTitolCas(String titolCas) {
+		this.titolCas = titolCas;
+	}
+
+	public String getTitolVal() {
+		return this.titolVal;
+	}
+
+	public void setTitolVal(String titolVal) {
+		this.titolVal = titolVal;
+	}
+	
+	public String getComentaris() {
+		return this.comentaris;
+	}
+
+	public void setComentaris(String comentaris) {
+		this.comentaris = comentaris;
+	}
+
+	public String getVersio() {
+		return this.versio;
+	}
+
+	public void setVersio(String versio) {
+		this.versio = versio;
+	}
+
+	public String getSubTitol() {
+		return this.subTitol;
+	}
+
+	public void setSubTitol(String subTitol) {
+		this.subTitol = subTitol;
+	}
+
+	public List<Instancia> getInstancies() {
+		return this.instancies;
+	}
+
+	public void setInstancies(List<Instancia> instancies) {
+		this.instancies = instancies;
+	}
+
+	public Instancia addInstancia(Instancia instancia) {
+		getInstancies().add(instancia);
+		instancia.setProces(this);
+
+		return instancia;
+	}
+
+	public Instancia removeInstancia(Instancia instancia) {
+		getInstancies().remove(instancia);
+		instancia.setProces(null);
+
+		return instancia;
+	}
+
+	public List<Tasca> getTasques() {
+		return this.tasques;
+	}
+
+	public void setTasques(List<Tasca> tasques) {
+		this.tasques = tasques;
+	}
+
+	public Tasca addTasca(Tasca tasca) {
+		getTasques().add(tasca);
+		tasca.setProces(this);
+
+		return tasca;
+	}
+
+	public Tasca removeTasca(Tasca tasca) {
+		getTasques().remove(tasca);
+		tasca.setProces(null);
+ 
+		return tasca;
+	}
+
+}

+ 124 - 0
src/main/java/es/uv/saic/domain/Rol.java

@@ -0,0 +1,124 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+import jakarta.persistence.*;
+import java.util.List;
+
+
+@Entity
+@Table(name="rols")
+@NamedQuery(name="Rol.findAll", query="SELECT r FROM Rol r")
+public class Rol implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@Column(name="id_rol")
+	private Integer idRol;
+
+	private String ambit;
+
+	@Column(name="descripcio_cas")
+	private String descripcioCas;
+	
+	@Column(name="descripcio_val")
+	private String descripcioVal;
+
+	@Column(name="nom_rol")
+	private String nomRol;
+
+	//bi-directional many-to-one association to Tasca
+	@OneToMany(mappedBy="rol")
+	private List<Tasca> tasques;
+
+	//bi-directional many-to-one association to UsuarisRol
+	@OneToMany(mappedBy="rol")
+	private List<UsuarisRol> usuarisRols;
+
+	public Rol() {
+	}
+
+	public Integer getIdRol() {
+		return this.idRol;
+	}
+
+	public void setIdRol(Integer idRol) {
+		this.idRol = idRol;
+	}
+
+	public String getAmbit() {
+		return this.ambit;
+	}
+
+	public void setAmbit(String ambit) {
+		this.ambit = ambit;
+	}
+	
+	public String getDescripcioCas() {
+		return descripcioCas;
+	}
+
+	public void setDescripcioCas(String descripcioCas) {
+		this.descripcioCas = descripcioCas;
+	}
+
+	public String getDescripcioVal() {
+		return descripcioVal;
+	}
+
+	public void setDescripcioVal(String descripcioVal) {
+		this.descripcioVal = descripcioVal;
+	}
+
+	public String getNomRol() {
+		return this.nomRol;
+	}
+
+	public void setNomRol(String nomRol) {
+		this.nomRol = nomRol;
+	}
+
+	public List<Tasca> getTasques() {
+		return this.tasques;
+	}
+
+	public void setTasques(List<Tasca> tasques) {
+		this.tasques = tasques;
+	}
+
+	public Tasca addTasque(Tasca tasca) {
+		getTasques().add(tasca);
+		tasca.setRol(this);
+
+		return tasca;
+	}
+
+	public Tasca removeTasque(Tasca tasca) {
+		getTasques().remove(tasca);
+		tasca.setRol(null);
+
+		return tasca;
+	}
+
+	public List<UsuarisRol> getUsuarisRols() {
+		return this.usuarisRols;
+	}
+
+	public void setUsuarisRols(List<UsuarisRol> usuarisRols) {
+		this.usuarisRols = usuarisRols;
+	}
+
+	public UsuarisRol addUsuarisRol(UsuarisRol usuarisRol) {
+		getUsuarisRols().add(usuarisRol);
+		usuarisRol.setRol(this);
+
+		return usuarisRol;
+	}
+
+	public UsuarisRol removeUsuarisRol(UsuarisRol usuarisRol) {
+		getUsuarisRols().remove(usuarisRol);
+		usuarisRol.setRol(null);
+
+		return usuarisRol;
+	}
+
+}

+ 256 - 0
src/main/java/es/uv/saic/domain/Tasca.java

@@ -0,0 +1,256 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+
+import jakarta.persistence.*;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * The persistent class for the tasques database table.
+ * 
+ */
+@Entity
+@Table(name="tasques")
+@NamedQuery(name="Tasca.findAll", query="SELECT t FROM Tasca t")
+public class Tasca implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@Column(name="id_tasca")
+	private Integer idTasca;
+
+	@Column(name="codi_evidencia")
+	private String codiEvidencia;
+
+	@Temporal(TemporalType.DATE)
+	@Column(name="data_lim")
+	private Date dataLim;
+
+	@Column(name="descripcio_cas")
+	private String descripcioCas;
+
+	@Column(name="descripcio_val")
+	private String descripcioVal;
+
+	@Column(name="id_tasca_seg")
+	private Integer idTascaSeg;
+
+	@Column(name="id_tasca_seg2")
+	private Integer idTascaSeg2;
+
+	@Column(name="id_tascap")
+	private Integer idTascap;
+
+	@Column(name="nom_evidencia_cas")
+	private String nomEvidenciaCas;
+	
+	@Column(name="nom_evidencia_val")
+	private String nomEvidenciaVal;
+
+	@Column(name="titol_cas")
+	private String titolCas;
+
+	@Column(name="titol_val")
+	private String titolVal;
+	
+	@Column(name="opcions")
+	private String opcions;
+	
+	@Column(name="informe")
+	private Boolean informe;
+
+	//bi-directional many-to-one association to Proces
+	@ManyToOne
+	@JoinColumn(name="id_proces")
+	private Proces proces;
+
+	//bi-directional many-to-one association to Rol
+	@ManyToOne
+	@JoinColumn(name="id_rol")
+	private Rol rol;
+
+	//bi-directional many-to-one association to Tipus
+	@ManyToOne
+	@JoinColumn(name="tipus")
+	private Tipus tipus;
+
+	//bi-directional many-to-one association to InstanciaTasca
+	@OneToMany(mappedBy="tasca")
+	private List<InstanciaTasca> instancies;
+
+	public Tasca() {
+	}
+
+	public Integer getIdTasca() {
+		return this.idTasca;
+	}
+
+	public void setIdTasca(Integer idTasca) {
+		this.idTasca = idTasca;
+	}
+
+	public String getCodiEvidencia() {
+		return this.codiEvidencia;
+	}
+
+	public void setCodiEvidencia(String codiEvidencia) {
+		this.codiEvidencia = codiEvidencia;
+	}
+
+	public Date getDataLim() {
+		return this.dataLim;
+	}
+
+	public void setDataLim(Date dataLim) {
+		this.dataLim = dataLim;
+	}
+
+	public String getDescripcioCas() {
+		return this.descripcioCas;
+	}
+
+	public void setDescripcioCas(String descripcioCas) {
+		this.descripcioCas = descripcioCas;
+	}
+
+	public String getDescripcioVal() {
+		return this.descripcioVal;
+	}
+
+	public void setDescripcioVal(String descripcioVal) {
+		this.descripcioVal = descripcioVal;
+	}
+
+	public Integer getIdTascaSeg() {
+		return this.idTascaSeg;
+	}
+
+	public void setIdTascaSeg(Integer idTascaSeg) {
+		this.idTascaSeg = idTascaSeg;
+	}
+
+	public Integer getIdTascaSeg2() {
+		return this.idTascaSeg2;
+	}
+
+	public void setIdTascaSeg2(Integer idTascaSeg2) {
+		this.idTascaSeg2 = idTascaSeg2;
+	}
+
+	public Integer getIdTascap() {
+		return this.idTascap;
+	}
+
+	public void setIdTascap(Integer idTascap) {
+		this.idTascap = idTascap;
+	}
+
+	public String getNomEvidenciaCas() {
+		return this.nomEvidenciaCas;
+	}
+
+	public void setNomEvidenciaCas(String nomEvidenciaCas) {
+		this.nomEvidenciaCas = nomEvidenciaCas;
+	}
+	public String getNomEvidenciaVal() {
+		return this.nomEvidenciaVal;
+	}
+
+	public void setNomEvidenciaVal(String nomEvidenciaVal) {
+		this.nomEvidenciaVal = nomEvidenciaVal;
+	}
+	public String getTitolCas() {
+		return this.titolCas;
+	}
+
+	public void setTitolCas(String titolCas) {
+		this.titolCas = titolCas;
+	}
+
+	public String getTitolVal() {
+		return this.titolVal;
+	}
+
+	public void setTitolVal(String titolVal) {
+		this.titolVal = titolVal;
+	}
+
+	public Proces getProces() {
+		return this.proces;
+	}
+
+	public void setProces(Proces proces) {
+		this.proces = proces;
+	}
+
+	public Rol getRol() {
+		return this.rol;
+	}
+
+	public void setRol(Rol rol) {
+		this.rol = rol;
+	}
+
+	public Tipus getTipus() {
+		return this.tipus;
+	}
+
+	public void setTipus(Tipus tipus) {
+		this.tipus = tipus;
+	}
+
+	public List<InstanciaTasca> getInstancies() {
+		return this.instancies;
+	}
+
+	public void setInstancies(List<InstanciaTasca> instanciaTascas) {
+		this.instancies = instanciaTascas;
+	}
+
+	public InstanciaTasca addInstancia(InstanciaTasca instanciaTasca) {
+		this.getInstancies().add(instanciaTasca);
+		instanciaTasca.setTasca(this);
+
+		return instanciaTasca;
+	}
+
+	public InstanciaTasca removeInstancia(InstanciaTasca instanciaTasca) {
+		this.getInstancies().remove(instanciaTasca);
+		instanciaTasca.setTasca(null);
+
+		return instanciaTasca;
+	}
+	
+	public boolean isExpired() {
+		if(this.getDataLim() != null) {
+			if((new Date(this.getDataLim().getTime()+(1000 * 60 * 60 * 24))).before(new Date())) {
+				return true;
+			}
+			else {
+				return false;
+			}
+		}
+		else {
+			return false;
+		}
+	}
+	
+	public void setOpcions(String opcions) {
+		this.opcions = opcions;
+	}
+
+	public String getOpcions() {
+		return this.opcions;
+	}
+	
+	public void setInforme(Boolean informe) {
+		this.informe = informe;
+	}
+
+	public Boolean getInforme() {
+		return this.informe;
+	}
+
+}

+ 42 - 0
src/main/java/es/uv/saic/domain/Tipus.java

@@ -0,0 +1,42 @@
+package es.uv.saic.domain;
+
+
+import java.io.Serializable;
+import jakarta.persistence.*;
+
+
+/**
+ * The persistent class for the tipus database table.
+ * 
+ */
+@Entity
+@NamedQuery(name="Tipus.findAll", query="SELECT t FROM Tipus t")
+public class Tipus implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	private Integer tipus;
+
+	private String descripcio;
+
+
+	public Tipus() {
+	}
+
+	public Integer getTipus() {
+		return this.tipus;
+	}
+
+	public void setTipus(Integer tipus) {
+		this.tipus = tipus;
+	}
+
+	public String getDescripcio() {
+		return this.descripcio;
+	}
+
+	public void setDescripcio(String descripcio) {
+		this.descripcio = descripcio;
+	}
+
+}

+ 210 - 0
src/main/java/es/uv/saic/domain/Usuari.java

@@ -0,0 +1,210 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+import jakarta.persistence.*;
+
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * The persistent class for the usuaris database table.
+ * 
+ */
+@Entity
+@Table(name="usuaris")
+@NamedQuery(name="Usuari.findAll", query="SELECT u FROM Usuari u")
+public class Usuari implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	private String usuari;
+
+	private String clau;
+
+	private String cognoms;
+
+	private String email;
+
+	private Boolean ldap;
+
+	private String nom;
+	
+	@Temporal(TemporalType.TIMESTAMP)
+	@Column(name="data_ultim")
+	private Date dataUltim;
+	
+	private String locale;
+
+	//bi-directional many-to-one association to InstanciaTasca
+	@OneToMany(mappedBy="usuari")
+	private List<InstanciaTasca> instanciesTasques;
+
+	//bi-directional many-to-one association to UsuarisRol
+	@OneToMany(mappedBy="usuari")
+	private List<UsuarisRol> rols;
+	
+	@Transient
+	private boolean isGranted;
+	
+	@Transient
+	private boolean isAdmin;
+	
+	@Transient
+	private boolean isDataTest;
+
+	public Usuari() {
+	}
+
+	public String getUsuari() {
+		return this.usuari;
+	}
+
+	public void setUsuari(String usuari) {
+		this.usuari = usuari;
+	}
+
+	public String getClau() {
+		return this.clau;
+	}
+
+	public void setClau(String clau) {
+		this.clau = clau;
+	}
+
+	public String getCognoms() {
+		return this.cognoms;
+	}
+
+	public void setCognoms(String cognoms) {
+		this.cognoms = cognoms;
+	}
+
+	public String getEmail() {
+		return this.email;
+	}
+
+	public void setEmail(String email) {
+		this.email = email;
+	}
+
+	public Boolean getLdap() {
+		return this.ldap;
+	}
+
+	public void setLdap(Boolean ldap) {
+		this.ldap = ldap;
+	}
+
+	public String getNom() {
+		return this.nom;
+	}
+
+	public void setNom(String nom) {
+		this.nom = nom;
+	}
+	
+	public Date getDataUltim() {
+		return this.dataUltim;
+	}
+
+	public void setDataUltim(Date dataUltim) {
+		this.dataUltim = dataUltim;
+	}
+	
+	public String getLocale() {
+		return this.locale;
+	}
+	
+	public void setLocale(String locale) {
+		this.locale = locale;
+	}
+
+	public List<InstanciaTasca> getInstanciesTasques() {
+		return this.instanciesTasques;
+	}
+
+	public void setInstanciesTasques(List<InstanciaTasca> instanciaTascas) {
+		this.instanciesTasques = instanciaTascas;
+	}
+
+	public InstanciaTasca addInstanciaTasca(InstanciaTasca instanciaTasca) {
+		getInstanciesTasques().add(instanciaTasca);
+		instanciaTasca.setUsuari(this);
+
+		return instanciaTasca;
+	}
+
+	public InstanciaTasca removeInstanciaTasca(InstanciaTasca instanciaTasca) {
+		getInstanciesTasques().remove(instanciaTasca);
+		instanciaTasca.setUsuari(null);
+
+		return instanciaTasca;
+	}
+
+	public List<UsuarisRol> getUsuarisRols() {
+		return this.rols;
+	}
+
+	public void setUsuariRols(List<UsuarisRol> usuarisRols) {
+		this.rols = usuarisRols;
+	}
+
+	public UsuarisRol addRol(UsuarisRol usuarisRol) {
+		getUsuarisRols().add(usuarisRol);
+		usuarisRol.setUsuari(this);
+
+		return usuarisRol;
+	}
+
+	public UsuarisRol removeRol(UsuarisRol usuarisRol) {
+		getUsuarisRols().remove(usuarisRol);
+		usuarisRol.setUsuari(null);
+
+		return usuarisRol;
+	}
+	
+	public boolean isGranted() {
+		return this.isGranted;
+	}
+
+	public void setGranted(boolean isGranted) {
+		this.isGranted = isGranted;
+	}
+	public boolean isAdmin() {
+		return this.isAdmin;
+	}
+
+	public void setAdmin(boolean isAdmin) {
+		this.isAdmin = isAdmin;
+	}
+
+	public boolean isDataTest() {
+		return isDataTest;
+	}
+
+	public void setDataTest(boolean isDataTest) {
+		this.isDataTest = isDataTest;
+	}
+	
+	public boolean equals(Object other) {
+		if (this == other) {
+			return true;
+		}
+		if (!(other instanceof Usuari)) {
+			return false;
+		}
+		Usuari castOther = (Usuari)other;
+		return 
+			this.usuari.equals(castOther.usuari);
+	}
+
+	public int hashCode() {
+		final int prime = 31;
+		int hash = 17;
+		hash = hash * prime + this.usuari.hashCode();
+		
+		return hash;
+	}
+	
+}

+ 90 - 0
src/main/java/es/uv/saic/domain/UsuariRepository.java

@@ -0,0 +1,90 @@
+package es.uv.saic.domain;
+
+
+
+import java.math.BigInteger;
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import es.uv.saic.dto.TascaAsignadaDTO;
+
+
+@Repository
+public interface UsuariRepository extends JpaRepository<Usuari, String> {
+	
+	@Query("SELECT i FROM Usuari i WHERE i.usuari = ?1")
+	Usuari findByUsername(String usuari);
+	
+	@Query(value=("(SELECT ur.tlugar AS tLugar, ur.lugar AS lugar, id_proces AS idProces , id_instancia AS instancia, id_tascai AS instanciaTasca, id_tascap AS tascaP, ur.id_rol AS rol \n"+ 
+			"FROM usuaris_rols ur \n"+
+			"INNER JOIN tasquesi ti ON ur.tlugar=ti.tlugar AND ur.lugar=ti.lugar \n"+
+			"WHERE ur.tlugar=ti.tlugar AND ur.id_rol=ti.id_rol AND vigent \n"+ 
+			"AND estat='A' AND usuari=?1) \n"+
+			"UNION \n"+
+			"(SELECT ur.tlugar AS tLugar, ur.lugar AS lugar, id_proces AS idProces , id_instancia AS instancia, id_tascai AS instanciaTasca, id_tascap AS tascaP, ur.id_rol AS rol \n"+
+			"FROM usuaris_rols ur, organs o, tasquesi ti \n"+
+			"WHERE ti.tlugar='T' AND ti.tlugar=o.tlugar AND ti.lugar=o.lugar AND o.tlugar2=ur.tlugar AND o.lugar2=ur.lugar \n"+
+			"AND ur.id_rol=ti.id_rol \n"+
+			"AND vigent \n"+
+			"AND estat='A' AND usuari=?1)"), nativeQuery=true)
+	List<TascaAsignadaDTO> findActiveInstanciaTasques(String usuari);
+	
+	@Query(value=("SELECT DISTINCT(ins.id_instancia) FROM instancies ins, usuaris_rols usr, tasques tas, tasquesi tasi WHERE ins.estat = 'A' " + 
+			"AND ((ins.tlugar = usr.tlugar AND ins.lugar = usr.lugar) OR (ins.centre = usr.lugar AND usr.tlugar = 'C')) " +
+			"AND tasi.id_instancia = ins.id_instancia " + 
+			"AND usr.vigent AND usr.usuari = ?1 AND tasi.id_tasca = tas.id_tasca AND tasi.estat = 'A' " + 
+			"AND tas.id_proces = ins.id_proces AND tas.id_rol = usr.id_rol ORDER BY ins.id_instancia ASC"), nativeQuery=true)
+	List<BigInteger> findActiveInstancies(String usuari);
+	
+	@Query(value=("SELECT DISTINCT(ins.id_instancia) FROM instancies ins, usuaris_rols usr, tasques tas, tasquesi tasi WHERE ins.estat = 'A'\n" + 
+			"AND usr.usuari = ?1 AND tasi.id_tasca = tas.id_tasca AND tasi.estat = 'A' AND tasi.id_instancia = ins.id_instancia\n" + 
+			"AND tas.id_proces = ins.id_proces AND tas.id_rol = usr.id_rol AND usr.vigent ORDER BY ins.id_instancia ASC"), nativeQuery=true)
+	List<BigInteger> findActiveInstanciesGranted(String usuari);
+	
+	@Query(value=("SELECT id_instancia FROM instancies WHERE lugar = ?1 AND tlugar = ?2"), nativeQuery=true)
+	List<BigInteger> findSupervisableProcessos(Integer lugar, String tlugar);
+	
+	@Query(value=("SELECT id_instancia FROM instancies WHERE centre = ?1"), nativeQuery=true)
+	List<BigInteger> findSupervisableProcessosResp(Integer centre);
+	
+	@Query(value=("SELECT id_instancia FROM instancies WHERE id_proces IN(SELECT id_proces FROM processos WHERE nom_proces IN(?1))"), nativeQuery=true)
+	List<BigInteger> findSupervisableProcessosSupervisor(List<String> procs);
+	
+	@Query(value=("SELECT DISTINCT(centre) FROM (SELECT o.lugar AS centre FROM usuaris_rols u " + 
+			 "LEFT JOIN organs o ON u.tlugar = o.tlugar AND u.lugar = o.lugar " + 
+			 "WHERE o.tlugar = 'C' AND u.usuari = ?1 AND u.vigent " + 
+			 "UNION " + 
+			 "SELECT lugar2 AS centre FROM usuaris_rols u " + 
+			 "LEFT JOIN organs o ON u.tlugar = o.tlugar AND u.lugar = o.lugar " + 
+			 "WHERE o.tlugar = 'T' AND u.usuari = ?1 AND u.vigent) a"), nativeQuery=true)
+	List<Integer> findSupervisableCentres(String usuari);
+	
+	@Query(value=("SELECT DISTINCT ins.centre FROM instancies ins "
+			+ "LEFT JOIN processos pr ON pr.id_proces = ins.id_proces "
+			+ "WHERE pr.nom_proces IN(?1)"), nativeQuery=true)
+	List<Integer> findSupervisableCentresSupervisor(List<String> procs);
+	
+	@Query(value="SELECT us.* FROM usuaris us, usuaris_rols usr, tasques tas, tasquesi tasi, instancies ins "
+			+ "WHERE us.usuari = usr.usuari AND tasi.id_tasca = tas.id_tasca AND tasi.estat = 'A' "
+			+ "AND ins.lugar = usr.lugar AND ins.tlugar = usr.tlugar AND ins.id_instancia = tasi.id_instancia AND ins.id_instancia = ?1 "
+			+ "AND usr.vigent AND tas.id_rol = usr.id_rol "
+			+ "UNION "
+			+ "SELECT us.* FROM usuaris us, usuaris_rols usr, tasques tas, tasquesi tasi, instancies ins "
+			+ "WHERE us.usuari = usr.usuari AND tasi.id_tasca = tas.id_tasca AND tasi.estat = 'A' "
+			+ "AND ins.centre = usr.lugar AND ins.id_instancia = tasi.id_instancia AND ins.id_instancia = ?1 "
+			+ "AND usr.vigent AND tas.id_rol = usr.id_rol "
+			+ "UNION "
+			+ "SELECT us.* FROM usuaris us, usuaris_rols usr, tasques tas, tasquesi tasi, instancies ins "
+			+ "WHERE us.usuari = usr.usuari AND tasi.id_tasca = tas.id_tasca AND tasi.estat = 'A' "
+			+ "AND usr.lugar = 0 AND usr.tlugar = 'U' AND ins.id_instancia = tasi.id_instancia AND ins.id_instancia = ?1 "
+			+ "AND usr.vigent AND tas.id_rol = usr.id_rol ", nativeQuery=true)
+	public List<Usuari> getInstanceAsignedUsers(BigInteger idInstancia);
+	
+	@Query(value=("SELECT * FROM usuaris WHERE usuari IN(SELECT DISTINCT usuari FROM usuaris_rols WHERE id_rol = ?1 "
+			+ "AND (lugar IN(?2) OR lugar IN (SELECT lugar FROM organs WHERE tlugar = 'T' AND lugar2 IN(?2))) AND vigent)"), nativeQuery=true)
+	List<Usuari> findByRolCentre(Integer idRol, List<Integer> centres);
+
+}

+ 127 - 0
src/main/java/es/uv/saic/domain/UsuarisRol.java

@@ -0,0 +1,127 @@
+package es.uv.saic.domain;
+
+
+import java.io.Serializable;
+import jakarta.persistence.*;
+import java.util.Date;
+
+/**
+ * The persistent class for the usuaris_rols database table.
+ * 
+ */
+@Entity
+@Table(name="usuaris_rols")
+@NamedQuery(name="UsuarisRol.findAll", query="SELECT u FROM UsuarisRol u")
+public class UsuarisRol implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@Column(name="id_usuari_rol")
+	private Integer idUsuariRol;
+
+	@Temporal(TemporalType.DATE)
+	private Date fin;
+
+	@Temporal(TemporalType.DATE)
+	private Date inici;
+
+	private Integer num;
+
+	private Integer supervisor;
+
+	private Boolean vigent;
+
+	//bi-directional many-to-one association to Organ
+	@ManyToOne
+	@JoinColumns({
+		@JoinColumn(name="lugar", referencedColumnName="lugar"),
+		@JoinColumn(name="tlugar", referencedColumnName="tlugar")
+		})
+	private Organ organ;
+
+	//bi-directional many-to-one association to Rol
+	@ManyToOne
+	@JoinColumn(name="id_rol")
+	private Rol rol;
+
+	//bi-directional many-to-one association to Usuari
+	@ManyToOne
+	@JoinColumn(name="usuari")
+	private Usuari usuari;
+
+	public UsuarisRol() {
+	}
+
+	public Integer getIdUsuariRol() {
+		return this.idUsuariRol;
+	}
+
+	public void setIdUsuariRol(Integer idUsuariRol) {
+		this.idUsuariRol = idUsuariRol;
+	}
+
+	public Date getFin() {
+		return this.fin;
+	}
+
+	public void setFin(Date fin) {
+		this.fin = fin;
+	}
+
+	public Date getInici() {
+		return this.inici;
+	}
+
+	public void setInici(Date inici) {
+		this.inici = inici;
+	}
+
+	public Integer getNum() {
+		return this.num;
+	}
+
+	public void setNum(Integer num) {
+		this.num = num;
+	}
+
+	public Integer getSupervisor() {
+		return this.supervisor;
+	}
+
+	public void setSupervisor(Integer supervisor) {
+		this.supervisor = supervisor;
+	}
+
+	public Boolean getVigent() {
+		return this.vigent;
+	}
+
+	public void setVigent(Boolean vigent) {
+		this.vigent = vigent;
+	}
+
+	public Organ getOrgan() {
+		return this.organ;
+	}
+
+	public void setOrgan(Organ organ) {
+		this.organ = organ;
+	}
+
+	public Rol getRol() {
+		return this.rol;
+	}
+
+	public void setRol(Rol rol) {
+		this.rol = rol;
+	}
+
+	public Usuari getUsuari() {
+		return this.usuari;
+	}
+
+	public void setUsuari(Usuari usuariBean) {
+		this.usuari = usuariBean;
+	}
+
+}

+ 64 - 0
src/main/java/es/uv/saic/domain/UsuarisRolRepository.java

@@ -0,0 +1,64 @@
+package es.uv.saic.domain;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+
+@Repository
+public interface UsuarisRolRepository extends JpaRepository<UsuarisRol, Long> {
+
+	@Query("SELECT i FROM UsuarisRol i WHERE i.usuari = ?1")
+	List<UsuarisRol> findByUsername(String usuari);
+	
+	@Query("SELECT i FROM UsuarisRol i WHERE i.usuari = ?1 AND i.vigent = TRUE")
+	List<UsuarisRol> findByUsernameActive(Usuari usuari);
+	
+	@Query("SELECT i FROM UsuarisRol i WHERE i.usuari = ?1 AND i.vigent = TRUE AND i.rol.nomRol = ?2")
+	UsuarisRol findByUsernameActiveRol(Usuari usuari, String Rol);
+	
+	@Query("SELECT i FROM UsuarisRol i WHERE i.usuari = ?1 AND i.vigent = TRUE AND i.rol.nomRol IN(?2)")
+	UsuarisRol findByUsernameActiveRoles(Usuari usuari, ArrayList<String> Rol);
+	
+	@Query(value=("SELECT * FROM usuaris_rols WHERE usuari = ?1 AND tlugar = ?2 AND lugar = ?3 AND vigent LIMIT 1"), nativeQuery=true)
+	UsuarisRol findActiveByUsuariTlugarLugar(String usuari, String tlugar, Integer lugar);
+	
+	//@Query("SELECT i FROM UsuarisRol i WHERE i.usuari = ?1 AND i.vigent = TRUE AND i.rol.ambit = ?2 LIMIT 1")
+	@Query(value=("SELECT ur.* "
+			+ "FROM usuaris_rols ur LEFT JOIN rols r ON ur.id_rol = r.id_rol "
+			+ "WHERE ur.usuari = ?1 AND r.ambit = ?2 AND ur.vigent LIMIT 1"), nativeQuery=true)
+	UsuarisRol findByUsernameActiveAmbit(String usuari, String ambit);
+	
+	@Query(value=("SELECT nom_proces FROM processos_rols WHERE id_rol IN(SELECT id_rol FROM rols WHERE nom_rol = ?1)"), nativeQuery=true)
+	List<String> findAssociatedProcs(String rol);
+
+	@Query(value=("SELECT * FROM usuaris_rols WHERE tlugar = 'C' AND lugar = ?1 AND vigent ORDER BY id_rol ASC"), nativeQuery=true)
+	List<UsuarisRol> findManagerByCentre(Integer centre);
+	
+	@Query(value=("SELECT * FROM usuaris_rols WHERE tlugar = 'T' AND lugar = ?1 AND vigent ORDER BY lugar"), nativeQuery=true)
+	List<UsuarisRol> findManagerByTitulacio(Integer titulacio);
+	
+	@Query(value=("SELECT * FROM usuaris_rols WHERE tlugar = 'C' AND lugar IN(?1) AND vigent ORDER BY id_rol ASC"), nativeQuery=true)
+	List<UsuarisRol> findManagerByCentres(List<Integer> centre);
+	
+	@Query(value=("SELECT * FROM usuaris_rols WHERE tlugar = 'T' AND lugar IN(?1) AND vigent ORDER BY lugar"), nativeQuery=true)
+	List<UsuarisRol> findManagerByTitulacions(List<Integer> titulacio);
+	
+	@Query(value=("SELECT * FROM usuaris_rols WHERE id_rol = ?1 AND usuari = ?2 AND lugar = ?3 AND tlugar = ?4"), nativeQuery=true)
+	UsuarisRol find(Integer idRol, String usuari, Integer lugar, String tlugar);
+	
+	@Query(value=("SELECT * FROM usuaris_rols WHERE id_rol = ?1 AND usuari = ?2 AND lugar = ?3 AND tlugar = ?4 AND vigent"), nativeQuery=true)
+	UsuarisRol findActive(Integer idRol, String usuari, Integer lugar, String tlugar);
+	
+	@Query(value=("SELECT * FROM usuaris_rols WHERE id_rol = ?1 AND usuari = ?2 AND lugar = ?3 AND tlugar = ?4 ORDER BY num DESC LIMIT 1"), nativeQuery=true)
+	UsuarisRol findLast(Integer idRol, String usuari, Integer lugar, String tlugar);
+	
+	@Query(value=("SELECT num FROM usuaris_rols WHERE id_rol = ?1 AND lugar = ?2 AND tlugar = ?3 ORDER BY num DESC LIMIT 1"), nativeQuery=true)
+	Integer findLastNum(Integer idRol, Integer lugar, String tlugar);
+	
+	
+}

+ 27 - 0
src/main/java/es/uv/saic/dto/CategoriaDTO.java

@@ -0,0 +1,27 @@
+package es.uv.saic.dto;
+
+public class CategoriaDTO {
+    Integer categoria;
+    Integer lugar;
+    String tlugar;
+ 
+    CategoriaDTO() {}
+
+    public CategoriaDTO(Integer categoria, Integer lugar, String tlugar) {
+        this.categoria = categoria;
+        this.lugar = lugar;
+        this.tlugar = tlugar;
+    }
+    
+    public Integer getCategoria() {
+        return this.categoria;
+    }
+
+    public Integer getLugar() {
+        return this.lugar;
+    }
+
+    public String getTlugar() {
+        return this.tlugar;
+    }
+}

+ 40 - 0
src/main/java/es/uv/saic/dto/DocumentDTO.java

@@ -0,0 +1,40 @@
+package es.uv.saic.dto;
+
+public class DocumentDTO {
+
+	private String text;
+	private String ruta;
+	
+	public DocumentDTO() {}
+	
+	public DocumentDTO(String text, String ruta, String data, String size) {
+		String template = """
+			<a style="width:100;display:flex;" target="_blank" href="/download/document/[ruta]">
+				<span style="width:100%;display:flex;">
+					<span style="width:80%;text-align:left;">[text]</span>
+					<span>[data]</span>
+					&nbsp;&nbsp;&nbsp;
+					<span> ([size])</span>
+				</span>
+			</a>
+		""";
+		this.text = template.replace("[ruta]", ruta).replace("[text]", text).replace("[data]", data).replace("[size]", size);
+		this.ruta = ruta;
+	}
+	
+	public String getText() {
+		return text;
+	}
+	public void setText(String text) {
+		this.text = text;
+	}
+	public String getRuta() {
+		return ruta;
+	}
+	public void setRuta(String ruta) {
+		this.ruta = ruta;
+	}
+	
+	
+	
+}

+ 42 - 0
src/main/java/es/uv/saic/dto/DocumentTmpDTO.java

@@ -0,0 +1,42 @@
+package es.uv.saic.dto;
+
+import org.springframework.web.multipart.MultipartFile;
+
+public class DocumentTmpDTO {
+    Integer idDocument;
+    Integer idCategoria;
+    Integer lugar;
+    String tlugar;
+    MultipartFile file;
+
+    DocumentTmpDTO() {}
+
+    public DocumentTmpDTO(Integer idDocument, Integer idCategoria, Integer lugar,
+        String tlugar, MultipartFile file) {
+        this.idDocument = idDocument;
+        this.idCategoria = idCategoria;
+        this.lugar = lugar;
+        this.tlugar = tlugar;
+        this.file = file;
+    }
+
+    public Integer getIdDocument() {
+        return this.idDocument;
+    }
+
+    public Integer getIdCategoria() {
+        return this.idCategoria;
+    }
+
+    public Integer getLugar() {
+        return this.lugar;
+    }
+
+    public String getTlugar() {
+        return this.tlugar;
+    }
+
+    public MultipartFile getFile () {
+        return this.file;
+    }
+}

+ 40 - 0
src/main/java/es/uv/saic/dto/IndicadorEnquestaDTO.java

@@ -0,0 +1,40 @@
+package es.uv.saic.dto;
+
+public class IndicadorEnquestaDTO {
+    private Integer idTitulacio;
+    private Integer idCentre;
+    private Integer curs;
+
+    public IndicadorEnquestaDTO() {
+    }
+
+    public IndicadorEnquestaDTO(Integer idTitulacio, Integer idCentre, Integer curs) {
+        this.idTitulacio = idTitulacio;
+        this.idCentre = idCentre;
+        this.curs = curs;
+    }
+
+    public Integer getIdTitulacio() {
+        return idTitulacio;
+    }
+
+    public Integer getIdCentre() {
+        return idCentre;
+    }
+
+    public Integer getCurs() {
+        return curs;
+    }
+
+    public void setIdTitulacio(Integer idTitulacio) {
+        this.idTitulacio = idTitulacio;
+    }
+
+    public void setIdCentre(Integer idCentre) {
+        this.idCentre = idCentre;
+    }
+
+    public void setCurs(Integer curs) {
+        this.curs = curs;
+    }
+}

+ 15 - 0
src/main/java/es/uv/saic/dto/IndicadorEnquestaValorDTO.java

@@ -0,0 +1,15 @@
+package es.uv.saic.dto;
+
+public interface IndicadorEnquestaValorDTO {
+	String getEnquesta();
+	String getIndicador();
+	String getValor();
+	String getNum();
+	String getAmbit();
+	String getTipus();
+	String getMin();
+	String getMax();
+	Integer getCurs();
+	String getCursd();
+	String getMedia();
+}

+ 32 - 0
src/main/java/es/uv/saic/dto/PdfDTO.java

@@ -0,0 +1,32 @@
+package es.uv.saic.dto;
+
+import java.math.BigInteger;
+import java.util.Optional;
+
+public class PdfDTO {
+    private String content;
+    private Optional<BigInteger> idtascai;
+    
+    public PdfDTO() {}
+
+    public PdfDTO(String content, Optional<BigInteger> idtascai) {
+        this.content = content;
+        this.idtascai = idtascai;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public Optional<BigInteger> getIdtascai() {
+        return idtascai;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public void setIdtascai(Optional<BigInteger> idtascai) {
+        this.idtascai = idtascai;
+    }
+}

+ 11 - 0
src/main/java/es/uv/saic/dto/TascaAsignadaDTO.java

@@ -0,0 +1,11 @@
+package es.uv.saic.dto;
+
+public interface TascaAsignadaDTO {
+	String getTLugar();
+	String getLugar();
+	String getIdProces();
+	String getInstancia();
+	String getInstanciaTasca();
+	String getTascaP();
+	Object getRol();
+}

+ 50 - 0
src/main/java/es/uv/saic/dto/TascaDTO.java

@@ -0,0 +1,50 @@
+package es.uv.saic.dto;
+
+public class TascaDTO {
+    private String nomProces;
+    private Integer lugar;
+    private Integer lugar2;
+    private String tambit;
+
+    public TascaDTO() {
+    }
+
+    public TascaDTO(String nomProces, Integer lugar, Integer lugar2, String tambit) {
+        this.nomProces = nomProces;
+        this.lugar = lugar;
+        this.lugar2 = lugar2;
+        this.tambit = tambit;
+    }
+
+    public String getNomProces() {
+        return nomProces;
+    }
+
+    public Integer getLugar() {
+        return lugar;
+    }
+
+    public Integer getLugar2() {
+        return lugar2;
+    }
+
+    public String getTambit() {
+        return tambit;
+    }
+
+    public void setNomProces(String nomProces) {
+        this.nomProces = nomProces;
+    }
+
+    public void setLugar(Integer lugar) {
+        this.lugar = lugar;
+    }
+
+    public void setLugar2(Integer lugar2) {
+        this.lugar2 = lugar2;
+    }
+
+    public void setTambit(String tambit) {
+        this.tambit = tambit;
+    }
+}

+ 19 - 0
src/main/java/es/uv/saic/dto/TascaInformeTransferDTO.java

@@ -0,0 +1,19 @@
+package es.uv.saic.dto;
+
+import java.sql.Date;
+
+public interface TascaInformeTransferDTO {
+    Integer getTitulacio();
+    Integer getIdProces();
+    String getNomProces();
+    String getAmbit();
+    Integer getCursAvaluat();
+    Integer getIdTascai();
+    Integer getIdInstancia();
+    Integer getIdTasca();
+    Integer getVersio();
+    String getEstat();
+    String getUsuariFet();
+    Date getDataFet();
+    String getEvidencia();
+}

+ 160 - 0
src/main/java/es/uv/saic/service/AuthProvider.java

@@ -0,0 +1,160 @@
+package es.uv.saic.service;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Hashtable;
+import java.util.List;
+
+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.DirContext;
+import javax.naming.directory.InitialDirContext;
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.SearchResult;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.AuthenticationProvider;
+import org.springframework.security.authentication.AuthenticationServiceException;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.stereotype.Component;
+
+import es.uv.saic.SaicApplication;
+import es.uv.saic.domain.Usuari;
+
+@Component
+public class AuthProvider implements AuthenticationProvider {
+
+	@Autowired
+	private UsuariService us;
+	@Autowired
+    private UsuarisRolService urs;
+		
+	private static final Logger logger = LoggerFactory.getLogger(SaicApplication.class);
+	
+	@Override
+	public Authentication authenticate(Authentication auth) throws AuthenticationException {
+		String username = auth.getName().toLowerCase().trim();
+        String password = auth.getCredentials().toString(); 
+        
+        List<SimpleGrantedAuthority> authorities = new ArrayList<SimpleGrantedAuthority>();
+    	authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
+        
+        Usuari u = this.us.findByUsername(username);
+        
+        if(u != null) {
+        	u.setGranted(this.urs.isGrantedUser(u));
+            u.setAdmin(this.urs.isAdminUser(u));
+            u.setDataTest(this.urs.isDataTestUser(u));
+        	boolean vigent = this.us.hasActiveRol(u);
+        	
+	        if(!u.getLdap() && vigent) {
+	            if (u.getUsuari().equals(username) && u.getClau().equals(password)) {
+	            	logger.info("Autenticación LOCAL correcta: "+username);
+	            	if(u.isAdmin()) {
+	            		authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
+	            	}
+	            	if(u.isGranted()) {
+	            		authorities.add(new SimpleGrantedAuthority("ROLE_MANAGER"));
+	            	}
+	            	if(u.isDataTest()) {
+	            		authorities.add(new SimpleGrantedAuthority("ROLE_TESTER"));
+	            	}
+	            	UsernamePasswordAuthenticationToken authUser = new UsernamePasswordAuthenticationToken(u, password, authorities);
+	            	authUser.setDetails(u);
+	                return authUser ;
+	            } 
+	            else {
+	            	logger.info("Error de autenticación LOCAL ["+username+"]: el usuario o la contraseña no coinciden");
+	                throw new BadCredentialsException("Error de autenticación LOCAL ["+username+"]: el usuario o la contraseña no coinciden");
+	            }
+	        }
+	        else if(vigent) {
+	        	
+	        	Hashtable<String, String> env = new Hashtable<String, String>();
+
+                env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
+                env.put(Context.PROVIDER_URL, "ldap://ldap.uv.es/");
+                env.put(Context.SECURITY_AUTHENTICATION, "simple");
+                env.put(Context.SECURITY_PRINCIPAL, "uid=" + username.toLowerCase().trim() + ", dc=uv, dc=es ");
+                env.put(Context.SECURITY_CREDENTIALS, password);
+                
+                try {
+                    DirContext dc = new InitialDirContext(env);
+                    String base = "dc=uv,dc=es";
+                    String filter = "(&(uid=" + username + "))";
+                    int state = 0;
+
+                    SearchControls ctls = new SearchControls();
+                    ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
+                    ctls.setReturningAttributes(new String[] { "uid" });
+
+                    NamingEnumeration<SearchResult> resultEnum = dc.search(base, filter, ctls);
+
+                    while (resultEnum.hasMore() && state < 2) {
+                        SearchResult result = resultEnum.next();
+
+                        Attributes attrs = result.getAttributes();
+                        if (attrs.size() != 1) {
+                            logger.info("Error de autenticación LDAP ["+username+"]: el usuario o la contraseña no coinciden");
+                            throw new BadCredentialsException("Error de autenticación LDAP ["+username+"]: el usuario o la contraseña no coinciden");
+                        }
+                        NamingEnumeration<?> e = attrs.getAll();
+                        while (e.hasMore()) {
+                            Attribute attr = (Attribute) e.next();
+                            if (!((String) attr.get()).equals(username)) {
+                                logger.info("Error de autenticación LDAP ["+username+"]: el usuario no coincide con el devuelto por el servidor");
+                                throw new BadCredentialsException("Error de autenticación LDAP ["+username+"]: el usuario no coincide con el devuelto por el servidor");
+                            }
+                        }
+                        state++;
+                    }
+
+                    dc.close();
+
+                    if (state < 1 || state > 1) {
+                        logger.info("Error de autenticación LDAP ["+username+"]: -> el servidor LDAP ha devuelto un estado incorrecto.");
+                        throw new BadCredentialsException("Error de autenticación LDAP ["+username+"]: -> el servidor LDAP ha devuelto un estado incorrecto.");
+                    }
+                    logger.info("Autenticación LDAP correcta: " + u.getUsuari());
+                    u.setDataUltim(new Date(System.currentTimeMillis()));
+                    this.us.save(u);
+	            	if(u.isAdmin()) {
+	            		authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
+	            	}
+	            	if(u.isGranted()) {
+	            		authorities.add(new SimpleGrantedAuthority("ROLE_MANAGER"));
+	            	}
+	            	if(u.isDataTest()) {
+	            		authorities.add(new SimpleGrantedAuthority("ROLE_TESTER"));
+	            	}
+	            	UsernamePasswordAuthenticationToken authUser = new UsernamePasswordAuthenticationToken(u, password, authorities);
+	            	authUser.setDetails(u);
+	                return authUser ;
+                } 
+                catch (NamingException ex) {
+                    logger.info("Error de autenticación ["+username+"]: " + ex.getMessage());
+                    throw new AuthenticationServiceException("Error de autenticación ["+username+"]: " + ex.getMessage());
+                }
+	        }
+        }
+        
+        throw new BadCredentialsException("Error general en el sistema de autenticación");
+ 
+
+	}
+
+	@Override
+	public boolean supports(Class<?> auth) {
+		return auth.equals(UsernamePasswordAuthenticationToken.class);
+	}
+
+}

+ 87 - 0
src/main/java/es/uv/saic/service/DocumentService.java

@@ -0,0 +1,87 @@
+package es.uv.saic.service;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.Optional;
+
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import es.uv.saic.domain.Document;
+import es.uv.saic.domain.DocumentRepository;
+
+@Service
+public class DocumentService {
+	
+	@Autowired
+	private DocumentRepository dr;
+	
+	@Value("${saic.data.docsPath}")
+	private String docsPath;
+
+	
+	public List<Document> getAll() {
+		return this.dr.findAll();
+	}
+	
+	public Document findById(Integer id) {
+		Optional<Document> c = this.dr.findById(id);
+		if(!c.isEmpty()) {
+			return c.get();
+		}
+		return null;
+	}
+	
+	public List<Document> findAllByCategoriaOrgan(Integer categoria, Integer lugar, String tlugar){
+		return this.dr.findAllByCategoriaOrgan(categoria, lugar, tlugar);
+	}
+	
+	public Document findByCategoriaOrgan(Integer categoria, Integer lugar, String tlugar){
+		return this.dr.findByCategoriaOrgan(categoria, lugar, tlugar);
+	}
+	
+	public List<Document> findByCategoriaNom(String nom){
+		return this.dr.findByCategoriaNom(nom);
+	}
+	
+	public List<Document> findByCategoriaTipus(String tipus){
+		return this.dr.findByCategoriaTipus(tipus);
+	}
+	
+	public Document archive(Document d) {
+		d.setVisible(false);
+		d = this.dr.save(d);
+		return d;
+	}
+	
+	public void archiveByOrgan(Integer lugar, String tlugar) {
+		this.dr.archiveByOrgan(lugar, tlugar);
+	}
+	
+	public boolean exists(Integer idCategoria, Integer lugar, String tlugar) {
+		Document d = this.dr.findByCategoriaOrgan(idCategoria, lugar, tlugar);
+		if(d == null) {
+			return false;
+		}
+		return true;
+	}
+	
+	public Document save(Document d) {
+		return this.dr.saveAndFlush(d);
+	}
+	
+	public void delete(Document d) {
+		this.dr.delete(d);
+	}
+	
+	public String upload(Integer idDocument, Integer idCategoria, Integer lugar, String tlugar, MultipartFile file) throws IllegalStateException, IOException {
+		String ext = FilenameUtils.getExtension(file.getOriginalFilename());
+		String fname = lugar.toString()+"_"+tlugar+"_"+idCategoria.toString()+"_"+idDocument.toString()+"."+ext;
+		file.transferTo(new File(docsPath+fname));
+		return docsPath+fname;
+	}
+}

+ 192 - 0
src/main/java/es/uv/saic/service/PlantillaService.java

@@ -0,0 +1,192 @@
+package es.uv.saic.service;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.math.BigInteger;
+import java.net.HttpURLConnection;
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.nio.file.Files;
+import java.util.Base64;
+import java.util.List;
+import java.util.Optional;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import es.uv.saic.domain.InstanciaTasca;
+import es.uv.saic.domain.PlantillaComentario;
+import es.uv.saic.domain.PlantillaConversation;
+
+
+@Service
+public class PlantillaService {
+	@Value("${saic.data.tmpPath}")
+	private String tmpPath;
+	@Value("${saic.data.templates.logoPath}")
+	private String logoPath;
+
+	@Value("${saic.url.core.domain}")
+	private String uriCore;
+
+
+	public byte[] toPDF(String content, Optional<BigInteger> idtascai) throws IOException, InterruptedException {
+		content = content.replace("<p><!-- pagebreak --></p>", "<p class=\"pagebreak\"><!-- pagebreak --></p>");
+		Document d = Jsoup.parse(content, "UTF8");
+		d.head().append("<style>"
+				+ "@page{size: 297mm 210mm;} "
+				+ "html{ max-width:297mm; max-height:210mm; margin:0; padding:0; transform:scale(0.925); transform-origin:left top; } "
+				+ "table { padding:2px !important; }"
+				+ "th, td { padding:2px !important; }"
+				+ ".pagebreak { page-break-before:always; }"
+				+ "</style>");
+		List<Element> trs = d.getElementsByTag("tr");
+		for(Element t : trs) {
+			if(t.hasAttr("height")) {
+				t.removeAttr("height");
+			}
+			if(t.hasAttr("style")) {
+				String style = t.attr("style");
+				style = style.replaceAll("height:[ \\d.pxcmin]{1,};", "");
+				t.attr("style", style);
+			}
+		}
+		List<Element> tds = d.getElementsByTag("td");
+		for(Element t : tds) {
+			if(t.hasAttr("height")) {
+				t.removeAttr("height");
+			}
+			if(t.hasAttr("style")) {
+				String style = t.attr("style");
+				style = style.replaceAll("height:[ \\d.pxcmin]{1,};", "");
+				t.attr("style", style);
+			}
+		}
+		List<Element> ignore = d.getElementsByClass("pdfignore");
+		for(Element e: ignore) {
+			e.remove();
+		}
+		
+		if(idtascai.isPresent()) {
+			InstanciaTasca ita = findById(idtascai.get());
+			if(ita.getTasca().getRol().getNomRol().equals("u_uq")) {
+				d.body().append(this.parseComments(d.html()));
+			}
+		}
+		
+		d.body().append(this.parseComments(d.html()));
+				
+		String basecommand = "google-chrome --headless --disable-gpu --no-pdf-header-footer --run-all-compositor-stages-before-draw --no-sandbox";	
+		File dst = File.createTempFile("saic-pdfpreview-", ".tmp.pdf", new File(tmpPath));
+		File src = File.createTempFile("saic-pdfpreview-", ".tmp.html", new File(tmpPath));
+		src.deleteOnExit();
+		dst.deleteOnExit();
+		
+		PrintWriter out = new PrintWriter(src.getAbsolutePath());
+		out.println(d.html());
+		out.flush();
+		out.close();
+		ProcessBuilder pb = new ProcessBuilder("bash", "-c", basecommand+" --print-to-pdf='"+dst+"' "+src.getAbsolutePath());
+		Process pr = pb.start();
+		pr.waitFor();
+				
+		byte[] bytes = Files.readAllBytes(dst.toPath());
+		src.delete();
+		dst.delete();
+		
+		return bytes;
+	}
+	
+	private InstanciaTasca findById(BigInteger id) {
+		URI uriObj = URI.create(uriCore + "/instanciatasca/" + id);
+		ObjectMapper mapper = new ObjectMapper();
+		InstanciaTasca instanciaTasca = null;
+
+		try {
+			HttpClient httpClient = HttpClient.newHttpClient();
+
+			HttpRequest request = HttpRequest.newBuilder()
+					.uri(uriObj)
+					.header("Content-Type", "application/json")
+					.POST(HttpRequest.BodyPublishers.noBody())
+					.build();
+
+			HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+			if (response.statusCode() == HttpURLConnection.HTTP_OK) {
+				instanciaTasca = mapper.readValue(response.body(), InstanciaTasca.class);
+			} else {
+				System.err.println("Error al obtener instancia: " + response.statusCode() + " -> " + response.body());
+			}
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return instanciaTasca;
+	}
+
+
+	private String parseComments(String content) throws JsonParseException, JsonMappingException, IOException {
+		// <!--tinycomments\|2\.1\|data:application\/json;base64,([A-Za-z0-9]*)=-->
+		Pattern pattern = Pattern.compile("\\<\\!\\-\\-tinycomments\\|2\\.1\\|data\\:application\\/json\\;base64\\,([A-Za-z0-9\\/\\+\\\\]*)\\=*\\-\\-\\>");
+		Matcher matcher = pattern.matcher(content);
+		String rawComments = "";
+		if(matcher.find()) {
+			byte[] decoded = Base64.getDecoder().decode(matcher.group(1));
+			rawComments = new String(decoded, "UTF-8");
+			
+			if(rawComments.length() < 10) {
+				return "";
+			}
+			
+			rawComments = rawComments.replaceAll("^.", "[");
+			rawComments = rawComments.replaceAll(".$", "]");
+			rawComments = rawComments.replaceAll("\"mce-conversation\\_\\d*\":", "");
+			
+			ObjectMapper mapper = new ObjectMapper();
+			List<PlantillaConversation> comments = mapper.readValue(rawComments, new TypeReference<List<PlantillaConversation>>(){});
+			
+			String tabComments =  "<p class=\"pagebreak\"><!-- pagebreak --></p>"
+								+ "<h3>COMENTARIOS GENERADOS DURANTE LA REVISIÓN DEL DOCUMENTO</h3>"
+								+ "<h3><small>Nota: Esta página no será visible en la versión final publicada del documento.</small></h3>"
+								+ "<table style=\"border-collapse: collapse; width: 297mm; border-width: 1px; border-spacing: 0px; border-color: rgb(149, 165, 166); margin-left: 0px; margin-right: auto;\" border=\"1\" width=\"297mm\" cellspacing=\"0\" cellpadding=\"8\">"
+								+ "<thead>"
+								+ "    <tr style=\"padding: 0px; border-width: 1px; border-color: rgb(149, 165, 166);\" bgcolor=\"#153d63\">"
+								+ "      <th style=\"padding: 0px; border-width: 1px; border-color: rgb(149, 165, 166); color:white;\" scope=\"col\">Usuario</th>"
+								+ "      <th style=\"padding: 0px; border-width: 1px; border-color: rgb(149, 165, 166); color:white;\" scope=\"col\">Nombre</th>"
+								+ "      <th style=\"padding: 0px; border-width: 1px; border-color: rgb(149, 165, 166); color:white;\" scope=\"col\">Comentario</th>"
+								+ "    </tr>"
+								+ "  </thead>"
+								+ "<tbody>";
+			for(PlantillaConversation conv: comments) {
+				for(PlantillaComentario c: conv.getComments()) {
+					tabComments += ("<tr style=\"padding: 0px; border-width: 1px; border-color: rgb(149, 165, 166);\"> "
+								  + "  <td style=\"padding: 0px; border-width: 1px; border-color: rgb(149, 165, 166);\">"+c.getAuthor()+"</td>"
+								  + "  <td style=\"padding: 0px; border-width: 1px; border-color: rgb(149, 165, 166);\">"+c.getAuthorName()+"</td>"
+								  + "  <td style=\"padding: 0px; border-width: 1px; border-color: rgb(149, 165, 166);\">"+c.getContent()+"</td>"
+								  + "</tr> ");
+				}
+			}
+			tabComments += "</tbody></table>";
+			return tabComments;
+		}
+		
+		return "";
+	}
+	
+	
+}

+ 104 - 0
src/main/java/es/uv/saic/service/UsuariService.java

@@ -0,0 +1,104 @@
+package es.uv.saic.service;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import es.uv.saic.domain.Usuari;
+import es.uv.saic.domain.UsuariRepository;
+import es.uv.saic.domain.UsuarisRol;
+import es.uv.saic.dto.TascaAsignadaDTO;
+
+@Service
+public class UsuariService {
+
+	@Autowired
+	private UsuariRepository usuariRepository;
+	@Autowired
+	private UsuarisRolService usuarisRolService;
+	
+	public List<Usuari> findAll() {
+		return this.usuariRepository.findAll();
+	}
+	
+	public Usuari findByUsername(String usuari) {
+		return this.usuariRepository.findByUsername(usuari);
+	}
+	
+	public boolean hasActiveRol(Usuari usuari) {
+		return this.usuarisRolService.hasActiveRol(usuari);
+	}
+	
+	public List<TascaAsignadaDTO> getActiveInstanciaTasques(Usuari usuari){
+		return this.usuariRepository.findActiveInstanciaTasques(usuari.getUsuari());
+	}
+	
+	public List<BigInteger> getActiveInstancies(Usuari usuari){
+		
+		if(usuari.isGranted() || usuarisRolService.findActiveRols(usuari).stream().anyMatch(r -> "adeit".equals(r.getRol().getNomRol()))) {
+			return this.usuariRepository.findActiveInstanciesGranted(usuari.getUsuari());
+		}
+		else{
+			return this.usuariRepository.findActiveInstancies(usuari.getUsuari());
+		}
+	}
+	
+	public List<BigInteger> getSupervisableProcessos(List<UsuarisRol> usuarisRols){
+		List<BigInteger> a = new ArrayList<BigInteger>();
+		for(UsuarisRol urol : usuarisRols) {
+			if(urol.getRol().getNomRol().equals("c_resp")) {  // Responsable de centro
+				a.addAll(this.usuariRepository.findSupervisableProcessosResp(urol.getOrgan().getId().getLugar()));
+			}
+			else if(urol.getRol().getNomRol().equals("c_supe")) { // Supervisor de centro
+				a.addAll(this.usuariRepository.findSupervisableProcessosResp(urol.getOrgan().getId().getLugar()));
+			}
+			else if(urol.getRol().getNomRol().equals("e_supe")) { // Supervisor externo
+				a.addAll(this.usuariRepository.findSupervisableProcessosResp(urol.getOrgan().getId().getLugar()));
+			}
+			else if(this.usuarisRolService.hasAssociatedProcs(urol.getRol().getNomRol())) { // Roles especiales (asociados a proceso)
+				a.addAll(this.usuariRepository.findSupervisableProcessosSupervisor(this.usuarisRolService.findAssociatedProcs(urol.getRol().getNomRol())));
+			}
+			else { // Cualquier otro rol
+				a.addAll(this.usuariRepository.findSupervisableProcessos(urol.getOrgan().getId().getLugar(), urol.getOrgan().getId().getTlugar()));
+			}
+		}
+		
+		return a.stream()
+				 .distinct()
+				 .collect(Collectors.toList());
+	}
+	
+	public List<Integer> getSupervisableCentres(Usuari usuari){	
+		List<Integer> a = new ArrayList<Integer>();
+		for(UsuarisRol urol : usuarisRolService.findActiveRols(usuari)) {
+			if(this.usuarisRolService.hasAssociatedProcs(urol.getRol().getNomRol())) { // special roles
+				a.addAll(this.usuariRepository.findSupervisableCentresSupervisor(this.usuarisRolService.findAssociatedProcs(urol.getRol().getNomRol())));
+			}
+			else {
+				a.addAll(this.usuariRepository.findSupervisableCentres(usuari.getUsuari()));
+			}
+		}
+		
+		return a.stream()
+				 .distinct()
+				 .collect(Collectors.toList());
+	}
+	
+	public List<Usuari> getInstanceAsignedUsers(BigInteger idInstancia){
+		return this.usuariRepository.getInstanceAsignedUsers(idInstancia);
+	}
+	
+	public List<Usuari> findByRolCentre(Integer idRol, List<Integer> centres){
+		return this.usuariRepository.findByRolCentre(idRol, centres);
+	}
+	
+	public void save(Usuari u) {
+		this.usuariRepository.save(u);
+		this.usuariRepository.flush();
+	}
+	
+}

+ 177 - 0
src/main/java/es/uv/saic/service/UsuarisRolService.java

@@ -0,0 +1,177 @@
+package es.uv.saic.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import es.uv.saic.domain.Usuari;
+import es.uv.saic.domain.UsuarisRol;
+import es.uv.saic.domain.UsuarisRolRepository;
+
+@Service
+public class UsuarisRolService {
+
+	@Autowired
+	private UsuarisRolRepository usuarisRolRepository;
+	
+	
+	public List<UsuarisRol> findAll() {
+		return this.usuarisRolRepository.findAll();
+	}
+	
+	public boolean exists(String usuari, String tlugar, Integer lugar) {
+		if(this.usuarisRolRepository.findActiveByUsuariTlugarLugar(usuari, tlugar, lugar) != null) {
+			return true;
+		}
+		return false;
+	}
+	
+	public UsuarisRol find(Integer idRol, String usuari, Integer lugar, String tlugar) {
+		return this.usuarisRolRepository.find(idRol, usuari, lugar, tlugar);
+	}
+	
+	public UsuarisRol findActive(Integer idRol, String usuari, Integer lugar, String tlugar) {
+		return this.usuarisRolRepository.findActive(idRol, usuari, lugar, tlugar);
+	}
+	
+	public UsuarisRol findLast(Integer idRol, String usuari, Integer lugar, String tlugar) {
+		return this.usuarisRolRepository.findLast(idRol, usuari, lugar, tlugar);
+	}
+	
+	public Integer findLastNum(Integer idRol, Integer lugar, String tlugar) {
+		return this.usuarisRolRepository.findLastNum(idRol, lugar, tlugar);
+	}
+	
+	public boolean hasActiveRol(Usuari usuari) {
+		List<UsuarisRol> rols = this.usuarisRolRepository.findByUsernameActive(usuari);
+		if(rols != null) {
+			if(rols.size() > 0) {
+				return true;
+			}
+		}
+		return false;
+	}
+	
+	public List<UsuarisRol> findActiveRols(Usuari usuari){
+		return this.usuarisRolRepository.findByUsernameActive(usuari);
+	}
+	
+	public boolean isGrantedUser(Usuari usuari) {
+		if(this.usuarisRolRepository.findByUsernameActiveRol(usuari, "u_uq") != null || 
+		   this.usuarisRolRepository.findByUsernameActiveRol(usuari, "u_admi") != null) {
+			return true;
+		}
+		else {
+			return false;
+		}
+	}
+	
+	public boolean isGrantedSupervisor(Usuari usuari) {
+		if(this.usuarisRolRepository.findByUsernameActiveRol(usuari, "adeit") != null ||
+		   this.usuarisRolRepository.findByUsernameActiveRol(usuari, "relint") != null ||
+		   this.usuarisRolRepository.findByUsernameActiveRol(usuari, "u_supe") != null) {
+			return true;
+		}
+		else {
+			return false;
+		}
+	}
+	
+	public boolean isAdminUser(Usuari usuari) {
+		if(this.usuarisRolRepository.findByUsernameActiveRol(usuari, "u_admi") != null) {
+			return true;
+		}
+		else {
+			return false;
+		}
+	}
+	
+	public boolean isDataTestUser(Usuari usuari) {
+		if(this.usuarisRolRepository.findByUsernameActiveRol(usuari, "u_data") != null) {
+			return true;
+		}
+		else {
+			return false;
+		}
+	}
+	
+	public boolean hasActiveRol(Usuari usuari, String rol) {
+		if(this.usuarisRolRepository.findByUsernameActiveRol(usuari, rol) != null) {
+			return true;
+		}
+		else {
+			return false;
+		}
+	}
+	
+	public boolean hasActiveRoles(Usuari usuari, ArrayList<String> rols) {
+		if(this.usuarisRolRepository.findByUsernameActiveRoles(usuari, rols) != null) {
+			return true;
+		}
+		else {
+			return false;
+		}
+	}
+	
+	public boolean hasActiveAmbit(Usuari usuari, String ambit) {
+		if(this.usuarisRolRepository.findByUsernameActiveAmbit(usuari.getUsuari(), ambit) != null) {
+			return true;
+		}
+		else {
+			return false;
+		}
+	}
+	
+	public boolean hasAssociatedProcs(String rol) {
+		List<String> procs = this.usuarisRolRepository.findAssociatedProcs(rol);
+		if(procs != null) {
+			if(procs.size() > 0) {
+				return true;
+			}
+			else {
+				return false;
+			}
+		}
+		else {
+			return false;
+		}
+	}
+	
+	public List<String> findAssociatedProcs(String rol) {
+		return this.usuarisRolRepository.findAssociatedProcs(rol);
+	}
+	
+	public List<UsuarisRol> findManagerByCentre(Integer centre){
+		return this.usuarisRolRepository.findManagerByCentre(centre);
+	}
+	
+	public List<UsuarisRol> findManagerByTitulacio(Integer titulacio){
+		return this.usuarisRolRepository.findManagerByTitulacio(titulacio);
+	}
+	
+	public List<UsuarisRol> findManagerByCentres(List<Integer> centre){
+		return this.usuarisRolRepository.findManagerByCentres(centre);
+	}
+	
+	public List<UsuarisRol> findManagerByTitulacions(List<Integer> titulacio){
+		return this.usuarisRolRepository.findManagerByTitulacions(titulacio);
+	}
+	
+	public ArrayList<String> getSpecialRoles(){
+		return new ArrayList<String>(Arrays.asList("adeit", "relint"));
+	}
+	
+	public void save(UsuarisRol u) {
+		this.usuarisRolRepository.save(u);
+		this.usuarisRolRepository.flush();
+	}
+	
+	public void delete(UsuarisRol ur) {
+		this.usuarisRolRepository.delete(ur);
+	}
+	
+	
+}

+ 98 - 0
src/main/java/es/uv/saic/web/DocumentController.java

@@ -0,0 +1,98 @@
+package es.uv.saic.web;
+
+import java.io.IOException;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import es.uv.saic.dto.CategoriaDTO;
+import es.uv.saic.dto.DocumentTmpDTO;
+import es.uv.saic.domain.Document;
+import es.uv.saic.service.DocumentService;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+
+@RestController
+public class DocumentController {
+    @Autowired
+    private DocumentService ds;
+    /*
+     * endpoint para save
+     */
+    @PostMapping("/document/save")
+    public ResponseEntity<?> save(@RequestBody Document doc) {
+        try {
+            Document auxDocument = ds.save(doc);        
+            return (auxDocument != null) ? ResponseEntity.ok(auxDocument) : 
+                ResponseEntity.badRequest().body("El documento no se a podido guardad correctamente.") ; 
+        } catch (Exception e) {
+            e.printStackTrace();
+            return ResponseEntity.badRequest().body("Hubo un error al procesar el documento: " + e.getMessage());
+        }   
+    }
+
+    /*
+     * endpoing para findByCategoriaOrgan
+     */
+    @PostMapping("/findByCategoriaOrgan")
+    public ResponseEntity<?> findByCategoriaOrgan(@RequestBody CategoriaDTO categoria) {
+        try {
+            Document document = ds.findByCategoriaOrgan(categoria.getCategoria(), categoria.getLugar(), categoria.getTlugar());
+            return (document != null) ? ResponseEntity.ok(document) : 
+                ResponseEntity.badRequest().body("El documento no se a podido encontrar.") ;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return ResponseEntity.badRequest().body("Hubo un error al procesar el documento: " + e.getMessage());
+        }
+    }
+
+    /*
+     * endpoint para findByID
+     */
+    @GetMapping("/document/{idDocument}")
+    public ResponseEntity<?> findByID(@RequestParam Integer idDocument) {
+        try {
+            Document document = ds.findById(idDocument);
+            return (document != null) ? ResponseEntity.ok(document) : 
+                ResponseEntity.badRequest().body("El documento no se a podido encontrar.") ;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return ResponseEntity.badRequest().body("No se encontro el documento: " + e.getMessage());
+        }
+    }
+    
+
+    /*
+     * endpoint para upload
+     */
+    @PostMapping("/document/upload")
+    public ResponseEntity<String> upload(@RequestBody DocumentTmpDTO documentTmpDTO) {
+        try{
+            return ResponseEntity.ok(ds.upload(documentTmpDTO.getIdDocument(), documentTmpDTO.getIdCategoria(),
+                documentTmpDTO.getLugar(), documentTmpDTO.getTlugar(), documentTmpDTO.getFile()));
+        } catch(IllegalStateException e) {
+            e.printStackTrace();
+            return ResponseEntity.badRequest().body("Error: " + e.getMessage());
+        } catch(IOException e) {
+            e.printStackTrace();
+            return ResponseEntity.badRequest().body("Error: " + e.getMessage());
+        }
+    }
+
+    @PostMapping("/document/archive")
+    public ResponseEntity<?> archive(@RequestBody Document doc) {
+        try {
+            Document auxDocument = ds.archive(doc);        
+            return (auxDocument != null) ? ResponseEntity.ok(auxDocument) : 
+                ResponseEntity.badRequest().body("El documento no se a podido archivar correctamente.") ; 
+        } catch (Exception e) {
+            e.printStackTrace();
+            return ResponseEntity.badRequest().body("Hubo un error al procesar el documento: " + e.getMessage());
+        }
+        
+    }
+}

+ 830 - 0
src/main/java/es/uv/saic/web/DownloadController.java

@@ -0,0 +1,830 @@
+package es.uv.saic.web;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigInteger;
+import java.net.HttpURLConnection;
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Optional;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.io.FileSystemResource;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import es.uv.saic.domain.Document;
+import es.uv.saic.domain.Indicador;
+import es.uv.saic.domain.InstanciaTasca;
+import es.uv.saic.domain.Organ;
+import es.uv.saic.domain.Proces;
+import es.uv.saic.domain.Tasca;
+import es.uv.saic.dto.CategoriaDTO;
+import es.uv.saic.dto.IndicadorEnquestaDTO;
+import es.uv.saic.dto.IndicadorEnquestaValorDTO;
+import es.uv.saic.dto.PdfDTO;
+import es.uv.saic.dto.TascaDTO;
+import es.uv.saic.dto.TascaInformeTransferDTO;
+import es.uv.saic.service.PlantillaService;
+import fr.opensagres.xdocreport.core.XDocReportException;
+import fr.opensagres.xdocreport.core.io.internal.ByteArrayOutputStream;
+import fr.opensagres.xdocreport.document.IXDocReport;
+import fr.opensagres.xdocreport.document.images.FileImageProvider;
+import fr.opensagres.xdocreport.document.images.IImageProvider;
+import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
+import fr.opensagres.xdocreport.template.IContext;
+import fr.opensagres.xdocreport.template.TemplateEngineKind;
+import fr.opensagres.xdocreport.template.formatter.FieldsMetadata;
+
+
+@Controller
+public class DownloadController {
+
+	@Autowired 
+	private PlantillaService pls;
+	
+	@Value("${saic.data.filePath}")
+	private String filePath;
+	
+	@Value("${saic.data.docsPath}")
+	private String docsPath;
+	
+	@Value("${saic.data.templates.fileNotFound}")
+	private String fileNotFound;
+	
+	@Value("${saic.data.templates.filePath}")
+	private String templatePath;
+	
+	@Value("${saic.data.templates.logoPath}")
+	private String logoPath;
+
+	@Value("${saic.url.domain}")
+	private String uri;
+
+	/*
+	 * Download a file associated with a task instance
+	 * @param model
+	 * @param idInstanciaTasca The ID of the task instance
+	 * @param response HttpServletResponse
+	 * @return A FileSystemResource representing the file to download
+	 */
+	@GetMapping(value="/download/{fileName}", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
+	@ResponseBody
+	public FileSystemResource download(Model model, @PathVariable("fileName") BigInteger idInstanciaTasca, HttpServletResponse response) throws FileNotFoundException {		
+		InstanciaTasca i = findByIdTasca(idInstanciaTasca);
+		FileSystemResource r = null;
+		if(i.getTasca().getTipus().getTipus() == 22){
+			r = new FileSystemResource(i.getEvidencia());
+			String extension = "."+FilenameUtils.getExtension(i.getEvidencia());
+			String name = "-"+i.getTasca().getNomEvidenciaCas().replace(" ", "_");
+			response.setHeader("Content-Disposition", "attachment; filename="+i.getTasca().getCodiEvidencia()+name+extension);
+		}
+		else{
+			r = new FileSystemResource(this.filePath+i.getEvidencia());
+			response.setHeader("Content-Disposition", "attachment; filename="+i.getTasca().getCodiEvidencia()+"_"+i.getEvidencia());
+		}
+		
+		if(!r.exists()) {
+			FileNotFoundException e = new FileNotFoundException("No se ha podido encontrar el archivo solicitado");
+			e.setStackTrace(new StackTraceElement[0]);
+			throw e;
+		}
+		
+		return r;
+	}
+
+	/*
+	 * Download a document by its ID
+	 * @param model
+	 * @param idDocument The ID of the document to download
+	 * @param response HttpServletResponse
+	 * @return A FileSystemResource representing the document to download
+	 */
+	@GetMapping(value="/download/document/{id}", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
+	@ResponseBody
+	public FileSystemResource downloadDocument(Model model, @PathVariable("id") Integer idDocument, HttpServletResponse response) throws FileNotFoundException {		
+		Document document = findByIdDocument(idDocument);
+		FileSystemResource file = new FileSystemResource(document.getRuta());
+		if(!file.exists()) {
+			FileNotFoundException e = new FileNotFoundException("No se ha podido encontrar el archivo solicitado");
+			e.setStackTrace(new StackTraceElement[0]);
+			throw e;
+		}
+		
+		response.setHeader("Content-Disposition", "attachment; filename="+file.getFilename());
+		return file;
+	}
+
+	/*
+	 * Download the latest report for a given process and degree
+	 * @param model
+	 * @param idTitulacio The ID of the degree
+	 * @param nomProces The name of the process
+	 * @param response HttpServletResponse
+	 * @return A FileSystemResource representing the report to download
+	 */
+	@GetMapping(value="/download/report/{t}/{p}", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
+	@ResponseBody 
+	public FileSystemResource downloadReport(Model model, @PathVariable("t") Integer idTitulacio, @PathVariable("p") String nomProces,
+			HttpServletResponse response) throws IOException, XDocReportException {
+		
+		Organ titulacio = findByIDOrgan("T", idTitulacio);
+		
+		TascaInformeTransferDTO it = getLastByProcName(nomProces, titulacio.getId().getLugar(), 
+														titulacio.getOrgan().getId().getLugar(), 
+														titulacio.getOrgan().getTambit());
+		
+		if(it != null) {
+			if((new File(this.filePath+it.getEvidencia())).exists()) {
+				response.setHeader("Content-Disposition", "attachment; filename="+Integer.toString(idTitulacio)+"_"+nomProces+".pdf");
+				return new FileSystemResource(this.filePath+it.getEvidencia());
+			}
+		}
+		
+		return new FileSystemResource(this.fileNotFound);
+	}
+
+
+	/*
+	 * Download a populated template for a given task instance
+	 * @param model
+	 * @param idTascai The ID of the task instance
+	 * @param response HttpServletResponse
+	 * @return A byte array representing the populated template to download
+	 */
+	@GetMapping(value="/download/template/{id}", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
+	@ResponseBody 
+	public byte[] downloadTemplate(Model model, @PathVariable("id") BigInteger idTascai, HttpServletResponse response) throws IOException, XDocReportException {
+		XDocReportRegistry.getRegistry().clear();
+		String reportId = "none";
+		InstanciaTasca it = findByIdTasca(idTascai);
+		Tasca tasca = it.getTasca();
+		 
+		/* Check if specific template exists */
+		Integer idTitulacio = it.getInstancia().getTitulacio();
+		String templatePath = this.templatePath+tasca.getCodiEvidencia().replace(".", "_")+".docx";
+		if(it.getInstancia().getOrgan().getTambit().equals("G") | idTitulacio == 1) {
+			File f = new File(this.templatePath+"/T1/"+tasca.getCodiEvidencia().replace(".", "_")+".docx");
+			if(f.exists() && !f.isDirectory()) { 
+				templatePath = this.templatePath+"/T1/"+tasca.getCodiEvidencia().replace(".", "_")+".docx";
+			}
+		}
+		else if(it.getInstancia().getOrgan().getTambit().equals("M") | idTitulacio == 2) {
+			File f = new File(this.templatePath+"/T2/"+tasca.getCodiEvidencia().replace(".", "_")+".docx");
+			if(f.exists() && !f.isDirectory()) { 
+				templatePath = this.templatePath+"/T2/"+tasca.getCodiEvidencia().replace(".", "_")+".docx";
+			}
+		}
+		
+		File f = new File(templatePath);
+		if(!f.exists()) {
+			FileNotFoundException e = new FileNotFoundException("No se ha encontrado la plantilla "+tasca.getCodiEvidencia()+".docx");
+			e.setStackTrace(new StackTraceElement[0]);
+			throw e;
+		}
+				
+		InputStream in = new FileInputStream(f);
+		IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in, reportId, TemplateEngineKind.Velocity);
+		FieldsMetadata metadata = new FieldsMetadata();
+		metadata.addFieldAsImage("logo");
+		report.setFieldsMetadata(metadata);
+		IContext context = report.createContext();
+		IImageProvider img;
+		if(new File(this.logoPath+"C"+Integer.toString(it.getInstancia().getCentre())+".png").exists()) {
+			img = new FileImageProvider(new File(this.logoPath+"C"+Integer.toString(it.getInstancia().getCentre())+".png"));
+		}
+		else {
+			img = new FileImageProvider(new File(this.logoPath+"C0.png"));
+		}
+		context.put("logo", img);
+		context.put("centre", it.getInstancia().getOrgan().getOrgan().getNomVal());
+		context.put("titulacio", it.getInstancia().getOrgan().getNomCas());
+		context.put("curs", Integer.toString(it.getInstancia().getProces().getCursAvaluat()-1)+" - "+Integer.toString(it.getInstancia().getProces().getCursAvaluat()));
+		context.put("curs_anterior", Integer.toString(it.getInstancia().getProces().getCursAvaluat()-2)+" - "+Integer.toString(it.getInstancia().getProces().getCursAvaluat()-1));
+		
+		Proces proces = it.getInstancia().getProces();
+		Integer idCentre = it.getInstancia().getCentre();
+			
+		if(tasca.getTipus().getTipus() == 14) { // Iterable template task
+			List<Organ> titulacions = new ArrayList<Organ>();
+			Integer ambit = idTitulacio/(int)1000;
+			titulacions = getTitulacionsByTypeCentre(it.getInstancia().getOrgan().getOrgan().getId().getLugar(), ambit);
+			List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();
+			for(Organ x : titulacions) {
+				HashMap<String, String> t = getTemplateDataArray(x.getId().getLugar(), idCentre, proces.getCursAvaluat());
+				t.put("titulacio", x.getNomCas());
+				data.add(t);
+			} 
+			context.put("data", data);
+			getTemplateData(idTitulacio, idCentre, proces.getCursAvaluat(), context);
+		}
+		else { // NO iterable template task
+			getTemplateData(idTitulacio, idCentre, proces.getCursAvaluat(), context);
+		}	
+		
+		ByteArrayOutputStream out = new ByteArrayOutputStream();  
+		report.process(context, out);
+	    response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\""+tasca.getCodiEvidencia()+".docx\"");
+
+		return out.toByteArray();
+		
+	}
+
+	/*
+	 * Populate the template data into the context
+	 * @param idTitulacio The ID of the degree
+	 * @param idCentre The ID of the center
+	 * @param curs The academic year
+	 * @param context The IContext to populate
+	 */
+	private void getTemplateData(Integer idTitulacio, Integer idCentre, Integer curs, IContext context) {
+		
+		/*  Indicadores del data warehouse */
+		try {
+			List<Indicador> indicadores;
+			indicadores = getFromTitulacion(idTitulacio, curs);
+			for(Indicador i : indicadores) { 
+				context.put(i.getIndicador(), i.getValor());
+			}
+		} 
+		catch(Exception e) { }
+		
+		/*  Indicadores de encuestas  */
+		List<IndicadorEnquestaValorDTO> enquestesT;
+		enquestesT = getAllInds(idTitulacio, idCentre, curs);
+				
+		for(IndicadorEnquestaValorDTO i : enquestesT) {
+			String indicador = i.getAmbit().equals("t") ? (i.getEnquesta()+"_"+i.getIndicador()) : (i.getEnquesta()+"_"+i.getIndicador()+"_"+i.getAmbit());
+			indicador = i.getTipus().equals("avg") ? indicador : (indicador += "_"+i.getTipus());		
+			indicador = i.getCursd() == null ? indicador : (indicador += "_"+i.getCursd());
+			context.put(indicador, formatValue(i.getValor()));
+		}
+	}
+
+	/*
+	 * Format a value for template insertion
+	 * @param v The value to format
+	 * @return The formatted value
+	 */
+	private String formatValue(String v) {	
+		if(v == null) return ""; 
+		if(v.equals("NP")) return "NP";
+		if(v.isEmpty() | v.isBlank()) {
+			return "";
+		}
+		
+		try{
+	        return String.format("%.2f", Float.parseFloat(v)).replace(",", ".");
+	    } 
+		catch(NumberFormatException e){ }
+		
+		try{
+	        return Integer.toString(Integer.parseInt(v));
+	    } 
+		catch(NumberFormatException e){ }
+		
+		return v;
+	}
+	
+	/*
+	 * Get template data as a HashMap
+	 * @param idTitulacio The ID of the degree
+	 * @param idCentre The ID of the center
+	 * @param curs The academic year
+	 * @return A HashMap containing the template data
+	 */
+	private HashMap<String, String> getTemplateDataArray(Integer idTitulacio, Integer idCentre, Integer curs) {
+		
+		HashMap<String, String> info = new HashMap<String, String>();
+		
+		/*  Indicadores del data warehouse */
+		try {
+			List<Indicador> indicadores;
+			indicadores = getFromTitulacion(idTitulacio, curs);
+			for(Indicador i : indicadores) { 
+				info.put(i.getIndicador(), i.getValor());
+			}
+		} 
+		catch(Exception e) { }
+		
+		/*  Indicadores de encuestas  */
+		List<IndicadorEnquestaValorDTO> enquestesT;	
+		enquestesT = getAllInds(idTitulacio, idCentre, curs);
+				
+		for(IndicadorEnquestaValorDTO i : enquestesT) {
+			String indicador = i.getAmbit().equals("t") ? (i.getEnquesta()+"_"+i.getIndicador()) : (i.getEnquesta()+"_"+i.getIndicador()+"_"+i.getAmbit());
+			indicador = i.getTipus().equals("avg") ? indicador : (indicador += "_"+i.getTipus());	
+			indicador = i.getCursd() == null ? indicador : (indicador += "_"+i.getCursd());
+			info.put(indicador, formatValue(i.getValor()));
+		}	
+		
+		return info;
+	}
+
+	/*
+	 * Test endpoint to generate a populated template for a given task (id of task)
+	 * @param model
+	 * @param idTitulacio The ID of the degree
+	 * @param idCentre The ID of the center
+	 * @param idTascap The ID of the task
+	 * @param idProces The ID of the process
+	 * @param response HttpServletResponse
+	 * @return A byte array representing the populated template
+	 */
+	@GetMapping(value="/test/template/{titulacio}/{centre}/{idProces}/{idTascap}", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
+	@ResponseBody
+	public byte[] testTemplate(Model model, @PathVariable("titulacio") Integer idTitulacio, @PathVariable("centre") Integer idCentre,
+			@PathVariable("idTascap") Integer idTascap, @PathVariable("idProces") Integer idProces, HttpServletResponse response) 
+					throws IOException, XDocReportException {
+		XDocReportRegistry.getRegistry().clear();
+		String reportId = "none";
+		
+		Tasca tasca = getByProcesTascap(idProces, idTascap);
+		Proces proces = findByIDProces(idProces);
+		Organ titulacio = findByIDOrgan("T", idTitulacio);
+		Organ centre = findByIDOrgan("C", idCentre);
+		Integer ambit = idTitulacio/(int)1000;
+		
+		/* Check if specific template exists */
+		String templatePath = this.templatePath+tasca.getCodiEvidencia().replace(".", "_")+".docx";
+		if(titulacio.getTambit().equals("G") | idTitulacio == 1) {
+			File f = new File(this.templatePath+"/T1/"+tasca.getCodiEvidencia().replace(".", "_")+".docx");
+			if(f.exists() && !f.isDirectory()) { 
+				templatePath = this.templatePath+"/T1/"+tasca.getCodiEvidencia().replace(".", "_")+".docx";
+			}
+		}
+		else if(titulacio.getTambit().equals("M") | idTitulacio == 2) {
+			File f = new File(this.templatePath+"/T2/"+tasca.getCodiEvidencia().replace(".", "_")+".docx");
+			if(f.exists() && !f.isDirectory()) { 
+				templatePath = this.templatePath+"/T2/"+tasca.getCodiEvidencia().replace(".", "_")+".docx";
+			}
+		}
+		
+		InputStream in = new FileInputStream(new File(templatePath));
+		IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in, reportId, TemplateEngineKind.Velocity);
+		FieldsMetadata metadata = new FieldsMetadata();
+		metadata.addFieldAsImage("logo");
+		report.setFieldsMetadata(metadata);
+		IContext context = report.createContext();
+		IImageProvider img;
+		if(new File(this.logoPath+"C"+Integer.toString(idCentre)+".png").exists()) {
+			img = new FileImageProvider(new File(this.logoPath+"C"+Integer.toString(idCentre)+".png"));
+		}
+		else {
+			img = new FileImageProvider(new File(this.logoPath+"C0.png"));
+		}
+		context.put("logo", img);
+		context.put("centre", centre.getNomVal());
+		context.put("titulacio", titulacio.getNomVal());
+		context.put("curs", Integer.toString(proces.getCursAvaluat()-1)+" - "+Integer.toString(proces.getCursAvaluat()));
+		context.put("curs_anterior", Integer.toString(proces.getCursAvaluat()-2)+" - "+Integer.toString(proces.getCursAvaluat()-1));
+		
+		if(tasca.getTipus().getTipus() == 14) { // Iterable template task
+			List<Organ> titulacions = new ArrayList<Organ>();
+			titulacions = getTitulacionsByTypeCentre(centre.getId().getLugar(), ambit);
+			List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();
+			for(Organ x : titulacions) {
+				HashMap<String, String> t = getTemplateDataArray(x.getId().getLugar(), idCentre, proces.getCursAvaluat());
+				t.put("titulacio", x.getNomCas());
+				data.add(t);
+			}
+			context.put("data", data);
+			getTemplateData(idTitulacio, idCentre, proces.getCursAvaluat(), context);
+		}
+		else { // NO iterable template task
+			getTemplateData(idTitulacio, idCentre, proces.getCursAvaluat(), context);
+		}
+		
+		ByteArrayOutputStream out = new ByteArrayOutputStream();  
+		report.process(context, out);
+	    response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\""+tasca.getCodiEvidencia()+".docx\"");
+
+		return out.toByteArray();
+		
+	}
+
+	/*
+	 * Test endpoint to generate a populated template for a given degree and evidence (Type of task)
+	 * @param model
+	 * @param idTitulacio The ID of the degree
+	 * @param idCentre The ID of the center
+	 * @param evidencia The name of the evidence
+	 * @param curs The academic year
+	 * @param tipusTasca The type of task
+	 * @param response HttpServletResponse
+	 * @return A byte array representing the populated template
+	 */
+	@GetMapping(value="/test/template2/{titulacio}/{centre}/{evidencia}/{curs}/{tipusTasca}", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
+	@ResponseBody
+	public byte[] testTemplate(Model model, @PathVariable("titulacio") Integer idTitulacio, @PathVariable("centre") Integer idCentre,
+			@PathVariable("evidencia") String evidencia, @PathVariable("curs") Integer curs, @PathVariable("tipusTasca") Integer tipusTasca, 
+			HttpServletResponse response) throws IOException, XDocReportException {
+		XDocReportRegistry.getRegistry().clear();
+		String reportId = "none";
+		
+		Organ titulacio = findByIDOrgan("T", idTitulacio);
+		Organ centre = findByIDOrgan("C", idCentre);
+		Integer ambit = idTitulacio/(int)1000;
+		
+		/* Check if specific template exists */
+		String templatePath = this.templatePath+evidencia.replace(".", "_").replace(" (G)", "").replace(" (M)", "")+".docx";
+		if(idTitulacio < 2000 | idTitulacio == 1) {
+			File f = new File(this.templatePath+"/T1/"+evidencia.replace(".", "_").replace(" (G)", "").replace(" (M)", "")+".docx");
+			if(f.exists() && !f.isDirectory()) { 
+				templatePath = this.templatePath+"/T1/"+evidencia.replace(".", "_").replace(" (G)", "").replace(" (M)", "")+".docx";
+			}
+			ambit = 1;
+		}
+		else if((idTitulacio >= 2000 & idTitulacio < 3000) | idTitulacio == 2) {
+			File f = new File(this.templatePath+"/T2/"+evidencia.replace(".", "_").replace(" (G)", "").replace(" (M)", "")+".docx");
+			if(f.exists() && !f.isDirectory()) { 
+				templatePath = this.templatePath+"/T2/"+evidencia.replace(".", "_").replace(" (G)", "").replace(" (M)", "")+".docx";
+			}
+			ambit = 2;
+		}
+		
+		InputStream in = new FileInputStream(new File(templatePath));
+		IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in, reportId, TemplateEngineKind.Velocity);
+		FieldsMetadata metadata = new FieldsMetadata();
+		metadata.addFieldAsImage("logo");
+		report.setFieldsMetadata(metadata);
+		IContext context = report.createContext();
+		IImageProvider img;
+		if(new File(this.logoPath+"C"+Integer.toString(idCentre)+".png").exists()) {
+			img = new FileImageProvider(new File(this.logoPath+"C"+Integer.toString(idCentre)+".png"));
+		}
+		else {
+			img = new FileImageProvider(new File(this.logoPath+"C0.png"));
+		}
+		context.put("logo", img);
+		context.put("centre", centre.getNomVal());
+		context.put("titulacio", titulacio.getNomVal());
+		context.put("curs", Integer.toString(curs-1)+" - "+Integer.toString(curs));
+		context.put("curs_anterior", Integer.toString(curs-2)+" - "+Integer.toString(curs-1));
+		
+		if(tipusTasca == 14) { // Iterable template task
+			List<Organ> titulacions = new ArrayList<Organ>();
+			titulacions = getTitulacionsByTypeCentre(centre.getId().getLugar(), ambit);
+			List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();
+			for(Organ x : titulacions) {
+				HashMap<String, String> t = getTemplateDataArray(x.getId().getLugar(), idCentre, curs);
+				t.put("titulacio", x.getNomCas());
+				data.add(t);
+			}
+			context.put("data", data);
+			getTemplateData(idTitulacio, idCentre, curs, context);
+		}
+		else { // NO iterable template task
+			getTemplateData(idTitulacio, idCentre, curs, context);
+		}
+		
+		ByteArrayOutputStream out = new ByteArrayOutputStream();  
+		report.process(context, out);
+	    response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\""+evidencia+".docx\"");
+
+		return out.toByteArray();
+		
+	}
+	
+	/*
+	 * Generate a PDF from the content of a task instance (unused)
+	 * @param model
+	 * @param idTascai The ID of the task instance
+	 * @param response HttpServletResponse
+	 * @return A byte array representing the generated PDF
+	 */
+	@GetMapping(value="/pdf/download/{idTascai}")
+	@ResponseBody
+	public byte[] downloadTemplatePdf(Model model, @PathVariable("idTascai") BigInteger idTascai, HttpServletResponse response) throws IOException, InterruptedException {
+		InstanciaTasca it = findByIdTasca(idTascai);
+		response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\""+it.getIdInstanciaTasca()+".pdf\"");
+		response.setHeader(HttpHeaders.CONTENT_TYPE, "application/pdf");
+		return pls.toPDF(it.getText(), Optional.of(idTascai));
+	}
+
+	/*
+	 * Generate a PDF preview from provided content
+	 * @param model
+	 * @param content The content to convert to PDF
+	 * @param idtascai Optional ID of the task instance for context
+	 * @param response HttpServletResponse
+	 */
+	@PostMapping(value="/pdf/preview")
+	@ResponseBody
+	public byte[] downloadTemplatePdf(Model model, HttpServletResponse response,
+			@RequestParam("content") String content, @RequestParam("idtascai") Optional<BigInteger> idtascai) throws IOException, InterruptedException {
+		response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"borrador.pdf\"");
+		response.setHeader(HttpHeaders.CONTENT_TYPE, "application/pdf");	
+		return toPDF(content, idtascai);
+	}
+
+	private TascaInformeTransferDTO getLastByProcName(String nomProces, Integer lugar, Integer lugar2, String tambit) {
+		URI uriObj = URI.create(uri + "/getLastByProcName");
+		ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+		TascaInformeTransferDTO tascaInformeTransferDTO = null;
+		
+		try {
+			TascaDTO TascaDTO = new TascaDTO(nomProces, lugar, lugar2, tambit);
+			String requestBody = mapper.writeValueAsString(TascaDTO);
+			HttpClient httpClient = HttpClient.newHttpClient();
+			HttpRequest request = HttpRequest.newBuilder()
+					.uri(uriObj)
+					.header("Content-Type", "application/json")
+					.POST(HttpRequest.BodyPublishers.ofString(requestBody))
+					.build();
+
+			HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+			if (response.statusCode() == HttpURLConnection.HTTP_OK) {
+				tascaInformeTransferDTO = mapper.readValue(response.body(), new TypeReference<TascaInformeTransferDTO>() {});
+
+			} else {
+				System.err.println("Failed to find enquesta by Curs, Ambit, Estudi. HTTP error code: " + response.statusCode());
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return tascaInformeTransferDTO;
+	}
+
+	private InstanciaTasca findByIdTasca(BigInteger idInstanciaTasca) {
+		URI uriObj = URI.create(uri + "/instanciatasca/" + idInstanciaTasca);
+		ObjectMapper mapper = new ObjectMapper();
+		InstanciaTasca instanciaTasca = null;
+		try {
+			HttpClient httpClient = HttpClient.newHttpClient();
+			HttpRequest request = HttpRequest.newBuilder()
+					.uri(uriObj)
+					.GET()
+					.build();
+
+			HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+			if (response.statusCode() == HttpURLConnection.HTTP_OK) {
+				instanciaTasca = mapper.readValue(response.body(), new TypeReference<InstanciaTasca>() {});
+			} else {
+				System.err.println("Failed to find InstanciaTasca by ID. HTTP error code: " + response.statusCode());
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return instanciaTasca;
+	}
+
+	private List<IndicadorEnquestaValorDTO> getAllInds(Integer idTitulacio, Integer idCentre, Integer curs) {
+		URI uriObj = URI.create(uri + "/allInds2");
+		ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+		List<IndicadorEnquestaValorDTO> list = null;
+
+		try {
+			IndicadorEnquestaDTO IndicadorEnquestaDTO = new IndicadorEnquestaDTO(idTitulacio, idCentre, curs);
+			String requestBody = mapper.writeValueAsString(IndicadorEnquestaDTO);
+			HttpClient httpClient = HttpClient.newHttpClient();
+			HttpRequest request = HttpRequest.newBuilder()
+					.uri(uriObj)
+					.header("Content-Type", "application/json")
+					.POST(HttpRequest.BodyPublishers.ofString(requestBody))
+					.build();
+
+			HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+			if (response.statusCode() == HttpURLConnection.HTTP_OK) {
+				list = mapper.readValue(response.body(), new TypeReference<List<IndicadorEnquestaValorDTO>>() {});
+
+			} else {
+				System.err.println("Failed to get all IndicadorsEnquestaValorDTO. HTTP error code: " + response.statusCode());
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return list;
+	}
+
+	private Tasca getByProcesTascap(Integer idProces, Integer idTascap) {
+		URI uriObj = URI.create(uri + "/getByProcesTascap/" + idProces + "/" + idTascap);
+		ObjectMapper mapper = new ObjectMapper();
+		Tasca tasca = null;
+
+		try {
+
+			HttpClient httpClient = HttpClient.newHttpClient();
+			HttpRequest request = HttpRequest.newBuilder()
+					.uri(uriObj)
+					.GET()
+					.build();
+
+			HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+			if (response.statusCode() == HttpURLConnection.HTTP_OK) {
+				tasca = mapper.readValue(response.body(), new TypeReference<Tasca>() {});
+
+			} else {
+				System.err.println("Failed to get Tasca. HTTP error code: " + response.statusCode());
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return tasca;
+	}
+
+	private List<Indicador> getFromTitulacion(Integer idTitulacio, Integer curs) {
+		URI uriObj = URI.create(uri + "/getFromTitulacio/" + idTitulacio + "/" + curs);
+		ObjectMapper mapper = new ObjectMapper();
+		List<Indicador> inds = new ArrayList<>();
+
+		try {
+
+			HttpClient httpClient = HttpClient.newHttpClient();
+			HttpRequest request = HttpRequest.newBuilder()
+					.uri(uriObj)
+					.GET()
+					.build();
+
+			HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+			if (response.statusCode() == HttpURLConnection.HTTP_OK) {
+				inds = mapper.readValue(response.body(), new TypeReference<List<Indicador>>() {});
+
+			} else {
+				System.err.println("Failed to getFromTitulacion. HTTP error code: " + response.statusCode());
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return inds;
+	}
+
+	private Proces findByIDProces(Integer idProces) {
+		URI uriObj = URI.create(uri + "/proces/" + idProces);
+		ObjectMapper mapper = new ObjectMapper();
+		Proces proces = null;
+
+		try {
+
+			HttpClient httpClient = HttpClient.newHttpClient();
+			HttpRequest request = HttpRequest.newBuilder()
+					.uri(uriObj)
+					.GET()
+					.build();
+
+			HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+			if (response.statusCode() == HttpURLConnection.HTTP_OK) {
+				proces = mapper.readValue(response.body(), new TypeReference<Proces>() {});
+
+			} else {
+				System.err.println("Failed to find proces byID. HTTP error code: " + response.statusCode());
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return proces;
+	}
+
+	
+	private Organ findByIDOrgan(String tlugar, Integer idTitulacio) {
+		URI uriObj = URI.create(uri + "/proces/" + tlugar + "/" + idTitulacio);
+		ObjectMapper mapper = new ObjectMapper();
+		Organ organ = null;
+
+		try {
+
+			HttpClient httpClient = HttpClient.newHttpClient();
+			HttpRequest request = HttpRequest.newBuilder()
+					.uri(uriObj)
+					.GET()
+					.build();
+
+			HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+			if (response.statusCode() == HttpURLConnection.HTTP_OK) {
+				organ = mapper.readValue(response.body(), new TypeReference<Organ>() {});
+
+			} else {
+				System.err.println("Failed to find proces byID. HTTP error code: " + response.statusCode());
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return organ;
+	}
+
+	private List<Organ> getTitulacionsByTypeCentre(Integer lugar, Integer ambit) {
+		URI uriObj = URI.create(uri + "/getTitulacionsByTypeCentre/" + lugar + "/" + ambit);
+		ObjectMapper mapper = new ObjectMapper();
+		List<Organ> organs = new ArrayList<>();
+
+		try {
+
+			HttpClient httpClient = HttpClient.newHttpClient();
+			HttpRequest request = HttpRequest.newBuilder()
+					.uri(uriObj)
+					.GET()
+					.build();
+
+			HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+			if (response.statusCode() == HttpURLConnection.HTTP_OK) {
+				organs = mapper.readValue(response.body(), new TypeReference<List<Organ>>() {});
+
+			} else {
+				System.err.println("Failed to find proces byID. HTTP error code: " + response.statusCode());
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return organs;
+	}
+
+	
+	
+	private Document findByIdDocument(Integer idDocument) {
+		URI uriObj = URI.create(uri + "/document/" + idDocument);
+		ObjectMapper mapper = new ObjectMapper();
+		Document document = null;
+
+		try {
+
+			HttpClient httpClient = HttpClient.newHttpClient();
+			HttpRequest request = HttpRequest.newBuilder()
+					.uri(uriObj)
+					.GET()
+					.build();
+
+			HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+			if (response.statusCode() == HttpURLConnection.HTTP_OK) {
+				document = mapper.readValue(response.body(), new TypeReference<Document>() {});
+
+			} else {
+				System.err.println("Failed to find proces byID. HTTP error code: " + response.statusCode());
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return document;
+	}
+
+	private byte[] toPDF(String content, Optional<BigInteger> idtascai) {
+		URI uriObj = URI.create(uri + "/toPDF/");
+		ObjectMapper mapper = new ObjectMapper();
+		byte[] pdf = null;
+
+		try {
+			PdfDTO pdfDTO = new PdfDTO(content, idtascai);
+			String requestBody = mapper.writeValueAsString(pdfDTO);
+
+			HttpClient httpClient = HttpClient.newHttpClient();
+			HttpRequest request = HttpRequest.newBuilder()
+					.uri(uriObj)
+					.header("Content-Type", "application/json")
+					.POST(HttpRequest.BodyPublishers.ofString(requestBody))
+					.build();
+
+			HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+			if (response.statusCode() == HttpURLConnection.HTTP_OK) {
+				pdf = mapper.readValue(response.body(), new TypeReference<byte[]>() {});
+
+			} else {
+				System.err.println("Failed to find proces byID. HTTP error code: " + response.statusCode());
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return pdf;
+	}
+}

+ 30 - 0
src/main/java/es/uv/saic/web/PlantillaController.java

@@ -0,0 +1,30 @@
+package es.uv.saic.web;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RestController;
+
+import es.uv.saic.dto.PdfDTO;
+import es.uv.saic.service.PlantillaService;
+
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+
+@RestController
+public class PlantillaController {
+    @Autowired
+    private PlantillaService ps;
+
+    @PostMapping("/toPDF")
+    public ResponseEntity<?> toPDF(@RequestBody PdfDTO pdfDTO) {
+        try {
+            byte[] pdf = ps.toPDF(pdfDTO.getContent(), pdfDTO.getIdtascai());  
+            return (pdf != null && pdf.length != 0) ? ResponseEntity.ok(pdf) : ResponseEntity.badRequest().body("El pdf esta vacio o es null");
+        } catch (Exception e) {
+             e.printStackTrace();
+            return ResponseEntity.badRequest().body("Error al pdf:" +  e.getMessage());
+        }
+    }
+    
+}

+ 44 - 0
src/main/resources/application-dev.properties

@@ -0,0 +1,44 @@
+# Urls
+saic.url.domain = https://saicd.uv.es:4443
+saic.url.public = ${saic.url.domain}/public
+
+# Email config
+saic.mailer.queue.enabled = true
+saic.mailer.reminder.enabled = false
+saic.mailer.calendar.enabled = false
+saic.mailer.maxMailsPerRound = 20
+
+# Data parser config
+saic.parser.surveys.path = /DATA/saic-data/databases/
+saic.parser.surveys.enabled = false
+
+# Database config
+spring.datasource.url=jdbc:postgresql://127.0.0.1/saic_v2
+spring.datasource.password=docent1ia2.l6
+
+# Files and log config
+logging.file.path=/DATA/saic-data/logs
+logging.file.name=/DATA/saic-data/logs/saicd.log
+saic.data.filePath=/DATA/saic-data/files/
+saic.data.tmpPath=/DATA/saic-data/tmp/
+saic.data.docsPath=/DATA/saic-data/documents/
+saic.data.templates.filePath=/DATA/saic-data/templates/
+saic.data.templates.logoPath=/DATA/saic-data/templates/logos/
+saic.data.templates.fileNotFound=/DATA/saic-data/utils/filenotfound.pdf
+saic.data.master = /DATA/saic-data/databases/MasterOficial/
+saic.data.doctorado = /DATA/saic-data/databases/doctorat/
+saic.data.evdocente = /DATA/saic-data/databases/ev_docente/latest/
+
+# Scheduler
+saic.scheduler.expired.enabled=false
+
+# Actuator
+spring.application.name = UV SAIC [TE]
+spring.boot.admin.client.url=http://garcosda.uv.es:9090
+spring.boot.admin.client.instance.management-base-url=${saic.url.domain}
+spring.boot.admin.client.instance.service-url=${saic.url.domain}
+spring.boot.admin.client.username=admin
+spring.boot.admin.client.password=kkdvk
+management.endpoints.web.exposure.include=*
+management.endpoint.health.show-details=always
+saic.actuator.validIp=147.156.85.28

+ 51 - 0
src/main/resources/application-local.properties

@@ -0,0 +1,51 @@
+# Urls
+saic.url.core.domain = http://127.0.0.1:8080
+saic.url.data.domain = http://127.0.0.1:8081
+saic.url.docs.domain = http://127.0.0.1:8082
+saic.url.public = ${saic.url.docs.domain}/public
+
+# JPA Debug
+#spring.jpa.show-sql=true 
+#spring.jackson.serialization.FAIL_ON_SELF_REFERENCES=false
+
+# Email config
+saic.mailer.queue.enabled = false
+saic.mailer.reminder.enabled = false
+saic.mailer.calendar.enabled = false
+saic.mailer.maxMailsPerRound = 20
+
+# Data parser config
+saic.parser.surveys.path = /home/dagarcos/DATA_SYNC/UV_APPS/SAIC/DATA/saic-data/databases/
+saic.parser.surveys.enabled = false
+
+# Database config
+spring.datasource.url=jdbc:postgresql://saicd.uv.es:5432/saic_v2
+spring.datasource.password=docent1ia2.l6
+
+# Files and log config
+saic.data.filePath=/home/dagarcos/DATA_SYNC/UV_APPS/SAIC/DATA/saic-data/files/
+saic.data.tmpPath=/home/dagarcos/DATA_SYNC/UV_APPS/SAIC/DATA/saic-data/tmp/
+saic.data.docsPath=/home/dagarcos/DATA_SYNC/UV_APPS/SAIC/DATA/saic-data/documents/
+saic.data.templates.filePath = /home/dagarcos/DATA_SYNC/UV_APPS/SAIC/DATA/saic-data/templates/
+saic.data.templates.logoPath = /home/dagarcos/DATA_SYNC/UV_APPS/SAIC/DATA/saic-data/templates/logos/
+saic.data.templates.fileNotFound = /home/dagarcos/DATA_SYNC/UV_APPS/SAIC/DATA/saic-data/utils/filenotfound.pdf
+saic.data.master = /home/dagarcos/DATA_SYNC/UV_APPS/SAIC/DATA/saic-data/databases/MasterOficial/
+saic.data.doctorado = /home/dagarcos/DATA_SYNC/UV_APPS/SAIC/DATA/saic-data/databases/doctorat/
+saic.data.evdocente = /home/dagarcos/DATA_SYNC/UV_APPS/SAIC/DATA/saic-data/databases/ev_docente/latest/
+logging.file.path=/home/dagarcos/DATA_SYNC/UV_APPS/SAIC/DATA/saic-data/logs
+logging.file.name=/home/dagarcos/DATA_SYNC/UV_APPS/SAIC/DATA/saic-data/logsd/saic.log
+
+# Scheduler
+saic.scheduler.expired.enabled=false
+
+# Actuator
+spring.application.name = UV SAIC [LO]
+spring.boot.admin.client.url=http://127.0.0.1:9090
+spring.boot.admin.client.instance.management-base-url=${saic.url.domain}
+spring.boot.admin.client.instance.service-url=${saic.url.domain}
+spring.boot.admin.client.username=admin
+spring.boot.admin.client.password=kkdvk
+management.endpoints.web.exposure.include=*
+management.endpoint.health.show-details=always
+saic.actuator.validIp=127.0.0.1
+

+ 45 - 0
src/main/resources/application-prod.properties

@@ -0,0 +1,45 @@
+# Urls
+saic.url.domain = https://saic.uv.es:4443
+saic.url.public = ${saic.url.domain}/public
+
+# Email config
+saic.mailer.queue.enabled = true
+saic.mailer.reminder.enabled = false
+saic.mailer.calendar.enabled = true
+saic.mailer.maxMailsPerRound = 20
+
+# Data parser config
+saic.parser.surveys.path = /DATA/saic-data/databases/
+saic.parser.surveys.enabled = false
+
+# Database config
+spring.datasource.url=jdbc:postgresql://127.0.0.1/saic_v2
+spring.datasource.password=docent1ia2.l6
+
+# Files and log config
+logging.file.path=/DATA/saic-data/logs
+logging.file.name=/DATA/saic-data/logs/saic.log
+saic.data.filePath=/DATA/saic-data/files/
+saic.data.tmpPath=/DATA/saic-data/tmp/
+saic.data.docsPath=/DATA/saic-data/documents/
+saic.data.templates.filePath=/DATA/saic-data/templates/
+saic.data.templates.logoPath=/DATA/saic-data/templates/logos/
+saic.data.templates.fileNotFound=/DATA/saic-data/utils/filenotfound.pdf
+saic.data.master = /DATA/saic-data/databases/MasterOficial/
+saic.data.doctorado = /DATA/saic-data/databases/doctorat/
+saic.data.evdocente = /DATA/saic-data/databases/ev_docente/latest/
+
+# Scheduler
+saic.scheduler.expired.enabled=false
+
+# Actuator
+spring.application.name = UV SAIC [PR]
+spring.boot.admin.client.url=http://garcosda.uv.es:9090
+spring.boot.admin.client.instance.management-base-url=${saic.url.domain}
+spring.boot.admin.client.instance.service-url=${saic.url.domain}
+spring.boot.admin.client.username=admin
+spring.boot.admin.client.password=kkdvk
+management.endpoints.web.exposure.include=*
+management.endpoint.health.show-details=always
+saic.actuator.validIp=147.156.85.28
+

+ 67 - 0
src/main/resources/application.properties

@@ -0,0 +1,67 @@
+
+# Activate spring profiles
+spring.profiles.active=@activatedProperties@
+
+# Multilang config
+spring.messages.encoding=UTF-8
+
+# Templates config
+spring.thymeleaf.mode=HTML
+spring.thymeleaf.encoding=UTF-8
+
+# JPA config
+spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
+spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
+spring.jpa.hibernate.ddl-auto=none
+#spring.jpa.properties.hibernate.show_sql=true
+
+
+# Logs config
+logging.logback.rollingpolicy.max-file-size=10MB
+logging.level.root=INFO
+
+# Max request and file size
+spring.servlet.multipart.max-file-size=128MB
+spring.servlet.multipart.max-request-size=128MB
+
+# Datasource config
+spring.datasource.driver-class-name=org.postgresql.Driver
+spring.datasource.username=postgres
+spring.sql.init.platform=postgres
+
+#spring.jpa.show-sql=true 
+
+# Email config
+spring.main.banner-mode=off
+spring.mail.protocol=smtp
+spring.mail.host=post.uv.es
+spring.mail.port=25
+spring.mail.properties.mail.smtp.auth = false
+spring.mail.properties.mail.smtp.starttls.enable = false
+
+# Server
+server.port=8080
+server.forward-headers-strategy=native
+server.tomcat.remoteip.remote-ip-header=X-Forwarded-For
+server.tomcat.remoteip.protocol-header=X-Forwarded-Proto
+server.tomcat.remoteip.port-header=X-Forwarded-Port
+server.tomcat.use-relative-redirects=true
+server.tomcat.remoteip.internal-proxies=.*
+
+# UQ server connection parameters
+saic.uqserver.host = uqserver.uv.es
+saic.uqserver.dbname.grau = MDB_grau
+saic.uqserver.dbname.master = MDB_master
+saic.uqserver.dbname.doct = MDB_doctorado
+saic.uqserver.dbname.prof = MDB_evalProf
+saic.uqserver.user = graucer
+saic.uqserver.passwd = C3team4mdb
+
+saic.uqserver2.host = dbmaster.uv.es
+saic.uqserver2.dbname.master = MDB_master
+saic.uqserver2.dbname.prof = MDB_evalProf
+saic.uqserver2.dbname.otros = MDB_otros
+saic.uqserver2.dbname.doct = MDB_doctorado
+saic.uqserver2.user = saic
+saic.uqserver2.passwd = S41cdb01.
+

+ 461 - 0
src/main/resources/messages.properties

@@ -0,0 +1,461 @@
+
+##########################################
+#	GLOBAL LOCALES 
+##########################################
+global.lang.va = Valencià
+global.lang.es = Castellano
+global.exit = Eixir
+global.login = Accedir
+global.help = Instruccions
+global.lang = Idioma
+global.footer.span1 = Consultes procedimentals
+global.footer.span2 = Consultes tècniques
+global.footer.span3 = Unitat de Qualitat
+global.menu.tits = Panell de control
+global.menu.procedures = Tasques assignades
+global.menu.supervision = Supervisió
+global.menu.managers = Responsables
+global.menu.admin = Administració
+global.menu.admin.stats = Informació
+global.menu.admin.instances = Instanciació
+global.menu.admin.procedures = Procediments
+global.menu.admin.mailing = Correus
+global.menu.admin.calendar = Planificador
+global.menu.admin.acredita = Acreditacions
+global.menu.data = Dades i plantilles
+global.menu.data.templates = Plantilles (word)
+global.menu.data.editor = Plantilles (online)
+global.menu.data.import = Importar dades
+global.menu.data.data = Dades consolidades
+global.menu.data.parse = Consolidar dades
+global.menu.contact = Contacte
+global.menu.contact.title = Contacte
+global.menu.contact.title = Adreces de correu electrònic de contacte
+global.accept = Acceptar
+global.edit = Editar
+global.new = Afegir
+global.titleNew = Afegir element
+global.delete = Esborrar 
+global.cancel = Cancel·lar
+global.close = Tancar
+global.close.confirm = Es perdran les dades no guardades
+global.save = Guardar
+global.confirm = Confirmar
+global.return = Tornar
+global.loading = Carregant...
+global.download = Descarregar
+global.titleDownload = Descarregar evidència
+global.deleteWarning = Atenció, aquesta acció no es podrà desfer
+global.error.msg.i = Hi ha hagut un error, per favor, torneu a intentar-ho o contacteu amb 
+global.error.msg.f = reportant el següent error
+global.editEvidence = Eliminar/Editar evidència
+global.uploadLimits = Només es permet pujar un fitxer, per a pujar-ne més utilitzi un fitxer comprimit
+global.uploadSelectFile = Seleccione un fitxer
+global.noData = No hi ha dades disponibles
+global.noTasks = No té cap tasca assignada
+global.expire.notice = En 5 minuts es tancarà automàticament la sessió per inactivitat.
+global.expire.keepalive = Tanque aquesta alerta per seguir fent servir l'aplicació
+global.error.msg = Hi ha hagut un error, per favor, torneu a intentar-ho. Si l'error persisteix contacteu amb
+global.unautorized.msg = El seu usuari no esta autoritzat a accedir a aquest apartat
+global.selectors.noData = No hi ha elements marcats
+
+##########################################
+#	LOGIN FORM LOCALES
+##########################################
+login.h2 = Identificació UV
+login.button = Iniciar Sessió
+login.placeholder.username = Usuari
+login.placeholder.passwd = Contrasenya
+login.error = L'usuari o contrasenya introduïts no són correctes o el seu usuari no està autoritzat.
+login.expired = La seua sessió s'ha tancat per inactivitat o per accedir des d'un altre dispositiu/navegador, per favor, torneu a identificar-vos.
+login.session.info1 = La sessió es tancarà automàticament després de 60 minuts d'inactivitat.
+login.session.info2 = Per favor, deseu els canvis periòdicament.
+
+##########################################
+#	PROCEDURES MAIN PAGE LOCALES
+##########################################
+procedures.title = Tasques assignades
+procedures.subtitle = Faça clic sobre el procediment per a realizar la tasca
+procedures.title.tasks = Tasques associades al procediment
+procedures.title.flow = veure flux
+procedures.center = Centre
+procedures.titulation = Titulació
+procedures.year.eval = Curs avaluat
+procedures.year.act = activat el curs
+procedures.dateLimit = Data límit
+procedures.dateInstance = Data darrera acció
+procedures.status = Estat
+procedures.btn.continue = Acceptar i avançar
+procedures.btn.yes = Si
+procedures.btn.no = No
+procedures.btn.selectFile = Seleccione l'evidència
+procedures.btn.draft = Guardar esborrany
+procedures.done.user = Realitzada per
+procedures.done.date = Data de realització
+procedures.done.evidence = Evidència aportada
+procedures.done.response = Resposta
+procedures.done.response.s = SI
+procedures.done.response.n = NO
+procedures.status.a = Activa
+procedures.status.n = Realitzada (Resposta NO)
+procedures.status.s = Realitzada (Resposta SI)
+procedures.status.f = Realitzada
+procedures.status.e = Realitzada (Evidència adjunta)
+procedures.status.i = Inactiva
+procedures.status.title.a = Tasca activa
+procedures.status.title.p = Tasca inactiva
+procedures.status.title.o = No li correspon realitzar aquesta tasca
+procedures.status.title.r = Tasca realitzada
+procedures.activeTask = Tasca activa
+procedures.olderEvidences = Evidències generades en el procés anteriorment
+procedures.closed = Procediment finalitzat
+procedures.cancelled = Procediment tancat
+procedures.extensionAlert = Només es permet pujar fitxers amb extensió PDF
+procedures.assignedTo = Assignada a
+procedures.back = Tornar
+procedures.template = Descarregue la plantilla
+procedures.legend.active = Activa
+procedures.legend.other = No li correspon
+procedures.legend.blocked = Inactiva
+procedures.legend.done = Realitzada
+procedures.legend.expired = Endarrerida
+procedures.list.legend.active = Actiu
+procedures.list.legend.other = No li correspon
+procedures.list.legend.done = Finalitzat
+procedures.list.legend.expired = Endarrerit
+procedures.otherActions = Accions realitzades anteriorment en aquesta tasca
+procedures.editor.confirm = Esta segur que desitja continuar? En enviar l'evidència ja no podrà fer canvis sobre aquesta tasca.
+procedures.editor.msgsave = Esborrany guardat correctament
+procedures.session.expired = La seua sessió s'ha tancat per inactivitat o per accedir des d'un altre dispositiu/navegador. Tanque aquest diàleg per tornar a entrar a SAIC.
+procedures.nosupported = El seu navegador no suporta les funcionalitats necessàries per treballar amb SAIC. Es recomana utilitzar una versió actualitzada de Chrome o Firefox.
+procedures.autosave.lastdate = Última modificació
+procedures.autosave.none = Encara no s'ha guardat cap esborrany
+
+##########################################
+#	SUPERVISION PAGE LOCALES
+##########################################
+supervision.title = Supervisió dels procediments
+supervision.subtitle = Seleccione els criteris de filtrat dels procediments que desitja supervisar i faça clic en "Consultar".
+supervision.searchBy = Consultar per 
+supervision.years = Curs(os) d'avaluació del procediment
+supervision.titulations = Titulació(ns)
+supervision.centers = Centre(s)
+supervision.titulations.all = Totes
+supervision.titulations.all.g = Tots els graus del centre
+supervision.titulations.all.m = Tots els masters del centre
+supervision.procedures = Procediment(s)
+supervision.evidences = Evidència(es)
+supervision.search = Consultar
+supervision.procedures.title = Procediments que coincideixen amb els criteris seleccionats
+supervision.filter.apha = Ordenar alfabèticament
+supervision.filter.date = Ordenar per data de darrera acció
+supervision.filter.none = Eliminar filtres
+supervision.filter.download1 = Exportar llistat
+supervision.filter.download2 = Exportar per titulació
+
+##########################################
+#	MANAGERS PAGE LOCALES
+##########################################
+managers.title = Cerca de responsables
+managers.title2 = Responsables del seu centre
+managers.subtitle = Seleccione els criteris de filtrat dels responsables que desitja cercar i faça clic en "Cercar".
+managers.centers = Centre
+managers.titulations = Titulació(ns)
+managers.search = Cercar
+managers.search.title = Resultats de la cerca
+managers.noResults = No s'ha trobar cap responsable amb els criteris de cerca seleccionats
+
+##########################################
+#	ADMIN PAGE LOCALES
+##########################################
+admin.instances.title = Instanciació de procediments
+admin.instances.subtitle = Seleccione un procediment junt amb el centre i la titulació sobre els que vol instanciar-lo
+admin.instances.error = Els següents procediments no s'han pogut instanciar
+admin.instances.done = S'han instanciat correctament els següents procediments
+admin.instances.selector.titulation = Titulació
+admin.instances.selector.center = Centre
+admin.instances.selector.procedure = Procediment
+admin.instances.selector.curs = Curs
+admin.instances.selector.taskType = Tipus de tasca
+admin.actions.instance = Instanciar
+admin.actions.load = Carregar
+admin.templates.title = Cerca i prova de plantilles
+admin.templates.subtitle = Seleccione un procediment junt amb el centre i la titulació sobre els que vol provar una plantilla
+admin.templates.info = Faça click sobre la plantilla que vol provar per a descarregar-la i veure els associats que s'han carregat correctament o faça click en editar per a modificar la llista d'indicadors
+admin.templates.indicators = Indicadors associats a la plantilla
+admin.templates.table.enq = Dades de enquestes
+admin.templates.table.serv = Dades del web service
+admin.procedures.title = Administració de procediments
+admin.procedures.subtitle = Seleccione el procediment i feu click en l'opció desitjada
+admin.procedures.action.new = Nou
+admin.procedures.action.duplicate = Duplicar
+admin.procedures.action.edit = Editar
+admin.procedures.action.remove = Esborrar
+admin.procedures.selector.procedure = Procediment
+admin.procedures.selector.years = Curs d' avaluació del procediment
+admin.procedures.selector.titulations = Titulació
+admin.procedures.selector.centers = Centre
+admin.procedures.confirm = Confirmar
+admin.procedures.info.procedure = Informació del procediment
+admin.procedures.info.task = Tasca
+admin.procedures.form.id = ID
+admin.procedures.form.nameProcedure = Codi
+admin.procedures.form.subtitleProcedure = Dimensió abreujada
+admin.procedures.form.context = Àmbit
+admin.procedures.form.version = Versió
+admin.procedures.form.activationYear = Curs d'activació
+admin.procedures.form.evalYear = Curs avaluat
+admin.procedures.form.titleCas = Titol en castellà
+admin.procedures.form.titleVal = Titol en valencià
+admin.procedures.form.descriptionCas = Descripció en castellà
+admin.procedures.form.descriptionVal = Descripció en valencià
+admin.procedures.form.comments = Informació adicional (ocult als usuaris) 
+admin.procedures.form.nameEvCas = Nom de la evidència en castellà
+admin.procedures.form.nameEvVal = Nom de la evidència en valencià
+admin.procedures.form.taskp = ID Tascap
+admin.procedures.form.limitDate = Data límit
+admin.procedures.form.options = Opcions
+admin.procedures.form.report = ¿Genera informe?
+admin.procedures.form.type = Tipus
+admin.procedures.form.type.1 = Evidència
+admin.procedures.form.type.2 = Si/No
+admin.procedures.form.type.3 = Continuar
+admin.procedures.form.evCode = Codi de l'evidència
+admin.procedures.form.next = ID tasca següent
+admin.procedures.form.next2 = ID tasca següent alternativa
+admin.procedures.form.role = Rol
+admin.procedures.form.addTask = Afegir tasca
+admin.procedures.form.removeConfirm = Si esborra aquest procediment les dades no es podràn recuperar
+admin.action.delete = Esborrar
+admin.action.deleteInstance = Esborrar procediment
+admin.action.deleteTask = Esborrar acció
+admin.action.reloadInstance = Esborrar i reiniciar procediment
+admin.action.closeInstance = Tancar procediment
+admin.action.reloadTask = Esborrar i repetir tasca
+admin.action.reactivate = Repetir tasca
+admin.action.edit = Editar tasca
+admin.action.attach = Adjuntar nova evidència
+admin.managers.add = Afegir responsable
+admin.managers.center = Centre
+admin.managers.titulation = Titulació
+admin.managers.user = Usuari
+admin.managers.firstname = Nom
+admin.managers.lastname = Cognoms
+admin.managers.email = Email
+admin.managers.role = Rol
+admin.managers.exists = Ja hi ha una entrada amb les dades seleccionades
+admin.managers.newRole = Afegir reponsable
+admin.managers.newUser = Nou usuari
+admin.stats.pending.title = Correus pendents d'enviar
+admin.stats.pending.total = Total de correus pendents d'enviar
+admin.stats.pending.username = Usuari
+admin.stats.pending.fullname = Nom
+admin.stats.pending.email = Correu
+admin.stats.sessions.title = Sesions actives en aquest moment
+admin.stats.sessions.id = ID de sessió
+admin.stats.sessions.username = Usuari
+admin.stats.sessions.last = Darrera acció
+admin.stats.sessions.expired = Expirada
+admin.stats.sessions.active.total = Total de sessions actives
+admin.stats.sessions.expired.total = Total de sessions expirades
+admin.stats.table.lengthMenu = Files
+admin.stats.table.zeroRecords = No s'han trobat resultats
+admin.stats.table.info = Pàgina _PAGE_ de _PAGES_
+admin.stats.table.infoEmpty = No hi ha dades per a mostrar
+admin.stats.table.infoFiltered = (filtrats de un total de _MAX_)
+admin.stats.table.next = Següent
+admin.stats.table.previous = Anterior
+admin.mailing.title = Correus electrònics
+admin.mailing.subtitle = Seleccione un centre i un rol al que enviar el correu
+admin.mailing.send = Enviar
+admin.mailing.center = Centre
+admin.mailing.role = Rol
+admin.mailing.subject = Assumpte
+admin.mailing.body = Missatge
+admin.mailing.sent.success = El missatge s'ha processat i serà enviat al més aviat possible 
+admin.mailing.sent.error = No s'han trobat usuaris per al rol i centres especificats
+admin.calendar.form.titleAdd = Planificar nova instància
+admin.calendar.form.titleEdit = Editar instància planificada
+admin.calendar.form.titleCopy = Copiar instancia existent
+admin.calendar.form.delete = Esborrar
+admin.calendar.form.instanciar = Instanciar
+admin.calendar.form.add = Afegir
+admin.calendar.form.date = Data
+admin.calendar.form.load = Carregar
+admin.calendar.form.changeDate = Canviar la data al
+admin.calendar.form.acredSel = Selecció per acreditació
+admin.calendar.form.input.grup.1 = Gener 
+admin.calendar.form.input.grup.4 = Abril
+admin.calendar.form.input.grup.9 = Septembre
+admin.calendar.form.input.grup.11 = Novembre
+admin.calendar.form.input.tambit.g = Graus
+admin.calendar.form.input.tambit.m = Másters
+admin.calendar.form.input.tambit.d = Doctorats
+admin.acredita.title = Resumen d'acreditacions 
+admin.acredita.form.view = Carregar
+admin.acredita.form.year = Any
+admin.acredita.form.group = Grup
+admin.acredita.form.groupnum.0 = Tots 
+admin.acredita.form.groupnum.1 = Gener 
+admin.acredita.form.groupnum.4 = Abril
+admin.acredita.form.groupnum.9 = Septembre
+admin.acredita.form.groupnum.11 = Novembre
+
+##########################################
+#	DASHBOARD PAGE LOCALES
+##########################################
+dashboard.header.published = Informes publicats
+dashboard.menu.summary = Resum
+dashboard.menu.procedures = Procediments SAIC
+dashboard.menu.docs = Documentació
+dashboard.menu.data = Indicadors
+dashboard.menu.tits = Titulacions
+dashboard.menu.managers = Responsables
+dashboard.summary.legend.active = Finalitzat
+dashboard.summary.legend.ontime = En curs
+dashboard.summary.legend.delayed = Endarrerit
+dashboard.summary.legend.closed = Tancat
+dashboard.data.sel.g = Dades de Grau
+dashboard.data.sel.m = Dades de Màster
+dashboard.data.sel.d = Dades de Doctorat
+dashboard.data.sel.rates = Taxes
+dashboard.data.sel.estud = Satisfacció estudiantat
+dashboard.data.sel.estud1 = Satisfacció estudiantat de 1er
+dashboard.data.sel.estud3 = Satisfacció estudiantat de 3er
+dashboard.data.sel.gradu = Satisfacció graduats/des
+dashboard.data.sel.prof = Satisfacció professorat
+dashboard.data.sel.eval = Evaluació docent
+dashboard.data.sel.ptgas = Satisfacció PTGAS
+dashboard.data.legend.1 = Titulació
+dashboard.data.legend.2 = Centre
+dashboard.data.legend.3 = Universitat
+dashboard.data.table.hr1 = Enquesta
+dashboard.data.table.hr2 = Indicador
+dashboard.data.table.hr3 = Ámbit
+dashboard.data.table.hr4 = Estudi
+dashboard.data.table.hr5 = Valor
+dashboard.data.table.hr6 = Curs
+dashboard.data.table.hr7 = CursD
+dashboard.data.table.hr8 = Tipus
+dashboard.data.table.hr9 = NºEnq
+dashboard.data.table.hr10 = Curs Enq
+dashboard.data.table.hr11 = Centre Orig
+dashboard.data.table.hr12 = Tit. Orig
+dashboard.data.table.hr13 = RUCT
+dashboard.data.table.hr14 = Data
+dashboard.data.table.btn1 = Dades del curs
+dashboard.data.table.btn2 = Exportar a Excel
+dashboard.data.table.btn3 = Exportar a CSV
+dashboard.data.table.btn4 = Exportar a PDF
+dashboard.data.table.btn5 = Mostrar/Ocultar columnes
+dashboard.data.table.btn6 = Veure gràfiques
+dashboard.data.table.btn7 = Veure totes les dades en format taula
+dashboard.acred.title.edit = Canviar dates
+dashboard.acred.date.segui = Seguiment
+dashboard.acred.date.acred = Pròxima acreditació
+dashboard.acred.date.renov = Última acreditació
+dashboard.acred.date.verif = Verificació
+dashboard.acred.date.impla = Implantació
+dashboard.acred.group.year = Curs pròx. acred.
+dashboard.acred.group.name = Grup pròx. acred.
+dashboard.acred.recom.title = Recommanacions *
+dashboard.acred.recom.msg = Hi ha recomanacions d'obligat compliment derivades de la darrera renovació.
+dashboard.acred.recom.info = Indicar si hi ha recomanacions d'obligat compliment pendents
+dashboard.acred.segui.title = Seguimiento **
+dashboard.acred.segui.info = Indicar si la titulació ha de passar seguiment obligatòriament
+dashboard.acred.segui.msg = La titulació ha de passar obligatòriament un seguiment en la data indicada al camp seguiment.
+dashboard.acred.codes = Codis interns
+dashboard.acred.table.title = Titulacions del centre
+dashboard.acred.table.ruct = RUCT
+dashboard.acred.table.tit = Titulació
+dashboard.acred.table.type = Tipus
+dashboard.acred.table.next = Pròx Accr.
+dashboard.acred.table.acred = Fecha Accr.
+dashboard.acred.table.renov = Renovació
+dashboard.acred.table.verif = Verificació
+dashboard.acred.table.impla = Implantació
+dashboard.acred.table.segui = Seguiment
+dashboard.acred.table.inter = InterUniv.
+dashboard.acred.docs.title = Documentació
+dashboard.gantt.selector = Veure procediments de
+dashboard.tree.selector.title = Veure procediments de
+dashboard.tree.selector.centre = Centre i totes les titulacions
+dashboard.tits.ruct = RUCT
+dashboard.tits.codes = Codis
+dashboard.tits.centre = Centre
+dashboard.tits.tit = Titulació
+dashboard.tits.type = Tipus 
+
+##########################################
+#	DATA PAGE LOCALES
+##########################################
+data.import.title = Importador de dades
+data.import.subtitle = Les dades que importi es quedaran en estat pendent de consolidar. De la mateixa manera, només podreu consultar les dades que es trobin en aquest mateix estat.
+data.import.note1 = El fitxer CSV ha de contenir, com a mínim, les columnes "curs", "titulacio", "centre" i "tipus"
+data.import.note2 = La columna "tipus" pot pendre els valors "avg", "min" o "max"
+data.import.note3 = * Només per a importació 
+data.import.note4 = * Només per a consulta
+data.import.note5 = S'han detectat les següents columnes en el fitxer seleccionat. Si desitja que s'ignore alguna columna, desmarque-la de la llista.
+data.show.title = Consultar dades consolidades
+data.consolide.title = Consolidar dades
+data.consolide.subtitle = Seleccione el conjunt de dades que desitja consolidar
+data.consolide.err1 = S'han detectat dades duplicades en el conjunt pendent de consolidar, si us plau, corregiu-lo abans de consolidar.
+data.consolide.err2 = S'han detectat errors d'integritat entre el conjunt seleccionat i les dades ja consolidades, si us plau, corregiu-les abans de consolidar.
+data.consolide.err3 = No s'ha pogut executar l'acció, comproveu de nou la integritat de les dades.
+data.consolide.count = Nombre de registres pendents de consolidar per al conjunt seleccionat
+data.consolide.tabdesc = Es mostren els registres per als quals s'han detectat problemes
+data.consolide.nodata = No hi ha dades pendents de consolidar per al conjunt seleccionat
+data.consolide.noerr = No s'han detectat errors
+data.consolide.ok = Acció realitzada correctament
+data.consolide.actions.info = Accions automàtiques disponibles
+data.consolide.actions.action1 = Esborrar duplicats
+data.consolide.actions.action2 = Esborrar consolidades
+data.consolide.actions.action3 = Esborrar pendents
+data.consolide.actions.msg = Nombre de registres esborrats
+
+data.input.source = Tipus de dades
+data.input.survey = Grup de dades
+data.input.year = Curs
+data.input.dstyear = Curs a imputar
+data.input.scope = Àmbit
+data.input.scope.t = Titulació
+data.input.scope.c = Centre
+data.input.scope.u = Universitat
+data.input.type = Tipus Titulació
+data.input.type.g = Grau
+data.input.type.m = Màster
+data.input.type.d = Doctorat
+data.input.type.u = Global
+data.input.tit = Titulació
+data.input.cen = Centre
+data.input.file = Seleccioneu o arrossegueu ací el fitxer CSV
+data.input.select = Trieu un conjunt de dades
+data.input.option = Trieu una opció
+data.input.delim = Delimitador
+data.input.dbsource = Origen
+data.input.importType = Tipus d'importació
+data.input.importType.file = Fitxer
+data.input.importType.db = Base de dades
+data.input.view = Vista/Taula a importar (nom_esquema.nom_vista)
+data.input.key = Clau
+
+data.btn.import = Importar
+data.btn.connect = Comprovar connexió
+data.btn.show = Consultar
+data.btn.delete = Eliminar
+data.btn.query = Consultar
+data.btn.check = Comprobar
+data.btn.run = Executar
+data.table.0 = Curs
+data.table.1 = Titulació
+data.table.2 = Centre
+data.table.3 = Àmbit
+data.table.4 = Tipus
+data.table.5 = Indicador
+data.table.6 = Valor
+data.table.7 = Num enq.
+data.table.8 = Titulació Orig.
+data.table.9 = Centre Orig.
+data.table.10 = RUCT
+data.table.11 = Usuari
+data.alert.connect = No s'ha pogut establir la connexió amb la vista indicada

+ 468 - 0
src/main/resources/messages_ca.properties

@@ -0,0 +1,468 @@
+
+##########################################
+#	GLOBAL LOCALES 
+##########################################
+global.lang.va = Valencià
+global.lang.es = Castellano
+global.exit = Eixir
+global.login = Accedir
+global.help = Instruccions
+global.lang = Idioma
+global.footer.span1 = Consultes procedimentals
+global.footer.span2 = Consultes tècniques
+global.footer.span3 = Unitat de Qualitat
+global.menu.tits = Panell de control
+global.menu.procedures = Tasques assignades
+global.menu.supervision = Supervisió
+global.menu.managers = Responsables
+global.menu.admin = Administració
+global.menu.admin.stats = Informació
+global.menu.admin.instances = Instanciació
+global.menu.admin.procedures = Procediments
+global.menu.admin.mailing = Correus
+global.menu.admin.calendar = Planificador
+global.menu.admin.acredita = Acreditacions
+global.menu.data = Dades i plantilles
+global.menu.data.templates = Plantilles (word)
+global.menu.data.editor = Plantilles (online)
+global.menu.data.import = Importar dades
+global.menu.data.data = Dades consolidades
+global.menu.data.parse = Consolidar dades
+global.menu.contact = Contacte
+global.menu.contact.title = Adreces de correu electrònic de contacte
+global.accept = Acceptar
+global.edit = Editar
+global.new = Afegir
+global.titleNew = Afegir element
+global.delete = Esborrar 
+global.cancel = Cancel·lar
+global.close = Tancar
+global.close.confirm = Es perdran les dades no guardades
+global.save = Guardar
+global.confirm = Confirmar
+global.return = Tornar
+global.loading = Carregant...
+global.download = Descarregar
+global.titleDownload = Descarregar evidència
+global.deleteWarning = Atenció, aquesta acció no es podrà desfer
+global.error.msg.i = Hi ha hagut un error, per favor, torneu a intentar-ho o contacteu amb 
+global.error.msg.f = reportant el següent error
+global.editEvidence = Eliminar/Editar evidència
+global.uploadLimits = Només es permet pujar un fitxer, per a pujar-ne més utilitzi un fitxer comprimit
+global.uploadSelectFile = Seleccione un fitxer
+global.noData = No hi ha dades disponibles
+global.noTasks = No té cap tasca assignada
+global.expire.notice = En 5 minuts es tancarà automàticament la sessió per inactivitat.
+global.expire.keepalive = Tanque aquesta alerta per seguir fent servir l'aplicació
+global.error.msg = Hi ha hagut un error, per favor, torneu a intentar-ho. Si l'error persisteix contacteu amb
+global.unautorized.msg = El seu usuari no esta autoritzat a accedir a aquest apartat
+global.selectors.noData = No hi ha elements marcats
+
+##########################################
+#	LOGIN FORM LOCALES
+##########################################
+login.h2 = Identificació UV
+login.button = Iniciar Sessió
+login.placeholder.username = Usuari
+login.placeholder.passwd = Contrasenya
+login.error = L'usuari o contrasenya introduïts no són correctes o el seu usuari no està autoritzat.
+login.expired = La seua sessió s'ha tancat per inactivitat o per accedir des d'un altre dispositiu/navegador, per favor, torneu a identificar-vos.
+login.session.info1 = Aquesta sessió es tancarà automàticament després de 60 minuts d'inactivitat o en accedir des d'un altre dispositiu/navegador.
+login.session.info2 = Per favor, deseu els canvis periòdicament.
+
+##########################################
+#	PROCEDURES MAIN PAGE LOCALES
+##########################################
+procedures.title = Tasques assignades
+procedures.subtitle = Faça clic sobre el procediment per a realizar la tasca
+procedures.title.tasks = Tasques associades al procediment
+procedures.title.flow = veure flux
+procedures.center = Centre
+procedures.titulation = Titulació
+procedures.year.eval = Curs avaluat
+procedures.year.act = activat el curs
+procedures.dateLimit = Data límit
+procedures.dateInstance = Data darrera acció
+procedures.status = Estat
+procedures.btn.continue = Acceptar i avançar
+procedures.btn.yes = Si
+procedures.btn.no = No
+procedures.btn.selectFile = Seleccione l'evidència
+procedures.btn.draft = Guardar esborrany
+procedures.done.user = Realitzada per
+procedures.done.date = Data de realització
+procedures.done.evidence = Evidència aportada
+procedures.done.response = Resposta
+procedures.done.response.s = SI
+procedures.done.response.n = NO
+procedures.status.a = Activa
+procedures.status.n = Realitzada (Resposta NO)
+procedures.status.s = Realitzada (Resposta SI)
+procedures.status.f = Realitzada
+procedures.status.e = Realitzada (Evidència adjunta)
+procedures.status.i = Inactiva
+procedures.status.title.a = Tasca activa
+procedures.status.title.p = Tasca inactiva
+procedures.status.title.o = No li correspon realitzar aquesta tasca
+procedures.status.title.r = Tasca realitzada
+procedures.activeTask = Tasca activa
+procedures.olderEvidences = Evidències generades en el procés anteriorment
+procedures.closed = Procediment finalitzat
+procedures.cancelled = Procediment tancat
+procedures.extensionAlert = Només es permet pujar fitxers amb extensió PDF
+procedures.assignedTo = Assignada a
+procedures.back = Tornar
+procedures.template = Descarregue la plantilla
+procedures.legend.active = Activa
+procedures.legend.other = No li correspon
+procedures.legend.blocked = Inactiva
+procedures.legend.done = Realitzada
+procedures.legend.expired = Endarrerida
+procedures.list.legend.active = Actiu
+procedures.list.legend.other = No li correspon
+procedures.list.legend.done = Finalitzat
+procedures.list.legend.expired = Endarrerit
+procedures.otherActions = Accions realitzades anteriorment en aquesta tasca
+procedures.editor.confirm = Esta segur que desitja continuar? En enviar l'evidència ja no podrà fer canvis sobre aquesta tasca.
+procedures.editor.msgsave = Esborrany guardat correctament
+procedures.session.expired = La seua sessió s'ha tancat per inactivitat o per accedir des d'un altre dispositiu/navegador. Tanque aquest diàleg per tornar a entrar a SAIC.
+procedures.nosupported = El seu navegador no suporta les funcionalitats necessàries per treballar amb SAIC. Es recomana utilitzar una versió actualitzada de Chrome o Firefox.
+procedures.autosave.lastdate = Última modificació
+procedures.autosave.none = Encara no s'ha guardat cap esborrany
+
+##########################################
+#	SUPERVISION PAGE LOCALES
+##########################################
+supervision.title = Supervisió dels procediments
+supervision.subtitle = Seleccione els criteris de filtrat dels procediments que desitja supervisar i faça clic en "Consultar".
+supervision.searchBy = Consultar per 
+supervision.years = Curs(os) d'avaluació del procediment
+supervision.titulations = Titulació(ns)
+supervision.centers = Centre(s)
+supervision.titulations.all = Totes
+supervision.titulations.all.g = Tots els graus del centre
+supervision.titulations.all.m = Tots els masters del centre
+supervision.procedures = Procediment(s)
+supervision.evidences = Evidència(es)
+supervision.search = Consultar
+supervision.procedures.title = Procediments que coincideixen amb els criteris seleccionats
+supervision.filter.apha = Ordenar alfabèticament
+supervision.filter.date = Ordenar per data de darrera acció
+supervision.filter.none = Eliminar filtres
+supervision.filter.download1 = Exportar llistat
+supervision.filter.download2 = Exportar per titulació
+
+##########################################
+#	MANAGERS PAGE LOCALES
+##########################################
+managers.title = Cerca de responsables
+managers.title2 = Responsables del seu centre
+managers.subtitle = Seleccione els criteris de filtrat dels responsables que desitja cercar i faça clic en "Cercar".
+managers.centers = Centre
+managers.titulations = Titulació(ns)
+managers.search = Cercar
+managers.search.title = Resultats de la cerca
+managers.noResults = No s'ha trobar cap responsable amb els criteris de cerca seleccionats
+
+##########################################
+#	ADMIN PAGE LOCALES
+##########################################
+admin.instances.title = Instanciació de procediments
+admin.instances.subtitle = Seleccione un procediment junt amb el centre i la titulació sobre els que vol instanciar-lo
+admin.instances.error = Els següents procediments no s'han pogut instanciar
+admin.instances.done = S'han instanciat correctament els següents procediments
+admin.instances.selector.titulation = Titulació
+admin.instances.selector.center = Centre
+admin.instances.selector.procedure = Procediment
+admin.instances.selector.curs = Curs
+admin.instances.selector.taskType = Tipus de tasca
+admin.templates.title = Cerca i prova de plantilles
+admin.templates.subtitle = Seleccione un procediment junt amb el centre i la titulació sobre els que vol provar una plantilla
+admin.templates.info = Faça click sobre la plantilla que vol provar per a descarregar-la i veure els associats que s'han carregat correctament o faça click en editar per a modificar la llista d'indicadors
+admin.templates.indicators = Indicadors associats a la plantilla
+admin.templates.table.enq = Dades de enquestes
+admin.templates.table.serv = Dades del web service
+admin.actions.instance = Instanciar
+admin.actions.load = Carregar
+admin.procedures.title = Administració de procediments
+admin.procedures.subtitle = Seleccione el procediment i feu click en l'opció desitjada
+admin.procedures.action.new = Nou
+admin.procedures.action.duplicate = Duplicar
+admin.procedures.action.edit = Editar
+admin.procedures.action.remove = Esborrar
+admin.procedures.selector.procedure = Procediment
+admin.procedures.selector.years = Curs d' avaluació del procediment
+admin.procedures.selector.titulations = Titulació
+admin.procedures.selector.centers = Centre
+admin.procedures.confirm = Confirmar
+admin.procedures.info.procedure = Informació del procediment
+admin.procedures.info.task = Tasca
+admin.procedures.form.id = ID
+admin.procedures.form.nameProcedure = Codi
+admin.procedures.form.subtitleProcedure = Dimensió abreujada
+admin.procedures.form.context = Àmbit
+admin.procedures.form.version = Versió
+admin.procedures.form.activationYear = Curs d'activació
+admin.procedures.form.evalYear = Curs avaluat
+admin.procedures.form.titleCas = Titol en castellà
+admin.procedures.form.titleVal = Titol en valencià
+admin.procedures.form.descriptionCas = Descripció en castellà
+admin.procedures.form.descriptionVal = Descripció en valencià
+admin.procedures.form.nameEvCas = Nom de la evidència en castellà
+admin.procedures.form.nameEvVal = Nom de la evidència en valencià
+admin.procedures.form.comments = Informació adicional (ocult als usuaris) 
+admin.procedures.form.taskp = ID Tascap
+admin.procedures.form.limitDate = Data límit
+admin.procedures.form.options = Opcions
+admin.procedures.form.report = ¿Genera informe?
+admin.procedures.form.type = Tipus
+admin.procedures.form.type.1 = Evidència
+admin.procedures.form.type.2 = Si/No
+admin.procedures.form.type.3 = Continuar
+admin.procedures.form.evCode = Codi de l'evidència
+admin.procedures.form.next = ID tasca següent
+admin.procedures.form.next2 = ID tasca següent alternativa
+admin.procedures.form.role = Rol
+admin.procedures.form.addTask = Afegir tasca
+admin.procedures.form.removeConfirm = Si esborra aquest procediment les dades no es podràn recuperar
+admin.action.delete = Esborrar
+admin.action.deleteInstance = Esborrar procediment
+admin.action.deleteTask = Esborrar acció
+admin.action.reloadInstance = Esborrar i reiniciar procediment
+admin.action.closeInstance = Tancar procediment
+admin.action.reloadTask = Esborrar i repetir tasca
+admin.action.reactivate = Repetir tasca
+admin.action.edit = Editar tasca
+admin.action.attach = Adjuntar nova evidència
+admin.managers.add = Afegir responsable
+admin.managers.center = Centre
+admin.managers.titulation = Titulació
+admin.managers.user = Usuari
+admin.managers.firstname = Nom
+admin.managers.lastname = Cognoms
+admin.managers.email = Email
+admin.managers.role = Rol
+admin.managers.exists = Ja hi ha una entrada amb les dades seleccionades
+admin.managers.newRole = Afegir reponsable
+admin.managers.newUser = Nou usuari
+admin.stats.pending.title = Correus pendents d'enviar
+admin.stats.pending.total = Total de correus pendents d'enviar
+admin.stats.pending.username = Usuari
+admin.stats.pending.fullname = Nom
+admin.stats.pending.email = Correu
+admin.stats.sessions.title = Sesions actives en aquest moment
+admin.stats.sessions.id = ID de sessió
+admin.stats.sessions.username = Usuari
+admin.stats.sessions.last = Darrera acció
+admin.stats.sessions.expired = Expirada
+admin.stats.sessions.active.total = Total de sessions actives
+admin.stats.sessions.expired.total = Total de sessions expirades
+admin.stats.table.lengthMenu = Files
+admin.stats.table.zeroRecords = No s'han trobat resultats
+admin.stats.table.info = Pàgina _PAGE_ de _PAGES_
+admin.stats.table.infoEmpty = No hi ha dades per a mostrar
+admin.stats.table.infoFiltered = (filtrats de un total de _MAX_)
+admin.stats.table.next = Següent
+admin.stats.table.previous = Anterior
+admin.mailing.title = Correus electrònics
+admin.mailing.subtitle = Seleccione un centre i un rol al que enviar el correu
+admin.mailing.send = Enviar
+admin.mailing.center = Centre
+admin.mailing.role = Rol
+admin.mailing.subject = Assumpte
+admin.mailing.body = Missatge
+admin.mailing.sent.success = El missatge s'ha processat i serà enviat al més aviat possible 
+admin.mailing.sent.error = No s'han trobat usuaris per al rol i centres especificats
+admin.calendar.form.titleAdd = Planificar nova instància
+admin.calendar.form.titleEdit = Editar instància planificada
+admin.calendar.form.titleCopy = Copiar instancia existent
+admin.calendar.form.delete = Esborrar
+admin.calendar.form.instanciar = Instanciar
+admin.calendar.form.add = Afegir
+admin.calendar.form.date = Data
+admin.calendar.form.load = Carregar
+admin.calendar.form.changeDate = Canviar la data al
+admin.calendar.form.acredSel = Selecció per acreditació
+admin.calendar.form.input.grup.1 = Gener 
+admin.calendar.form.input.grup.4 = Abril
+admin.calendar.form.input.grup.9 = Septembre
+admin.calendar.form.input.grup.11 = Novembre
+admin.calendar.form.input.tambit.g = Graus
+admin.calendar.form.input.tambit.m = Másters
+admin.calendar.form.input.tambit.d = Doctorats
+admin.acredita.title = Resumen d'acreditacions 
+admin.acredita.form.view = Carregar
+admin.acredita.form.year = Any
+admin.acredita.form.group = Grup
+admin.acredita.form.groupnum.0 = Tots 
+admin.acredita.form.groupnum.1 = Gener 
+admin.acredita.form.groupnum.4 = Abril
+admin.acredita.form.groupnum.9 = Septembre
+admin.acredita.form.groupnum.11 = Novembre
+
+
+##########################################
+#	DASHBOARD PAGE LOCALES
+##########################################
+dashboard.header.published = Informes publicats
+dashboard.menu.summary = Resum
+dashboard.menu.procedures = Procediments SAIC
+dashboard.menu.docs = Documentació
+dashboard.menu.data = Indicadors
+dashboard.menu.tits = Titulacions
+dashboard.menu.managers = Responsables
+dashboard.summary.legend.active = Finalitzat
+dashboard.summary.legend.ontime = En curs
+dashboard.summary.legend.delayed = Endarrerit
+dashboard.summary.legend.closed = Tancat
+dashboard.data.sel.g = Dades de Grau
+dashboard.data.sel.m = Dades de Màster
+dashboard.data.sel.d = Dades de Doctorat
+dashboard.data.sel.rates = Taxes
+dashboard.data.sel.estud = Satisfacció estudiantat
+dashboard.data.sel.estud1 = Satisfacció estudiantat de 1er
+dashboard.data.sel.estud3 = Satisfacció estudiantat de 3er
+dashboard.data.sel.gradu = Satisfacció graduats/des
+dashboard.data.sel.prof = Satisfacció professorat
+dashboard.data.sel.eval = Evaluació docent
+dashboard.data.sel.ptgas = Satisfacció PTGAS
+dashboard.data.legend.1 = Titulació
+dashboard.data.legend.2 = Centre
+dashboard.data.legend.3 = Universitat
+dashboard.data.table.hr1 = Enquesta
+dashboard.data.table.hr2 = Indicador
+dashboard.data.table.hr3 = Ámbit
+dashboard.data.table.hr4 = Estudi
+dashboard.data.table.hr5 = Valor
+dashboard.data.table.hr6 = Curs
+dashboard.data.table.hr7 = CursD
+dashboard.data.table.hr8 = Tipus
+dashboard.data.table.hr9 = NºEnq
+dashboard.data.table.hr10 = Curs Enq
+dashboard.data.table.hr11 = Centre Orig
+dashboard.data.table.hr12 = Tit. Orig
+dashboard.data.table.hr13 = RUCT
+dashboard.data.table.hr14 = Data
+dashboard.data.table.btn1 = Dades del curs
+dashboard.data.table.btn2 = Exportar a Excel
+dashboard.data.table.btn3 = Exportar a CSV
+dashboard.data.table.btn4 = Exportar a PDF
+dashboard.data.table.btn5 = Mostrar/Ocultar columnes
+dashboard.data.table.btn6 = Veure gràfiques
+dashboard.data.table.btn7 = Veure totes les dades en format taula
+dashboard.acred.title.edit = Canviar dates
+dashboard.acred.date.segui = Seguiment
+dashboard.acred.date.acred = Pròxima acreditació
+dashboard.acred.date.renov = Última acreditació
+dashboard.acred.date.renov = Renovació
+dashboard.acred.date.verif = Verificació
+dashboard.acred.date.impla = Implantació
+dashboard.acred.group.year = Curs pròx. acred.
+dashboard.acred.group.name = Grup pròx. acred.
+dashboard.acred.recom.title = Recommanacions *
+dashboard.acred.recom.msg = Hi ha recomanacions d'obligat compliment derivades de la darrera renovació.
+dashboard.acred.recom.info = Indicar si hi ha recomanacions d'obligat compliment pendents
+dashboard.acred.segui.title = Seguimiento **
+dashboard.acred.segui.info = Indicar si la titulació ha de passar seguiment obligatòriament
+dashboard.acred.segui.msg = La titulació ha de passar obligatòriament un seguiment en la data indicada al camp seguiment.
+dashboard.acred.codes = Codis interns
+dashboard.acred.table.title = Titulacions del centre
+dashboard.acred.table.ruct = RUCT
+dashboard.acred.table.tit = Titulació
+dashboard.acred.table.type = Tipus
+dashboard.acred.table.next = Pròx Accr.
+dashboard.acred.table.acred = Fecha Accr.
+dashboard.acred.table.renov = Renovació
+dashboard.acred.table.verif = Verificació
+dashboard.acred.table.impla = Implantació
+dashboard.acred.table.segui = Seguiment
+dashboard.acred.table.inter = InterUniv.
+dashboard.acred.table.date = Data acreditació
+dashboard.acred.docs.title = Documentació
+dashboard.gantt.selector = Veure procediments de
+dashboard.tree.selector.title = Veure procediments de
+dashboard.tree.selector.centre = Centre i totes les titulacions
+dashboard.tits.ruct = RUCT
+dashboard.tits.codes = Codis
+dashboard.tits.centre = Centre
+dashboard.tits.tit = Titulació
+dashboard.tits.type = Tipus 
+
+##########################################
+#	DATA PAGE LOCALES
+##########################################
+data.import.title = Importador de dades
+data.import.subtitle = Les dades que importi es quedaran en estat pendent de consolidar. De la mateixa manera, només podreu consultar les dades que es trobin en aquest mateix estat.
+data.import.note1 = El fitxer CSV ha de contenir, com a mínim, les columnes "curs", "titulacio", "centre" i "tipus"
+data.import.note2 = La columna "tipus" pot pendre els valors "avg", "min" o "max"
+data.import.note3 = * Només per a importació 
+data.import.note4 = * Només per a consulta
+data.import.note5 = S'han detectat les següents columnes en el fitxer seleccionat. Si desitja que s'ignore alguna columna, desmarque-la de la llista.
+data.show.title = Consultar dades consolidades
+data.consolide.title = Consolidar dades
+data.consolide.subtitle = Seleccione el conjunt de dades que desitja consolidar
+data.consolide.err1 = S'han detectat dades duplicades en el conjunt pendent de consolidar, si us plau, corregiu-lo abans de consolidar.
+data.consolide.err2 = S'han detectat errors d'integritat entre el conjunt seleccionat i les dades ja consolidades, si us plau, corregiu-les abans de consolidar.
+data.consolide.err3 = No s'ha pogut executar l'acció, comproveu de nou la integritat de les dades.
+data.consolide.count = Nombre de registres pendents de consolidar per al conjunt seleccionat
+data.consolide.tabdesc = Es mostren els registres per als quals s'han detectat problemes
+data.consolide.nodata = No hi ha dades pendents de consolidar per al conjunt seleccionat
+data.consolide.noerr = No s'han detectat errors
+data.consolide.ok = Acció realitzada correctament
+data.consolide.actions.info = Accions automàtiques disponibles
+data.consolide.actions.action1 = Esborrar duplicats
+data.consolide.actions.action2 = Esborrar consolidades
+data.consolide.actions.action3 = Esborrar pendents
+data.consolide.actions.msg = Nombre de registres esborrats
+
+data.input.source = Tipus de dades
+data.input.survey = Grup de dades
+data.input.year = Curs
+data.input.dstyear = Curs a imputar
+data.input.scope = Àmbit
+data.input.scope.t = Titulació
+data.input.scope.c = Centre
+data.input.scope.u = Universitat
+data.input.type = Tipus Titulació
+data.input.type.g = Grau
+data.input.type.m = Màster
+data.input.type.d = Doctorat
+data.input.type.u = Global
+data.input.tit = Titulació
+data.input.cen = Centre
+data.input.file = Seleccioneu o arrossegueu ací el fitxer CSV
+data.input.select = Trieu un conjunt de dades
+data.input.option = Trieu una opció
+data.input.delim = Delimitador
+data.input.dbsource = DB d'origen
+data.input.importType = Tipus d'importació
+data.input.importType.file = Fitxer
+data.input.importType.db = Base de dades
+data.input.view = Vista/Taula a importar (nom_esquema.nom_vista)
+data.input.key = Clau
+
+data.btn.import = Importar
+data.btn.connect = Comprovar connexió
+data.btn.show = Consultar
+data.btn.delete = Eliminar
+data.btn.query = Consultar
+data.btn.check = Comprobar
+data.btn.run = Executar
+data.table.0 = Curs
+data.table.1 = Titulació
+data.table.2 = Centre
+data.table.3 = Àmbit
+data.table.4 = Tipus
+data.table.5 = Indicador
+data.table.6 = Valor
+data.table.7 = Num enq.
+data.table.8 = Titulació Orig.
+data.table.9 = Centre Orig.
+data.table.10 = RUCT
+data.table.11 = Usuari
+data.alert.connect = No s'ha pogut establir la connexió amb la vista indicada
+
+
+
+
+

+ 462 - 0
src/main/resources/messages_es.properties

@@ -0,0 +1,462 @@
+
+##########################################
+#	GLOBAL LOCALES 
+##########################################
+global.lang.va = Valencià
+global.lang.es = Castellano
+global.exit = Salir
+global.login = Acceder
+global.help = Instrucciones
+global.lang = Idioma
+global.footer.span1 = Consultas procedimentales
+global.footer.span2 = Consultas técnicas
+global.footer.span3 = Unidad de Calidad
+global.menu.tits = Panel de control
+global.menu.procedures = Tareas asignadas
+global.menu.supervision = Supervisión
+global.menu.managers = Responsables
+global.menu.admin = Administración
+global.menu.admin.stats = Información
+global.menu.admin.instances = Instanciación
+global.menu.admin.procedures = Procedimientos
+global.menu.admin.parse = Consolidar datos
+global.menu.admin.mailing = Correos
+global.menu.admin.calendar = Planificador
+global.menu.admin.acredita = Acreditaciones
+global.menu.data = Datos y plantillas
+global.menu.admin.templates = Plantillas (word)
+global.menu.admin.editor = Plantillas (online)
+global.menu.admin.import = Importar datos
+global.menu.admin.data = Datos consolidados
+global.menu.contact = Contacto
+global.menu.contact.title = Direcciones de correo electrónico de contacto
+global.accept = Aceptar
+global.edit = Editar
+global.new = Nuevo
+global.titleNew = Nuevo elemento
+global.delete = Borrar 
+global.cancel = Cancelar
+global.close = Cerrar
+global.close.confirm = Se perderán los datos no guardados
+global.save = Guardar
+global.confirm = Confirmar
+global.return = Volver
+global.loading = Cargando...
+global.titleDownload = Descargar evidencia
+global.download = Descargar
+global.deleteWarning = Atenció, esta acción no se podrá deshacer
+global.error.msg.i = Ha ocurrido un error, por favor, vuelva a intentarlo o contacte con
+global.error.msg.f = reportando el siguiente error
+global.editEvidence = Eliminar/Editar evidencia
+global.uploadLimits = Solo se permite subir un fichero, para subir más utilize un fichero comprimido
+global.uploadSelectFile = Seleccione un fichero
+global.noData = No hay datos disponibles
+global.noTasks = No tiene ninguna tarea asignada
+global.expire.notice = En 5 minutos se cerrará automaticamente la sesión por inactividad.
+global.expire.keepalive = Cierre esta alerta para seguir usando la aplicación
+global.error.msg = Ha habido un error, por favor, vuelva a intentarlo. Si el error persiste contacte con
+global.unautorized.msg = Su usuario no está autorizado a acceder a este apartado
+global.selectors.noData = No hay elementos marcados
+
+##########################################
+#	LOGIN FORM LOCALES
+##########################################
+login.h2 = Identificación UV
+login.button = Iniciar Sesión
+login.placeholder.username = Usuario
+login.placeholder.passwd = Contraseña
+login.error = El usuario o contraseña introducidos no son correctos o su usuario no está autorizado.
+login.expired = Su sesión se ha cerrado por inactividad o por acceder desde otro dispositivo/navegador, por favor, vuelva a identificarse.
+login.session.info1 = La sesión se cerrará automaticamente tras 60 minutos de inactividad.
+login.session.info2 = Por favor, guarde los cambios periodicamente.
+
+##########################################
+#	PROCEDURES MAIN PAGE LOCALES
+##########################################
+procedures.title = Tareas asignadas
+procedures.subtitle = Haga clic sobre el procedimiento para realizar la tarea
+procedures.title.tasks = Tareas asociadas al procedimiento
+procedures.title.flow = ver flujo
+procedures.center = Centro
+procedures.titulation = Titulación
+procedures.year.eval = Curso evaluado
+procedures.year.act = activado el curso
+procedures.dateLimit = Fecha límite
+procedures.dateInstance = Fecha última acción
+procedures.status = Estado
+procedures.btn.continue = Aceptar y avanzar
+procedures.btn.yes = Si
+procedures.btn.no = No
+procedures.btn.selectFile = Seleccione la evidencia
+procedures.btn.draft = Guardar borrador
+procedures.done.user = Realizada por
+procedures.done.date = Fecha de realización
+procedures.done.evidence = Evidencia aportada
+procedures.done.response = Respuesta
+procedures.done.response.s = SI
+procedures.done.response.n = NO
+procedures.status.a = Activa
+procedures.status.n = Realizada (Respuesta NO)
+procedures.status.s = Realizada (Respuesta SI)
+procedures.status.f = Realizada
+procedures.status.e = Realizada (Evidencia adjunta)
+procedures.status.i = Inactiva
+procedures.status.title.a = Tarea activa
+procedures.status.title.p = Tarea inactiva
+procedures.status.title.o = No le corresponde realizar está tarea
+procedures.status.title.r = Tarea realizada
+procedures.activeTask = Tarea activa
+procedures.olderEvidences = Evidencias generadas en el proceso anteriormente
+procedures.closed = Procedimiento finalizado
+procedures.cancelled = Procedimiento cerrado
+procedures.extensionAlert = Solo se permite subir archivos con extensión PDF
+procedures.assignedTo = Asignada a
+procedures.back = Volver
+procedures.template = Descargue la plantilla
+procedures.legend.active = Activa
+procedures.legend.other = No le corresponde
+procedures.legend.blocked = Inactiva
+procedures.legend.done = Realizada
+procedures.legend.expired = Atrasada
+procedures.list.legend.active = Activo
+procedures.list.legend.other = No le corresponde
+procedures.list.legend.done = Finalizado
+procedures.list.legend.expired = Atrasado
+procedures.otherActions = Acciones realizadas anteriormente en esta tarea
+procedures.editor.confirm = ¿Esta seguro de que desea continuar? Al enviar la evidencia ya no podrá realizar cambios sobre esta tarea.
+procedures.editor.msgsave = Borrador guardado correctamente
+procedures.session.expired = Su sesión se ha cerrado por inactividad o por acceder desde otro dispositivo/navegador. Cierre este diálogo para volver a entrar a SAIC.
+procedures.nosupported = Su navegador no soporta las funcionalidades necesarias para trabajar con SAIC. Se recomienda utilizar una versión actualizada de Chrome o Firefox.
+procedures.autosave.lastdate = Última modificación
+procedures.autosave.none = Aun no se ha guardado ningún borrador
+
+##########################################
+#	SUPERVISION PAGE LOCALES
+##########################################
+supervision.title = Supervisión de los procedimientos
+supervision.subtitle = Seleccione los criterios de filtrado de los procedimentos que desea supervisar y pulse "Consultar".
+supervision.searchBy = Buscar por
+supervision.years = Curs(os) de evaluación del procedimiento
+supervision.titulations = Titulación(es)
+supervision.titulations.all = Todos
+supervision.centers = Centro(s)
+supervision.titulations.all.g = Todos los grados del centro
+supervision.titulations.all.m = Todos los másters del centro
+supervision.procedures = Procedimiento(s)
+supervision.evidences = Evidencia(s)
+supervision.search = Consultar
+supervision.procedures.title = Procedimientos que coinciden con los criterios seleccionados
+supervision.filter.apha = Ordenar alfabéticamente
+supervision.filter.date = Ordenar por fecha de última acción
+supervision.filter.none = Eliminar filtros
+supervision.filter.download1 = Exportar listado
+supervision.filter.download2 = Exportar por titulación
+
+
+##########################################
+#	MANAGERS PAGE LOCALES
+##########################################
+managers.title = Búsqueda de responsables
+managers.title2 = Responsables de su centro
+managers.subtitle = Seleccione los criterios de filtrado de los responsables que desea buscar y pulse "Buscar".
+managers.centers = Centro
+managers.titulations = Titulación(es)
+managers.search = Buscar
+managers.search.title = Resultados de la búsqueda
+managers.noResults = No se ha encontrado ningun responsable con los criterios seleccionados
+
+##########################################
+#	ADMIN PAGE LOCALES
+##########################################
+admin.instances.title = Instanciación de procedimientos
+admin.instances.subtitle = Seleccione un procedimiento junto con el centro y la titulación sobre los que quiere instanciarlo
+admin.instances.error = Los siguientes procedimentos no se han podido instanciar
+admin.instances.done = Se han instanciado correctamente los siguientes procedimientos
+admin.instances.selector.titulation = Titulación
+admin.instances.selector.center = Centro
+admin.instances.selector.procedure = Procedimiento
+admin.instances.selector.curs = Curso
+admin.instances.selector.taskType = Tipo de tarea
+admin.templates.title = Búsqueda y prueba de plantillas
+admin.templates.subtitle = Seleccione un procedimiento junto con el centro y la titulación sobre los que quiere probar una plantilla
+admin.templates.info = Haga click sobre la plantilla que desea probar
+admin.templates.info = Faça click sobre la plantilla que vol provar per a descarregar-la i veure els associats que s'han carregat correctament o faça click en editar per a modificar la llista d'indicadors
+admin.templates.indicators = Indicadores asociados a la plantilla
+admin.templates.table.enq = Datos de encuestas
+admin.templates.table.serv = Datos del web service
+admin.actions.instance = Instanciar
+admin.actions.load = Cargar
+admin.procedures.title = Administración de procedimientos
+admin.procedures.subtitle = Selccione el procedimiento y haga click en la opción deseada
+admin.procedures.action.new = Nuevo
+admin.procedures.action.duplicate = Duplicar
+admin.procedures.action.edit = Editar
+admin.procedures.action.remove = Eliminar
+admin.procedures.selector.procedure = Procedimiento
+admin.procedures.selector.years = Curso de evaluación del procedimiento
+admin.procedures.selector.titulations = Titulación
+admin.procedures.selector.centers = Centro
+admin.procedures.confirm = Confirmar
+admin.procedures.info.procedure = Información del procedimiento
+admin.procedures.info.task = Tarea
+admin.procedures.form.id = ID
+admin.procedures.form.nameProcedure = Código
+admin.procedures.form.subtitleProcedure = Dimensión abreviada
+admin.procedures.form.context = Ámbito
+admin.procedures.form.version = Versión
+admin.procedures.form.activationYear = Curso de activación
+admin.procedures.form.evalYear = Curso evaluado
+admin.procedures.form.titleCas = Titulo en castellano
+admin.procedures.form.titleVal = Titulo en valenciano
+admin.procedures.form.descriptionCas = Descripción en castellano
+admin.procedures.form.descriptionVal = Descripción en valenciano
+admin.procedures.form.comments = Información adicional (oculto a los usuaris) 
+admin.procedures.form.nameEvCas = Nombre de la evidencia en castellano
+admin.procedures.form.nameEvVal = Nombre de la evidencia en valenciano
+admin.procedures.form.taskp = ID Tascap
+admin.procedures.form.limitDate = Fecha límite
+admin.procedures.form.options = Opciones
+admin.procedures.form.report = ¿Genera informe?
+admin.procedures.form.type = Tipo
+admin.procedures.form.type.1 = Evidencia
+admin.procedures.form.type.2 = Si/No
+admin.procedures.form.type.3 = Continuar
+admin.procedures.form.evCode = Código de la evidencia
+admin.procedures.form.next = ID tarea siguiente
+admin.procedures.form.next2 = ID tarea siguiente alternativa
+admin.procedures.form.role = Rol
+admin.procedures.form.addTask = Añadir tarea
+admin.procedures.form.removeConfirm = Si elimina este procedimiento los datos no se podrán recuperar
+admin.action.delete = Eliminar
+admin.action.deleteInstance = Eliminar procedimiento
+admin.action.deleteTask = Eliminar acción
+admin.action.reloadInstance = Borrar y reiniciar procedimiento
+admin.action.closeInstance = Cerrar procedimiento
+admin.action.reloadTask = Borrar y repetir tarea
+admin.action.reactivate = Repetir tarea
+admin.action.edit = Editar tarea
+admin.action.attach = Adjuntar nueva evidencia
+admin.managers.add = Añadir responsable
+admin.managers.center = Centro
+admin.managers.titulation = Titulación
+admin.managers.user = Usuario
+admin.managers.firstname = Nombre
+admin.managers.lastname = Apellidos
+admin.managers.email = Email
+admin.managers.role = Rol
+admin.managers.exists = Ya existe una entrada con los datos seleccionados
+admin.managers.newRole = Añadir responsable
+admin.managers.newUser = Nuevo usuario
+admin.stats.pending.title = Correos pendientes de enviar
+admin.stats.pending.total = Total de correos pendientes de enviar
+admin.stats.pending.username = Usuario
+admin.stats.pending.fullname = Nombre
+admin.stats.pending.email = Correo
+admin.stats.sessions.title = Sesiones activas en este instante
+admin.stats.sessions.id = ID de sesión
+admin.stats.sessions.username = Usuario
+admin.stats.sessions.last = Última acción
+admin.stats.sessions.expired = Expirada
+admin.stats.sessions.active.total = Total de sesiones activas
+admin.stats.sessions.expired.total = Total de sesionrs expiradas
+admin.stats.table.lengthMenu = Filas
+admin.stats.table.zeroRecords = No se han encontrado resultados
+admin.stats.table.info = Página _PAGE_ de _PAGES_
+admin.stats.table.infoEmpty = No hay datos para mostrar
+admin.stats.table.infoFiltered = (filtradas de un total de _MAX_)
+admin.stats.table.next = Siguiente
+admin.stats.table.previous = Anterior
+admin.mailing.title = Correos electronicos
+admin.mailing.subtitle = Seleccione un centro y un rol al que enviar el correo
+admin.mailing.send = Enviar
+admin.mailing.center = Centro
+admin.mailing.role = Rol
+admin.mailing.subject = Asunto
+admin.mailing.body = Mensaje
+admin.mailing.sent.success = El mensaje se ha procesado correctamente y será enviado lo antes posible
+admin.mailing.sent.error = No se han encontrado usuarios para el rol y centros especificados
+admin.calendar.form.titleAdd = Planificar nueva instancia
+admin.calendar.form.titleEdit = Editar instancia planificada
+admin.calendar.form.titleCopy = Copiar instancia existente
+admin.calendar.form.delete = Eliminar
+admin.calendar.form.instanciar = Instanciar
+admin.calendar.form.add = Añadir
+admin.calendar.form.date = Fecha
+admin.calendar.form.load = Cargar
+admin.calendar.form.changeDate = ¿Cambiar la fecha al
+admin.calendar.form.acredSel = Selección por acreditación
+admin.calendar.form.input.grup.1 = Enero 
+admin.calendar.form.input.grup.4 = Abril
+admin.calendar.form.input.grup.9 = Septiembre
+admin.calendar.form.input.grup.11 = Noviembre
+admin.calendar.form.input.tambit.g = Grados
+admin.calendar.form.input.tambit.m = Másters
+admin.calendar.form.input.tambit.d = Doctorados
+admin.acredita.title = Resumen de acreditaciones 
+admin.acredita.form.view = Cargar
+admin.acredita.form.year = Año
+admin.acredita.form.group = Grupo
+admin.acredita.form.groupnum.0 = Todos 
+admin.acredita.form.groupnum.1 = Enero 
+admin.acredita.form.groupnum.4 = Abril
+admin.acredita.form.groupnum.9 = Septiembre
+admin.acredita.form.groupnum.11 = Noviembre
+
+##########################################
+#	DASHBOARD PAGE LOCALES
+##########################################
+dashboard.header.published = Informes publicados
+dashboard.menu.summary = Resumen
+dashboard.menu.procedures = Procedimientos SAIC
+dashboard.menu.docs = Documentación
+dashboard.menu.data = Indicadores
+dashboard.menu.tits = Titulaciones
+dashboard.menu.managers = Responsables
+dashboard.summary.legend.active = Finalizado
+dashboard.summary.legend.ontime = En curso
+dashboard.summary.legend.delayed = Atrasado
+dashboard.summary.legend.closed = Cerrado
+dashboard.data.sel.g = Datos de Grado
+dashboard.data.sel.m = Datos de Máster
+dashboard.data.sel.d = Datos de Doctorado
+dashboard.data.sel.rates = Tasas
+dashboard.data.sel.estud = Satisfacción estudiantado
+dashboard.data.sel.estud1 = Satisfacción estudiantado de 1º
+dashboard.data.sel.estud3 = Satisfacción estudiantado de 3º
+dashboard.data.sel.gradu = Satisfacción graduados/as
+dashboard.data.sel.prof = Satisfacción profesorado
+dashboard.data.sel.eval = Evaluación docente
+dashboard.data.sel.ptgas = Satisfacción del PTGAS
+dashboard.data.legend.1 = Titulación
+dashboard.data.legend.2 = Centro
+dashboard.data.legend.3 = Universidad
+dashboard.data.table.hr1 = Encuesta
+dashboard.data.table.hr2 = Indicador
+dashboard.data.table.hr3 = Ámbito
+dashboard.data.table.hr4 = Estudio
+dashboard.data.table.hr5 = Valor
+dashboard.data.table.hr6 = Curso
+dashboard.data.table.hr7 = CursoD
+dashboard.data.table.hr8 = Tipo
+dashboard.data.table.hr9 = NºEnc
+dashboard.data.table.hr10 = Curso Enc
+dashboard.data.table.hr11 = Centro Orig
+dashboard.data.table.hr12 = Tit. Orig
+dashboard.data.table.hr13 = RUCT
+dashboard.data.table.hr14 = Fecha
+dashboard.data.table.btn1 = Datos del curso
+dashboard.data.table.btn2 = Exportar a Excel
+dashboard.data.table.btn3 = Exportar a CSV
+dashboard.data.table.btn4 = Exportar a PDF
+dashboard.data.table.btn5 = Mostrar/Ocultar columnas
+dashboard.data.table.btn6 = Ver gráficas
+dashboard.data.table.btn7 = Ver todos los datos en formato tabla
+dashboard.acred.title.edit = Cambiar fechas
+dashboard.acred.date.segui = Seguimiento
+dashboard.acred.date.acred = Próxima acreditación
+dashboard.acred.date.renov = Última acreditación
+dashboard.acred.date.verif = Verificación
+dashboard.acred.date.impla = Implantación
+dashboard.acred.group.year = Curso próx. acred.
+dashboard.acred.group.name = Grupo próx. acred.
+dashboard.acred.recom.title = Recomendaciones *
+dashboard.acred.recom.msg = Hay recomendaciones de obligado cumplimiento derivadas de la última renovación.
+dashboard.acred.recom.info = Indicar si hay recomendaciones de obligado cumplimiento pendientes
+dashboard.acred.segui.title = Seguimiento **
+dashboard.acred.segui.info = Indicar si la titulación tiene que hacer especial seguimiento
+dashboard.acred.segui.msg = La titulación tiene que pasar obligatoriamente un seguimiento en la fecha indicada en el campo seguimiento.
+dashboard.acred.codes = Códigos internos
+dashboard.acred.table.title = Titulaciones del centro
+dashboard.acred.table.ruct = RUCT
+dashboard.acred.table.tit = Titulación
+dashboard.acred.table.type = Tipo
+dashboard.acred.table.next = Próx Accr.
+dashboard.acred.table.acred = Fecha Accr.
+dashboard.acred.table.renov = Renovación
+dashboard.acred.table.verif = Verificación
+dashboard.acred.table.impla = Implantación
+dashboard.acred.table.segui = Seguimiento
+dashboard.acred.table.inter = InterUniv.
+dashboard.acred.docs.title = Documentación
+dashboard.gantt.selector = Ver procedimientos de
+dashboard.tree.selector.title = Ver procedimientos de
+dashboard.tree.selector.centre = Centro y todas sus titulaciones
+dashboard.tits.ruct = RUCT
+dashboard.tits.codes = Códigos
+dashboard.tits.centre = Centro
+dashboard.tits.tit = Titulación
+dashboard.tits.type = Tipo
+
+##########################################
+#	DATA PAGE LOCALES
+##########################################
+data.import.title = Importador de datos
+data.import.subtitle = Los datos que importe se quedarán en estado pendiente de consolidar. Del mismo modo, solo podrá consultar los datos que se encuentren en ese mismo estado.
+data.import.note1 = El fichero CSV debe de contener, como mínimo, las columnas "curs", "titulacio", "centre" y "tipus".
+data.import.note2 = La columna "tipus" puede tomar los valores "avg", "min" o "max"
+data.import.note3 = * Solo para importación 
+data.import.note4 = * Solo para consulta
+data.import.note5 = Se han detectado las siguientes columnas en el fichero seleccionado. Si desea que se ignore alguna columna, desmárquela de la lista.
+data.show.title = Consultar datos consolidados
+data.consolide.title = Consultar datos consolidados
+data.consolide.subtitle = Seleccione el conjunto de datos que desea consolidar
+data.consolide.err1 = Se han detectado datos duplicados en el conjunto pendiente de consolidar, por favor, corríjalo antes de consolidar.
+data.consolide.err2 = Se han detectado errores de integridad entre el conjunto seleccionado y los datos ya consolidados, por favor, corríjalos antes de consolidar.
+data.consolide.err3 = No se ha podido ejecutar la acción, compruebe de nuevo la integridad de los datos.
+data.consolide.count = Número de registros pendientes de consolidar para el conjunto seleccionado
+data.consolide.tabdesc = Se muestran los registros para los que se han detectado problemas
+data.consolide.nodata = No hay datos pendientes de consolidar para el conjunto seleccionado
+data.consolide.noerr = No se han detectado errores
+data.consolide.ok = Acción realizada correctamente
+data.consolide.actions.info = Acciones automáticas disponibles
+data.consolide.actions.action1 = Eliminar duplicados
+data.consolide.actions.action2 = Eliminar consolidados
+data.consolide.actions.action3 = Eliminar pendientes
+data.consolide.actions.msg = Número de registros eliminados
+
+data.input.source = Tipo de datos
+data.input.survey = Grupo de datos
+data.input.year = Curso
+data.input.dstyear = Curso a imputar
+data.input.scope = Ámbito
+data.input.scope.t = Titulación
+data.input.scope.c = Centro
+data.input.scope.u = Universidad
+data.input.type = Tipo Titulación
+data.input.type.g = Grado
+data.input.type.m = Máster
+data.input.type.d = Doctorado
+data.input.type.u = Global
+data.input.tit = Titulación
+data.input.cen = Centro
+data.input.file = Seleccione o arrastre aquí el archivo CSV
+data.input.select = Seleccione un conjunto de datos
+data.input.option = Seleccione una opción
+data.input.delim = Delimitador
+data.input.dbsource = DB de origen
+data.input.importType = Tipo de importación
+data.input.importType.file = Fichero CSV
+data.input.importType.db = Base de datos
+data.input.view = Vista/Tabla a importar (nombre_esquema.nombre_vista)
+data.input.key = Clau
+
+data.btn.import = Importar
+data.btn.connect = Comprobar conexión
+data.btn.show = Consultar
+data.btn.delete = Eliminar
+data.btn.query = Consultar
+data.btn.check = Comprobar
+data.btn.run = Ejecutar
+data.table.0 = Curso
+data.table.1 = Titulación
+data.table.2 = Centro
+data.table.3 = Ámbito
+data.table.4 = Tipo
+data.table.5 = Indicador
+data.table.6 = Valor
+data.table.7 = Num enc.
+data.table.8 = Titulacion Orig.
+data.table.9 = Centro Orig.
+data.table.10 = RUCT
+data.table.11 = Usuario
+data.alert.connect = No se ha podido establecer la conexión con la vista indicada

+ 3106 - 0
src/main/resources/static/css/app.css

@@ -0,0 +1,3106 @@
+@font-face {
+	font-family: 'Clear Sans'; /*a name to be used later*/
+	src: url('fonts/ClearSans-Regular.eot');
+	src: url('fonts/ClearSans-Regular.eot?#iefix') format('embedded-opentype'),
+		 url('fonts/ClearSans-Regular.woff') format('woff'),
+		 url('fonts/ClearSans-Regular.ttf') format('truetype'),
+		 url('fonts/ClearSans-Regular.svg#Clear SansRegular') format('svg');
+	font-style: normal;
+}
+
+@font-face {
+	font-family: 'Clear Sans';
+	src: url('fonts/ClearSans-Bold.eot');
+	src: url('fonts/ClearSans-Bold.eot?#iefix') format('embedded-opentype'),
+		url('fonts/ClearSans-Bold.woff') format('woff'),
+		url('fonts/ClearSans-Bold.ttf') format('truetype'),
+		url('fonts/ClearSans-Bold.svg#Clear SansBold') format('svg');
+	font-weight: bold;
+}
+
+body {
+	background-color: #f9f9f9;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+}
+
+
+/*****************************************************************************************/
+/*** COMMON PROPERTIES
+/*****************************************************************************************/
+
+.property-opacityText {
+	-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=25)";
+	filter: alpha(opacity = 25);
+	-moz-opacity: 0.25;
+	-khtml-opacity: 0.25;
+	/*opacity: 0.25;*/
+}
+
+.property-position {
+	top: 0px !important;
+}
+
+.property-titleText {
+	color: #fff;
+	font-size: 20px;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+}
+
+.property-resetStyle {
+	background: none !important;
+	border: none;
+	padding: 0px !important;
+}
+
+.property-defaultText {
+	color: #fff;
+	font-size: 14px;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+}
+
+.property-defaultIcon {
+	color: #303030;
+	font-size: 14px;
+}
+
+.property-iconTabPanel {
+	color: #5f5858;
+	font-size: 18px;
+}
+
+.property-containerTitleStartpage {
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+	color: #a4a4a4;
+	font-size: 20px;
+	margin-left: 30px !important;
+}
+
+.property-center {
+	text-align: center !important;
+}
+
+.property-standardSpaceMenuIcon {
+	top: 25px !important;
+	padding-top: 10px !important;
+}
+
+.property-standardSpaceMenuIcon div {
+	width: 100px !important;
+	height: 50px !important;
+}
+
+.property-footerText {
+	font-size: 12px !important;
+	color: #c7c7c7;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+	line-height: 25px;
+}
+
+.property-footerText a {
+	font-size: 12px !important;
+	color: #fff;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+	line-height: 25px;
+}
+
+.property-fieldMarginRight {
+	margin-right: 10px;
+}
+
+.property-fieldMarginLeft {
+	margin-left: 10px;
+}
+
+.property-fieldMarginRightBetweenDragGrid {
+	margin-right: 5px;
+}
+
+.property-fieldMarginTop {
+	margin-top: 10px;
+}
+
+.property-fieldMarginBottom {
+	margin-bottom: 10px;
+}
+
+.property-fieldMarginTopToolbar {
+	margin-top: 5px !important;
+}
+
+.property-fieldMarginTopToolbarDocked, .property-fieldMarginTopForce {
+	margin-top: 10px !important;
+}
+
+.property-fieldMarginRightToolbar {
+	margin-right: 10px !important;
+}
+
+.property-fieldMarginBottomToolbar {
+	margin-bottom: 10px !important;
+}
+
+.property-fieldMarginBottomLeft {
+	margin: 0px 0px 40px 40px !important;
+}
+
+.property-fieldMarginBottomRight {
+	margin: 0px 40px 40px 0px !important;
+}
+
+.property-forceHeightField, .property-forceHeightField .x-form-trigger-wrap, .property-forceHeightField input {
+	height: 38px !important;
+}
+
+.property-fieldLabelText {
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+	font-size: 12px;
+	text-transform: uppercase;
+	font-weight: bold;
+	color: #b7b7b7;
+}
+
+.property-fieldText, .property-toolbarText {
+	color: #303030;
+	font-size: 14px;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+}
+
+.property-marginFieldsGrid {
+	margin-bottom: 20px !important;
+}
+
+.property-hide {
+	display: none !important;
+}
+
+.property-panelPaddingOnlyFields {
+	padding: 10px 10px 0px 10px !important;
+	border: none !important;
+}
+
+.property-paddingReset {
+	padding: 0px !important;
+}
+
+/*****************************************************************************************/
+/*** NOMENCLATURA PARA CLASES CSS:
+/*****************************************************************************************/
+/*** 	Prefijo siempre visible. Por ejemplo: 'uv'
+/*** 	Componente sobre el que se aplica el estilo. Por ejemplo: 'UserInfoDropdown'
+/*** 	Ubicación del componente en la aplicación. Por ejemplo: 'Header'
+/*** 
+/***	Ejemplo: uvUserInfoDropdownHeader -> Dropdown de la información de usuario 
+/***										 ubicado en el Header de la aplicación
+/*****************************************************************************************/
+
+
+/**********************************/
+/*** RIGHT BUTTON MENU
+/**********************************/
+.x-menu, .x-menu-body {
+	background-image: none !important;
+	background-color: #f9f9f9 !important;
+}
+
+.x-menu-body {
+	padding: 0px !important;
+}
+
+.x-menu-icon-separator, .x-menu-item-separator, .x-menu-body .x-menu-item div {
+	display: none !important;
+}
+
+.x-menu-body {
+	border-color: #534c4c !important;
+}
+
+.x-menu-body .x-menu-item {
+	padding: 0px !important;
+	height: 35px !important;
+	line-height: 35px !important;
+}
+
+.x-menu-body .x-menu-item a {
+	line-height: 35px !important;
+	padding: 0px 9px !important;
+}
+
+.x-menu-body .x-menu-item span {
+	color: #5f5858 !important;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+	font-size: 14px !important;
+}
+
+.x-menu-body .x-menu-item-active {
+	background-image: none !important;
+	background-color: #534c4c !important;
+	border: none !important;
+	border-radius: 0px !important;
+}
+
+.x-menu-body .x-menu-item-active span {
+	color: #fff !important;
+}
+
+.x-menu-body .x-cols-icon {
+	top: 70px !important;
+}
+
+.x-menu-body .x-menu-item .x-menu-item-arrow {
+	width: 5px;
+	height: 8px;
+	top: 13px;
+	right: 10px;
+	background-image: url("../img/arrow_triangle-right.png") !important;
+}
+
+.x-menu-body .x-menu-item-active .x-menu-item-arrow {
+	background-image: url("../img/arrow_triangle-right-over.png") !important;
+}
+
+.x-menu-body .x-menu-item.x-menu-item-unchecked .x-menu-item-icon,
+.x-menu-body .x-menu-item.x-menu-item-unchecked .x-menu-item-icon-right {
+	width: 18px;
+	height: 18px;
+	background: url("../img/icon_check_blank-menu.png");
+	margin-top: 4px;
+	margin-left: 5px;
+}
+
+.x-menu-body .x-menu-item.x-menu-item-checked .x-menu-item-icon,
+.x-menu-body .x-menu-item.x-menu-item-checked .x-menu-item-icon-right {
+	width: 18px;
+	height: 18px;
+	background: url("../img/icon_check-menu.png");
+	margin-top: 4px;
+	margin-left: 5px;
+}
+
+.x-menu-body .x-menu-item.x-menu-item-checked .x-menu-item-text,
+.x-menu-body .x-menu-item.x-menu-item-unchecked .x-menu-item-text {
+	margin-left: 26px;
+}
+
+/*****************************************************************************************/
+/*** APPLICATION HEADER
+/*****************************************************************************************/
+
+/* CORE CLS */
+.uvHeaderView .x-panel-body-default {
+	background-color: #002852;
+	width: 100% !important;
+	height: 85px !important;
+}
+
+.uvHeaderView .x-panel-body-default .x-box-inner {
+	height: 85px !important;
+}
+
+.uvLogoUVHeader {
+	margin: 10px 20px 9px 10px !important;
+	left: 0px !important;
+	cursor: pointer;
+	top: 0px !important;
+}
+
+.uvVerticalRuleHeader {
+	background-color: #fff;
+	margin-top: 13px !important;
+}
+
+.uvTitleHeader {
+	line-height: 36px;
+	vertical-align: middle;
+	margin-top: 10px !important;
+	padding-left: 20px !important;
+}
+
+.uvAdscripHeader {
+	margin-top: 6px !important;
+	margin-right: 10px !important;
+	text-align: right;
+}
+
+.uvLanguageUserHeader {
+	top: 25px !important;
+}
+
+.uvLanguageTrigger {
+	bottom: 0px !important;
+	margin-bottom: 5px !important;
+	margin-right: 10px !important;
+	height: 26px !important;
+	line-height: 26px !important;
+}
+
+.uvLanguageTrigger input {
+	text-align: right !important;
+	cursor: pointer;
+	height: 22px !important;
+}
+
+.uvLanguageTrigger .x-trigger-cell {
+	background-color: transparent;
+	width: 19px !important;
+}
+
+.uvLanguageTriggerHeader {
+	margin-top: 5px !important;
+	height: 19px !important;
+	background: none;
+	line-height: 19px !important;
+	text-align: center;
+	cursor: pointer;
+	color: #fff;
+	font-size: 14px;
+}
+
+.uvVerticalRuleLanguageHeader {
+	background-color: #fff;
+	margin-bottom: 9px !important;
+	margin-top: 5px !important;
+	height: 17px !important;
+}
+
+.uvUserIconHeader {
+	color: #fff;
+	font-size: 16px;
+	margin-bottom: 5px !important;
+	margin-top: 6px !important;
+	padding-left: 15px !important;
+}
+
+.uvUserInfoHeader {
+	height: 19px !important;
+	line-height: 19px !important;
+	top: 3px !important;
+	bottom: 0px !important;
+	margin-bottom: 5px !important;
+	margin-right: 6px !important;
+	padding-left: 10px !important;
+	text-align: left;
+	cursor: pointer;
+}
+
+.uvUserInfoHeader span {
+	height: 19px !important;
+	line-height: 19px !important;
+}
+
+.uvUserInfoArrowHeader {
+	margin-top: 6px !important;
+	margin-left: 10px !important;
+}
+
+.uvUserInfoIcon {
+	float: right;
+	margin-top: 2px !important;
+}
+
+.uvDropdownListHeader, .uvDropdownListHeaderMultiSelect {
+	border: 1px solid #5c7591 !important;
+	border-top: 0px !important;
+}
+
+.uvDropdownListInstantHeader {
+	border: 1px solid #5c7591 !important;
+	background-color: #f9f9f9;
+}
+
+.uvDropdownListHeader li, .uvDropdownListHeaderMultiSelect li, .uvDropdownListInstantHeader li {
+	min-height: 35px;
+	line-height: 35px;
+	padding: 0 9px;
+	background-color: #f9f9f9;
+	border: none;
+}
+
+.uvDropdownListHeaderMultiSelect .x-boundlist-item {
+	background-image: url("../img/icon_check_blank-menu.png") !important;
+	background-size: 18px 18px !important;
+	background-position: 8px 8px;
+	background-repeat: no-repeat;
+	padding-left: 35px !important;
+}
+
+.uvDropdownListHeaderMultiSelect .uvDropdownListHeaderMultiSelect-selected {
+	background-image: url("../img/icon_check-menu.png") !important;
+	background-size: 18px 18px !important;
+	background-position: 8px 8px;
+	background-repeat: no-repeat;
+}
+
+.uvDropdownListHeader li.uvDropdownListHeader-item-over,
+.uvDropdownListHeaderMultiSelect li.uvDropdownListHeaderMultiSelect-item-over, 
+.uvDropdownListInstantHeader li.uvDropdownListInstantHeader-item-over {
+	background-color: #e5e5e5;
+	min-height: 35px;
+	line-height: 35px;
+}
+
+.uvDropdownListHeader-list-ct, .uvDropdownListHeaderMultiSelect-list-ct, .uvDropdownListInstantHeader-list-ct {
+	color: #002852;
+	font-size: 14px;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+}
+
+.uvUserInfoDropdownHeader {
+	background: none !important;
+	border: 1px solid #5c7591 !important;
+	padding: 0px !important;
+	top : 51px !important;
+}
+
+.uvUserInfoDropdownHeader-body {
+	padding: 0px !important;
+}
+
+.uvUserInfoDropdownHeader div {
+	background: none;
+	background-color: #f9f9f9;
+	border: none !important;
+}
+
+.uvUserInfoDropdownHeader .x-menu-item, .uvUserInfoDropdownHeader .x-menu-item a {
+	height: 35px !important;
+	line-height: 35px !important;
+	border-radius: 0px !important;
+	padding: 0px !important;
+}
+
+.uvUserInfoDropdownHeader .x-menu-item a {
+	padding: 0px 9px !important;
+}
+
+.uvUserInfoDropdownHeader .x-menu-item a span {
+	color: #002852;
+	font-size: 14px;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+}
+
+.uvUserInfoDropdownHeader .x-menu-item-active {
+	background-image: none;
+	background-color: #e5e5e5 !important;
+}
+
+.uvUserInfoDropdownHeader .x-menu-item-active span {
+	color: #002852 !important;
+}
+
+.no-icon-menu .x-menu-item-icon {
+	display: none;
+}
+
+/*****************************************************************************************/
+/*** APPLICATION MAINMENU
+/*****************************************************************************************/
+
+/* CORE CLS */
+.uvMainMenu {
+	background-image: none !important;
+	background-color: #cbc0a0 !important;
+	top: 55px !important;
+	height: 30px !important;
+}
+
+.uvMainMenu .x-btn-default-toolbar-small-focus {
+	border-radius: 0px !important;
+	background-image: none !important;
+	background-color: #cbc0a0 !important;
+}
+
+.uvItemMainMenu, .uvItemMainMenu span {
+	padding: 0px !important;
+	border: none !important;
+	line-height: 30px !important;
+	height: 30px !important;
+	padding-right: 5px !important;
+}
+
+
+.uvItemMainMenu .x-btn-button {
+	padding-right: 0px !important;
+}
+
+.uvItemMainMenu .x-btn-inner {
+	line-height: 30px !important;
+	height: 30px !important;
+	padding: 0px 10px !important;
+	color: #303030;
+	font-size: 16px;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+	margin-right: 10px !important;
+}
+
+.uvItemMainMenu .x-btn-wrap {
+	background-image: none !important;
+}
+
+/* IE FIX */
+.uvItemMainMenu td {
+	display: none;
+}
+
+/* IE FIX */
+.uvItemMainMenu .x-btn-mc {
+	display: block;
+}
+
+/* IE FIX */
+.uvItemMainMenu .x-btn-mc span {
+	height: 30px !important;
+	line-height: 30px !important;
+}
+
+/* IE FIX */
+.uvItemMainMenu .x-btn-default-toolbar-small-focus-mc,
+.uvItemMainMenu .x-btn-default-toolbar-small-menu-active-mc {
+	background-image: none !important;
+	background-color: #e6e3d2 !important; 
+}
+
+.uvItemMainMenu:hover {
+	background-image: none !important;
+	background-color: #d5cdad !important;
+	border-radius: 0px !important;
+}
+
+.uvItemMainMenu.x-btn-default-toolbar-small-menu-active, 
+.uvItemMainMenu.x-btn-default-toolbar-small-pressed {
+	background-image: none !important;
+	background-color: #e6e3d2 !important;
+	border-radius: 0px !important;
+}
+
+.uvDropdownSubItemMainMenu {
+	background: none !important;
+	border: none;
+	padding: 0px !important;
+}
+
+.uvDropdownSubItemMainMenu-body {
+	padding: 0px !important;
+}
+
+.uvDropdownSubItemMainMenu div {
+	background: none;
+	background-color: #e6e3d2;
+	border: none !important;
+}
+
+.uvDropdownSubItemMainMenu .x-menu-item, .uvDropdownSubItemMainMenu .x-menu-item a {
+	height: 35px !important;
+	line-height: 35px !important;
+	border-radius: 0px !important;
+	padding: 0px !important;
+}
+
+.uvDropdownSubItemMainMenu .x-menu-item a {
+	padding: 0px 9px !important;
+}
+
+.uvDropdownSubItemMainMenu .x-menu-item a span {
+	color: #303030;
+	font-size: 14px;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+}
+
+.uvDropdownSubItemMainMenu .x-menu-item-active {
+	background-image: none;
+	background-color: #d5cdad !important;
+}
+
+.uvDropdownSubItemMainMenu .x-menu-item-active span {
+	color: #303030 !important;
+}
+
+.uvDropdownSubItemMainMenu .x-menu-body .x-menu-item-active .x-menu-item-arrow {
+	background-image: url("../img/arrow_triangle-right.png") !important;
+}
+
+.uvDropdownSubSubItemMainMenu {
+	background: none;
+	background-color: #e6e3d2;
+	border: none !important;
+}
+
+.uvDropdownSubSubItemMainMenu a {
+	height: 35px !important;
+	line-height: 35px !important;
+	border-radius: 0px !important;
+	padding: 0px 9px !important;
+}
+
+.uvDropdownSubSubItemMainMenu a span {
+	color: #303030;
+	font-size: 14px;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+}
+
+.uvDropdownSubSubItemMainMenu.x-menu-item-active {
+	background-image: none;
+	background-color: #d5cdad !important;
+}
+
+.uvDropdownSubSubItemMainMenu.x-menu-item-active span {
+	color: #303030 !important;
+}
+
+.x-ie-shadow {
+	display: none !important;
+}
+
+
+/*****************************************************************************************/
+/*** APPLICATION TABPANEL (GLOBAL)
+/*****************************************************************************************/
+
+.uvTabPanel {
+	background-color: #efefef !important;
+}
+
+.uvTabPanel .x-tab-bar {
+	background: none !important;
+	border: none !important;
+	height: 25px !important;
+}
+
+.uvTabPanel .x-tab-bar-strip, .uvTabPanelBig .x-tab-bar-strip {
+	display: none;
+}
+
+.uvTabPanel .x-tab-bar-body, .uvTabPanel .x-tab-bar-body .x-box-inner,
+.uvTabPanelBig .x-tab-bar-body, .uvTabPanelBig .x-tab-bar-body .x-box-inner {
+	padding: 0px !important;
+	height: inherit !important;
+}
+
+/* IE FIX */
+.uvTabPanel .x-tab-bar .x-frame-ml, .uvTabPanel .x-tab-bar .x-frame-mr,
+.uvTabPanel .x-tab-bar .x-frame-tc, .uvTabPanel .x-tab-bar .x-frame-tl,
+.uvTabPanel .x-tab-bar .x-frame-tr, 
+.uvTabPanelBig .x-tab-bar .x-frame-ml, .uvTabPanelBig .x-tab-bar .x-frame-mr,
+.uvTabPanelBig .x-tab-bar .x-frame-tc, .uvTabPanelBig .x-tab-bar .x-frame-tl,
+.uvTabPanelBig .x-tab-bar .x-frame-tr {
+	display: none;
+}
+
+*/
+/* IE FIX */
+.uvTabPanel .x-tab-default-mc, .uvTabPanelBig .x-tab-default-mc {
+	padding: 0px !important;
+}
+
+/* IE FIX */
+.uvTabPanel .x-tab-default-top {
+	padding: 5px 10px 4px 10px !important;
+}
+
+.uvTabPanel .x-tab-default, .uvTabPanelBig .x-tab-default {
+	height: 25px !important;
+	border-radius: 0px !important;
+	background: none !important;
+	background-color: #e5e5e5 !important;
+	border: none !important;
+	-webkit-box-shadow: none;
+	-moz-box-shadow: none;
+	box-shadow: none;
+}
+
+.uvTabPanel .x-tab-default .x-tab-wrap, .uvTabPanel .x-tab-default .x-frame-mc,
+.uvTabPanelBig .x-tab-default .x-tab-wrap, .uvTabPanelBig .x-tab-default .x-frame-mc {
+	background-image: none !important;
+	background: none !important;
+	background-color: #e5e5e5 !important;
+}
+
+.uvTabPanel .x-tab-default:hover, 
+.uvTabPanel .x-tab-default:hover .x-tab-wrap, .uvTabPanel .x-tab-default:hover .x-frame-mc,
+.uvTabPanelBig .x-tab-default:hover, 
+.uvTabPanelBig .x-tab-default:hover .x-tab-wrap, .uvTabPanelBig .x-tab-default:hover .x-frame-mc {
+	background-image: none !important;
+	background: none !important;
+	background-color: #efefef !important;
+}
+
+.uvTabPanel .x-tab-default:active, .uvTabPanel .x-tab-default-active,
+.uvTabPanel .x-tab-default:active .x-tab-wrap, .uvTabPanel .x-tab-default-active .x-tab-wrap, .uvTabPanel .x-tab-default-top-active .x-frame-mc, .uvTabPanel .x-tab-default:active .x-frame-mc {
+	background-image: none !important;
+	background: none !important;
+	background-color: #f9f9f9 !important;
+}
+
+.uvTabPanel .x-tab-default .x-tab-inner, .uvTabPanelBig .x-tab-default .x-tab-inner {
+	color: #5f5858;
+	font-size: 14px;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+	font-weight: normal;
+}
+
+.uvTabPanel span {
+	height: 100% !important;
+}
+
+.uvTabPanel .x-tab-default.x-item-disabled .x-tab-inner, .uvTabPanelBig .x-tab-default.x-item-disabled .x-tab-inner {
+	color: #b7b7b7 !important;
+}
+
+.uvTabPanel a {
+	padding: 5px 10px 4px 10px !important;
+}
+
+.uvTabPanel .x-tab-after-title, .uvTabPanelBig .x-tab-after-title {
+	padding: 5px 40px 4px 10px !important;
+}
+
+.uvTabPanel .x-tab-default .x-tab-close-btn, .uvTabPanelBig .x-tab-default .x-tab-close-btn {
+	width: 17px !important;
+	height: 17px !important;
+	filter: none;
+	background-image: url("../img/icon_close.png") !important;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(  src='../img/icon_close.png', sizingMethod='scale' );
+	-ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader( src='../img/icon_close.png', sizingMethod='scale')";
+	background-size: 7px 7px;
+	background-repeat: no-repeat;
+	top: 4px;
+	right: 10px;
+	opacity: 1;
+	background-position: 10px 5px !important;
+}
+
+.uvTabPanel .x-tab-default .x-tab-close-btn:hover, .uvTabPanelBig .x-tab-default .x-tab-close-btn:hover {
+	background-image: url("../img/icon_close_over.png") !important;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader( src='../img/icon_close_over.png', sizingMethod='scale');
+	-ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader( src='../img/icon_close_over.png', sizingMethod='scale')";
+	opacity: 1;
+}
+
+.uvTabPanel .x-tabbar-scroll-left, .uvTabPanelBig .x-tabbar-scroll-left {
+	background-image: url("../img/arrow_carrot-left.png") !important;
+	background-position: 5px 6px;
+	background-color: #e5e5e5 !important;
+	height: 25px;
+	border-radius: 0px;
+	border-right: 1px solid #f9f9f9;
+}
+
+.uvTabPanel .x-tabbar-scroll-right, .uvTabPanelBig .x-tabbar-scroll-right {
+	background-image: url("../img/arrow_carrot-right.png") !important;
+	background-position: 6px 6px;
+	background-color: #e5e5e5 !important;
+	height: 25px;
+	border-radius: 0px;
+	border-left: 1px solid #f9f9f9;
+}
+
+.uvTabPanel .x-tabbar-scroll-left:hover, .uvTabPanelBig .x-tabbar-scroll-left:hover {
+	background-image: url("../img/arrow_carrot-left-over.png") !important;
+}
+
+.uvTabPanel .x-tabbar-scroll-right:hover, .uvTabPanelBig .x-tabbar-scroll-right:hover {
+	background-image: url("../img/arrow_carrot-right-over.png") !important;
+}
+
+.uvTabPanel .x-tabbar-scroll-left:active, .uvTabPanelBig .x-tabbar-scroll-left:active {
+	background-image: url("../img/arrow_carrot-left.png") !important;
+}
+
+.uvTabPanel .x-tabbar-scroll-right:active, .uvTabPanelBig .x-tabbar-scroll-right:active {
+	background-image: url("../img/arrow_carrot-right.png") !important;
+}
+
+
+/*****************************************************************************************/
+/*** APPLICATION TABPANEL (TABPANELBIG)
+/*****************************************************************************************/
+.uvTabPanelBig {
+	background-color: #e5e5e5 !important;
+}
+
+.uvTabPanelBig .x-tab-bar {
+	background: none !important;
+	border: none !important;
+	height: 50px !important;
+	line-height: 50px !important;
+}
+
+/* IE FIX */
+.uvTabPanelBig .x-tab-default-top {
+	padding: 8px 10px !important;
+}
+
+.uvTabPanelBig .x-tab-default {
+	height: 50px !important;
+}
+
+.uvTabPanelBig .x-tab-default .x-tab-inner {
+	font-size: 12px;
+	padding: 0px !important;
+	padding-top: 24px !important;
+}
+
+.uvTabPanelBig a {
+	padding: 0px 10px !important;
+}
+
+.uvTabPanelBig a .x-tab-icon-el {
+	color: #5f5858 !important;
+	font-size: 18px;
+	height:18px !important;
+	line-height: 18px !important;
+	text-align: center;
+	filter:none !important;
+	width: 100% !important;
+	margin-left: 3px;
+}
+
+.uvTabPanelBig a.x-item-disabled .x-tab-icon-el {
+	color: #b7b7b7 !important;
+}
+
+.uvTabPanelBig span {
+	height: inherit !important;
+}
+
+.uvTabPanelBig .x-tab-default:active, .uvTabPanelBig .x-tab-default-active,
+.uvTabPanelBig .x-tab-default:active .x-tab-wrap, .uvTabPanelBig .x-tab-default-active .x-tab-wrap, .uvTabPanelBig .x-tab-default-top-active .x-frame-mc, .uvTabPanelBig .x-tab-default:active .x-frame-mc {
+	background-image: none !important;
+	background: none !important;
+	background-color: #fff !important;
+}
+
+.uvTabPanelBig .x-tab-default.x-tab-disabled:hover, 
+.uvTabPanelBig .x-tab-default.x-tab-disabled:hover .x-tab-wrap, .uvTabPanelBig .x-tab-default.x-tab-disabled:hover .x-frame-mc {
+	background-image: none !important;
+	background: none !important;
+	background-color: #e5e5e5 !important;
+}
+
+.uvTabPanelBig .x-tabbar-scroll-left {
+	background-position: 5px 19px;
+	height: 50px;
+}
+
+.uvTabPanelBig .x-tabbar-scroll-right {
+	background-position: 6px 19px;
+	height: 50px;
+}
+
+.uvTabPanelBig .uvPagingToolbar {
+	background-color: #fff !important;
+	border: none !important;
+}
+
+.uvTabPanelBig .uvPagingToolbar .uvPaginationButton {
+	background-color: #fff !important;
+}
+
+/*****************************************************************************************/
+/*** APPLICATION CONTENT CONTAINER (STARTPAGE)
+/*****************************************************************************************/
+
+.uvTabPanelBody {
+	top: 25px !important;
+	border: none !important;
+	background-color: #f9f9f9 !important;
+}
+
+/*****************************************************************************************/
+/*** APPLICATION TABPANEL CONTENT (TABPANELBIG)
+/*****************************************************************************************/
+
+.uvTabPanelBodyBig {
+	top: 50px !important;
+	border: none !important;
+	background-color: #f9f9f9 !important;
+}
+
+.uvTabPanelBodyBig .x-panel-body {
+	border-top: none !important;
+}
+
+.uvTabPanelBodyBig .uvGrid {
+	border: none !important;
+}
+
+.uvTabPanelBodyBig .uvFilterForm {
+	padding: 0px 0px !important;
+	margin-bottom: 10px;
+}
+
+.uvTabPanelBodyBig .uvFilterForm .x-panel-body-default {
+	background-color: #fff !important;
+}
+
+.uvTabPanelBodyBig .uvFilterForm .x-panel-header {
+	background-color: #fff !important;
+}
+
+.uvTabPanelBodyBig .uvFilterForm .x-panel-header > .x-panel-body-default {
+	background-color: #fff !important;
+	padding-bottom: 0px !important;
+}
+
+
+/*****************************************************************************************/
+/*** APPLICATION CONTENT (STARTPAGE)
+/*****************************************************************************************/
+
+.uvContainerStartpage {
+	background-color: #f9f9f9 !important;
+	margin: 25px 0px 0px 0px;
+}
+
+.uvContainerMenuIconStartpage {
+	background-color: #f9f9f9 !important;
+	margin: 0px !important;
+	padding: 0px !important;
+}
+
+.uvContainerMenuIconStartpage a {
+	margin: 0px !important;
+	padding: 0px !important;
+}
+
+.uvContainerMenuIconStartpage .x-mask {
+	background: none !important;
+}
+
+.uvContainerMenuIconStartpage .x-item-disabled a, .uvContainerMenuIconStartpage .x-item-disabled div {
+	color: #e5e5e5 !important;
+}
+
+.uvContainerMenuIconSectionStartpage {
+	background-color: #f9f9f9 !important;
+	margin: 0px !important;
+	padding: 0px !important;
+	border-top: none;
+}
+
+.uvTitleSectionStartpage {
+	float: left;
+}
+
+.uvHorizontalStrongRuleStartpage {
+	width: 100%;
+	display: block;
+	background-color: #e5e5e5 !important;
+	height: 2px;
+	margin-top: 20px;
+	margin-left: 5px;
+}
+
+.uvHorizontalStrongRightRuleStartpage {
+	width: 90% !important;
+}
+
+.uvMenuIconStartpage {
+	margin: 30px 10px 20px 0px !important;
+	cursor: pointer;
+}
+
+.uvMenuIconStartpage a, .uvMenuIconStartpage div {
+	color: #5c7591;
+}
+
+.uvMenuIconStartpage:hover a, .uvMenuIconStartpage:hover div {
+	color: #335375;
+}
+
+.uvMenuIconStartpage:active a, .uvMenuIconStartpage:active div {
+	color: #002852;
+}
+
+.uvMenuIconIconStartpage {
+	font-size: 24px;
+	text-align: center;
+	background: none;
+	background-color: #f9f9f9 !important;
+	padding-top: 1px !important;
+}
+
+.uvMenuIconButtonStartpage {
+	background: none !important;
+	border: none !important;
+	text-align:center !important;
+	font-size: 14px !important;
+}
+
+.uvMenuIconButtonStartpage:hover {
+	cursor: pointer;
+}
+
+
+/*****************************************************************************************/
+/*** APPLICATION FOOTER
+/*****************************************************************************************/
+
+.uvFooterView, .uvFooterView div, .uvFooterView label {
+	height: 25px !important;
+	background-color: #303030 !important;
+	background-image: none !important;
+}
+
+.uvFooterText {
+	padding-left: 10px !important;
+}
+
+.uvFooterVersion {
+	font-size: 12px !important;
+	color: #fff;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+	line-height: 25px;
+	height: 25px !important;
+	background-color: #303030 !important;
+	background-image: none !important;
+	padding-right: 10px !important;
+	cursor: pointer;
+	text-align: right;
+}
+
+
+/*****************************************************************************************/
+/*** APPLICATION PAGE
+/*****************************************************************************************/
+
+.uvContainerPage {
+	background-color: #f9f9f9 !important;
+	padding: 10px;
+	border-bottom: none !important;
+}
+
+/* General Button Toolbar at Bottom of PAGE */
+.uvDockedToolbar {
+	background-image: none !important;
+	background-color: #f9f9f9 !important;
+	border: none !important;
+	padding: 0px !important;
+	height: 48px !important;
+	line-height: 48px !important;
+}
+
+.uvDockedToolbar .x-box-inner {
+	background-image: none !important;
+	background-color: #f9f9f9 !important;
+}
+
+.uvDockedToolbar a {
+	top: 0px !important;
+	padding-top: 0px !important;
+	padding-bottom: 0px !important;
+}
+
+
+/*****************************************************************************************/
+/*** TAB PAGE
+/*****************************************************************************************/
+
+.uvTabPage {
+	background-color: #fff !important;
+	padding: 10px;
+	border: none !important;
+	height: inherit !important;
+}
+
+
+/*****************************************************************************************/
+/*** APPLICATION COMPONENTS
+/*****************************************************************************************/
+
+
+/**********************************/
+/*** FILTER FORM
+/**********************************/
+.uvFilterForm {
+	padding: 0px 10px !important;
+	margin-bottom: 10px;
+}
+
+.uvFilterForm .x-panel-body-default {
+	background-color: #f9f9f9 !important;
+	border: none !important;
+}
+
+.uvFilterForm .x-panel-header {
+	background-color: #f9f9f9 !important;
+	background-image: none !important;
+	padding: 0px !important;
+	margin: 0px !important;
+	border: none !important;
+	box-shadow: none;
+}
+
+.uvFilterForm .x-panel-header > .x-panel-body-default {
+	background-color: #f9f9f9 !important;
+	border: none !important;
+	padding-top: 15px !important;
+	padding-bottom: 9px !important;
+}
+
+/* Filter form only with form */
+.uvFilterFormOnlyForm .x-panel-header > .x-panel-body-default {
+	padding-bottom: 0px !important;
+}
+
+/* IE FIX */
+.uvFilterForm .x-box-target {
+	width: 100% !important;
+}
+
+.uvTitleFilterForm {
+	font-size: 14px !important;
+	color: #a4a4a4;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+	float: left;
+	height: 20px !important;
+}
+
+.uvHorizontalLightRule {
+	width: 100%;
+	display: block;
+	background-color: #e5e5e5 !important;
+	height: 1px;
+	margin-top: 14px;
+	margin-left: 5px;
+	float: right;
+}
+
+.uvFilterForm .x-tool-collapse-top {
+	background: none;
+	background-image: url("../img/arrow_carrot-up.png") !important;
+	background-repeat: no-repeat;
+	width: 12px;
+	height: 7px;
+}
+
+.uvFilterForm .x-tool-expand-bottom {
+	background: none;
+	background-image: url("../img/arrow_carrot-down.png") !important;
+	background-repeat: no-repeat;
+	width: 12px;
+	height: 7px;
+}
+
+.uvFilterForm .x-toolbar-default {
+	background: none !important;
+	border: none !important;
+}
+
+/* FIX PADDING GLOBAL */
+.uvFilterForm .x-toolbar-default a {
+	padding-top: 0px !important;
+	padding-bottom: 0px !important;
+}
+
+
+/**********************************/
+/*** TEXTFIELD, COMBOBOX, DATEFIELD, INSTANT, TEXTFIELDEXTEND (GLOBAL)
+/**********************************/
+.uvTextField.x-item-disabled .uvFieldTextField,
+.uvComboField.x-item-disabled .uvFieldComboField,
+.uvDateField.x-item-disabled .uvFieldDateField,
+.uvInstantField.x-item-disabled .uvFieldInstantField,
+.uvTextAreaField.x-item-disabled .uvFieldTextAreaField {
+	border: none !important;
+	background-color: #f9f9f9 !important;
+}
+
+.uvFieldTextField,
+.uvFieldComboField,
+.uvFieldDateField,
+.uvFieldInstantField {
+	background-image: none !important;
+	background-color: #fff !important;
+	border: 1px solid #e5e5e5;
+	padding: 19px 10px 5px 10px;
+	height: 38px;
+}
+
+.uvFieldComboField {
+	padding: 19px 34px 5px 10px !important;
+}
+
+.uvFieldTextField:focus, 
+.uvFieldComboFieldFocus, 
+.uvFieldDateFieldFocus, 
+.uvFieldInstantFieldFocus,
+.uvFieldTextAreaField:focus {
+	border: 1px solid #5c7591;
+}
+
+.uvFieldTextField.x-form-invalid-field,
+.uvFieldComboField.x-form-invalid-field,
+.uvFieldDateField.x-form-invalid-field,
+.uvFieldInstantField.x-form-invalid-field,
+.uvFieldTextAreaField.x-form-invalid-field {
+	border: 1px solid #e75d66 !important;
+}
+
+.uvLabelTextField,
+.uvLabelComboField,
+.uvLabelDateField,
+.uvLabelInstantField {
+	position: absolute;
+	z-index: 100;
+	padding: 1px 10px 0px 10px;
+}
+
+.uvLabelTextFieldFocus,
+.uvLabelComboFieldFocus,
+.uvLabelDateFieldFocus,
+.uvLabelInstantFieldFocus,
+.uvLabelTextAreaFieldFocus {
+	color: #5c7591;
+}
+
+
+/**********************************/
+/*** COMBOBOX, DATEFIELD (SPECIFIC)
+/**********************************/
+.uvComboField .x-trigger-cell,
+.uvDateField .x-trigger-cell {
+	width: 9px !important;
+	position: absolute;
+	right: 17px;
+	background: none !important;
+	height: 38px !important;
+}
+
+.uvComboTrigger,
+.uvDateTrigger {
+	height: 38px !important;
+	background: none;
+	line-height: 38px !important;
+	text-align: center;
+	cursor: pointer;
+	color: #b7b7b7;
+	font-size: 14px;
+}
+
+.uvComboField.x-item-disabled .x-trigger-cell,
+.uvDateField.x-item-disabled .x-trigger-cell {
+	display: none;
+}
+
+
+/**********************************/
+/*** TEXTFIELDEXTEND (SPECIFIC)
+/**********************************/
+.uvTextFieldExtend {
+	height: 38px !important;
+	background: none;
+	line-height: 38px !important;
+	text-align: center;
+	cursor: pointer;
+	color: #b7b7b7;
+	font-size: 14px;
+	position: absolute !important;
+}
+
+/**********************************/
+/*** TEXTAREAEXTEND (SPECIFIC)
+/**********************************/
+.uvTextAreaExtend .x-trigger-cell {
+	width: 9px !important;
+	position: absolute;
+	right: 22px;
+	background: none !important;
+	height: 38px !important;
+}
+
+.uvTextFieldExtendTrigger {
+	height: 38px !important;
+	background: none;
+	line-height: 38px !important;
+	text-align: center;
+	cursor: pointer;
+	color: #b7b7b7;
+	font-size: 14px;
+	right: 10px;
+	position: absolute !important;
+}
+
+/**********************************/
+/*** INSTANT (SPECIFIC)
+/**********************************/
+.uvFieldInstantField {
+	background-image: url("../img/icon_pencil.png") !important;
+	background-repeat: no-repeat !important;
+	background-position: 8px 12px !important;
+	padding: 19px 10px 5px 30px !important;
+}
+
+.uvLabelInstantField {
+	padding: 1px 10px 0px 30px !important;
+}
+
+.uvInstantField.x-item-disabled .uvFieldInstantField {
+	background-image: none !important;
+	padding: 19px 10px 5px 10px !important;
+}
+
+.uvInstantField.x-item-disabled .uvLabelInstantField {
+	padding: 1px 10px 0px 10px !important;
+}
+
+
+/**********************************/
+/*** TEXTAREA (SPECIFIC)
+/**********************************/
+.uvTextAreaField textarea {
+	height: 100% !important;
+}
+
+.uvTextAreaField .x-form-item-body {
+	position: absolute !important;
+	padding: 0px !important;
+	margin: 0px !important;
+	height: 100% !important;
+}
+
+.uvTextAreaField {
+	padding : 0px !important;
+}
+
+.uvFieldTextAreaField {
+	background-image: none !important;
+	background-color: #fff !important;
+	border: 1px solid #e5e5e5;
+	padding: 19px 10px 5px 10px;
+	text-align: justify !important;
+}
+
+.uvLabelTextAreaField {
+	position: absolute;
+	z-index: 100;
+	background-color: #fff;
+	margin: 1px 0px 0px 1px !important;
+	padding: 0px 10px 0px 9px;
+}
+
+.uvLabelTextAreaFieldFirefox {
+	position: absolute;
+	z-index: 100;
+	background-color: #fff;
+	margin: 2px 0px 0px 1px !important;
+	padding: 0px 10px 0px 9px;
+}
+
+.uvTextAreaField.x-item-disabled .uvLabelTextAreaField {
+	background-color: #f9f9f9 !important
+}
+
+
+/**********************************/
+/*** FILE (SPECIFIC)
+/**********************************/
+.uvIconFile {
+	position: absolute !important;
+	top: 0px !important;
+	left: 0px !important;
+	margin-top: 12px !important;
+}
+
+.uvFileField td + td {
+	width: 9px !important;
+	position: absolute;
+	right: 17px;
+	background: none !important;
+	height: 38px !important;
+}
+
+.uvFileTrigger {
+	width: 14px !important;
+	height: 38px !important;
+	background: none;
+	line-height: 38px !important;
+	text-align: center;
+	cursor: pointer;
+	color: #b7b7b7;
+	font-size: 14px;
+	position: absolute !important;
+	top: 0px !important;
+	left: 0px !important;
+}
+
+.uvFileField td + td input {
+	cursor: pointer !important;
+	z-index: 0 !important;
+}
+
+.uvFileTrigger-over {
+	cursor: pointer !important;
+}
+
+.uvFileTrigger input {
+	width: 100% !important;
+	height: 38px !important;
+	top: 0px !important;
+	right: 0px !important;
+}
+
+/**********************************/
+/*** BUTTON (GLOBAL)
+/**********************************/
+/* IE FIX */
+.uvButtonPrimary .x-btn-tl, .uvButtonPrimary .x-btn-tc, .uvButtonPrimary .x-btn-tr, .uvButtonPrimary .x-btn-ml,
+.uvButtonPrimary .x-btn-mr, .uvButtonPrimary .x-btn-bl, .uvButtonPrimary .x-btn-bc, .uvButtonPrimary .x-btn-br,
+.uvButtonSecondary .x-btn-tl, .uvButtonSecondary .x-btn-tc, .uvButtonSecondary .x-btn-tr, .uvButtonSecondary .x-btn-ml,
+.uvButtonSecondary .x-btn-mr, .uvButtonSecondary .x-btn-bl, .uvButtonSecondary .x-btn-bc, .uvButtonSecondary .x-btn-br,
+.uvButtonTiny .x-btn-tl, .uvButtonTiny .x-btn-tc, .uvButtonTiny .x-btn-tr, .uvButtonTiny .x-btn-ml,
+.uvButtonTiny .x-btn-mr, .uvButtonTiny .x-btn-bl, .uvButtonTiny .x-btn-bc, .uvButtonTiny .x-btn-br,
+.uvButtonToolbar .x-btn-tl, .uvButtonToolbar .x-btn-tc, .uvButtonToolbar .x-btn-tr, .uvButtonToolbar .x-btn-ml,
+.uvButtonToolbar .x-btn-mr, .uvButtonToolbar .x-btn-bl, .uvButtonToolbar .x-btn-bc, .uvButtonToolbar .x-btn-br,
+.x-datepicker-footer a .x-btn-tl, .x-datepicker-footer a .x-btn-tc, .x-datepicker-footer a .x-btn-tr, .x-datepicker-footer a .x-btn-ml,
+.x-datepicker-footer a .x-btn-mr, .x-datepicker-footer a .x-btn-bl, .x-datepicker-footer a .x-btn-bc, .x-datepicker-footer a .x-btn-br,
+.x-monthpicker-buttons a .x-btn-tl, .x-monthpicker-buttons a .x-btn-tc, .x-monthpicker-buttons a .x-btn-tr, .x-monthpicker-buttons a .x-btn-ml,
+.x-monthpicker-buttons a .x-btn-mr, .x-monthpicker-buttons a .x-btn-bl, .x-monthpicker-buttons a .x-btn-bc, .x-monthpicker-buttons a .x-btn-br {
+	display: none;
+}
+
+.uvButtonPrimary .x-btn-mc, .uvButtonSecondary .x-btn-mc, .uvButtonTiny .x-btn-mc, .uvButtonToolbar .x-btn-mc, .x-datepicker-footer a .x-btn-mc, .x-monthpicker-buttons a .x-btn-mc {
+	background: none !important;
+	border: none !important;
+}
+
+.uvButtonPrimary .x-btn-mc, .uvButtonSecondary .x-btn-mc, .uvButtonTiny .x-btn-mc, .uvButtonToolbar .x-btn-wrap, .x-datepicker-footer a .x-btn-mc, .x-monthpicker-buttons a .x-btn-mc, a.uvButtonSecondary {
+	padding: 0px 10px !important;
+}
+
+.uvButtonPrimary .x-btn-inner, .uvButtonSecondary .x-btn-inner, .uvButtonTiny .x-btn-inner, .uvButtonToolbar .x-btn-inner, .x-datepicker-footer a .x-btn-inner, .x-monthpicker-buttons a .x-btn-inner {
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+}
+
+.uvButtonPrimary span, .uvButtonSecondary span {
+	font-size: 14px !important;
+	height: 28px !important;
+	line-height: 28px !important;
+}
+
+.uvButtonPrimary, .uvButtonPrimary.x-btn-default-toolbar-small,
+.uvButtonSecondary, .uvButtonSecondary.x-btn-default-toolbar-small {
+	height: 28px !important;
+	background-image: none !important;
+	border-top-width: 1px !important;
+	border-bottom-width: 1px !important;
+	border-left-width: 1px !important;
+	border-right-width: 1px !important;
+	-moz-border-radius: 3px !important;
+	-webkit-border-radius: 3px !important;
+	border-radius: 3px !important;
+}
+
+.uvButtonPrimary.x-item-disabled, .uvButtonSecondary.x-item-disabled,
+.uvButtonPrimary.x-item-disabled:hover, .uvButtonSecondary.x-item-disabled:hover,
+.uvButtonTiny.x-item-disabled, .uvButtonTiny.x-item-disabled:hover,
+.uvButtonToolbar.x-item-disabled, .uvButtonToolbar.x-item-disabled:hover,
+.x-datepicker-footer a.x-item-disabled, .x-datepicker-footer a.x-item-disabled:hover,
+.x-monthpicker-buttons a.x-item-disabled, .x-monthpicker-buttons a.x-item-disabled:hover {
+	background-color: #e5e5e5 !important;
+	border: 1px solid #e5e5e5 !important;
+}
+
+.uvButtonPrimary.x-item-disabled span, .uvButtonSecondary.x-item-disabled span, .uvButtonTiny.x-item-disabled span, .uvButtonToolbar.x-item-disabled span, .x-datepicker-footer a.x-item-disabled span, .x-monthpicker-buttons a.x-item-disabled span {
+	color: #ccc !important;
+}
+
+/**********************************/
+/*** TINY BUTTON (TOOLBAR, TINY, DATEPICKER, MONTHPICKER)
+/**********************************/
+.uvButtonToolbar span, .uvButtonTiny span, .x-datepicker-footer a span, .x-monthpicker-buttons a span {
+	font-size: 14px !important;
+	height: 22px !important;
+	line-height: 22px !important;
+}
+
+.uvButtonToolbar, .uvButtonToolbar.x-btn-default-toolbar-small, .uvButtonTiny, .uvButtonTiny.x-btn-default-toolbar-small, .x-datepicker-footer a, .x-datepicker-footer a.x-btn-default-toolbar-small,
+.x-monthpicker-buttons a, .x-monthpicker-buttons a.x-btn-default-toolbar-small, .x-monthpicker-buttons .x-btn-default-small, .x-datepicker-footer .x-btn-default-small {
+	height: 24px !important;
+	background-image: none !important;
+	border-top-width: 1px !important;
+	border-bottom-width: 1px !important;
+	border-left-width: 1px !important;
+	border-right-width: 1px !important;
+	-moz-border-radius: 3px !important;
+	-webkit-border-radius: 3px !important;
+	border-radius: 3px !important;
+}
+
+.uvButtonTiny a.x-btn-default-small, .x-datepicker-footer a.x-btn-default-small, .x-monthpicker-buttons a.x-btn-default-small {
+	padding: 0px !important;
+	margin-bottom: 2px !important;
+}
+
+a.uvButtonTiny {
+	padding: 0px 10px !important;
+}
+
+/**********************************/
+/*** BUTTON (PRIMARY, DATEPICKER)
+/**********************************/
+
+.uvButtonPrimary span, .x-datepicker-footer a span, .x-monthpicker-buttons a span {
+	color: #fff !important;
+}
+
+.uvButtonPrimary, .x-datepicker-footer a, .x-monthpicker-buttons a {
+	background-color: #5c7591 !important;
+	border: 1px solid #5c7591 !important;
+}
+
+.uvButtonPrimary:hover, .x-datepicker-footer a:hover, .x-monthpicker-buttons a:hover {
+	background-image: none !important;
+	background-color: #335375 !important;
+	border: 1px solid #335375 !important;
+}
+
+.uvButtonPrimary:focus, .x-datepicker-footer a:focus, .x-monthpicker-buttons a:focus {
+	background-image: none !important;
+	border: 1px solid #002852 !important;
+	background-color: #5c7591 !important;
+}
+
+.uvButtonPrimary:active, .x-datepicker-footer a:active, .x-monthpicker-buttons a:active {
+	background-image: none !important;
+	background-color: #002852 !important;
+	border: 1px solid #002852 !important;
+}
+
+/**********************************/
+/*** BUTTON (SECONDARY)
+/**********************************/
+.uvButtonSecondary span, .x-monthpicker-buttons a + a span {
+	color: #5f5858 !important;
+}
+
+.uvButtonSecondary, .x-monthpicker-buttons a + a {
+	background-color: #cbc0a0 !important;
+	border: 1px solid #cbc0a0 !important;
+}
+
+.uvButtonSecondary:hover, .x-monthpicker-buttons a + a:hover {
+	background-image: none !important;
+	background-color: #d5cdad !important;
+	border: 1px solid #d5cdad !important;
+}
+
+.uvButtonSecondary:focus, .x-monthpicker-buttons a + a:focus {
+	background-image: none !important;
+	border: 1px solid #002852 !important;
+	background-color: #cbc0a0 !important;
+}
+
+.uvButtonSecondary:active, .x-monthpicker-buttons a + a:active {
+	background-image: none !important;
+	background-color: #e6e3d2 !important;
+	border: 1px solid #e6e3d2 !important;
+}
+
+/**********************************/
+/*** BUTTON (TOOLBAR, TINY)
+/**********************************/
+.uvButtonToolbar span, .uvButtonTiny span {
+	color: #fff !important;
+}
+
+.uvButtonToolbar, .uvButtonTiny {
+	background-color: #5f5858 !important;
+	border: 1px solid #5f5858 !important;
+}
+
+.uvButtonToolbar:hover, .uvButtonTiny:hover {
+	background-image: none !important;
+	background-color: #534c4c !important;
+	border: 1px solid #534c4c !important;
+}
+
+.uvButtonToolbar:focus, .uvButtonTiny:focus {
+	background-image: none !important;
+	border: 1px solid #002852 !important;
+	background-color: #5f5858 !important;
+}
+
+.uvButtonToolbar:active, .uvButtonTiny:active {
+	background-image: none !important;
+	background-color: #474041 !important;
+	border: 1px solid #474041 !important;
+}
+
+
+/**********************************/
+/*** DATEPICKER
+/**********************************/
+.x-datepicker {
+	border: 1px solid #5c7591 !important;
+	border-top: none !important;
+	width: 230px !important;
+}
+
+.x-datepicker-header {
+	background-image: none !important;
+	background-color: #5c7591 !important;
+	height: 40px !important;
+	line-height: 40px !important;
+	padding: 0px !important;
+	/*border-bottom: 2px solid #335375 !important;*/
+}
+
+.x-datepicker-header .x-datepicker-month .x-btn-split-right {
+	background-image: url("../img/arrow_triangle-down-datepicker.png") !important;
+	background-repeat: no-repeat;
+}
+
+.x-datepicker-header .x-btn-default-small {
+	padding: 0px !important;
+	padding-bottom: 4px !important;
+}
+
+.x-datepicker-header .x-btn-inner {
+	color: #fff !important;
+	font-size: 14px !important;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+}
+
+.x-datepicker-prev, .x-datepicker-next {
+	background: none !important;
+}
+
+.x-datepicker-arrow {
+	width: 7px !important;
+	height: 12px !important;
+	top: 14px !important;
+}
+
+.x-datepicker-prev {
+	background-image: url("../img/arrow_carrot-left-datepicker.png") !important;
+	background-repeat: no-repeat;
+	left: 10px !important;
+}
+
+.x-datepicker-next {
+	background-image: url("../img/arrow_carrot-right-datepicker.png") !important;
+	background-repeat: no-repeat;
+	right: 10px !important;
+}
+
+.x-datepicker-inner .x-datepicker-column-header {
+	background-image: none !important;
+	background-color: #e5e5e5 !important;
+	color: #002852 !important;
+	font-size: 14px !important;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+	border-bottom: none !important;
+}
+
+.x-datepicker-inner .x-datepicker-column-header .x-datepicker-column-header-inner {
+	line-height: 30px !important;
+}
+
+.x-datepicker-inner .x-datepicker-cell .x-datepicker-date {
+	line-height: 19px;
+	color: #002852;
+	font-size: 14px !important;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+	width: 26px !important;
+	margin-left: 4px !important;
+	margin-top: 3px;
+  	margin-bottom: 2px;
+}
+
+.x-datepicker-inner .x-datepicker-prevday .x-datepicker-date,
+.x-datepicker-inner .x-datepicker-disabled .x-datepicker-date {
+	color: #e5e5e5 !important;
+}
+
+.x-datepicker-cell {
+	border: none !important;
+}
+
+.x-datepicker-inner tr td, .x-datepicker-inner .x-datepicker-disabled .x-datepicker-date {
+	background-color: #f9f9f9 !important;
+}
+
+.x-datepicker-inner tr td:nth-child(6), .x-datepicker-inner tr td:nth-child(7),
+.x-datepicker-inner tr td:nth-child(6) .x-datepicker-date, .x-datepicker-inner tr td:nth-child(7) .x-datepicker-date {
+	background-color: #efefef !important;
+}
+
+/*
+.x-datepicker-inner tr td:first-child, .x-datepicker-inner tr td:nth-child(7),
+.x-datepicker-inner tr td:first-child .x-datepicker-date, .x-datepicker-inner tr td:nth-child(7) .x-datepicker-date {
+	background-color: #efefef !important;
+}
+.x-datepicker-selected {
+	border-color: #5c7591 !important;
+}*/
+
+.x-datepicker-selected .x-datepicker-date {
+	border: 1px solid #002852 !important;
+	background-color: #f9f9f9 !important;
+}
+
+.x-datepicker-today .x-datepicker-date {
+	background-color: #5c7591 !important;
+	border-radius: 45px;
+	color: #fff !important;
+	line-height: 24px !important;
+	margin-top: 0px !important;
+  	margin-bottom: 0px !important;
+}
+
+.x-datepicker-selected.x-datepicker-today .x-datepicker-date {
+	border: none !important;
+}
+
+.x-css-shadow {
+	box-shadow: none !important;
+}
+
+.x-datepicker-footer, .x-monthpicker-buttons {
+	background-image: none !important;
+	background-color: #f9f9f9 !important;
+	height: 33px !important;
+	line-height: 33px !important;
+	padding: 0px !important;
+	border-top: none !important;
+}
+
+.x-monthpicker-months, .x-monthpicker-years {
+	width: 114px !important;
+}
+
+.x-monthpicker-months {
+	border-color: #5c7591 !important;
+	background-color: #f9f9f9 !important;
+}
+
+.x-monthpicker-months .x-monthpicker-item-inner {
+	margin: 0 5px 0 5px !important;
+}
+
+.x-monthpicker-month,.x-monthpicker-year, .x-monthpicker-yearnav-button-ct {
+	width: 56px !important;
+}
+
+.x-monthpicker-years {
+	background-color: #f9f9f9 !important;
+}
+
+.x-monthpicker-yearnav-button-ct {
+	margin: 5px 0 4px;
+}
+
+.x-monthpicker-yearnav-button-ct .x-monthpicker-yearnav-button {
+	width: 7px !important;
+	height: 17px !important;
+}
+
+.x-monthpicker-yearnav-button-ct .x-monthpicker-yearnav-prev {
+	background-image: url("../img/arrow_carrot-left-over.png") !important;
+	background-repeat: no-repeat;
+	background-position: 0px 0px !important;
+	background-color: #f9f9f9 !important;
+}
+
+.x-monthpicker-yearnav-button-ct .x-monthpicker-yearnav-next {
+	background-image: url("../img/arrow_carrot-right-over.png") !important;
+	background-repeat: no-repeat;
+	background-position: 0px 0px !important;
+	background-color: #f9f9f9 !important;
+}
+
+.x-monthpicker-item-inner {
+	line-height: 24px !important;
+	color: #303030;
+	font-size: 14px !important;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+	border-color: #f9f9f9;
+}
+
+.x-monthpicker-selected {
+	background-color: #f9f9f9 !important;
+	color: #002852 !important;
+	border-color: #5c7591 !important;
+}
+
+/**********************************/
+/*** GRID
+/**********************************/
+.uvGrid {
+	background-image: none !important;
+	background-color: #fff !important;
+	border: 1px solid #f9f9f9 !important;
+}
+
+.uvGrid .x-grid-header-ct, .uvGrid .x-column-header {
+	background-image: none !important;
+	background-color: #fff !important;
+	border-right: none !important;
+	height: 40px !important;
+	line-height: 40px !important;
+	margin: 0px !important;
+	padding: 0px !important;
+}
+
+.uvGrid .x-grid-header-ct {
+	border-left: 1px solid #e5e5e5 !important;
+	border-right: 1px solid #e5e5e5 !important;
+	border-top: 1px solid #e5e5e5 !important;
+}
+
+.uvGrid .x-column-header {
+	padding: 0px 0px 0px 10px !important;
+}
+
+.uvGrid .x-column-header-over {
+	background: none !important;
+	background-color: #fff !important;
+}
+
+.uvGrid .x-column-header-inner {
+	padding: 0px !important;
+}
+
+.uvGrid .x-column-header span {
+	color: #5f5858;
+	font-size: 14px;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+	font-weight: bold;	
+}
+
+.uvGrid .x-panel-body {
+	border: 1px solid #e5e5e5 !important;
+}
+
+.uvGrid .x-grid-view {
+	overflow-x: hidden !important;
+	overflow-y: auto !important;
+}
+
+.uvGrid .x-grid-row td {
+	background-image: none !important;
+	background-color: #fff;
+	border-color: #e5e5e5 !important;
+}
+
+.uvGrid .x-grid-row-alt td {
+	background-image: none !important;
+	background-color: #f9f9f9; 
+}
+
+.uvGrid .x-grid-row div {
+	color: #5f5858;
+	font-size: 13px;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+	padding: 0px 0px 0px 10px !important;
+	height: 30px !important;
+	line-height: 30px !important;
+}
+
+.uvGrid .x-grid-row-over div {
+	color: #5c7591 !important;
+	background-color: #efefef !important;
+}
+
+.uvGrid .x-grid-row-selected div, .uvGrid .x-grid-row-focused div {
+	color: #5c7591 !important;
+	background-color: #e5e5e5 !important;
+}
+
+.uvGrid .x-column-header .x-column-header-trigger {
+	background-image: url("../img/arrow_down.png") !important;
+	background-color: #fff !important;
+	border: none !important;
+	width: 28px !important;
+}
+
+.uvGrid .x-column-header-open .x-column-header-trigger {
+	background-image: url("../img/arrow_down-pressed.png") !important;
+	background-color: #fff !important;
+	border: none !important;
+	width: 28px !important;
+}
+
+.uvGrid .x-column-header-sort-ASC .x-column-header-text {
+	background-image: url("../img/arrow_triangle-up.png") !important;
+}
+
+.uvGrid .x-column-header-sort-DESC .x-column-header-text {
+	background-image: url("../img/arrow_triangle-down.png") !important;
+}
+
+.uvGrid .x-column-header-text p {
+	line-height: 0px !important;
+	font-size: 13px !important;
+}
+
+.uvGridIcon{
+	margin-top: 6px;
+}
+
+.uvGrid .x-action-col-icon {
+	width: 20px !important;
+	height: 20px !important;
+	margin: 5px 0px !important;
+}
+
+/* Grid Checker */
+.uvGrid .x-grid-cell-special .x-grid-row-checker, .uvGrid .x-column-header-checkbox .x-column-header-text {
+	width: 18px;
+	height: 18px;
+	background: url("../img/icon_check_blank-menu.png") no-repeat;
+	margin-top: 6px;
+	margin-left: 0px;
+}
+
+.uvGrid .x-grid-row-selected .x-grid-cell-special .x-grid-row-checker, .uvGrid .x-column-header-checkbox.x-grid-hd-checker-on .x-column-header-text {
+	width: 18px;
+	height: 18px;
+	background: url("../img/icon_check-menu.png") no-repeat;
+	margin-top: 6px;
+	margin-left: 0px;
+}
+
+.uvGrid .x-column-header-checkbox .x-column-header-text {
+	margin-top: 10px;
+	margin-left: 0px;
+}
+
+.uvGrid .x-column-header-checkbox.x-grid-hd-checker-on .x-column-header-text {
+	margin-top: 10px;
+	margin-left: 0px;
+}
+
+.uvGrid .x-grid-cell-row-checker .x-grid-cell-inner, .uvGrid .x-column-header-checkbox {
+	padding: 0px 0px 0px 6px !important;
+}
+
+.uvGrid .x-column-header-checkbox .x-column-header-inner {
+	height: 100%;
+}
+
+/* Grid Expander */
+.uvGrid .x-grid-cell-special {
+	border-right: none !important;
+}
+
+.uvGrid .x-grid-cell-special .x-grid-row-expander {
+	background-image: url("../img/icon_minus-box.png") !important;
+	background-repeat: no-repeat;
+	background-position: 0px 9px !important;
+	width: 11px !important;
+}
+
+.uvGrid .x-grid-row-collapsed .x-grid-cell-special .x-grid-row-expander {
+	background-image: url("../img/icon_plus-box.png") !important;
+	background-repeat: no-repeat;
+	background-position: 0px 9px !important;
+}
+
+.uvGrid .x-grid-row-over .x-grid-cell-special .x-grid-row-expander {
+	background-image: url("../img/icon_minus-box-over.png") !important;
+}
+
+.uvGrid .x-grid-row-collapsed.x-grid-row-over .x-grid-cell-special .x-grid-row-expander {
+	background-image: url("../img/icon_plus-box-over.png") !important;
+}
+
+.uvGrid .x-grid-row .uvGridExpandContent, .uvGrid .x-grid-row .x-grid-rowbody {
+	height: auto !important;
+}
+
+.uvGrid .x-grid-wrap-row td {
+	background-image: none !important;
+	background-color: #e5e5e5 !important; 
+	border-color: #f9f9f9 !important;
+}
+
+.uvGrid .x-grid-wrap-row div {
+	color: #303030 !important;
+	font-size: 13px;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+	padding: 0px 0px 0px 10px !important;
+	height: 30px !important;
+	line-height: 30px !important;
+}
+
+.uvGrid .x-grid-wrap-row.x-grid-row-over div, .uvGrid .x-grid-wrap-row.x-grid-row-selected div, .uvGrid .x-grid-wrap-row.x-grid-row-focused div {
+	color: #5c7591 !important;
+	background-color: #efefef !important;
+}
+
+.uvGrid .x-grid-wrap-row .x-grid-rowbody, .uvGrid .x-grid-wrap-row .x-grid-rowbody div, .uvGrid .x-grid-wrap-row .x-grid-rowbody * {
+	background-color: #f9f9f9;
+}
+
+.uvGrid .x-grid-wrap-row .x-grid-rowbody td {
+	background-color: #f9f9f9 !important;
+}
+
+.uvGrid .x-grid-wrap-row.x-grid-row-over .x-grid-rowbody, .uvGrid .x-grid-wrap-row.x-grid-row-selected .x-grid-rowbody, .uvGrid .x-grid-wrap-row.x-grid-row-focused .x-grid-rowbody
+.uvGrid .x-grid-wrap-row.x-grid-row-over .x-grid-rowbody div, .uvGrid .x-grid-wrap-row.x-grid-row-selected .x-grid-rowbody div, .uvGrid .x-grid-wrap-row.x-grid-row-focused .x-grid-rowbody div,
+.uvGrid .x-grid-wrap-row.x-grid-row-over .uvGridExpandContent, .uvGrid .x-grid-wrap-row.x-grid-row-selected .uvGridExpandContent, .uvGrid .x-grid-wrap-row.x-grid-row-focused .uvGridExpandContent,
+.uvGrid .x-grid-wrap-row.x-grid-row-over .uvGridExpandContent div, .uvGrid .x-grid-wrap-row.x-grid-row-selected .uvGridExpandContent div, .uvGrid .x-grid-wrap-row.x-grid-row-focused .uvGridExpandContent div,
+.uvGrid .x-grid-wrap-row.x-grid-row-over .uvGridExpandContent *, .uvGrid .x-grid-wrap-row.x-grid-row-selected .uvGridExpandContent *, .uvGrid .x-grid-wrap-row.x-grid-row-focused .uvGridExpandContent * {
+	background-color: #f9f9f9 !important;
+}
+
+/* Grid Grouping */
+.uvGrid .x-group-hd-container .x-grid-group-hd, .uvGrid .x-group-hd-container .x-grid-group-title {
+	background-color: #e5e5e5 !important;
+	border-width: 0px !important;	
+	border-bottom: 1px solid #f9f9f9 !important;
+}
+
+.uvGrid .x-grid-row-over .x-group-hd-container div, .uvGrid .x-grid-row-over .x-group-hd-container div 
+.uvGrid .x-grid-row-selected .x-group-hd-container .x-grid-group-hd, .uvGrid .x-grid-row-selected .x-group-hd-container .x-grid-group-title 
+.uvGrid .x-grid-row-focused .x-group-hd-container .x-grid-group-hd, .uvGrid .x-grid-row-focused .x-group-hd-container .x-grid-group-title {
+	background-color: #e5e5e5 !important;
+	border-width: 0px !important;	
+	border-bottom: 1px solid #f9f9f9 !important;
+	color: #303030 !important;
+}
+
+.uvGrid .x-grid-row-selected .x-group-hd-container .x-grid-group-title {
+	background-color: #efefef !important;
+}
+
+.uvGrid .x-group-hd-container:hover div, .uvGrid .x-group-hd-container:hover div {
+	background-color: #efefef !important;
+}
+
+.uvGrid .x-group-hd-container .x-grid-table {
+	border-top: none !important;
+}
+
+.uvGrid .x-group-hd-container .x-grid-table td {
+	background-color: #fff !important;
+	border-bottom: 1px solid #e5e5e5 !important;
+}
+
+.uvGrid .x-group-hd-container .x-grid-table div {
+	color: #5f5858 !important;
+	font-size: 13px !important;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+}
+
+.uvGrid .x-grid-row-over .x-group-hd-container .x-grid-table div, .uvGrid .x-grid-row-selected .x-group-hd-container .x-grid-table div,
+.uvGrid .x-grid-row-focused .x-group-hd-container .x-grid-table div {
+	color: #5c7591 !important;
+	background-color: #efefef !important;
+	border: none !important;
+}
+
+.uvGrid .x-group-hd-container .x-grid-table .x-grid-row-alt td {
+	background-color: #f9f9f9 !important;
+	border-bottom: 1px solid #e5e5e5 !important;
+}
+
+.uvGrid .x-grid-group-hd-collapsed .x-grid-group-hd-collapsible .x-grid-group-title {
+	background-image: url("../img/icon_plus-box.png") !important;
+	background-repeat: no-repeat;
+	background-position: 0px 9px !important;
+	padding-left: 20px !important;
+}
+
+.uvGrid .x-grid-group-hd-collapsible .x-grid-group-title {
+	background-image: url("../img/icon_minus-box.png") !important;
+	background-repeat: no-repeat;
+	background-position: 0px 9px !important;
+	width: 11px !important;
+	padding-left: 20px !important;
+}
+
+.uvGrid .x-grid-group-hd-collapsed .x-grid-group-hd-collapsible:hover .x-grid-group-title {
+	background-image: url("../img/icon_plus-box-over.png") !important;
+}
+
+.uvGrid .x-grid-group-hd-collapsible:hover .x-grid-group-title {
+	background-image: url("../img/icon_minus-box-over.png") !important;
+}
+
+/* GRID TOOLBAR DOCKED */
+.uvGrid .x-toolbar-default, .uvToolbar.x-toolbar-default {
+	background-image: none !important;
+	background-color: #fff !important;
+	border: none !important;
+	padding: 0px !important;
+}
+
+.uvGrid .x-toolbar-default a {
+	top: 0px !important;
+	margin-top: 10px !important;
+}
+
+.uvToolbar.x-toolbar-default a {
+	top: 0px !important;
+	margin-top: 0px !important;
+}
+
+.uvGrid .uvSummaryPanel {
+}
+
+.uvGrid .uvSummaryPanel .x-panel-body{
+	border: none !important;
+	padding-left:10px;
+	background-color:#e5e5e5 !important;
+}
+
+.uvGrid .uvSummaryPanel label{
+	color: #a4a4a4;
+	font-size: 12px;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+	font-weight: normal;
+}
+
+
+/*****************************************/
+/*** EDITABLE GRID FIELDS
+/*****************************************/
+.uvGrid .x-grid-cell-editor input {
+	color: #5f5858;
+	font-size: 13px;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+	padding: 4px 10px 5px 10px !important;
+}
+
+.uvGrid .x-grid-cell-editor .uvComboField .x-trigger-cell, 
+.uvGrid .x-grid-cell-editor .uvDateField .x-trigger-cell,
+.uvGrid .x-grid-cell-editor .uvComboField .x-trigger-cell div { 
+	height: 32px !important;
+	line-height: 32px !important;
+}
+
+.uvGrid .x-grid-cell-editor .uvComboTrigger, .uvGrid .x-grid-cell-editor .uvDateTrigger {
+	height: 32px !important;
+	line-height: 32px !important;
+}
+
+.uvGrid .x-grid-cell-editor .x-form-checkbox {
+	width: 25px;
+	height: 25px;
+	background: url("../img/icon_check_blank-focus.png");
+	background-size: 25px 25px;
+	background-repeat: no-repeat;
+	margin: 0px !important;
+}
+
+.uvGrid .x-grid-cell-editor.x-grid-editor .x-form-cb-wrap {
+	text-align: left !important;
+	padding-left: 10px !important;
+}
+
+.uvGrid .x-grid-cell-editor .x-form-cb-checked .x-form-checkbox {
+	background: url("../img/icon_check-focus.png");
+	background-size: 25px 25px;
+	background-repeat: no-repeat;
+	z-index: 1000 !important;
+	margin: 0px !important;
+}
+
+
+.uvCellEditorUnchecked {
+	background: url("../img/icon_check_blank.png");
+	background-size: 25px 25px;
+	background-repeat: no-repeat;
+	width: 25px;
+	margin-top: 2px;
+}
+
+.uvCellEditorChecked {
+	background: url("../img/icon_check.png");
+	background-size: 25px 25px;
+	background-repeat: no-repeat;
+	width: 25px;
+	margin-top: 2px;
+}
+
+
+/**********************************/
+/*** ACTION COLUMN (GRID)
+/**********************************/
+.uvActionColumnBreakLink {
+	background-image: url("../img/icon_breaklink.png") !important;
+}
+
+.uvActionColumnBreakLink:hover {
+	background-image: url("../img/icon_breaklink-over.png") !important;
+}
+
+.uvActionColumnBreakRemove {
+	background-image: url("../img/icon_trash.png") !important;
+}
+
+.uvActionColumnBreakRemove:hover {
+	background-image: url("../img/icon_trash-over.png") !important;
+}
+
+.uvActionColumnLinkEntity {
+	background-image: url("../img/arrow_carrot-2up_alt2.png") !important;
+}
+
+.uvActionColumnLinkEntity:hover {
+	background-image: url("../img/arrow_carrot-2up_alt2-over.png") !important;
+}
+
+.uvActionColumnEstructuraEntity {
+	background-image: url("../img/icon_menu-circle_alt2.png") !important;
+}
+
+.uvActionColumnEstructuraEntity:hover {
+	background-image: url("../img/icon_menu-circle_alt2-over.png") !important;
+}
+
+.uvActionColumnLineaEntity {
+	background-image: url("../img/icon_easel.png") !important;
+}
+
+.uvActionColumnLineaEntity:hover {
+	background-image: url("../img/icon_easel-over.png") !important;
+}
+
+.uvActionColumnExternalLinkEntity {
+	background-image: url("../img/icon_link.png") !important;
+}
+
+.uvActionColumnExternalLinkEntity:hover {
+	background-image: url("../img/icon_link-over.png") !important;
+}
+
+.uvActionColumnDocumentsEntity {
+	background-image: url("../img/icon_documents.png") !important;
+}
+
+.uvActionColumnDocumentsEntity:hover {
+	background-image: url("../img/icon_documents-over.png") !important;
+}
+
+.uvActionColumnDocumentsDownload {
+	background-image: url("../img/icon_download.png") !important;
+}
+
+.uvGrid .uvActionColumnDocumentsDownload.x-action-col-icon {
+	width: 25px !important;
+}
+
+.uvActionColumnDocumentsDownload:hover {
+	background-image: url("../img/icon_download-over.png") !important;
+}
+
+
+.uvActionColumnPlus {
+	background-image: url("../img/icon_plus_alt2.png") !important;
+}
+.uvActionColumnPlus:hover {
+	background-image: url("../img/icon_plus_alt2-over.png") !important;
+}
+
+.uvActionColumnMinus {
+	background-image: url("../img/icon_minus_alt2.png") !important;
+}
+.uvActionColumnMinus:hover {
+	background-image: url("../img/icon_minus_alt2-over.png") !important;
+}
+
+.uvActionColumnGroup {
+	background-image: url("../img/icon_group.png") !important;
+    background-repeat: no-repeat !important;
+}
+.uvActionColumnGroup:hover {
+	background-image: url("../img/icon_group-over.png") !important;
+    background-repeat: no-repeat !important;
+}
+
+/**********************************/
+/*** PAGING TOOLBAR
+/**********************************/
+.uvPagingToolbar {
+	background-image: none !important;
+	background-color: #f9f9f9 !important;
+	height: 34px !important;
+	line-height: 34px !important;
+}
+
+.uvPagingToolbar .x-box-inner {
+	height: 34px !important;
+	line-height: 34px !important;
+}
+
+.uvPagingToolbar .x-toolbar-text {
+	height: 24px !important;
+	line-height: 24px !important;
+	padding-top: 5px !important;
+	padding-right: 10px !important;
+	color: #303030;
+	font-size: 14px;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+}
+
+/**********************************/
+/*** SPECIAL BUTTON (PAGINATION TOOLBAR)
+/**********************************/
+/* IE FIX */
+.uvPaginationButton .x-btn-tl, .uvPaginationButton .x-btn-tc,
+.uvPaginationButton .x-btn-tr, .uvPaginationButton .x-btn-ml,
+.uvPaginationButton .x-btn-mr, .uvPaginationButton .x-btn-bl,
+.uvPaginationButton .x-btn-bc, .uvPaginationButton .x-btn-br {
+	display: none;
+}
+
+.uvPaginationButton .x-btn-mc {
+	background: none !important;
+	border: none !important;
+}
+
+.uvPaginationButton .x-btn-mc {
+	padding: 10px 20px 2px 0px !important;
+}
+
+.uvPaginationButton {
+	background-image: none !important;
+	background-color: #f9f9f9 !important;
+	border: none !important;
+	color: #5c7591 !important;
+	font-size: 22px !important;
+	height: 34px !important;
+	line-height: 34px !important;
+}
+
+.uvPagingToolbar a { /* Override back: SAME AS uvPaginationButton */
+	padding: 10px 20px 2px 0px !important;
+}
+
+.uvPagingToolbar a.uvButtonToolbar { /* Override back: SAME AS uvPaginationButton */
+	padding: 0px !important;
+}
+
+.uvPaginationButton span {
+	height: 24px !important;
+	line-height: 24px !important;
+}
+
+.uvPaginationButton.x-btn-default-toolbar-small-disabled {
+	opacity: 1 !important;
+}
+
+.uvPaginationButtonDisabled, .uvPaginationButton .x-btn-default-toolbar-small-disabled-mc span,
+.uvPaginationButtonDisabled .x-btn-mc {
+	color: #b7b7b7 !important;
+}
+
+/* Pagination dropdown */
+.uvDropdownListInstantHeader .uvPagingToolbar {
+	border-top: 1px solid #5c7591 !important;
+}
+
+.uvDropdownListInstantHeader .uvPagingToolbar a {
+	padding: 5px 20px 2px 0px !important;
+}
+
+.uvDropdownListInstantHeader .uvPaginationButton .x-btn-mc {
+	padding: 0px 0px 2px 0px !important;
+}
+
+.uvDropdownListInstantHeader .uvFieldPagination {
+	margin: 0px 5px 0px 0px !important;
+}
+
+.uvDropdownListInstantHeader .uvPagingToolbar .x-toolbar-text {
+	padding-top: 0px !important;
+}
+
+/**********************************/
+/*** TEXTFIELD (PAGINATION TOOLBAR)
+/**********************************/
+.uvFieldPagination {
+	  margin: 5px 5px 0px 0px !important;
+}
+
+.uvFieldPagination.x-item-disabled .uvFieldPaginationField {
+	border: none !important;
+	background-color: #f9f9f9 !important;
+}
+
+.uvFieldPaginationField {
+	background-image: none !important;
+	background-color: #fff !important;
+	border: 1px solid #e5e5e5;
+	height: 24px !important;
+	text-align: center !important;
+}
+
+.uvFieldPaginationField:focus {
+	border: 1px solid #5c7591;
+}
+
+.uvFieldPaginationField.x-form-invalid-field {
+	border: 1px solid #e75d66 !important;
+}
+
+
+/**********************************/
+/*** IMAGE CONTAINER COMPONENT
+/**********************************/
+/* IE Fix */
+.uvImageViewerContainerBorder .x-btn-tl, .uvImageViewerContainerBorder .x-btn-tc,
+.uvImageViewerContainerBorder .x-btn-tr, .uvImageViewerContainerBorder .x-btn-ml,
+.uvImageViewerContainerBorder .x-btn-mr, .uvImageViewerContainerBorder .x-btn-bl,
+.uvImageViewerContainerBorder .x-btn-bc, .uvImageViewerContainerBorder .x-btn-br {
+	display: none;
+}
+
+/* IE Fix */
+.uvImageViewerContainerBorder .x-btn-mc {
+	background: none !important;
+	border: none !important;
+}
+
+/* IE Fix */
+.uvImageViewerContainerBorder .x-btn-mc {
+	padding: 5px 10px 4px 10px !important;
+}
+
+.uvImageViewerContainerBorder {
+    border: 3px solid #fff;
+    border-radius: 3px;
+    width: 106px !important;
+    height: 86px !important;
+}
+
+.uvImageViewerPanel {
+    width: 100px !important;
+    height: 80px !important;
+    position: absolute;
+    background-color: #f5f5f5 !important;
+}
+
+.uvImagePreview {
+	width: 100px !important;
+    height: 80px !important;
+	position: absolute;
+	top: 0px;
+	bottom: 0px;
+	left: 0px;
+	right: 0px;
+	margin: auto;
+}
+
+.uvImageMaskAction {
+	width: 100px !important;
+    height: 80px !important;
+    position: absolute;
+    top: 0px !important;
+    left: 0px !important;
+    border: none !important;
+    border-radius: 0px !important;
+    padding: 0px !important;
+    margin: 0px !important;
+    background-color: #efefef !important;
+    background-image: none !important;
+
+	-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
+    filter: alpha(opacity=0);
+    -khtml-opacity: 0;
+    -moz-opacity: 0;
+    opacity: 0;
+}
+
+.uvImageMaskAction span {
+	-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
+    filter: alpha(opacity=0);
+    -khtml-opacity: 0;
+    -moz-opacity: 0;
+    opacity: 0;
+}
+
+.uvImageMaskAction:hover {
+    background-image: url("../img/icon_cloud-upload_alt.png") !important;
+    background-size: 20px 20px;
+    background-repeat: no-repeat;
+    background-position: center 15px;
+
+	-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
+    filter: alpha(opacity=100);
+    -khtml-opacity: 1;
+    -moz-opacity: 1;
+    opacity: 1;
+}
+
+.uvImageMaskAction:hover span {
+	-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
+    filter: alpha(opacity=100);
+    -khtml-opacity: 1;
+    -moz-opacity: 1;
+    opacity: 1;
+}
+
+.uvImageMaskAction:hover span {
+	width: 80px !important;
+	height: 30px !important;
+	padding: 0px !important;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+    font-size: 12px !important;
+    color: #303030 !important;
+}
+
+.uvImageMaskAction:hover .x-btn-wrap {
+	position: absolute;
+	bottom: 11px !important;
+}
+
+.uvImageMaskAction:hover .x-btn-inner {
+	line-height: 15px !important;
+}
+
+
+/**********************************/
+/*** RADIO BUTTONS
+/**********************************/
+.uvRadioGroup {
+	height: 38px !important;
+	line-height: 38px !important;
+}
+
+.uvRadioGroup .x-form-radio {
+	width: 25px;
+	height: 25px;
+	background: url("../img/icon_radio_blank.png");
+	background-size: 25px 25px;
+	background-repeat: no-repeat;
+	margin: 0px !important;
+}
+
+.uvRadioGroup .x-form-radio-group {
+	width: 120px !important;
+}
+
+.uvRadioGroup .x-form-cb-checked .x-form-radio {
+	background: url("../img/icon_radio.png");
+	background-size: 25px 25px;
+	background-repeat: no-repeat;
+	z-index: 1000 !important;
+	margin: 0px !important;
+}
+
+.uvRadioGroup .x-form-radio-focus {
+	background: url("../img/icon_radio_blank-focus.png");
+	background-size: 25px 25px;
+	background-repeat: no-repeat;
+	z-index: 1000 !important;
+	margin: 0px !important;
+}
+
+.uvRadioGroup .x-form-cb-checked .x-form-radio-focus {
+	background: url("../img/icon_radio-focus.png");
+	background-size: 25px 25px;
+	background-repeat: no-repeat;
+	z-index: 1000 !important;
+	margin: 0px !important;
+}
+
+.uvRadioGroup .x-item-disabled .x-form-radio {
+	width: 25px;
+	height: 25px;
+	background: url("../img/icon_radio_blank-disabled.png");
+	background-size: 25px 25px;
+	background-repeat: no-repeat;
+	margin: 0px !important;
+}
+
+.uvRadioGroup .x-form-cb-checked.x-item-disabled .x-form-radio {
+	background: url("../img/icon_radio-disabled.png");
+	background-size: 25px 25px;
+	background-repeat: no-repeat;
+	z-index: 1000 !important;
+	margin: 0px !important;
+}
+
+.uvRadioGroup label.x-form-cb-label {
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+	font-size: 12px;
+	text-transform: uppercase;
+	font-weight: bold;
+	color: #b7b7b7;
+}
+
+.uvRadioGroup label.x-form-cb-label-after {
+	margin-left: 10px !important;
+}
+
+
+/**********************************/
+/*** CHECK BUTTONS
+/**********************************/
+.uvCheckGroup {
+	height: 38px !important;
+	line-height: 38px !important;
+}
+
+.uvCheckBoxToolbar {
+	height: 25px !important;
+	line-height: 25px !important;
+}
+
+.uvCheckGroup .x-form-checkbox, .uvCheckBoxToolbar .x-form-checkbox {
+	width: 25px;
+	height: 25px;
+	background: url("../img/icon_check_blank.png");
+	background-size: 25px 25px;
+	background-repeat: no-repeat;
+	margin: 0px !important;
+}
+
+.uvCheckGroup .x-form-checkbox-group, .uvCheckBoxToolbar .x-form-checkbox-group {
+	width: 120px !important;
+}
+
+.uvCheckGroup .x-form-cb-checked .x-form-checkbox, .uvCheckBoxToolbar .x-form-cb-checked .x-form-checkbox {
+	background: url("../img/icon_check.png");
+	background-size: 25px 25px;
+	background-repeat: no-repeat;
+	z-index: 1000 !important;
+	margin: 0px !important;
+}
+
+.uvCheckGroup .x-form-checkbox-focus, .uvCheckBoxToolbar .x-form-checkbox-focus {
+	background: url("../img/icon_check_blank-focus.png");
+	background-size: 25px 25px;
+	background-repeat: no-repeat;
+	z-index: 1000 !important;
+	margin: 0px !important;
+}
+
+.uvCheckGroup .x-form-cb-checked .x-form-checkbox-focus, .uvCheckBoxToolbar .x-form-cb-checked .x-form-checkbox-focus {
+	background: url("../img/icon_check-focus.png");
+	background-size: 25px 25px;
+	background-repeat: no-repeat;
+	z-index: 1000 !important;
+	margin: 0px !important;
+}
+
+.uvCheckGroup .x-item-disabled .x-form-checkbox, .uvCheckBoxToolbar .x-item-disabled .x-form-checkbox {
+	width: 25px;
+	height: 25px;
+	background: url("../img/icon_check_blank-disabled.png");
+	background-size: 25px 25px;
+	background-repeat: no-repeat;
+	margin: 0px !important;
+}
+
+.uvCheckGroup .x-form-cb-checked.x-item-disabled .x-form-checkbox, .uvCheckBoxToolbar .x-form-cb-checked.x-item-disabled .x-form-checkbox {
+	background: url("../img/icon_check-disabled.png");
+	background-size: 25px 25px;
+	background-repeat: no-repeat;
+	z-index: 1000 !important;
+	margin: 0px !important;
+}
+
+.uvCheckGroup label.x-form-cb-label, .uvCheckBoxToolbar label.x-form-cb-label {
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+	font-size: 12px;
+	text-transform: uppercase;
+	font-weight: bold;
+	color: #b7b7b7;
+}
+
+.uvCheckBoxToolbar label.x-form-cb-label {
+	padding-right: 4px;
+}
+
+.uvCheckGroup label.x-form-cb-label-after, .uvCheckBoxToolbar label.x-form-cb-label-after {
+	margin-left: 10px !important;
+}
+
+.x-grid-checkcolumn {
+	width: 25px;
+	height: 25px;
+	background: url("../img/icon_check_blank.png");
+	margin-top: 2px !important;
+}
+
+.x-grid-checkcolumn.x-grid-checkcolumn-checked {
+	width: 25px;
+	height: 25px;
+	background: url("../img/icon_check.png");
+	margin-top: 2px !important;
+}
+
+
+/**********************************/
+/*** POPUPS, VENTANAS Y ALERTS
+/**********************************/
+.x-window, .x-window-header, .x-window-body {
+	background-image: none !important;
+	background-color: #fff !important;
+	padding: 0px !important;
+	margin: 0px !important;
+	border-radius: 0px !important;
+	border: none !important;
+}
+
+.x-window .uvDockedToolbar {
+	background-image: none !important;
+	background-color: #fff !important;
+}
+
+.x-window .uvDockedToolbar .x-box-inner {
+	background-image: none !important;
+	background-color: #fff !important;
+}
+
+.x-window .x-window-header-default-top {
+	-webkit-box-shadow: none !important;
+	-moz-box-shadow: none !important;
+	box-shadow: none !important;
+}
+
+.x-window .x-window-header {
+	padding: 40px 40px 0px 40px !important;
+	border: none !important;
+}
+
+.x-window .x-window-header .x-tool-after-title {
+	display: none !important;
+}
+
+.x-window .x-window-header .x-header-body {
+	border-bottom: 1px solid #e5e5e5 !important;
+	border-top: 1px solid #fff !important;
+	border-left: 1px solid #fff !important;
+	border-right: 1px solid #fff !important;
+	padding-bottom: 10px !important;
+}
+
+.x-window .x-window-header .x-header-body span {
+	font-size: 18px !important;
+	color: #303030;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+	font-weight: normal !important;
+}
+
+/* IE FIX */
+.x-window .x-window-header-ml, .x-window .x-window-header-mr,
+.x-window .x-window-header-tc, .x-window .x-window-header-tl,
+.x-window .x-window-header-tr, .x-window .x-window-header-mc,
+.x-window .x-window-header-br, .x-window .x-window-header-bc,
+.x-window .x-window-header-bl,
+.x-window .x-window-ml, .x-window .x-window-mr,
+.x-window .x-window-tc, .x-window .x-window-tl,
+.x-window .x-window-tr, .x-window .x-window-mc,
+.x-window .x-window-br, .x-window .x-window-bc,
+.x-window .x-window-bl {
+	background-image: none !important;
+	background-color: #fff !important;
+}
+
+/* IE FIX */
+.x-window .x-window-header .x-frame-ml div {
+	width: inherit !important;
+}
+
+/* IE FIX */
+.x-window .x-frame-mc .x-window-body {
+	padding-top: 50px !important;
+}
+
+/* IE FIX */
+.x-window .x-frame-mc .x-window-body .x-panel-body,
+.x-window-body .x-panel-body {
+	border: none;
+}
+
+.x-window .uvGrid {
+	border: none !important;
+}
+
+.x-window .x-frame-mc .x-window-body .uvGrid .x-panel-body {
+	border: 1px solid #e5e5e5 !important;
+}
+
+.x-window-body {
+	padding: 20px 40px 40px 40px !important;
+}
+
+.x-window-body .uvGrid .x-panel-body {
+	border: 1px solid #e5e5e5 !important;
+}
+
+.x-window .uvFilterForm {
+	padding: 0px 0px !important;
+	margin-bottom: 10px;
+}
+
+.x-window .uvFilterForm .x-panel-body-default {
+	background-color: #fff !important;
+}
+
+.x-window .uvFilterForm .x-panel-header {
+	background-color: #fff !important;
+}
+
+.x-window .uvFilterForm .x-panel-header > .x-panel-body-default {
+	background-color: #fff !important;
+	padding-bottom: 0px !important;
+}
+
+/**********************************/
+/*** CHANGELOG
+/**********************************/
+.uvChangelogImage {
+	background-image: url("../img/LogoUVChangelog.png") !important;
+	background-size: auto 77px !important;
+	background-repeat: no-repeat !important;
+}
+
+.uvChangelogImage .x-panel-body-default {
+	background: none !important;
+}
+
+.uvChangelogText {
+	font-size: 13px !important;
+	color: #303030;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+	margin-left: 220px !important;
+}
+
+.uvChangelogServer {
+	font-size: 13px !important;
+	color: #303030;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+}
+
+.uvTreePanel .x-grid-body {
+	border-top: 1px solid #e5e5e5 !important;
+	border-bottom: 1px solid #e5e5e5 !important;
+	border-left: 1px solid #e5e5e5 !important;
+	border-right: 1px solid #e5e5e5 !important;
+}
+
+.uvTreePanel .x-grid-cell-inner-treecolumn {
+	padding: 6px 6px 6px 0px !important;
+}
+
+.uvTreePanel .x-grid-row-focused .x-grid-cell-inner-treecolumn {
+	padding: 5px 6px 5px 0px !important;
+}
+
+.uvTreePanel .x-tree-node-text {
+	font-family: 'Clear Sans', Arial, sans-serif;
+	font-size: 12px !important;
+	font-weight: bold;
+	color: #5c7591;
+	padding-left: 10px !important;
+}
+
+.uvTreePanel .x-grid-tree-node-leaf .x-tree-node-text {
+	font-weight: normal;
+	color: #303030;
+}
+
+.uvTreePanel .x-tree-icon-leaf {
+	background-size: 16px !important;
+}
+
+.uvTreePanel .x-tree-expander {
+	background-image: url("../img/arrow-right.png") !important;
+	background-size: 16px !important;
+	background-position: 0px !important;
+	margin-right: 3px !important;
+}
+
+.uvTreePanel .x-grid-tree-node-expanded .x-tree-expander {
+	background-image: url("../img/arrow-down.png") !important;
+	background-size: 16px !important;
+	background-position: 0px !important;
+	margin-right: 3px !important;
+}
+
+.uvTreePanel .x-tree-expander-over .x-tree-expander {
+	background-image: url("../img/arrow-right-over.png") !important;
+	background-size: 16px !important;
+	background-position: 0px !important;
+	margin-right: 3px !important;
+}
+
+.uvTreePanel .x-grid-tree-node-expanded .x-tree-expander-over .x-tree-expander {
+	background-image: url("../img/arrow-down-over.png") !important;
+	background-size: 16px !important;
+	background-position: 0px !important;
+	margin-right: 3px !important;
+}
+
+.uvTreePanel .x-tree-icon-parent {
+	background-image: url("../img/icon_folder-alt.png") !important;
+	background-size: 16px !important;
+	background-position: 0px !important;
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../img/icon_folder-alt.png',sizingMethod='scale');
+	-ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../img/icon_folder-alt.png',sizingMethod='scale')";
+}
+
+.uvTreePanel .x-grid-tree-node-expanded .x-tree-icon-parent {
+	background-image: url("../img/icon_folder-open_alt.png") !important;
+	background-size: 16px !important;
+	background-position: 0px !important;
+}
+
+
+/**********************************/
+/*** ALERTS
+/**********************************/
+.uvMessageBoxContainerBody {
+	padding: 20px 40px 0px 40px !important;
+}
+
+.uvMessageBoxContainerBody .x-box-item {
+	padding: 0px 0px 10px 0px !important;
+}
+
+.uvMessageBoxContainerBodyBasic {
+	padding-top: 10px !important;
+	padding-bottom: 30px !important;
+}
+
+.uvMessageBoxContainerBody .x-form-display-field, .uvMessageBoxContainerBodyText {
+	font-family: 'Clear Sans', Arial, sans-serif;
+	font-size: 16px !important;
+	font-weight: normal;
+	color: #303030;
+	line-height: 20px !important;
+	text-align: justify !important;
+}
+
+.uvMessageBoxContainerBodyTextDetail {
+	font-size: 13px !important;
+	font-weight: normal;
+	color: #303030;
+	line-height: 17px !important;
+	text-align: justify !important;
+}
+
+.uvMessageBoxContainerBody + .x-toolbar .x-btn-default-small {
+	padding: 0px !important;
+}
+
+
+/**********************************/
+/*** AYUDA
+/**********************************/
+.uvIframePanel {
+	border: 1px solid #e5e5e5 !important;
+	font-family: 'Clear Sans', Arial, sans-serif;
+	font-size: 12px !important;
+	color: #303030;
+}
+
+.uvIframePanel * {
+	font-family: 'Clear Sans', Arial, sans-serif;
+	font-size: 12px !important;
+	color: #303030;
+}
+
+
+/**********************************/
+/*** TOOLTIPS
+/**********************************/
+.x-tip {
+	background-image: none !important;
+	background-color: #e5e5e5 !important;
+	border-radius: 0px !important;
+	border: 1px solid #002852 !important;
+	padding: 5px !important;
+}
+
+.x-tip.x-tip-form-invalid {
+	border: 1px solid #e75d66 !important;
+	-webkit-box-shadow: none !important;
+	-moz-box-shadow: none !important;
+	box-shadow: none !important;
+}
+
+.x-tip .x-tip-body-form-invalid {
+	background-image: none !important;
+}
+
+.x-tip-body, .x-tip-body *, .x-tip-body-form-invalid, .x-tip-body-form-invalid * {
+	padding: 0px !important;
+	margin: 0px !important;
+	color: #303030 !important;
+	font-family: 'Clear Sans', Arial, sans-serif;
+	font-size: 14px !important;
+}
+
+
+/**********************************/
+/*** BUBBLE
+/**********************************/
+#msg-div {
+	z-index: 20000 !important;
+	width: 450px !important;
+}
+
+#msg-div > div {
+	border: 1px solid #23baa8 !important;
+	background-color: #e5e5e5 !important;
+}
+
+#msg-div .msg * {
+	background-image: none !important;
+	padding: 0px !important;
+	margin: 0px !important;
+	-webkit-box-shadow: none !important;
+	-moz-box-shadow: none !important;
+	box-shadow: none !important;
+	background-color: #e5e5e5 !important;
+	color: #303030 !important;
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+	font-size: 14px !important;
+}
+
+#msg-div .msg .x-box-mc {
+	padding: 0px 10px !important;
+}
+
+#msg-div .msg .x-box-mc tbody > tr div {
+	font-weight: bold !important;
+	color: #002852 !important;
+}
+
+
+/**********************************/
+/*** 
+/**********************************/
+.x-surface * {
+	font-family: 'Clear Sans', Arial, sans-serif !important;
+	color: #303030;
+}
+
+/**********************************/
+/*** ESTILOS PARA LA VENTANA DE ERROR
+/**********************************/
+.errorContentContainer {
+	top: 50% !important;
+	text-align: center;
+	margin-top: -85px !important;
+}
+
+.errorLabel {
+	font-family: 'Clear Sans', Arial, sans-serif;
+	font-size: 18px;
+	color: #425b71;
+}
+
+.errorIcon {
+	font-size: 50px;
+	color: #425b71;
+}
+
+/**********************************/
+/*** LOGOS HOME PAGE
+/**********************************/
+.uvTextUVApps {
+	background-color: #f9f9f9 !important;
+	color: #5c7591;
+	text-align: center !important;
+	font-size: 22px !important;
+	font-family:Clear Sans, Arial, sans-serif;	
+}

+ 429 - 0
src/main/resources/static/css/bootstrap-select/bootstrap-select.css

@@ -0,0 +1,429 @@
+/*!
+ * Bootstrap-select v1.13.9 (https://developer.snapappointments.com/bootstrap-select)
+ *
+ * Copyright 2012-2019 SnapAppointments, LLC
+ * Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE)
+ */
+
+select.bs-select-hidden,
+.bootstrap-select > select.bs-select-hidden,
+select.selectpicker {
+  display: none !important;
+}
+.bootstrap-select {
+  width: 220px \0;
+  /*IE9 and below*/
+  vertical-align: middle;
+}
+.bootstrap-select > .dropdown-toggle {
+  position: relative;
+  width: 100%;
+  text-align: right;
+  white-space: nowrap;
+  display: -webkit-inline-box;
+  display: -webkit-inline-flex;
+  display: -ms-inline-flexbox;
+  display: inline-flex;
+  -webkit-box-align: center;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  -webkit-box-pack: justify;
+  -webkit-justify-content: space-between;
+      -ms-flex-pack: justify;
+          justify-content: space-between;
+}
+.bootstrap-select > .dropdown-toggle:after {
+  margin-top: -1px;
+}
+.bootstrap-select > .dropdown-toggle.bs-placeholder,
+.bootstrap-select > .dropdown-toggle.bs-placeholder:hover,
+.bootstrap-select > .dropdown-toggle.bs-placeholder:focus,
+.bootstrap-select > .dropdown-toggle.bs-placeholder:active {
+  color: #999;
+}
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary:hover,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary:hover,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success:hover,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger:hover,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info:hover,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark:hover,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary:focus,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary:focus,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success:focus,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger:focus,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info:focus,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark:focus,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary:active,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary:active,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success:active,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger:active,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info:active,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark:active {
+  color: rgba(255, 255, 255, 0.5);
+}
+.bootstrap-select > select {
+  position: absolute !important;
+  bottom: 0;
+  left: 50%;
+  display: block !important;
+  width: 0.5px !important;
+  height: 100% !important;
+  padding: 0 !important;
+  opacity: 0 !important;
+  border: none;
+  z-index: 0 !important;
+}
+.bootstrap-select > select.mobile-device {
+  top: 0;
+  left: 0;
+  display: block !important;
+  width: 100% !important;
+  z-index: 2 !important;
+}
+.has-error .bootstrap-select .dropdown-toggle,
+.error .bootstrap-select .dropdown-toggle,
+.bootstrap-select.is-invalid .dropdown-toggle,
+.was-validated .bootstrap-select .selectpicker:invalid + .dropdown-toggle {
+  border-color: #b94a48;
+}
+.bootstrap-select.is-valid .dropdown-toggle,
+.was-validated .bootstrap-select .selectpicker:valid + .dropdown-toggle {
+  border-color: #28a745;
+}
+.bootstrap-select.fit-width {
+  width: auto !important;
+}
+.bootstrap-select:not([class*="col-"]):not([class*="form-control"]):not(.input-group-btn) {
+  width: 220px;
+}
+.bootstrap-select > select.mobile-device:focus + .dropdown-toggle,
+.bootstrap-select .dropdown-toggle:focus {
+  outline: thin dotted #333333 !important;
+  outline: 5px auto -webkit-focus-ring-color !important;
+  outline-offset: -2px;
+}
+.bootstrap-select.form-control {
+  margin-bottom: 0;
+  padding: 0;
+  border: none;
+}
+:not(.input-group) > .bootstrap-select.form-control:not([class*="col-"]) {
+  width: 100%;
+}
+.bootstrap-select.form-control.input-group-btn {
+  float: none;
+  z-index: auto;
+}
+.form-inline .bootstrap-select,
+.form-inline .bootstrap-select.form-control:not([class*="col-"]) {
+  width: auto;
+}
+.bootstrap-select:not(.input-group-btn),
+.bootstrap-select[class*="col-"] {
+  float: none;
+  display: inline-block;
+  margin-left: 0;
+}
+.bootstrap-select.dropdown-menu-right,
+.bootstrap-select[class*="col-"].dropdown-menu-right,
+.row .bootstrap-select[class*="col-"].dropdown-menu-right {
+  float: right;
+}
+.form-inline .bootstrap-select,
+.form-horizontal .bootstrap-select,
+.form-group .bootstrap-select {
+  margin-bottom: 0;
+}
+.form-group-lg .bootstrap-select.form-control,
+.form-group-sm .bootstrap-select.form-control {
+  padding: 0;
+}
+.form-group-lg .bootstrap-select.form-control .dropdown-toggle,
+.form-group-sm .bootstrap-select.form-control .dropdown-toggle {
+  height: 100%;
+  font-size: inherit;
+  line-height: inherit;
+  border-radius: inherit;
+}
+.bootstrap-select.form-control-sm .dropdown-toggle,
+.bootstrap-select.form-control-lg .dropdown-toggle {
+  font-size: inherit;
+  line-height: inherit;
+  border-radius: inherit;
+}
+.bootstrap-select.form-control-sm .dropdown-toggle {
+  padding: 0.25rem 0.5rem;
+}
+.bootstrap-select.form-control-lg .dropdown-toggle {
+  padding: 0.5rem 1rem;
+}
+.form-inline .bootstrap-select .form-control {
+  width: 100%;
+}
+.bootstrap-select.disabled,
+.bootstrap-select > .disabled {
+  cursor: not-allowed;
+}
+.bootstrap-select.disabled:focus,
+.bootstrap-select > .disabled:focus {
+  outline: none !important;
+}
+.bootstrap-select.bs-container {
+  position: absolute;
+  top: 0;
+  left: 0;
+  height: 0 !important;
+  padding: 0 !important;
+}
+.bootstrap-select.bs-container .dropdown-menu {
+  z-index: 1060;
+}
+.bootstrap-select .dropdown-toggle .filter-option {
+  position: static;
+  top: 0;
+  left: 0;
+  float: left;
+  height: 100%;
+  width: 100%;
+  text-align: left;
+  overflow: hidden;
+  -webkit-box-flex: 0;
+  -webkit-flex: 0 1 auto;
+      -ms-flex: 0 1 auto;
+          flex: 0 1 auto;
+}
+.bs3.bootstrap-select .dropdown-toggle .filter-option {
+  padding-right: inherit;
+}
+.input-group .bs3-has-addon.bootstrap-select .dropdown-toggle .filter-option {
+  position: absolute;
+  padding-top: inherit;
+  padding-bottom: inherit;
+  padding-left: inherit;
+  float: none;
+}
+.input-group .bs3-has-addon.bootstrap-select .dropdown-toggle .filter-option .filter-option-inner {
+  padding-right: inherit;
+}
+.bootstrap-select .dropdown-toggle .filter-option-inner-inner {
+  overflow: hidden;
+}
+.bootstrap-select .dropdown-toggle .filter-expand {
+  width: 0 !important;
+  float: left;
+  opacity: 0 !important;
+  overflow: hidden;
+}
+.bootstrap-select .dropdown-toggle .caret {
+  position: absolute;
+  top: 50%;
+  right: 12px;
+  margin-top: -2px;
+  vertical-align: middle;
+}
+.input-group .bootstrap-select.form-control .dropdown-toggle {
+  border-radius: inherit;
+}
+.bootstrap-select[class*="col-"] .dropdown-toggle {
+  width: 100%;
+}
+.bootstrap-select .dropdown-menu {
+  min-width: 100%;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+.bootstrap-select .dropdown-menu > .inner:focus {
+  outline: none !important;
+}
+.bootstrap-select .dropdown-menu.inner {
+  position: static;
+  float: none;
+  border: 0;
+  padding: 0;
+  margin: 0;
+  border-radius: 0;
+  -webkit-box-shadow: none;
+          box-shadow: none;
+}
+.bootstrap-select .dropdown-menu li {
+  position: relative;
+}
+.bootstrap-select .dropdown-menu li.active small {
+  color: rgba(255, 255, 255, 0.5) !important;
+}
+.bootstrap-select .dropdown-menu li.disabled a {
+  cursor: not-allowed;
+}
+.bootstrap-select .dropdown-menu li a {
+  cursor: pointer;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+}
+.bootstrap-select .dropdown-menu li a.opt {
+  position: relative;
+  padding-left: 2.25em;
+}
+.bootstrap-select .dropdown-menu li a span.check-mark {
+  display: none;
+}
+.bootstrap-select .dropdown-menu li a span.text {
+  display: inline-block;
+}
+.bootstrap-select .dropdown-menu li small {
+  padding-left: 0.5em;
+}
+.bootstrap-select .dropdown-menu .notify {
+  position: absolute;
+  bottom: 5px;
+  width: 96%;
+  margin: 0 2%;
+  min-height: 26px;
+  padding: 3px 5px;
+  background: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+  pointer-events: none;
+  opacity: 0.9;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+.bootstrap-select .no-results {
+  padding: 3px;
+  background: #f5f5f5;
+  margin: 0 5px;
+  white-space: nowrap;
+}
+.bootstrap-select.fit-width .dropdown-toggle .filter-option {
+  position: static;
+  display: inline;
+  padding: 0;
+  width: auto;
+}
+.bootstrap-select.fit-width .dropdown-toggle .filter-option-inner,
+.bootstrap-select.fit-width .dropdown-toggle .filter-option-inner-inner {
+  display: inline;
+}
+.bootstrap-select.fit-width .dropdown-toggle .bs-caret:before {
+  content: '\00a0';
+}
+.bootstrap-select.fit-width .dropdown-toggle .caret {
+  position: static;
+  top: auto;
+  margin-top: -1px;
+}
+.bootstrap-select.show-tick .dropdown-menu .selected span.check-mark {
+  position: absolute;
+  display: inline-block;
+  right: 15px;
+  top: 5px;
+}
+.bootstrap-select.show-tick .dropdown-menu li a span.text {
+  margin-right: 34px;
+}
+.bootstrap-select .bs-ok-default:after {
+  content: '';
+  display: block;
+  width: 0.5em;
+  height: 1em;
+  border-style: solid;
+  border-width: 0 0.26em 0.26em 0;
+  -webkit-transform: rotate(45deg);
+      -ms-transform: rotate(45deg);
+       -o-transform: rotate(45deg);
+          transform: rotate(45deg);
+}
+.bootstrap-select.show-menu-arrow.open > .dropdown-toggle,
+.bootstrap-select.show-menu-arrow.show > .dropdown-toggle {
+  z-index: 1061;
+}
+.bootstrap-select.show-menu-arrow .dropdown-toggle .filter-option:before {
+  content: '';
+  border-left: 7px solid transparent;
+  border-right: 7px solid transparent;
+  border-bottom: 7px solid rgba(204, 204, 204, 0.2);
+  position: absolute;
+  bottom: -4px;
+  left: 9px;
+  display: none;
+}
+.bootstrap-select.show-menu-arrow .dropdown-toggle .filter-option:after {
+  content: '';
+  border-left: 6px solid transparent;
+  border-right: 6px solid transparent;
+  border-bottom: 6px solid white;
+  position: absolute;
+  bottom: -4px;
+  left: 10px;
+  display: none;
+}
+.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle .filter-option:before {
+  bottom: auto;
+  top: -4px;
+  border-top: 7px solid rgba(204, 204, 204, 0.2);
+  border-bottom: 0;
+}
+.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle .filter-option:after {
+  bottom: auto;
+  top: -4px;
+  border-top: 6px solid white;
+  border-bottom: 0;
+}
+.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle .filter-option:before {
+  right: 12px;
+  left: auto;
+}
+.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle .filter-option:after {
+  right: 13px;
+  left: auto;
+}
+.bootstrap-select.show-menu-arrow.open > .dropdown-toggle .filter-option:before,
+.bootstrap-select.show-menu-arrow.show > .dropdown-toggle .filter-option:before,
+.bootstrap-select.show-menu-arrow.open > .dropdown-toggle .filter-option:after,
+.bootstrap-select.show-menu-arrow.show > .dropdown-toggle .filter-option:after {
+  display: block;
+}
+.bs-searchbox,
+.bs-actionsbox,
+.bs-donebutton {
+  padding: 4px 8px;
+}
+.bs-actionsbox {
+  width: 100%;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+.bs-actionsbox .btn-group button {
+  width: 50%;
+}
+.bs-donebutton {
+  float: left;
+  width: 100%;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+.bs-donebutton .btn-group button {
+  width: 100%;
+}
+.bs-searchbox + .bs-actionsbox {
+  padding: 0 8px 4px;
+}
+.bs-searchbox .form-control {
+  margin-bottom: 0;
+  width: 100%;
+  float: none;
+}
+/*# sourceMappingURL=bootstrap-select.css.map */

File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/css/bootstrap-select/bootstrap-select.css.map


File diff suppressed because it is too large
+ 5 - 0
src/main/resources/static/css/bootstrap-select/bootstrap-select.min.css


+ 3719 - 0
src/main/resources/static/css/bootstrap/bootstrap-grid.css

@@ -0,0 +1,3719 @@
+/*!
+ * Bootstrap Grid v4.3.1 (https://getbootstrap.com/)
+ * Copyright 2011-2019 The Bootstrap Authors
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+html {
+  box-sizing: border-box;
+  -ms-overflow-style: scrollbar;
+}
+
+*,
+*::before,
+*::after {
+  box-sizing: inherit;
+}
+
+.container {
+  width: 100%;
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-right: auto;
+  margin-left: auto;
+}
+
+@media (min-width: 576px) {
+  .container {
+    max-width: 540px;
+  }
+}
+
+@media (min-width: 768px) {
+  .container {
+    max-width: 720px;
+  }
+}
+
+@media (min-width: 992px) {
+  .container {
+    max-width: 960px;
+  }
+}
+
+@media (min-width: 1200px) {
+  .container {
+    max-width: 1140px;
+  }
+}
+
+.container-fluid {
+  width: 100%;
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-right: auto;
+  margin-left: auto;
+}
+
+.row {
+  display: -ms-flexbox;
+  display: flex;
+  -ms-flex-wrap: wrap;
+  flex-wrap: wrap;
+  margin-right: -15px;
+  margin-left: -15px;
+}
+
+.no-gutters {
+  margin-right: 0;
+  margin-left: 0;
+}
+
+.no-gutters > .col,
+.no-gutters > [class*="col-"] {
+  padding-right: 0;
+  padding-left: 0;
+}
+
+.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+.col-xl-auto {
+  position: relative;
+  width: 100%;
+  padding-right: 15px;
+  padding-left: 15px;
+}
+
+.col {
+  -ms-flex-preferred-size: 0;
+  flex-basis: 0;
+  -ms-flex-positive: 1;
+  flex-grow: 1;
+  max-width: 100%;
+}
+
+.col-auto {
+  -ms-flex: 0 0 auto;
+  flex: 0 0 auto;
+  width: auto;
+  max-width: 100%;
+}
+
+.col-1 {
+  -ms-flex: 0 0 8.333333%;
+  flex: 0 0 8.333333%;
+  max-width: 8.333333%;
+}
+
+.col-2 {
+  -ms-flex: 0 0 16.666667%;
+  flex: 0 0 16.666667%;
+  max-width: 16.666667%;
+}
+
+.col-3 {
+  -ms-flex: 0 0 25%;
+  flex: 0 0 25%;
+  max-width: 25%;
+}
+
+.col-4 {
+  -ms-flex: 0 0 33.333333%;
+  flex: 0 0 33.333333%;
+  max-width: 33.333333%;
+}
+
+.col-5 {
+  -ms-flex: 0 0 41.666667%;
+  flex: 0 0 41.666667%;
+  max-width: 41.666667%;
+}
+
+.col-6 {
+  -ms-flex: 0 0 50%;
+  flex: 0 0 50%;
+  max-width: 50%;
+}
+
+.col-7 {
+  -ms-flex: 0 0 58.333333%;
+  flex: 0 0 58.333333%;
+  max-width: 58.333333%;
+}
+
+.col-8 {
+  -ms-flex: 0 0 66.666667%;
+  flex: 0 0 66.666667%;
+  max-width: 66.666667%;
+}
+
+.col-9 {
+  -ms-flex: 0 0 75%;
+  flex: 0 0 75%;
+  max-width: 75%;
+}
+
+.col-10 {
+  -ms-flex: 0 0 83.333333%;
+  flex: 0 0 83.333333%;
+  max-width: 83.333333%;
+}
+
+.col-11 {
+  -ms-flex: 0 0 91.666667%;
+  flex: 0 0 91.666667%;
+  max-width: 91.666667%;
+}
+
+.col-12 {
+  -ms-flex: 0 0 100%;
+  flex: 0 0 100%;
+  max-width: 100%;
+}
+
+.order-first {
+  -ms-flex-order: -1;
+  order: -1;
+}
+
+.order-last {
+  -ms-flex-order: 13;
+  order: 13;
+}
+
+.order-0 {
+  -ms-flex-order: 0;
+  order: 0;
+}
+
+.order-1 {
+  -ms-flex-order: 1;
+  order: 1;
+}
+
+.order-2 {
+  -ms-flex-order: 2;
+  order: 2;
+}
+
+.order-3 {
+  -ms-flex-order: 3;
+  order: 3;
+}
+
+.order-4 {
+  -ms-flex-order: 4;
+  order: 4;
+}
+
+.order-5 {
+  -ms-flex-order: 5;
+  order: 5;
+}
+
+.order-6 {
+  -ms-flex-order: 6;
+  order: 6;
+}
+
+.order-7 {
+  -ms-flex-order: 7;
+  order: 7;
+}
+
+.order-8 {
+  -ms-flex-order: 8;
+  order: 8;
+}
+
+.order-9 {
+  -ms-flex-order: 9;
+  order: 9;
+}
+
+.order-10 {
+  -ms-flex-order: 10;
+  order: 10;
+}
+
+.order-11 {
+  -ms-flex-order: 11;
+  order: 11;
+}
+
+.order-12 {
+  -ms-flex-order: 12;
+  order: 12;
+}
+
+.offset-1 {
+  margin-left: 8.333333%;
+}
+
+.offset-2 {
+  margin-left: 16.666667%;
+}
+
+.offset-3 {
+  margin-left: 25%;
+}
+
+.offset-4 {
+  margin-left: 33.333333%;
+}
+
+.offset-5 {
+  margin-left: 41.666667%;
+}
+
+.offset-6 {
+  margin-left: 50%;
+}
+
+.offset-7 {
+  margin-left: 58.333333%;
+}
+
+.offset-8 {
+  margin-left: 66.666667%;
+}
+
+.offset-9 {
+  margin-left: 75%;
+}
+
+.offset-10 {
+  margin-left: 83.333333%;
+}
+
+.offset-11 {
+  margin-left: 91.666667%;
+}
+
+@media (min-width: 576px) {
+  .col-sm {
+    -ms-flex-preferred-size: 0;
+    flex-basis: 0;
+    -ms-flex-positive: 1;
+    flex-grow: 1;
+    max-width: 100%;
+  }
+  .col-sm-auto {
+    -ms-flex: 0 0 auto;
+    flex: 0 0 auto;
+    width: auto;
+    max-width: 100%;
+  }
+  .col-sm-1 {
+    -ms-flex: 0 0 8.333333%;
+    flex: 0 0 8.333333%;
+    max-width: 8.333333%;
+  }
+  .col-sm-2 {
+    -ms-flex: 0 0 16.666667%;
+    flex: 0 0 16.666667%;
+    max-width: 16.666667%;
+  }
+  .col-sm-3 {
+    -ms-flex: 0 0 25%;
+    flex: 0 0 25%;
+    max-width: 25%;
+  }
+  .col-sm-4 {
+    -ms-flex: 0 0 33.333333%;
+    flex: 0 0 33.333333%;
+    max-width: 33.333333%;
+  }
+  .col-sm-5 {
+    -ms-flex: 0 0 41.666667%;
+    flex: 0 0 41.666667%;
+    max-width: 41.666667%;
+  }
+  .col-sm-6 {
+    -ms-flex: 0 0 50%;
+    flex: 0 0 50%;
+    max-width: 50%;
+  }
+  .col-sm-7 {
+    -ms-flex: 0 0 58.333333%;
+    flex: 0 0 58.333333%;
+    max-width: 58.333333%;
+  }
+  .col-sm-8 {
+    -ms-flex: 0 0 66.666667%;
+    flex: 0 0 66.666667%;
+    max-width: 66.666667%;
+  }
+  .col-sm-9 {
+    -ms-flex: 0 0 75%;
+    flex: 0 0 75%;
+    max-width: 75%;
+  }
+  .col-sm-10 {
+    -ms-flex: 0 0 83.333333%;
+    flex: 0 0 83.333333%;
+    max-width: 83.333333%;
+  }
+  .col-sm-11 {
+    -ms-flex: 0 0 91.666667%;
+    flex: 0 0 91.666667%;
+    max-width: 91.666667%;
+  }
+  .col-sm-12 {
+    -ms-flex: 0 0 100%;
+    flex: 0 0 100%;
+    max-width: 100%;
+  }
+  .order-sm-first {
+    -ms-flex-order: -1;
+    order: -1;
+  }
+  .order-sm-last {
+    -ms-flex-order: 13;
+    order: 13;
+  }
+  .order-sm-0 {
+    -ms-flex-order: 0;
+    order: 0;
+  }
+  .order-sm-1 {
+    -ms-flex-order: 1;
+    order: 1;
+  }
+  .order-sm-2 {
+    -ms-flex-order: 2;
+    order: 2;
+  }
+  .order-sm-3 {
+    -ms-flex-order: 3;
+    order: 3;
+  }
+  .order-sm-4 {
+    -ms-flex-order: 4;
+    order: 4;
+  }
+  .order-sm-5 {
+    -ms-flex-order: 5;
+    order: 5;
+  }
+  .order-sm-6 {
+    -ms-flex-order: 6;
+    order: 6;
+  }
+  .order-sm-7 {
+    -ms-flex-order: 7;
+    order: 7;
+  }
+  .order-sm-8 {
+    -ms-flex-order: 8;
+    order: 8;
+  }
+  .order-sm-9 {
+    -ms-flex-order: 9;
+    order: 9;
+  }
+  .order-sm-10 {
+    -ms-flex-order: 10;
+    order: 10;
+  }
+  .order-sm-11 {
+    -ms-flex-order: 11;
+    order: 11;
+  }
+  .order-sm-12 {
+    -ms-flex-order: 12;
+    order: 12;
+  }
+  .offset-sm-0 {
+    margin-left: 0;
+  }
+  .offset-sm-1 {
+    margin-left: 8.333333%;
+  }
+  .offset-sm-2 {
+    margin-left: 16.666667%;
+  }
+  .offset-sm-3 {
+    margin-left: 25%;
+  }
+  .offset-sm-4 {
+    margin-left: 33.333333%;
+  }
+  .offset-sm-5 {
+    margin-left: 41.666667%;
+  }
+  .offset-sm-6 {
+    margin-left: 50%;
+  }
+  .offset-sm-7 {
+    margin-left: 58.333333%;
+  }
+  .offset-sm-8 {
+    margin-left: 66.666667%;
+  }
+  .offset-sm-9 {
+    margin-left: 75%;
+  }
+  .offset-sm-10 {
+    margin-left: 83.333333%;
+  }
+  .offset-sm-11 {
+    margin-left: 91.666667%;
+  }
+}
+
+@media (min-width: 768px) {
+  .col-md {
+    -ms-flex-preferred-size: 0;
+    flex-basis: 0;
+    -ms-flex-positive: 1;
+    flex-grow: 1;
+    max-width: 100%;
+  }
+  .col-md-auto {
+    -ms-flex: 0 0 auto;
+    flex: 0 0 auto;
+    width: auto;
+    max-width: 100%;
+  }
+  .col-md-1 {
+    -ms-flex: 0 0 8.333333%;
+    flex: 0 0 8.333333%;
+    max-width: 8.333333%;
+  }
+  .col-md-2 {
+    -ms-flex: 0 0 16.666667%;
+    flex: 0 0 16.666667%;
+    max-width: 16.666667%;
+  }
+  .col-md-3 {
+    -ms-flex: 0 0 25%;
+    flex: 0 0 25%;
+    max-width: 25%;
+  }
+  .col-md-4 {
+    -ms-flex: 0 0 33.333333%;
+    flex: 0 0 33.333333%;
+    max-width: 33.333333%;
+  }
+  .col-md-5 {
+    -ms-flex: 0 0 41.666667%;
+    flex: 0 0 41.666667%;
+    max-width: 41.666667%;
+  }
+  .col-md-6 {
+    -ms-flex: 0 0 50%;
+    flex: 0 0 50%;
+    max-width: 50%;
+  }
+  .col-md-7 {
+    -ms-flex: 0 0 58.333333%;
+    flex: 0 0 58.333333%;
+    max-width: 58.333333%;
+  }
+  .col-md-8 {
+    -ms-flex: 0 0 66.666667%;
+    flex: 0 0 66.666667%;
+    max-width: 66.666667%;
+  }
+  .col-md-9 {
+    -ms-flex: 0 0 75%;
+    flex: 0 0 75%;
+    max-width: 75%;
+  }
+  .col-md-10 {
+    -ms-flex: 0 0 83.333333%;
+    flex: 0 0 83.333333%;
+    max-width: 83.333333%;
+  }
+  .col-md-11 {
+    -ms-flex: 0 0 91.666667%;
+    flex: 0 0 91.666667%;
+    max-width: 91.666667%;
+  }
+  .col-md-12 {
+    -ms-flex: 0 0 100%;
+    flex: 0 0 100%;
+    max-width: 100%;
+  }
+  .order-md-first {
+    -ms-flex-order: -1;
+    order: -1;
+  }
+  .order-md-last {
+    -ms-flex-order: 13;
+    order: 13;
+  }
+  .order-md-0 {
+    -ms-flex-order: 0;
+    order: 0;
+  }
+  .order-md-1 {
+    -ms-flex-order: 1;
+    order: 1;
+  }
+  .order-md-2 {
+    -ms-flex-order: 2;
+    order: 2;
+  }
+  .order-md-3 {
+    -ms-flex-order: 3;
+    order: 3;
+  }
+  .order-md-4 {
+    -ms-flex-order: 4;
+    order: 4;
+  }
+  .order-md-5 {
+    -ms-flex-order: 5;
+    order: 5;
+  }
+  .order-md-6 {
+    -ms-flex-order: 6;
+    order: 6;
+  }
+  .order-md-7 {
+    -ms-flex-order: 7;
+    order: 7;
+  }
+  .order-md-8 {
+    -ms-flex-order: 8;
+    order: 8;
+  }
+  .order-md-9 {
+    -ms-flex-order: 9;
+    order: 9;
+  }
+  .order-md-10 {
+    -ms-flex-order: 10;
+    order: 10;
+  }
+  .order-md-11 {
+    -ms-flex-order: 11;
+    order: 11;
+  }
+  .order-md-12 {
+    -ms-flex-order: 12;
+    order: 12;
+  }
+  .offset-md-0 {
+    margin-left: 0;
+  }
+  .offset-md-1 {
+    margin-left: 8.333333%;
+  }
+  .offset-md-2 {
+    margin-left: 16.666667%;
+  }
+  .offset-md-3 {
+    margin-left: 25%;
+  }
+  .offset-md-4 {
+    margin-left: 33.333333%;
+  }
+  .offset-md-5 {
+    margin-left: 41.666667%;
+  }
+  .offset-md-6 {
+    margin-left: 50%;
+  }
+  .offset-md-7 {
+    margin-left: 58.333333%;
+  }
+  .offset-md-8 {
+    margin-left: 66.666667%;
+  }
+  .offset-md-9 {
+    margin-left: 75%;
+  }
+  .offset-md-10 {
+    margin-left: 83.333333%;
+  }
+  .offset-md-11 {
+    margin-left: 91.666667%;
+  }
+}
+
+@media (min-width: 992px) {
+  .col-lg {
+    -ms-flex-preferred-size: 0;
+    flex-basis: 0;
+    -ms-flex-positive: 1;
+    flex-grow: 1;
+    max-width: 100%;
+  }
+  .col-lg-auto {
+    -ms-flex: 0 0 auto;
+    flex: 0 0 auto;
+    width: auto;
+    max-width: 100%;
+  }
+  .col-lg-1 {
+    -ms-flex: 0 0 8.333333%;
+    flex: 0 0 8.333333%;
+    max-width: 8.333333%;
+  }
+  .col-lg-2 {
+    -ms-flex: 0 0 16.666667%;
+    flex: 0 0 16.666667%;
+    max-width: 16.666667%;
+  }
+  .col-lg-3 {
+    -ms-flex: 0 0 25%;
+    flex: 0 0 25%;
+    max-width: 25%;
+  }
+  .col-lg-4 {
+    -ms-flex: 0 0 33.333333%;
+    flex: 0 0 33.333333%;
+    max-width: 33.333333%;
+  }
+  .col-lg-5 {
+    -ms-flex: 0 0 41.666667%;
+    flex: 0 0 41.666667%;
+    max-width: 41.666667%;
+  }
+  .col-lg-6 {
+    -ms-flex: 0 0 50%;
+    flex: 0 0 50%;
+    max-width: 50%;
+  }
+  .col-lg-7 {
+    -ms-flex: 0 0 58.333333%;
+    flex: 0 0 58.333333%;
+    max-width: 58.333333%;
+  }
+  .col-lg-8 {
+    -ms-flex: 0 0 66.666667%;
+    flex: 0 0 66.666667%;
+    max-width: 66.666667%;
+  }
+  .col-lg-9 {
+    -ms-flex: 0 0 75%;
+    flex: 0 0 75%;
+    max-width: 75%;
+  }
+  .col-lg-10 {
+    -ms-flex: 0 0 83.333333%;
+    flex: 0 0 83.333333%;
+    max-width: 83.333333%;
+  }
+  .col-lg-11 {
+    -ms-flex: 0 0 91.666667%;
+    flex: 0 0 91.666667%;
+    max-width: 91.666667%;
+  }
+  .col-lg-12 {
+    -ms-flex: 0 0 100%;
+    flex: 0 0 100%;
+    max-width: 100%;
+  }
+  .order-lg-first {
+    -ms-flex-order: -1;
+    order: -1;
+  }
+  .order-lg-last {
+    -ms-flex-order: 13;
+    order: 13;
+  }
+  .order-lg-0 {
+    -ms-flex-order: 0;
+    order: 0;
+  }
+  .order-lg-1 {
+    -ms-flex-order: 1;
+    order: 1;
+  }
+  .order-lg-2 {
+    -ms-flex-order: 2;
+    order: 2;
+  }
+  .order-lg-3 {
+    -ms-flex-order: 3;
+    order: 3;
+  }
+  .order-lg-4 {
+    -ms-flex-order: 4;
+    order: 4;
+  }
+  .order-lg-5 {
+    -ms-flex-order: 5;
+    order: 5;
+  }
+  .order-lg-6 {
+    -ms-flex-order: 6;
+    order: 6;
+  }
+  .order-lg-7 {
+    -ms-flex-order: 7;
+    order: 7;
+  }
+  .order-lg-8 {
+    -ms-flex-order: 8;
+    order: 8;
+  }
+  .order-lg-9 {
+    -ms-flex-order: 9;
+    order: 9;
+  }
+  .order-lg-10 {
+    -ms-flex-order: 10;
+    order: 10;
+  }
+  .order-lg-11 {
+    -ms-flex-order: 11;
+    order: 11;
+  }
+  .order-lg-12 {
+    -ms-flex-order: 12;
+    order: 12;
+  }
+  .offset-lg-0 {
+    margin-left: 0;
+  }
+  .offset-lg-1 {
+    margin-left: 8.333333%;
+  }
+  .offset-lg-2 {
+    margin-left: 16.666667%;
+  }
+  .offset-lg-3 {
+    margin-left: 25%;
+  }
+  .offset-lg-4 {
+    margin-left: 33.333333%;
+  }
+  .offset-lg-5 {
+    margin-left: 41.666667%;
+  }
+  .offset-lg-6 {
+    margin-left: 50%;
+  }
+  .offset-lg-7 {
+    margin-left: 58.333333%;
+  }
+  .offset-lg-8 {
+    margin-left: 66.666667%;
+  }
+  .offset-lg-9 {
+    margin-left: 75%;
+  }
+  .offset-lg-10 {
+    margin-left: 83.333333%;
+  }
+  .offset-lg-11 {
+    margin-left: 91.666667%;
+  }
+}
+
+@media (min-width: 1200px) {
+  .col-xl {
+    -ms-flex-preferred-size: 0;
+    flex-basis: 0;
+    -ms-flex-positive: 1;
+    flex-grow: 1;
+    max-width: 100%;
+  }
+  .col-xl-auto {
+    -ms-flex: 0 0 auto;
+    flex: 0 0 auto;
+    width: auto;
+    max-width: 100%;
+  }
+  .col-xl-1 {
+    -ms-flex: 0 0 8.333333%;
+    flex: 0 0 8.333333%;
+    max-width: 8.333333%;
+  }
+  .col-xl-2 {
+    -ms-flex: 0 0 16.666667%;
+    flex: 0 0 16.666667%;
+    max-width: 16.666667%;
+  }
+  .col-xl-3 {
+    -ms-flex: 0 0 25%;
+    flex: 0 0 25%;
+    max-width: 25%;
+  }
+  .col-xl-4 {
+    -ms-flex: 0 0 33.333333%;
+    flex: 0 0 33.333333%;
+    max-width: 33.333333%;
+  }
+  .col-xl-5 {
+    -ms-flex: 0 0 41.666667%;
+    flex: 0 0 41.666667%;
+    max-width: 41.666667%;
+  }
+  .col-xl-6 {
+    -ms-flex: 0 0 50%;
+    flex: 0 0 50%;
+    max-width: 50%;
+  }
+  .col-xl-7 {
+    -ms-flex: 0 0 58.333333%;
+    flex: 0 0 58.333333%;
+    max-width: 58.333333%;
+  }
+  .col-xl-8 {
+    -ms-flex: 0 0 66.666667%;
+    flex: 0 0 66.666667%;
+    max-width: 66.666667%;
+  }
+  .col-xl-9 {
+    -ms-flex: 0 0 75%;
+    flex: 0 0 75%;
+    max-width: 75%;
+  }
+  .col-xl-10 {
+    -ms-flex: 0 0 83.333333%;
+    flex: 0 0 83.333333%;
+    max-width: 83.333333%;
+  }
+  .col-xl-11 {
+    -ms-flex: 0 0 91.666667%;
+    flex: 0 0 91.666667%;
+    max-width: 91.666667%;
+  }
+  .col-xl-12 {
+    -ms-flex: 0 0 100%;
+    flex: 0 0 100%;
+    max-width: 100%;
+  }
+  .order-xl-first {
+    -ms-flex-order: -1;
+    order: -1;
+  }
+  .order-xl-last {
+    -ms-flex-order: 13;
+    order: 13;
+  }
+  .order-xl-0 {
+    -ms-flex-order: 0;
+    order: 0;
+  }
+  .order-xl-1 {
+    -ms-flex-order: 1;
+    order: 1;
+  }
+  .order-xl-2 {
+    -ms-flex-order: 2;
+    order: 2;
+  }
+  .order-xl-3 {
+    -ms-flex-order: 3;
+    order: 3;
+  }
+  .order-xl-4 {
+    -ms-flex-order: 4;
+    order: 4;
+  }
+  .order-xl-5 {
+    -ms-flex-order: 5;
+    order: 5;
+  }
+  .order-xl-6 {
+    -ms-flex-order: 6;
+    order: 6;
+  }
+  .order-xl-7 {
+    -ms-flex-order: 7;
+    order: 7;
+  }
+  .order-xl-8 {
+    -ms-flex-order: 8;
+    order: 8;
+  }
+  .order-xl-9 {
+    -ms-flex-order: 9;
+    order: 9;
+  }
+  .order-xl-10 {
+    -ms-flex-order: 10;
+    order: 10;
+  }
+  .order-xl-11 {
+    -ms-flex-order: 11;
+    order: 11;
+  }
+  .order-xl-12 {
+    -ms-flex-order: 12;
+    order: 12;
+  }
+  .offset-xl-0 {
+    margin-left: 0;
+  }
+  .offset-xl-1 {
+    margin-left: 8.333333%;
+  }
+  .offset-xl-2 {
+    margin-left: 16.666667%;
+  }
+  .offset-xl-3 {
+    margin-left: 25%;
+  }
+  .offset-xl-4 {
+    margin-left: 33.333333%;
+  }
+  .offset-xl-5 {
+    margin-left: 41.666667%;
+  }
+  .offset-xl-6 {
+    margin-left: 50%;
+  }
+  .offset-xl-7 {
+    margin-left: 58.333333%;
+  }
+  .offset-xl-8 {
+    margin-left: 66.666667%;
+  }
+  .offset-xl-9 {
+    margin-left: 75%;
+  }
+  .offset-xl-10 {
+    margin-left: 83.333333%;
+  }
+  .offset-xl-11 {
+    margin-left: 91.666667%;
+  }
+}
+
+.d-none {
+  display: none !important;
+}
+
+.d-inline {
+  display: inline !important;
+}
+
+.d-inline-block {
+  display: inline-block !important;
+}
+
+.d-block {
+  display: block !important;
+}
+
+.d-table {
+  display: table !important;
+}
+
+.d-table-row {
+  display: table-row !important;
+}
+
+.d-table-cell {
+  display: table-cell !important;
+}
+
+.d-flex {
+  display: -ms-flexbox !important;
+  display: flex !important;
+}
+
+.d-inline-flex {
+  display: -ms-inline-flexbox !important;
+  display: inline-flex !important;
+}
+
+@media (min-width: 576px) {
+  .d-sm-none {
+    display: none !important;
+  }
+  .d-sm-inline {
+    display: inline !important;
+  }
+  .d-sm-inline-block {
+    display: inline-block !important;
+  }
+  .d-sm-block {
+    display: block !important;
+  }
+  .d-sm-table {
+    display: table !important;
+  }
+  .d-sm-table-row {
+    display: table-row !important;
+  }
+  .d-sm-table-cell {
+    display: table-cell !important;
+  }
+  .d-sm-flex {
+    display: -ms-flexbox !important;
+    display: flex !important;
+  }
+  .d-sm-inline-flex {
+    display: -ms-inline-flexbox !important;
+    display: inline-flex !important;
+  }
+}
+
+@media (min-width: 768px) {
+  .d-md-none {
+    display: none !important;
+  }
+  .d-md-inline {
+    display: inline !important;
+  }
+  .d-md-inline-block {
+    display: inline-block !important;
+  }
+  .d-md-block {
+    display: block !important;
+  }
+  .d-md-table {
+    display: table !important;
+  }
+  .d-md-table-row {
+    display: table-row !important;
+  }
+  .d-md-table-cell {
+    display: table-cell !important;
+  }
+  .d-md-flex {
+    display: -ms-flexbox !important;
+    display: flex !important;
+  }
+  .d-md-inline-flex {
+    display: -ms-inline-flexbox !important;
+    display: inline-flex !important;
+  }
+}
+
+@media (min-width: 992px) {
+  .d-lg-none {
+    display: none !important;
+  }
+  .d-lg-inline {
+    display: inline !important;
+  }
+  .d-lg-inline-block {
+    display: inline-block !important;
+  }
+  .d-lg-block {
+    display: block !important;
+  }
+  .d-lg-table {
+    display: table !important;
+  }
+  .d-lg-table-row {
+    display: table-row !important;
+  }
+  .d-lg-table-cell {
+    display: table-cell !important;
+  }
+  .d-lg-flex {
+    display: -ms-flexbox !important;
+    display: flex !important;
+  }
+  .d-lg-inline-flex {
+    display: -ms-inline-flexbox !important;
+    display: inline-flex !important;
+  }
+}
+
+@media (min-width: 1200px) {
+  .d-xl-none {
+    display: none !important;
+  }
+  .d-xl-inline {
+    display: inline !important;
+  }
+  .d-xl-inline-block {
+    display: inline-block !important;
+  }
+  .d-xl-block {
+    display: block !important;
+  }
+  .d-xl-table {
+    display: table !important;
+  }
+  .d-xl-table-row {
+    display: table-row !important;
+  }
+  .d-xl-table-cell {
+    display: table-cell !important;
+  }
+  .d-xl-flex {
+    display: -ms-flexbox !important;
+    display: flex !important;
+  }
+  .d-xl-inline-flex {
+    display: -ms-inline-flexbox !important;
+    display: inline-flex !important;
+  }
+}
+
+@media print {
+  .d-print-none {
+    display: none !important;
+  }
+  .d-print-inline {
+    display: inline !important;
+  }
+  .d-print-inline-block {
+    display: inline-block !important;
+  }
+  .d-print-block {
+    display: block !important;
+  }
+  .d-print-table {
+    display: table !important;
+  }
+  .d-print-table-row {
+    display: table-row !important;
+  }
+  .d-print-table-cell {
+    display: table-cell !important;
+  }
+  .d-print-flex {
+    display: -ms-flexbox !important;
+    display: flex !important;
+  }
+  .d-print-inline-flex {
+    display: -ms-inline-flexbox !important;
+    display: inline-flex !important;
+  }
+}
+
+.flex-row {
+  -ms-flex-direction: row !important;
+  flex-direction: row !important;
+}
+
+.flex-column {
+  -ms-flex-direction: column !important;
+  flex-direction: column !important;
+}
+
+.flex-row-reverse {
+  -ms-flex-direction: row-reverse !important;
+  flex-direction: row-reverse !important;
+}
+
+.flex-column-reverse {
+  -ms-flex-direction: column-reverse !important;
+  flex-direction: column-reverse !important;
+}
+
+.flex-wrap {
+  -ms-flex-wrap: wrap !important;
+  flex-wrap: wrap !important;
+}
+
+.flex-nowrap {
+  -ms-flex-wrap: nowrap !important;
+  flex-wrap: nowrap !important;
+}
+
+.flex-wrap-reverse {
+  -ms-flex-wrap: wrap-reverse !important;
+  flex-wrap: wrap-reverse !important;
+}
+
+.flex-fill {
+  -ms-flex: 1 1 auto !important;
+  flex: 1 1 auto !important;
+}
+
+.flex-grow-0 {
+  -ms-flex-positive: 0 !important;
+  flex-grow: 0 !important;
+}
+
+.flex-grow-1 {
+  -ms-flex-positive: 1 !important;
+  flex-grow: 1 !important;
+}
+
+.flex-shrink-0 {
+  -ms-flex-negative: 0 !important;
+  flex-shrink: 0 !important;
+}
+
+.flex-shrink-1 {
+  -ms-flex-negative: 1 !important;
+  flex-shrink: 1 !important;
+}
+
+.justify-content-start {
+  -ms-flex-pack: start !important;
+  justify-content: flex-start !important;
+}
+
+.justify-content-end {
+  -ms-flex-pack: end !important;
+  justify-content: flex-end !important;
+}
+
+.justify-content-center {
+  -ms-flex-pack: center !important;
+  justify-content: center !important;
+}
+
+.justify-content-between {
+  -ms-flex-pack: justify !important;
+  justify-content: space-between !important;
+}
+
+.justify-content-around {
+  -ms-flex-pack: distribute !important;
+  justify-content: space-around !important;
+}
+
+.align-items-start {
+  -ms-flex-align: start !important;
+  align-items: flex-start !important;
+}
+
+.align-items-end {
+  -ms-flex-align: end !important;
+  align-items: flex-end !important;
+}
+
+.align-items-center {
+  -ms-flex-align: center !important;
+  align-items: center !important;
+}
+
+.align-items-baseline {
+  -ms-flex-align: baseline !important;
+  align-items: baseline !important;
+}
+
+.align-items-stretch {
+  -ms-flex-align: stretch !important;
+  align-items: stretch !important;
+}
+
+.align-content-start {
+  -ms-flex-line-pack: start !important;
+  align-content: flex-start !important;
+}
+
+.align-content-end {
+  -ms-flex-line-pack: end !important;
+  align-content: flex-end !important;
+}
+
+.align-content-center {
+  -ms-flex-line-pack: center !important;
+  align-content: center !important;
+}
+
+.align-content-between {
+  -ms-flex-line-pack: justify !important;
+  align-content: space-between !important;
+}
+
+.align-content-around {
+  -ms-flex-line-pack: distribute !important;
+  align-content: space-around !important;
+}
+
+.align-content-stretch {
+  -ms-flex-line-pack: stretch !important;
+  align-content: stretch !important;
+}
+
+.align-self-auto {
+  -ms-flex-item-align: auto !important;
+  align-self: auto !important;
+}
+
+.align-self-start {
+  -ms-flex-item-align: start !important;
+  align-self: flex-start !important;
+}
+
+.align-self-end {
+  -ms-flex-item-align: end !important;
+  align-self: flex-end !important;
+}
+
+.align-self-center {
+  -ms-flex-item-align: center !important;
+  align-self: center !important;
+}
+
+.align-self-baseline {
+  -ms-flex-item-align: baseline !important;
+  align-self: baseline !important;
+}
+
+.align-self-stretch {
+  -ms-flex-item-align: stretch !important;
+  align-self: stretch !important;
+}
+
+@media (min-width: 576px) {
+  .flex-sm-row {
+    -ms-flex-direction: row !important;
+    flex-direction: row !important;
+  }
+  .flex-sm-column {
+    -ms-flex-direction: column !important;
+    flex-direction: column !important;
+  }
+  .flex-sm-row-reverse {
+    -ms-flex-direction: row-reverse !important;
+    flex-direction: row-reverse !important;
+  }
+  .flex-sm-column-reverse {
+    -ms-flex-direction: column-reverse !important;
+    flex-direction: column-reverse !important;
+  }
+  .flex-sm-wrap {
+    -ms-flex-wrap: wrap !important;
+    flex-wrap: wrap !important;
+  }
+  .flex-sm-nowrap {
+    -ms-flex-wrap: nowrap !important;
+    flex-wrap: nowrap !important;
+  }
+  .flex-sm-wrap-reverse {
+    -ms-flex-wrap: wrap-reverse !important;
+    flex-wrap: wrap-reverse !important;
+  }
+  .flex-sm-fill {
+    -ms-flex: 1 1 auto !important;
+    flex: 1 1 auto !important;
+  }
+  .flex-sm-grow-0 {
+    -ms-flex-positive: 0 !important;
+    flex-grow: 0 !important;
+  }
+  .flex-sm-grow-1 {
+    -ms-flex-positive: 1 !important;
+    flex-grow: 1 !important;
+  }
+  .flex-sm-shrink-0 {
+    -ms-flex-negative: 0 !important;
+    flex-shrink: 0 !important;
+  }
+  .flex-sm-shrink-1 {
+    -ms-flex-negative: 1 !important;
+    flex-shrink: 1 !important;
+  }
+  .justify-content-sm-start {
+    -ms-flex-pack: start !important;
+    justify-content: flex-start !important;
+  }
+  .justify-content-sm-end {
+    -ms-flex-pack: end !important;
+    justify-content: flex-end !important;
+  }
+  .justify-content-sm-center {
+    -ms-flex-pack: center !important;
+    justify-content: center !important;
+  }
+  .justify-content-sm-between {
+    -ms-flex-pack: justify !important;
+    justify-content: space-between !important;
+  }
+  .justify-content-sm-around {
+    -ms-flex-pack: distribute !important;
+    justify-content: space-around !important;
+  }
+  .align-items-sm-start {
+    -ms-flex-align: start !important;
+    align-items: flex-start !important;
+  }
+  .align-items-sm-end {
+    -ms-flex-align: end !important;
+    align-items: flex-end !important;
+  }
+  .align-items-sm-center {
+    -ms-flex-align: center !important;
+    align-items: center !important;
+  }
+  .align-items-sm-baseline {
+    -ms-flex-align: baseline !important;
+    align-items: baseline !important;
+  }
+  .align-items-sm-stretch {
+    -ms-flex-align: stretch !important;
+    align-items: stretch !important;
+  }
+  .align-content-sm-start {
+    -ms-flex-line-pack: start !important;
+    align-content: flex-start !important;
+  }
+  .align-content-sm-end {
+    -ms-flex-line-pack: end !important;
+    align-content: flex-end !important;
+  }
+  .align-content-sm-center {
+    -ms-flex-line-pack: center !important;
+    align-content: center !important;
+  }
+  .align-content-sm-between {
+    -ms-flex-line-pack: justify !important;
+    align-content: space-between !important;
+  }
+  .align-content-sm-around {
+    -ms-flex-line-pack: distribute !important;
+    align-content: space-around !important;
+  }
+  .align-content-sm-stretch {
+    -ms-flex-line-pack: stretch !important;
+    align-content: stretch !important;
+  }
+  .align-self-sm-auto {
+    -ms-flex-item-align: auto !important;
+    align-self: auto !important;
+  }
+  .align-self-sm-start {
+    -ms-flex-item-align: start !important;
+    align-self: flex-start !important;
+  }
+  .align-self-sm-end {
+    -ms-flex-item-align: end !important;
+    align-self: flex-end !important;
+  }
+  .align-self-sm-center {
+    -ms-flex-item-align: center !important;
+    align-self: center !important;
+  }
+  .align-self-sm-baseline {
+    -ms-flex-item-align: baseline !important;
+    align-self: baseline !important;
+  }
+  .align-self-sm-stretch {
+    -ms-flex-item-align: stretch !important;
+    align-self: stretch !important;
+  }
+}
+
+@media (min-width: 768px) {
+  .flex-md-row {
+    -ms-flex-direction: row !important;
+    flex-direction: row !important;
+  }
+  .flex-md-column {
+    -ms-flex-direction: column !important;
+    flex-direction: column !important;
+  }
+  .flex-md-row-reverse {
+    -ms-flex-direction: row-reverse !important;
+    flex-direction: row-reverse !important;
+  }
+  .flex-md-column-reverse {
+    -ms-flex-direction: column-reverse !important;
+    flex-direction: column-reverse !important;
+  }
+  .flex-md-wrap {
+    -ms-flex-wrap: wrap !important;
+    flex-wrap: wrap !important;
+  }
+  .flex-md-nowrap {
+    -ms-flex-wrap: nowrap !important;
+    flex-wrap: nowrap !important;
+  }
+  .flex-md-wrap-reverse {
+    -ms-flex-wrap: wrap-reverse !important;
+    flex-wrap: wrap-reverse !important;
+  }
+  .flex-md-fill {
+    -ms-flex: 1 1 auto !important;
+    flex: 1 1 auto !important;
+  }
+  .flex-md-grow-0 {
+    -ms-flex-positive: 0 !important;
+    flex-grow: 0 !important;
+  }
+  .flex-md-grow-1 {
+    -ms-flex-positive: 1 !important;
+    flex-grow: 1 !important;
+  }
+  .flex-md-shrink-0 {
+    -ms-flex-negative: 0 !important;
+    flex-shrink: 0 !important;
+  }
+  .flex-md-shrink-1 {
+    -ms-flex-negative: 1 !important;
+    flex-shrink: 1 !important;
+  }
+  .justify-content-md-start {
+    -ms-flex-pack: start !important;
+    justify-content: flex-start !important;
+  }
+  .justify-content-md-end {
+    -ms-flex-pack: end !important;
+    justify-content: flex-end !important;
+  }
+  .justify-content-md-center {
+    -ms-flex-pack: center !important;
+    justify-content: center !important;
+  }
+  .justify-content-md-between {
+    -ms-flex-pack: justify !important;
+    justify-content: space-between !important;
+  }
+  .justify-content-md-around {
+    -ms-flex-pack: distribute !important;
+    justify-content: space-around !important;
+  }
+  .align-items-md-start {
+    -ms-flex-align: start !important;
+    align-items: flex-start !important;
+  }
+  .align-items-md-end {
+    -ms-flex-align: end !important;
+    align-items: flex-end !important;
+  }
+  .align-items-md-center {
+    -ms-flex-align: center !important;
+    align-items: center !important;
+  }
+  .align-items-md-baseline {
+    -ms-flex-align: baseline !important;
+    align-items: baseline !important;
+  }
+  .align-items-md-stretch {
+    -ms-flex-align: stretch !important;
+    align-items: stretch !important;
+  }
+  .align-content-md-start {
+    -ms-flex-line-pack: start !important;
+    align-content: flex-start !important;
+  }
+  .align-content-md-end {
+    -ms-flex-line-pack: end !important;
+    align-content: flex-end !important;
+  }
+  .align-content-md-center {
+    -ms-flex-line-pack: center !important;
+    align-content: center !important;
+  }
+  .align-content-md-between {
+    -ms-flex-line-pack: justify !important;
+    align-content: space-between !important;
+  }
+  .align-content-md-around {
+    -ms-flex-line-pack: distribute !important;
+    align-content: space-around !important;
+  }
+  .align-content-md-stretch {
+    -ms-flex-line-pack: stretch !important;
+    align-content: stretch !important;
+  }
+  .align-self-md-auto {
+    -ms-flex-item-align: auto !important;
+    align-self: auto !important;
+  }
+  .align-self-md-start {
+    -ms-flex-item-align: start !important;
+    align-self: flex-start !important;
+  }
+  .align-self-md-end {
+    -ms-flex-item-align: end !important;
+    align-self: flex-end !important;
+  }
+  .align-self-md-center {
+    -ms-flex-item-align: center !important;
+    align-self: center !important;
+  }
+  .align-self-md-baseline {
+    -ms-flex-item-align: baseline !important;
+    align-self: baseline !important;
+  }
+  .align-self-md-stretch {
+    -ms-flex-item-align: stretch !important;
+    align-self: stretch !important;
+  }
+}
+
+@media (min-width: 992px) {
+  .flex-lg-row {
+    -ms-flex-direction: row !important;
+    flex-direction: row !important;
+  }
+  .flex-lg-column {
+    -ms-flex-direction: column !important;
+    flex-direction: column !important;
+  }
+  .flex-lg-row-reverse {
+    -ms-flex-direction: row-reverse !important;
+    flex-direction: row-reverse !important;
+  }
+  .flex-lg-column-reverse {
+    -ms-flex-direction: column-reverse !important;
+    flex-direction: column-reverse !important;
+  }
+  .flex-lg-wrap {
+    -ms-flex-wrap: wrap !important;
+    flex-wrap: wrap !important;
+  }
+  .flex-lg-nowrap {
+    -ms-flex-wrap: nowrap !important;
+    flex-wrap: nowrap !important;
+  }
+  .flex-lg-wrap-reverse {
+    -ms-flex-wrap: wrap-reverse !important;
+    flex-wrap: wrap-reverse !important;
+  }
+  .flex-lg-fill {
+    -ms-flex: 1 1 auto !important;
+    flex: 1 1 auto !important;
+  }
+  .flex-lg-grow-0 {
+    -ms-flex-positive: 0 !important;
+    flex-grow: 0 !important;
+  }
+  .flex-lg-grow-1 {
+    -ms-flex-positive: 1 !important;
+    flex-grow: 1 !important;
+  }
+  .flex-lg-shrink-0 {
+    -ms-flex-negative: 0 !important;
+    flex-shrink: 0 !important;
+  }
+  .flex-lg-shrink-1 {
+    -ms-flex-negative: 1 !important;
+    flex-shrink: 1 !important;
+  }
+  .justify-content-lg-start {
+    -ms-flex-pack: start !important;
+    justify-content: flex-start !important;
+  }
+  .justify-content-lg-end {
+    -ms-flex-pack: end !important;
+    justify-content: flex-end !important;
+  }
+  .justify-content-lg-center {
+    -ms-flex-pack: center !important;
+    justify-content: center !important;
+  }
+  .justify-content-lg-between {
+    -ms-flex-pack: justify !important;
+    justify-content: space-between !important;
+  }
+  .justify-content-lg-around {
+    -ms-flex-pack: distribute !important;
+    justify-content: space-around !important;
+  }
+  .align-items-lg-start {
+    -ms-flex-align: start !important;
+    align-items: flex-start !important;
+  }
+  .align-items-lg-end {
+    -ms-flex-align: end !important;
+    align-items: flex-end !important;
+  }
+  .align-items-lg-center {
+    -ms-flex-align: center !important;
+    align-items: center !important;
+  }
+  .align-items-lg-baseline {
+    -ms-flex-align: baseline !important;
+    align-items: baseline !important;
+  }
+  .align-items-lg-stretch {
+    -ms-flex-align: stretch !important;
+    align-items: stretch !important;
+  }
+  .align-content-lg-start {
+    -ms-flex-line-pack: start !important;
+    align-content: flex-start !important;
+  }
+  .align-content-lg-end {
+    -ms-flex-line-pack: end !important;
+    align-content: flex-end !important;
+  }
+  .align-content-lg-center {
+    -ms-flex-line-pack: center !important;
+    align-content: center !important;
+  }
+  .align-content-lg-between {
+    -ms-flex-line-pack: justify !important;
+    align-content: space-between !important;
+  }
+  .align-content-lg-around {
+    -ms-flex-line-pack: distribute !important;
+    align-content: space-around !important;
+  }
+  .align-content-lg-stretch {
+    -ms-flex-line-pack: stretch !important;
+    align-content: stretch !important;
+  }
+  .align-self-lg-auto {
+    -ms-flex-item-align: auto !important;
+    align-self: auto !important;
+  }
+  .align-self-lg-start {
+    -ms-flex-item-align: start !important;
+    align-self: flex-start !important;
+  }
+  .align-self-lg-end {
+    -ms-flex-item-align: end !important;
+    align-self: flex-end !important;
+  }
+  .align-self-lg-center {
+    -ms-flex-item-align: center !important;
+    align-self: center !important;
+  }
+  .align-self-lg-baseline {
+    -ms-flex-item-align: baseline !important;
+    align-self: baseline !important;
+  }
+  .align-self-lg-stretch {
+    -ms-flex-item-align: stretch !important;
+    align-self: stretch !important;
+  }
+}
+
+@media (min-width: 1200px) {
+  .flex-xl-row {
+    -ms-flex-direction: row !important;
+    flex-direction: row !important;
+  }
+  .flex-xl-column {
+    -ms-flex-direction: column !important;
+    flex-direction: column !important;
+  }
+  .flex-xl-row-reverse {
+    -ms-flex-direction: row-reverse !important;
+    flex-direction: row-reverse !important;
+  }
+  .flex-xl-column-reverse {
+    -ms-flex-direction: column-reverse !important;
+    flex-direction: column-reverse !important;
+  }
+  .flex-xl-wrap {
+    -ms-flex-wrap: wrap !important;
+    flex-wrap: wrap !important;
+  }
+  .flex-xl-nowrap {
+    -ms-flex-wrap: nowrap !important;
+    flex-wrap: nowrap !important;
+  }
+  .flex-xl-wrap-reverse {
+    -ms-flex-wrap: wrap-reverse !important;
+    flex-wrap: wrap-reverse !important;
+  }
+  .flex-xl-fill {
+    -ms-flex: 1 1 auto !important;
+    flex: 1 1 auto !important;
+  }
+  .flex-xl-grow-0 {
+    -ms-flex-positive: 0 !important;
+    flex-grow: 0 !important;
+  }
+  .flex-xl-grow-1 {
+    -ms-flex-positive: 1 !important;
+    flex-grow: 1 !important;
+  }
+  .flex-xl-shrink-0 {
+    -ms-flex-negative: 0 !important;
+    flex-shrink: 0 !important;
+  }
+  .flex-xl-shrink-1 {
+    -ms-flex-negative: 1 !important;
+    flex-shrink: 1 !important;
+  }
+  .justify-content-xl-start {
+    -ms-flex-pack: start !important;
+    justify-content: flex-start !important;
+  }
+  .justify-content-xl-end {
+    -ms-flex-pack: end !important;
+    justify-content: flex-end !important;
+  }
+  .justify-content-xl-center {
+    -ms-flex-pack: center !important;
+    justify-content: center !important;
+  }
+  .justify-content-xl-between {
+    -ms-flex-pack: justify !important;
+    justify-content: space-between !important;
+  }
+  .justify-content-xl-around {
+    -ms-flex-pack: distribute !important;
+    justify-content: space-around !important;
+  }
+  .align-items-xl-start {
+    -ms-flex-align: start !important;
+    align-items: flex-start !important;
+  }
+  .align-items-xl-end {
+    -ms-flex-align: end !important;
+    align-items: flex-end !important;
+  }
+  .align-items-xl-center {
+    -ms-flex-align: center !important;
+    align-items: center !important;
+  }
+  .align-items-xl-baseline {
+    -ms-flex-align: baseline !important;
+    align-items: baseline !important;
+  }
+  .align-items-xl-stretch {
+    -ms-flex-align: stretch !important;
+    align-items: stretch !important;
+  }
+  .align-content-xl-start {
+    -ms-flex-line-pack: start !important;
+    align-content: flex-start !important;
+  }
+  .align-content-xl-end {
+    -ms-flex-line-pack: end !important;
+    align-content: flex-end !important;
+  }
+  .align-content-xl-center {
+    -ms-flex-line-pack: center !important;
+    align-content: center !important;
+  }
+  .align-content-xl-between {
+    -ms-flex-line-pack: justify !important;
+    align-content: space-between !important;
+  }
+  .align-content-xl-around {
+    -ms-flex-line-pack: distribute !important;
+    align-content: space-around !important;
+  }
+  .align-content-xl-stretch {
+    -ms-flex-line-pack: stretch !important;
+    align-content: stretch !important;
+  }
+  .align-self-xl-auto {
+    -ms-flex-item-align: auto !important;
+    align-self: auto !important;
+  }
+  .align-self-xl-start {
+    -ms-flex-item-align: start !important;
+    align-self: flex-start !important;
+  }
+  .align-self-xl-end {
+    -ms-flex-item-align: end !important;
+    align-self: flex-end !important;
+  }
+  .align-self-xl-center {
+    -ms-flex-item-align: center !important;
+    align-self: center !important;
+  }
+  .align-self-xl-baseline {
+    -ms-flex-item-align: baseline !important;
+    align-self: baseline !important;
+  }
+  .align-self-xl-stretch {
+    -ms-flex-item-align: stretch !important;
+    align-self: stretch !important;
+  }
+}
+
+.m-0 {
+  margin: 0 !important;
+}
+
+.mt-0,
+.my-0 {
+  margin-top: 0 !important;
+}
+
+.mr-0,
+.mx-0 {
+  margin-right: 0 !important;
+}
+
+.mb-0,
+.my-0 {
+  margin-bottom: 0 !important;
+}
+
+.ml-0,
+.mx-0 {
+  margin-left: 0 !important;
+}
+
+.m-1 {
+  margin: 0.25rem !important;
+}
+
+.mt-1,
+.my-1 {
+  margin-top: 0.25rem !important;
+}
+
+.mr-1,
+.mx-1 {
+  margin-right: 0.25rem !important;
+}
+
+.mb-1,
+.my-1 {
+  margin-bottom: 0.25rem !important;
+}
+
+.ml-1,
+.mx-1 {
+  margin-left: 0.25rem !important;
+}
+
+.m-2 {
+  margin: 0.5rem !important;
+}
+
+.mt-2,
+.my-2 {
+  margin-top: 0.5rem !important;
+}
+
+.mr-2,
+.mx-2 {
+  margin-right: 0.5rem !important;
+}
+
+.mb-2,
+.my-2 {
+  margin-bottom: 0.5rem !important;
+}
+
+.ml-2,
+.mx-2 {
+  margin-left: 0.5rem !important;
+}
+
+.m-3 {
+  margin: 1rem !important;
+}
+
+.mt-3,
+.my-3 {
+  margin-top: 1rem !important;
+}
+
+.mr-3,
+.mx-3 {
+  margin-right: 1rem !important;
+}
+
+.mb-3,
+.my-3 {
+  margin-bottom: 1rem !important;
+}
+
+.ml-3,
+.mx-3 {
+  margin-left: 1rem !important;
+}
+
+.m-4 {
+  margin: 1.5rem !important;
+}
+
+.mt-4,
+.my-4 {
+  margin-top: 1.5rem !important;
+}
+
+.mr-4,
+.mx-4 {
+  margin-right: 1.5rem !important;
+}
+
+.mb-4,
+.my-4 {
+  margin-bottom: 1.5rem !important;
+}
+
+.ml-4,
+.mx-4 {
+  margin-left: 1.5rem !important;
+}
+
+.m-5 {
+  margin: 3rem !important;
+}
+
+.mt-5,
+.my-5 {
+  margin-top: 3rem !important;
+}
+
+.mr-5,
+.mx-5 {
+  margin-right: 3rem !important;
+}
+
+.mb-5,
+.my-5 {
+  margin-bottom: 3rem !important;
+}
+
+.ml-5,
+.mx-5 {
+  margin-left: 3rem !important;
+}
+
+.p-0 {
+  padding: 0 !important;
+}
+
+.pt-0,
+.py-0 {
+  padding-top: 0 !important;
+}
+
+.pr-0,
+.px-0 {
+  padding-right: 0 !important;
+}
+
+.pb-0,
+.py-0 {
+  padding-bottom: 0 !important;
+}
+
+.pl-0,
+.px-0 {
+  padding-left: 0 !important;
+}
+
+.p-1 {
+  padding: 0.25rem !important;
+}
+
+.pt-1,
+.py-1 {
+  padding-top: 0.25rem !important;
+}
+
+.pr-1,
+.px-1 {
+  padding-right: 0.25rem !important;
+}
+
+.pb-1,
+.py-1 {
+  padding-bottom: 0.25rem !important;
+}
+
+.pl-1,
+.px-1 {
+  padding-left: 0.25rem !important;
+}
+
+.p-2 {
+  padding: 0.5rem !important;
+}
+
+.pt-2,
+.py-2 {
+  padding-top: 0.5rem !important;
+}
+
+.pr-2,
+.px-2 {
+  padding-right: 0.5rem !important;
+}
+
+.pb-2,
+.py-2 {
+  padding-bottom: 0.5rem !important;
+}
+
+.pl-2,
+.px-2 {
+  padding-left: 0.5rem !important;
+}
+
+.p-3 {
+  padding: 1rem !important;
+}
+
+.pt-3,
+.py-3 {
+  padding-top: 1rem !important;
+}
+
+.pr-3,
+.px-3 {
+  padding-right: 1rem !important;
+}
+
+.pb-3,
+.py-3 {
+  padding-bottom: 1rem !important;
+}
+
+.pl-3,
+.px-3 {
+  padding-left: 1rem !important;
+}
+
+.p-4 {
+  padding: 1.5rem !important;
+}
+
+.pt-4,
+.py-4 {
+  padding-top: 1.5rem !important;
+}
+
+.pr-4,
+.px-4 {
+  padding-right: 1.5rem !important;
+}
+
+.pb-4,
+.py-4 {
+  padding-bottom: 1.5rem !important;
+}
+
+.pl-4,
+.px-4 {
+  padding-left: 1.5rem !important;
+}
+
+.p-5 {
+  padding: 3rem !important;
+}
+
+.pt-5,
+.py-5 {
+  padding-top: 3rem !important;
+}
+
+.pr-5,
+.px-5 {
+  padding-right: 3rem !important;
+}
+
+.pb-5,
+.py-5 {
+  padding-bottom: 3rem !important;
+}
+
+.pl-5,
+.px-5 {
+  padding-left: 3rem !important;
+}
+
+.m-n1 {
+  margin: -0.25rem !important;
+}
+
+.mt-n1,
+.my-n1 {
+  margin-top: -0.25rem !important;
+}
+
+.mr-n1,
+.mx-n1 {
+  margin-right: -0.25rem !important;
+}
+
+.mb-n1,
+.my-n1 {
+  margin-bottom: -0.25rem !important;
+}
+
+.ml-n1,
+.mx-n1 {
+  margin-left: -0.25rem !important;
+}
+
+.m-n2 {
+  margin: -0.5rem !important;
+}
+
+.mt-n2,
+.my-n2 {
+  margin-top: -0.5rem !important;
+}
+
+.mr-n2,
+.mx-n2 {
+  margin-right: -0.5rem !important;
+}
+
+.mb-n2,
+.my-n2 {
+  margin-bottom: -0.5rem !important;
+}
+
+.ml-n2,
+.mx-n2 {
+  margin-left: -0.5rem !important;
+}
+
+.m-n3 {
+  margin: -1rem !important;
+}
+
+.mt-n3,
+.my-n3 {
+  margin-top: -1rem !important;
+}
+
+.mr-n3,
+.mx-n3 {
+  margin-right: -1rem !important;
+}
+
+.mb-n3,
+.my-n3 {
+  margin-bottom: -1rem !important;
+}
+
+.ml-n3,
+.mx-n3 {
+  margin-left: -1rem !important;
+}
+
+.m-n4 {
+  margin: -1.5rem !important;
+}
+
+.mt-n4,
+.my-n4 {
+  margin-top: -1.5rem !important;
+}
+
+.mr-n4,
+.mx-n4 {
+  margin-right: -1.5rem !important;
+}
+
+.mb-n4,
+.my-n4 {
+  margin-bottom: -1.5rem !important;
+}
+
+.ml-n4,
+.mx-n4 {
+  margin-left: -1.5rem !important;
+}
+
+.m-n5 {
+  margin: -3rem !important;
+}
+
+.mt-n5,
+.my-n5 {
+  margin-top: -3rem !important;
+}
+
+.mr-n5,
+.mx-n5 {
+  margin-right: -3rem !important;
+}
+
+.mb-n5,
+.my-n5 {
+  margin-bottom: -3rem !important;
+}
+
+.ml-n5,
+.mx-n5 {
+  margin-left: -3rem !important;
+}
+
+.m-auto {
+  margin: auto !important;
+}
+
+.mt-auto,
+.my-auto {
+  margin-top: auto !important;
+}
+
+.mr-auto,
+.mx-auto {
+  margin-right: auto !important;
+}
+
+.mb-auto,
+.my-auto {
+  margin-bottom: auto !important;
+}
+
+.ml-auto,
+.mx-auto {
+  margin-left: auto !important;
+}
+
+@media (min-width: 576px) {
+  .m-sm-0 {
+    margin: 0 !important;
+  }
+  .mt-sm-0,
+  .my-sm-0 {
+    margin-top: 0 !important;
+  }
+  .mr-sm-0,
+  .mx-sm-0 {
+    margin-right: 0 !important;
+  }
+  .mb-sm-0,
+  .my-sm-0 {
+    margin-bottom: 0 !important;
+  }
+  .ml-sm-0,
+  .mx-sm-0 {
+    margin-left: 0 !important;
+  }
+  .m-sm-1 {
+    margin: 0.25rem !important;
+  }
+  .mt-sm-1,
+  .my-sm-1 {
+    margin-top: 0.25rem !important;
+  }
+  .mr-sm-1,
+  .mx-sm-1 {
+    margin-right: 0.25rem !important;
+  }
+  .mb-sm-1,
+  .my-sm-1 {
+    margin-bottom: 0.25rem !important;
+  }
+  .ml-sm-1,
+  .mx-sm-1 {
+    margin-left: 0.25rem !important;
+  }
+  .m-sm-2 {
+    margin: 0.5rem !important;
+  }
+  .mt-sm-2,
+  .my-sm-2 {
+    margin-top: 0.5rem !important;
+  }
+  .mr-sm-2,
+  .mx-sm-2 {
+    margin-right: 0.5rem !important;
+  }
+  .mb-sm-2,
+  .my-sm-2 {
+    margin-bottom: 0.5rem !important;
+  }
+  .ml-sm-2,
+  .mx-sm-2 {
+    margin-left: 0.5rem !important;
+  }
+  .m-sm-3 {
+    margin: 1rem !important;
+  }
+  .mt-sm-3,
+  .my-sm-3 {
+    margin-top: 1rem !important;
+  }
+  .mr-sm-3,
+  .mx-sm-3 {
+    margin-right: 1rem !important;
+  }
+  .mb-sm-3,
+  .my-sm-3 {
+    margin-bottom: 1rem !important;
+  }
+  .ml-sm-3,
+  .mx-sm-3 {
+    margin-left: 1rem !important;
+  }
+  .m-sm-4 {
+    margin: 1.5rem !important;
+  }
+  .mt-sm-4,
+  .my-sm-4 {
+    margin-top: 1.5rem !important;
+  }
+  .mr-sm-4,
+  .mx-sm-4 {
+    margin-right: 1.5rem !important;
+  }
+  .mb-sm-4,
+  .my-sm-4 {
+    margin-bottom: 1.5rem !important;
+  }
+  .ml-sm-4,
+  .mx-sm-4 {
+    margin-left: 1.5rem !important;
+  }
+  .m-sm-5 {
+    margin: 3rem !important;
+  }
+  .mt-sm-5,
+  .my-sm-5 {
+    margin-top: 3rem !important;
+  }
+  .mr-sm-5,
+  .mx-sm-5 {
+    margin-right: 3rem !important;
+  }
+  .mb-sm-5,
+  .my-sm-5 {
+    margin-bottom: 3rem !important;
+  }
+  .ml-sm-5,
+  .mx-sm-5 {
+    margin-left: 3rem !important;
+  }
+  .p-sm-0 {
+    padding: 0 !important;
+  }
+  .pt-sm-0,
+  .py-sm-0 {
+    padding-top: 0 !important;
+  }
+  .pr-sm-0,
+  .px-sm-0 {
+    padding-right: 0 !important;
+  }
+  .pb-sm-0,
+  .py-sm-0 {
+    padding-bottom: 0 !important;
+  }
+  .pl-sm-0,
+  .px-sm-0 {
+    padding-left: 0 !important;
+  }
+  .p-sm-1 {
+    padding: 0.25rem !important;
+  }
+  .pt-sm-1,
+  .py-sm-1 {
+    padding-top: 0.25rem !important;
+  }
+  .pr-sm-1,
+  .px-sm-1 {
+    padding-right: 0.25rem !important;
+  }
+  .pb-sm-1,
+  .py-sm-1 {
+    padding-bottom: 0.25rem !important;
+  }
+  .pl-sm-1,
+  .px-sm-1 {
+    padding-left: 0.25rem !important;
+  }
+  .p-sm-2 {
+    padding: 0.5rem !important;
+  }
+  .pt-sm-2,
+  .py-sm-2 {
+    padding-top: 0.5rem !important;
+  }
+  .pr-sm-2,
+  .px-sm-2 {
+    padding-right: 0.5rem !important;
+  }
+  .pb-sm-2,
+  .py-sm-2 {
+    padding-bottom: 0.5rem !important;
+  }
+  .pl-sm-2,
+  .px-sm-2 {
+    padding-left: 0.5rem !important;
+  }
+  .p-sm-3 {
+    padding: 1rem !important;
+  }
+  .pt-sm-3,
+  .py-sm-3 {
+    padding-top: 1rem !important;
+  }
+  .pr-sm-3,
+  .px-sm-3 {
+    padding-right: 1rem !important;
+  }
+  .pb-sm-3,
+  .py-sm-3 {
+    padding-bottom: 1rem !important;
+  }
+  .pl-sm-3,
+  .px-sm-3 {
+    padding-left: 1rem !important;
+  }
+  .p-sm-4 {
+    padding: 1.5rem !important;
+  }
+  .pt-sm-4,
+  .py-sm-4 {
+    padding-top: 1.5rem !important;
+  }
+  .pr-sm-4,
+  .px-sm-4 {
+    padding-right: 1.5rem !important;
+  }
+  .pb-sm-4,
+  .py-sm-4 {
+    padding-bottom: 1.5rem !important;
+  }
+  .pl-sm-4,
+  .px-sm-4 {
+    padding-left: 1.5rem !important;
+  }
+  .p-sm-5 {
+    padding: 3rem !important;
+  }
+  .pt-sm-5,
+  .py-sm-5 {
+    padding-top: 3rem !important;
+  }
+  .pr-sm-5,
+  .px-sm-5 {
+    padding-right: 3rem !important;
+  }
+  .pb-sm-5,
+  .py-sm-5 {
+    padding-bottom: 3rem !important;
+  }
+  .pl-sm-5,
+  .px-sm-5 {
+    padding-left: 3rem !important;
+  }
+  .m-sm-n1 {
+    margin: -0.25rem !important;
+  }
+  .mt-sm-n1,
+  .my-sm-n1 {
+    margin-top: -0.25rem !important;
+  }
+  .mr-sm-n1,
+  .mx-sm-n1 {
+    margin-right: -0.25rem !important;
+  }
+  .mb-sm-n1,
+  .my-sm-n1 {
+    margin-bottom: -0.25rem !important;
+  }
+  .ml-sm-n1,
+  .mx-sm-n1 {
+    margin-left: -0.25rem !important;
+  }
+  .m-sm-n2 {
+    margin: -0.5rem !important;
+  }
+  .mt-sm-n2,
+  .my-sm-n2 {
+    margin-top: -0.5rem !important;
+  }
+  .mr-sm-n2,
+  .mx-sm-n2 {
+    margin-right: -0.5rem !important;
+  }
+  .mb-sm-n2,
+  .my-sm-n2 {
+    margin-bottom: -0.5rem !important;
+  }
+  .ml-sm-n2,
+  .mx-sm-n2 {
+    margin-left: -0.5rem !important;
+  }
+  .m-sm-n3 {
+    margin: -1rem !important;
+  }
+  .mt-sm-n3,
+  .my-sm-n3 {
+    margin-top: -1rem !important;
+  }
+  .mr-sm-n3,
+  .mx-sm-n3 {
+    margin-right: -1rem !important;
+  }
+  .mb-sm-n3,
+  .my-sm-n3 {
+    margin-bottom: -1rem !important;
+  }
+  .ml-sm-n3,
+  .mx-sm-n3 {
+    margin-left: -1rem !important;
+  }
+  .m-sm-n4 {
+    margin: -1.5rem !important;
+  }
+  .mt-sm-n4,
+  .my-sm-n4 {
+    margin-top: -1.5rem !important;
+  }
+  .mr-sm-n4,
+  .mx-sm-n4 {
+    margin-right: -1.5rem !important;
+  }
+  .mb-sm-n4,
+  .my-sm-n4 {
+    margin-bottom: -1.5rem !important;
+  }
+  .ml-sm-n4,
+  .mx-sm-n4 {
+    margin-left: -1.5rem !important;
+  }
+  .m-sm-n5 {
+    margin: -3rem !important;
+  }
+  .mt-sm-n5,
+  .my-sm-n5 {
+    margin-top: -3rem !important;
+  }
+  .mr-sm-n5,
+  .mx-sm-n5 {
+    margin-right: -3rem !important;
+  }
+  .mb-sm-n5,
+  .my-sm-n5 {
+    margin-bottom: -3rem !important;
+  }
+  .ml-sm-n5,
+  .mx-sm-n5 {
+    margin-left: -3rem !important;
+  }
+  .m-sm-auto {
+    margin: auto !important;
+  }
+  .mt-sm-auto,
+  .my-sm-auto {
+    margin-top: auto !important;
+  }
+  .mr-sm-auto,
+  .mx-sm-auto {
+    margin-right: auto !important;
+  }
+  .mb-sm-auto,
+  .my-sm-auto {
+    margin-bottom: auto !important;
+  }
+  .ml-sm-auto,
+  .mx-sm-auto {
+    margin-left: auto !important;
+  }
+}
+
+@media (min-width: 768px) {
+  .m-md-0 {
+    margin: 0 !important;
+  }
+  .mt-md-0,
+  .my-md-0 {
+    margin-top: 0 !important;
+  }
+  .mr-md-0,
+  .mx-md-0 {
+    margin-right: 0 !important;
+  }
+  .mb-md-0,
+  .my-md-0 {
+    margin-bottom: 0 !important;
+  }
+  .ml-md-0,
+  .mx-md-0 {
+    margin-left: 0 !important;
+  }
+  .m-md-1 {
+    margin: 0.25rem !important;
+  }
+  .mt-md-1,
+  .my-md-1 {
+    margin-top: 0.25rem !important;
+  }
+  .mr-md-1,
+  .mx-md-1 {
+    margin-right: 0.25rem !important;
+  }
+  .mb-md-1,
+  .my-md-1 {
+    margin-bottom: 0.25rem !important;
+  }
+  .ml-md-1,
+  .mx-md-1 {
+    margin-left: 0.25rem !important;
+  }
+  .m-md-2 {
+    margin: 0.5rem !important;
+  }
+  .mt-md-2,
+  .my-md-2 {
+    margin-top: 0.5rem !important;
+  }
+  .mr-md-2,
+  .mx-md-2 {
+    margin-right: 0.5rem !important;
+  }
+  .mb-md-2,
+  .my-md-2 {
+    margin-bottom: 0.5rem !important;
+  }
+  .ml-md-2,
+  .mx-md-2 {
+    margin-left: 0.5rem !important;
+  }
+  .m-md-3 {
+    margin: 1rem !important;
+  }
+  .mt-md-3,
+  .my-md-3 {
+    margin-top: 1rem !important;
+  }
+  .mr-md-3,
+  .mx-md-3 {
+    margin-right: 1rem !important;
+  }
+  .mb-md-3,
+  .my-md-3 {
+    margin-bottom: 1rem !important;
+  }
+  .ml-md-3,
+  .mx-md-3 {
+    margin-left: 1rem !important;
+  }
+  .m-md-4 {
+    margin: 1.5rem !important;
+  }
+  .mt-md-4,
+  .my-md-4 {
+    margin-top: 1.5rem !important;
+  }
+  .mr-md-4,
+  .mx-md-4 {
+    margin-right: 1.5rem !important;
+  }
+  .mb-md-4,
+  .my-md-4 {
+    margin-bottom: 1.5rem !important;
+  }
+  .ml-md-4,
+  .mx-md-4 {
+    margin-left: 1.5rem !important;
+  }
+  .m-md-5 {
+    margin: 3rem !important;
+  }
+  .mt-md-5,
+  .my-md-5 {
+    margin-top: 3rem !important;
+  }
+  .mr-md-5,
+  .mx-md-5 {
+    margin-right: 3rem !important;
+  }
+  .mb-md-5,
+  .my-md-5 {
+    margin-bottom: 3rem !important;
+  }
+  .ml-md-5,
+  .mx-md-5 {
+    margin-left: 3rem !important;
+  }
+  .p-md-0 {
+    padding: 0 !important;
+  }
+  .pt-md-0,
+  .py-md-0 {
+    padding-top: 0 !important;
+  }
+  .pr-md-0,
+  .px-md-0 {
+    padding-right: 0 !important;
+  }
+  .pb-md-0,
+  .py-md-0 {
+    padding-bottom: 0 !important;
+  }
+  .pl-md-0,
+  .px-md-0 {
+    padding-left: 0 !important;
+  }
+  .p-md-1 {
+    padding: 0.25rem !important;
+  }
+  .pt-md-1,
+  .py-md-1 {
+    padding-top: 0.25rem !important;
+  }
+  .pr-md-1,
+  .px-md-1 {
+    padding-right: 0.25rem !important;
+  }
+  .pb-md-1,
+  .py-md-1 {
+    padding-bottom: 0.25rem !important;
+  }
+  .pl-md-1,
+  .px-md-1 {
+    padding-left: 0.25rem !important;
+  }
+  .p-md-2 {
+    padding: 0.5rem !important;
+  }
+  .pt-md-2,
+  .py-md-2 {
+    padding-top: 0.5rem !important;
+  }
+  .pr-md-2,
+  .px-md-2 {
+    padding-right: 0.5rem !important;
+  }
+  .pb-md-2,
+  .py-md-2 {
+    padding-bottom: 0.5rem !important;
+  }
+  .pl-md-2,
+  .px-md-2 {
+    padding-left: 0.5rem !important;
+  }
+  .p-md-3 {
+    padding: 1rem !important;
+  }
+  .pt-md-3,
+  .py-md-3 {
+    padding-top: 1rem !important;
+  }
+  .pr-md-3,
+  .px-md-3 {
+    padding-right: 1rem !important;
+  }
+  .pb-md-3,
+  .py-md-3 {
+    padding-bottom: 1rem !important;
+  }
+  .pl-md-3,
+  .px-md-3 {
+    padding-left: 1rem !important;
+  }
+  .p-md-4 {
+    padding: 1.5rem !important;
+  }
+  .pt-md-4,
+  .py-md-4 {
+    padding-top: 1.5rem !important;
+  }
+  .pr-md-4,
+  .px-md-4 {
+    padding-right: 1.5rem !important;
+  }
+  .pb-md-4,
+  .py-md-4 {
+    padding-bottom: 1.5rem !important;
+  }
+  .pl-md-4,
+  .px-md-4 {
+    padding-left: 1.5rem !important;
+  }
+  .p-md-5 {
+    padding: 3rem !important;
+  }
+  .pt-md-5,
+  .py-md-5 {
+    padding-top: 3rem !important;
+  }
+  .pr-md-5,
+  .px-md-5 {
+    padding-right: 3rem !important;
+  }
+  .pb-md-5,
+  .py-md-5 {
+    padding-bottom: 3rem !important;
+  }
+  .pl-md-5,
+  .px-md-5 {
+    padding-left: 3rem !important;
+  }
+  .m-md-n1 {
+    margin: -0.25rem !important;
+  }
+  .mt-md-n1,
+  .my-md-n1 {
+    margin-top: -0.25rem !important;
+  }
+  .mr-md-n1,
+  .mx-md-n1 {
+    margin-right: -0.25rem !important;
+  }
+  .mb-md-n1,
+  .my-md-n1 {
+    margin-bottom: -0.25rem !important;
+  }
+  .ml-md-n1,
+  .mx-md-n1 {
+    margin-left: -0.25rem !important;
+  }
+  .m-md-n2 {
+    margin: -0.5rem !important;
+  }
+  .mt-md-n2,
+  .my-md-n2 {
+    margin-top: -0.5rem !important;
+  }
+  .mr-md-n2,
+  .mx-md-n2 {
+    margin-right: -0.5rem !important;
+  }
+  .mb-md-n2,
+  .my-md-n2 {
+    margin-bottom: -0.5rem !important;
+  }
+  .ml-md-n2,
+  .mx-md-n2 {
+    margin-left: -0.5rem !important;
+  }
+  .m-md-n3 {
+    margin: -1rem !important;
+  }
+  .mt-md-n3,
+  .my-md-n3 {
+    margin-top: -1rem !important;
+  }
+  .mr-md-n3,
+  .mx-md-n3 {
+    margin-right: -1rem !important;
+  }
+  .mb-md-n3,
+  .my-md-n3 {
+    margin-bottom: -1rem !important;
+  }
+  .ml-md-n3,
+  .mx-md-n3 {
+    margin-left: -1rem !important;
+  }
+  .m-md-n4 {
+    margin: -1.5rem !important;
+  }
+  .mt-md-n4,
+  .my-md-n4 {
+    margin-top: -1.5rem !important;
+  }
+  .mr-md-n4,
+  .mx-md-n4 {
+    margin-right: -1.5rem !important;
+  }
+  .mb-md-n4,
+  .my-md-n4 {
+    margin-bottom: -1.5rem !important;
+  }
+  .ml-md-n4,
+  .mx-md-n4 {
+    margin-left: -1.5rem !important;
+  }
+  .m-md-n5 {
+    margin: -3rem !important;
+  }
+  .mt-md-n5,
+  .my-md-n5 {
+    margin-top: -3rem !important;
+  }
+  .mr-md-n5,
+  .mx-md-n5 {
+    margin-right: -3rem !important;
+  }
+  .mb-md-n5,
+  .my-md-n5 {
+    margin-bottom: -3rem !important;
+  }
+  .ml-md-n5,
+  .mx-md-n5 {
+    margin-left: -3rem !important;
+  }
+  .m-md-auto {
+    margin: auto !important;
+  }
+  .mt-md-auto,
+  .my-md-auto {
+    margin-top: auto !important;
+  }
+  .mr-md-auto,
+  .mx-md-auto {
+    margin-right: auto !important;
+  }
+  .mb-md-auto,
+  .my-md-auto {
+    margin-bottom: auto !important;
+  }
+  .ml-md-auto,
+  .mx-md-auto {
+    margin-left: auto !important;
+  }
+}
+
+@media (min-width: 992px) {
+  .m-lg-0 {
+    margin: 0 !important;
+  }
+  .mt-lg-0,
+  .my-lg-0 {
+    margin-top: 0 !important;
+  }
+  .mr-lg-0,
+  .mx-lg-0 {
+    margin-right: 0 !important;
+  }
+  .mb-lg-0,
+  .my-lg-0 {
+    margin-bottom: 0 !important;
+  }
+  .ml-lg-0,
+  .mx-lg-0 {
+    margin-left: 0 !important;
+  }
+  .m-lg-1 {
+    margin: 0.25rem !important;
+  }
+  .mt-lg-1,
+  .my-lg-1 {
+    margin-top: 0.25rem !important;
+  }
+  .mr-lg-1,
+  .mx-lg-1 {
+    margin-right: 0.25rem !important;
+  }
+  .mb-lg-1,
+  .my-lg-1 {
+    margin-bottom: 0.25rem !important;
+  }
+  .ml-lg-1,
+  .mx-lg-1 {
+    margin-left: 0.25rem !important;
+  }
+  .m-lg-2 {
+    margin: 0.5rem !important;
+  }
+  .mt-lg-2,
+  .my-lg-2 {
+    margin-top: 0.5rem !important;
+  }
+  .mr-lg-2,
+  .mx-lg-2 {
+    margin-right: 0.5rem !important;
+  }
+  .mb-lg-2,
+  .my-lg-2 {
+    margin-bottom: 0.5rem !important;
+  }
+  .ml-lg-2,
+  .mx-lg-2 {
+    margin-left: 0.5rem !important;
+  }
+  .m-lg-3 {
+    margin: 1rem !important;
+  }
+  .mt-lg-3,
+  .my-lg-3 {
+    margin-top: 1rem !important;
+  }
+  .mr-lg-3,
+  .mx-lg-3 {
+    margin-right: 1rem !important;
+  }
+  .mb-lg-3,
+  .my-lg-3 {
+    margin-bottom: 1rem !important;
+  }
+  .ml-lg-3,
+  .mx-lg-3 {
+    margin-left: 1rem !important;
+  }
+  .m-lg-4 {
+    margin: 1.5rem !important;
+  }
+  .mt-lg-4,
+  .my-lg-4 {
+    margin-top: 1.5rem !important;
+  }
+  .mr-lg-4,
+  .mx-lg-4 {
+    margin-right: 1.5rem !important;
+  }
+  .mb-lg-4,
+  .my-lg-4 {
+    margin-bottom: 1.5rem !important;
+  }
+  .ml-lg-4,
+  .mx-lg-4 {
+    margin-left: 1.5rem !important;
+  }
+  .m-lg-5 {
+    margin: 3rem !important;
+  }
+  .mt-lg-5,
+  .my-lg-5 {
+    margin-top: 3rem !important;
+  }
+  .mr-lg-5,
+  .mx-lg-5 {
+    margin-right: 3rem !important;
+  }
+  .mb-lg-5,
+  .my-lg-5 {
+    margin-bottom: 3rem !important;
+  }
+  .ml-lg-5,
+  .mx-lg-5 {
+    margin-left: 3rem !important;
+  }
+  .p-lg-0 {
+    padding: 0 !important;
+  }
+  .pt-lg-0,
+  .py-lg-0 {
+    padding-top: 0 !important;
+  }
+  .pr-lg-0,
+  .px-lg-0 {
+    padding-right: 0 !important;
+  }
+  .pb-lg-0,
+  .py-lg-0 {
+    padding-bottom: 0 !important;
+  }
+  .pl-lg-0,
+  .px-lg-0 {
+    padding-left: 0 !important;
+  }
+  .p-lg-1 {
+    padding: 0.25rem !important;
+  }
+  .pt-lg-1,
+  .py-lg-1 {
+    padding-top: 0.25rem !important;
+  }
+  .pr-lg-1,
+  .px-lg-1 {
+    padding-right: 0.25rem !important;
+  }
+  .pb-lg-1,
+  .py-lg-1 {
+    padding-bottom: 0.25rem !important;
+  }
+  .pl-lg-1,
+  .px-lg-1 {
+    padding-left: 0.25rem !important;
+  }
+  .p-lg-2 {
+    padding: 0.5rem !important;
+  }
+  .pt-lg-2,
+  .py-lg-2 {
+    padding-top: 0.5rem !important;
+  }
+  .pr-lg-2,
+  .px-lg-2 {
+    padding-right: 0.5rem !important;
+  }
+  .pb-lg-2,
+  .py-lg-2 {
+    padding-bottom: 0.5rem !important;
+  }
+  .pl-lg-2,
+  .px-lg-2 {
+    padding-left: 0.5rem !important;
+  }
+  .p-lg-3 {
+    padding: 1rem !important;
+  }
+  .pt-lg-3,
+  .py-lg-3 {
+    padding-top: 1rem !important;
+  }
+  .pr-lg-3,
+  .px-lg-3 {
+    padding-right: 1rem !important;
+  }
+  .pb-lg-3,
+  .py-lg-3 {
+    padding-bottom: 1rem !important;
+  }
+  .pl-lg-3,
+  .px-lg-3 {
+    padding-left: 1rem !important;
+  }
+  .p-lg-4 {
+    padding: 1.5rem !important;
+  }
+  .pt-lg-4,
+  .py-lg-4 {
+    padding-top: 1.5rem !important;
+  }
+  .pr-lg-4,
+  .px-lg-4 {
+    padding-right: 1.5rem !important;
+  }
+  .pb-lg-4,
+  .py-lg-4 {
+    padding-bottom: 1.5rem !important;
+  }
+  .pl-lg-4,
+  .px-lg-4 {
+    padding-left: 1.5rem !important;
+  }
+  .p-lg-5 {
+    padding: 3rem !important;
+  }
+  .pt-lg-5,
+  .py-lg-5 {
+    padding-top: 3rem !important;
+  }
+  .pr-lg-5,
+  .px-lg-5 {
+    padding-right: 3rem !important;
+  }
+  .pb-lg-5,
+  .py-lg-5 {
+    padding-bottom: 3rem !important;
+  }
+  .pl-lg-5,
+  .px-lg-5 {
+    padding-left: 3rem !important;
+  }
+  .m-lg-n1 {
+    margin: -0.25rem !important;
+  }
+  .mt-lg-n1,
+  .my-lg-n1 {
+    margin-top: -0.25rem !important;
+  }
+  .mr-lg-n1,
+  .mx-lg-n1 {
+    margin-right: -0.25rem !important;
+  }
+  .mb-lg-n1,
+  .my-lg-n1 {
+    margin-bottom: -0.25rem !important;
+  }
+  .ml-lg-n1,
+  .mx-lg-n1 {
+    margin-left: -0.25rem !important;
+  }
+  .m-lg-n2 {
+    margin: -0.5rem !important;
+  }
+  .mt-lg-n2,
+  .my-lg-n2 {
+    margin-top: -0.5rem !important;
+  }
+  .mr-lg-n2,
+  .mx-lg-n2 {
+    margin-right: -0.5rem !important;
+  }
+  .mb-lg-n2,
+  .my-lg-n2 {
+    margin-bottom: -0.5rem !important;
+  }
+  .ml-lg-n2,
+  .mx-lg-n2 {
+    margin-left: -0.5rem !important;
+  }
+  .m-lg-n3 {
+    margin: -1rem !important;
+  }
+  .mt-lg-n3,
+  .my-lg-n3 {
+    margin-top: -1rem !important;
+  }
+  .mr-lg-n3,
+  .mx-lg-n3 {
+    margin-right: -1rem !important;
+  }
+  .mb-lg-n3,
+  .my-lg-n3 {
+    margin-bottom: -1rem !important;
+  }
+  .ml-lg-n3,
+  .mx-lg-n3 {
+    margin-left: -1rem !important;
+  }
+  .m-lg-n4 {
+    margin: -1.5rem !important;
+  }
+  .mt-lg-n4,
+  .my-lg-n4 {
+    margin-top: -1.5rem !important;
+  }
+  .mr-lg-n4,
+  .mx-lg-n4 {
+    margin-right: -1.5rem !important;
+  }
+  .mb-lg-n4,
+  .my-lg-n4 {
+    margin-bottom: -1.5rem !important;
+  }
+  .ml-lg-n4,
+  .mx-lg-n4 {
+    margin-left: -1.5rem !important;
+  }
+  .m-lg-n5 {
+    margin: -3rem !important;
+  }
+  .mt-lg-n5,
+  .my-lg-n5 {
+    margin-top: -3rem !important;
+  }
+  .mr-lg-n5,
+  .mx-lg-n5 {
+    margin-right: -3rem !important;
+  }
+  .mb-lg-n5,
+  .my-lg-n5 {
+    margin-bottom: -3rem !important;
+  }
+  .ml-lg-n5,
+  .mx-lg-n5 {
+    margin-left: -3rem !important;
+  }
+  .m-lg-auto {
+    margin: auto !important;
+  }
+  .mt-lg-auto,
+  .my-lg-auto {
+    margin-top: auto !important;
+  }
+  .mr-lg-auto,
+  .mx-lg-auto {
+    margin-right: auto !important;
+  }
+  .mb-lg-auto,
+  .my-lg-auto {
+    margin-bottom: auto !important;
+  }
+  .ml-lg-auto,
+  .mx-lg-auto {
+    margin-left: auto !important;
+  }
+}
+
+@media (min-width: 1200px) {
+  .m-xl-0 {
+    margin: 0 !important;
+  }
+  .mt-xl-0,
+  .my-xl-0 {
+    margin-top: 0 !important;
+  }
+  .mr-xl-0,
+  .mx-xl-0 {
+    margin-right: 0 !important;
+  }
+  .mb-xl-0,
+  .my-xl-0 {
+    margin-bottom: 0 !important;
+  }
+  .ml-xl-0,
+  .mx-xl-0 {
+    margin-left: 0 !important;
+  }
+  .m-xl-1 {
+    margin: 0.25rem !important;
+  }
+  .mt-xl-1,
+  .my-xl-1 {
+    margin-top: 0.25rem !important;
+  }
+  .mr-xl-1,
+  .mx-xl-1 {
+    margin-right: 0.25rem !important;
+  }
+  .mb-xl-1,
+  .my-xl-1 {
+    margin-bottom: 0.25rem !important;
+  }
+  .ml-xl-1,
+  .mx-xl-1 {
+    margin-left: 0.25rem !important;
+  }
+  .m-xl-2 {
+    margin: 0.5rem !important;
+  }
+  .mt-xl-2,
+  .my-xl-2 {
+    margin-top: 0.5rem !important;
+  }
+  .mr-xl-2,
+  .mx-xl-2 {
+    margin-right: 0.5rem !important;
+  }
+  .mb-xl-2,
+  .my-xl-2 {
+    margin-bottom: 0.5rem !important;
+  }
+  .ml-xl-2,
+  .mx-xl-2 {
+    margin-left: 0.5rem !important;
+  }
+  .m-xl-3 {
+    margin: 1rem !important;
+  }
+  .mt-xl-3,
+  .my-xl-3 {
+    margin-top: 1rem !important;
+  }
+  .mr-xl-3,
+  .mx-xl-3 {
+    margin-right: 1rem !important;
+  }
+  .mb-xl-3,
+  .my-xl-3 {
+    margin-bottom: 1rem !important;
+  }
+  .ml-xl-3,
+  .mx-xl-3 {
+    margin-left: 1rem !important;
+  }
+  .m-xl-4 {
+    margin: 1.5rem !important;
+  }
+  .mt-xl-4,
+  .my-xl-4 {
+    margin-top: 1.5rem !important;
+  }
+  .mr-xl-4,
+  .mx-xl-4 {
+    margin-right: 1.5rem !important;
+  }
+  .mb-xl-4,
+  .my-xl-4 {
+    margin-bottom: 1.5rem !important;
+  }
+  .ml-xl-4,
+  .mx-xl-4 {
+    margin-left: 1.5rem !important;
+  }
+  .m-xl-5 {
+    margin: 3rem !important;
+  }
+  .mt-xl-5,
+  .my-xl-5 {
+    margin-top: 3rem !important;
+  }
+  .mr-xl-5,
+  .mx-xl-5 {
+    margin-right: 3rem !important;
+  }
+  .mb-xl-5,
+  .my-xl-5 {
+    margin-bottom: 3rem !important;
+  }
+  .ml-xl-5,
+  .mx-xl-5 {
+    margin-left: 3rem !important;
+  }
+  .p-xl-0 {
+    padding: 0 !important;
+  }
+  .pt-xl-0,
+  .py-xl-0 {
+    padding-top: 0 !important;
+  }
+  .pr-xl-0,
+  .px-xl-0 {
+    padding-right: 0 !important;
+  }
+  .pb-xl-0,
+  .py-xl-0 {
+    padding-bottom: 0 !important;
+  }
+  .pl-xl-0,
+  .px-xl-0 {
+    padding-left: 0 !important;
+  }
+  .p-xl-1 {
+    padding: 0.25rem !important;
+  }
+  .pt-xl-1,
+  .py-xl-1 {
+    padding-top: 0.25rem !important;
+  }
+  .pr-xl-1,
+  .px-xl-1 {
+    padding-right: 0.25rem !important;
+  }
+  .pb-xl-1,
+  .py-xl-1 {
+    padding-bottom: 0.25rem !important;
+  }
+  .pl-xl-1,
+  .px-xl-1 {
+    padding-left: 0.25rem !important;
+  }
+  .p-xl-2 {
+    padding: 0.5rem !important;
+  }
+  .pt-xl-2,
+  .py-xl-2 {
+    padding-top: 0.5rem !important;
+  }
+  .pr-xl-2,
+  .px-xl-2 {
+    padding-right: 0.5rem !important;
+  }
+  .pb-xl-2,
+  .py-xl-2 {
+    padding-bottom: 0.5rem !important;
+  }
+  .pl-xl-2,
+  .px-xl-2 {
+    padding-left: 0.5rem !important;
+  }
+  .p-xl-3 {
+    padding: 1rem !important;
+  }
+  .pt-xl-3,
+  .py-xl-3 {
+    padding-top: 1rem !important;
+  }
+  .pr-xl-3,
+  .px-xl-3 {
+    padding-right: 1rem !important;
+  }
+  .pb-xl-3,
+  .py-xl-3 {
+    padding-bottom: 1rem !important;
+  }
+  .pl-xl-3,
+  .px-xl-3 {
+    padding-left: 1rem !important;
+  }
+  .p-xl-4 {
+    padding: 1.5rem !important;
+  }
+  .pt-xl-4,
+  .py-xl-4 {
+    padding-top: 1.5rem !important;
+  }
+  .pr-xl-4,
+  .px-xl-4 {
+    padding-right: 1.5rem !important;
+  }
+  .pb-xl-4,
+  .py-xl-4 {
+    padding-bottom: 1.5rem !important;
+  }
+  .pl-xl-4,
+  .px-xl-4 {
+    padding-left: 1.5rem !important;
+  }
+  .p-xl-5 {
+    padding: 3rem !important;
+  }
+  .pt-xl-5,
+  .py-xl-5 {
+    padding-top: 3rem !important;
+  }
+  .pr-xl-5,
+  .px-xl-5 {
+    padding-right: 3rem !important;
+  }
+  .pb-xl-5,
+  .py-xl-5 {
+    padding-bottom: 3rem !important;
+  }
+  .pl-xl-5,
+  .px-xl-5 {
+    padding-left: 3rem !important;
+  }
+  .m-xl-n1 {
+    margin: -0.25rem !important;
+  }
+  .mt-xl-n1,
+  .my-xl-n1 {
+    margin-top: -0.25rem !important;
+  }
+  .mr-xl-n1,
+  .mx-xl-n1 {
+    margin-right: -0.25rem !important;
+  }
+  .mb-xl-n1,
+  .my-xl-n1 {
+    margin-bottom: -0.25rem !important;
+  }
+  .ml-xl-n1,
+  .mx-xl-n1 {
+    margin-left: -0.25rem !important;
+  }
+  .m-xl-n2 {
+    margin: -0.5rem !important;
+  }
+  .mt-xl-n2,
+  .my-xl-n2 {
+    margin-top: -0.5rem !important;
+  }
+  .mr-xl-n2,
+  .mx-xl-n2 {
+    margin-right: -0.5rem !important;
+  }
+  .mb-xl-n2,
+  .my-xl-n2 {
+    margin-bottom: -0.5rem !important;
+  }
+  .ml-xl-n2,
+  .mx-xl-n2 {
+    margin-left: -0.5rem !important;
+  }
+  .m-xl-n3 {
+    margin: -1rem !important;
+  }
+  .mt-xl-n3,
+  .my-xl-n3 {
+    margin-top: -1rem !important;
+  }
+  .mr-xl-n3,
+  .mx-xl-n3 {
+    margin-right: -1rem !important;
+  }
+  .mb-xl-n3,
+  .my-xl-n3 {
+    margin-bottom: -1rem !important;
+  }
+  .ml-xl-n3,
+  .mx-xl-n3 {
+    margin-left: -1rem !important;
+  }
+  .m-xl-n4 {
+    margin: -1.5rem !important;
+  }
+  .mt-xl-n4,
+  .my-xl-n4 {
+    margin-top: -1.5rem !important;
+  }
+  .mr-xl-n4,
+  .mx-xl-n4 {
+    margin-right: -1.5rem !important;
+  }
+  .mb-xl-n4,
+  .my-xl-n4 {
+    margin-bottom: -1.5rem !important;
+  }
+  .ml-xl-n4,
+  .mx-xl-n4 {
+    margin-left: -1.5rem !important;
+  }
+  .m-xl-n5 {
+    margin: -3rem !important;
+  }
+  .mt-xl-n5,
+  .my-xl-n5 {
+    margin-top: -3rem !important;
+  }
+  .mr-xl-n5,
+  .mx-xl-n5 {
+    margin-right: -3rem !important;
+  }
+  .mb-xl-n5,
+  .my-xl-n5 {
+    margin-bottom: -3rem !important;
+  }
+  .ml-xl-n5,
+  .mx-xl-n5 {
+    margin-left: -3rem !important;
+  }
+  .m-xl-auto {
+    margin: auto !important;
+  }
+  .mt-xl-auto,
+  .my-xl-auto {
+    margin-top: auto !important;
+  }
+  .mr-xl-auto,
+  .mx-xl-auto {
+    margin-right: auto !important;
+  }
+  .mb-xl-auto,
+  .my-xl-auto {
+    margin-bottom: auto !important;
+  }
+  .ml-xl-auto,
+  .mx-xl-auto {
+    margin-left: auto !important;
+  }
+}
+/*# sourceMappingURL=bootstrap-grid.css.map */

File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/css/bootstrap/bootstrap-grid.css.map


File diff suppressed because it is too large
+ 5 - 0
src/main/resources/static/css/bootstrap/bootstrap-grid.min.css


File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/css/bootstrap/bootstrap-grid.min.css.map


+ 331 - 0
src/main/resources/static/css/bootstrap/bootstrap-reboot.css

@@ -0,0 +1,331 @@
+/*!
+ * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)
+ * Copyright 2011-2019 The Bootstrap Authors
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
+ */
+*,
+*::before,
+*::after {
+  box-sizing: border-box;
+}
+
+html {
+  font-family: sans-serif;
+  line-height: 1.15;
+  -webkit-text-size-adjust: 100%;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+
+article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
+  display: block;
+}
+
+body {
+  margin: 0;
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+  font-size: 1rem;
+  font-weight: 400;
+  line-height: 1.5;
+  color: #212529;
+  text-align: left;
+  background-color: #fff;
+}
+
+[tabindex="-1"]:focus {
+  outline: 0 !important;
+}
+
+hr {
+  box-sizing: content-box;
+  height: 0;
+  overflow: visible;
+}
+
+h1, h2, h3, h4, h5, h6 {
+  margin-top: 0;
+  margin-bottom: 0.5rem;
+}
+
+p {
+  margin-top: 0;
+  margin-bottom: 1rem;
+}
+
+abbr[title],
+abbr[data-original-title] {
+  text-decoration: underline;
+  -webkit-text-decoration: underline dotted;
+  text-decoration: underline dotted;
+  cursor: help;
+  border-bottom: 0;
+  -webkit-text-decoration-skip-ink: none;
+  text-decoration-skip-ink: none;
+}
+
+address {
+  margin-bottom: 1rem;
+  font-style: normal;
+  line-height: inherit;
+}
+
+ol,
+ul,
+dl {
+  margin-top: 0;
+  margin-bottom: 1rem;
+}
+
+ol ol,
+ul ul,
+ol ul,
+ul ol {
+  margin-bottom: 0;
+}
+
+dt {
+  font-weight: 700;
+}
+
+dd {
+  margin-bottom: .5rem;
+  margin-left: 0;
+}
+
+blockquote {
+  margin: 0 0 1rem;
+}
+
+b,
+strong {
+  font-weight: bolder;
+}
+
+small {
+  font-size: 80%;
+}
+
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline;
+}
+
+sub {
+  bottom: -.25em;
+}
+
+sup {
+  top: -.5em;
+}
+
+a {
+  color: #007bff;
+  text-decoration: none;
+  background-color: transparent;
+}
+
+a:hover {
+  color: #0056b3;
+  text-decoration: underline;
+}
+
+a:not([href]):not([tabindex]) {
+  color: inherit;
+  text-decoration: none;
+}
+
+a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {
+  color: inherit;
+  text-decoration: none;
+}
+
+a:not([href]):not([tabindex]):focus {
+  outline: 0;
+}
+
+pre,
+code,
+kbd,
+samp {
+  font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+  font-size: 1em;
+}
+
+pre {
+  margin-top: 0;
+  margin-bottom: 1rem;
+  overflow: auto;
+}
+
+figure {
+  margin: 0 0 1rem;
+}
+
+img {
+  vertical-align: middle;
+  border-style: none;
+}
+
+svg {
+  overflow: hidden;
+  vertical-align: middle;
+}
+
+table {
+  border-collapse: collapse;
+}
+
+caption {
+  padding-top: 0.75rem;
+  padding-bottom: 0.75rem;
+  color: #6c757d;
+  text-align: left;
+  caption-side: bottom;
+}
+
+th {
+  text-align: inherit;
+}
+
+label {
+  display: inline-block;
+  margin-bottom: 0.5rem;
+}
+
+button {
+  border-radius: 0;
+}
+
+button:focus {
+  outline: 1px dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+}
+
+input,
+button,
+select,
+optgroup,
+textarea {
+  margin: 0;
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+}
+
+button,
+input {
+  overflow: visible;
+}
+
+button,
+select {
+  text-transform: none;
+}
+
+select {
+  word-wrap: normal;
+}
+
+button,
+[type="button"],
+[type="reset"],
+[type="submit"] {
+  -webkit-appearance: button;
+}
+
+button:not(:disabled),
+[type="button"]:not(:disabled),
+[type="reset"]:not(:disabled),
+[type="submit"]:not(:disabled) {
+  cursor: pointer;
+}
+
+button::-moz-focus-inner,
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
+[type="submit"]::-moz-focus-inner {
+  padding: 0;
+  border-style: none;
+}
+
+input[type="radio"],
+input[type="checkbox"] {
+  box-sizing: border-box;
+  padding: 0;
+}
+
+input[type="date"],
+input[type="time"],
+input[type="datetime-local"],
+input[type="month"] {
+  -webkit-appearance: listbox;
+}
+
+textarea {
+  overflow: auto;
+  resize: vertical;
+}
+
+fieldset {
+  min-width: 0;
+  padding: 0;
+  margin: 0;
+  border: 0;
+}
+
+legend {
+  display: block;
+  width: 100%;
+  max-width: 100%;
+  padding: 0;
+  margin-bottom: .5rem;
+  font-size: 1.5rem;
+  line-height: inherit;
+  color: inherit;
+  white-space: normal;
+}
+
+progress {
+  vertical-align: baseline;
+}
+
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
+  height: auto;
+}
+
+[type="search"] {
+  outline-offset: -2px;
+  -webkit-appearance: none;
+}
+
+[type="search"]::-webkit-search-decoration {
+  -webkit-appearance: none;
+}
+
+::-webkit-file-upload-button {
+  font: inherit;
+  -webkit-appearance: button;
+}
+
+output {
+  display: inline-block;
+}
+
+summary {
+  display: list-item;
+  cursor: pointer;
+}
+
+template {
+  display: none;
+}
+
+[hidden] {
+  display: none !important;
+}
+/*# sourceMappingURL=bootstrap-reboot.css.map */

File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/css/bootstrap/bootstrap-reboot.css.map


File diff suppressed because it is too large
+ 6 - 0
src/main/resources/static/css/bootstrap/bootstrap-reboot.min.css


File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/css/bootstrap/bootstrap-reboot.min.css.map


+ 10038 - 0
src/main/resources/static/css/bootstrap/bootstrap.css

@@ -0,0 +1,10038 @@
+/*!
+ * Bootstrap v4.3.1 (https://getbootstrap.com/)
+ * Copyright 2011-2019 The Bootstrap Authors
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+:root {
+  --blue: #007bff;
+  --indigo: #6610f2;
+  --purple: #6f42c1;
+  --pink: #e83e8c;
+  --red: #dc3545;
+  --orange: #fd7e14;
+  --yellow: #ffc107;
+  --green: #28a745;
+  --teal: #20c997;
+  --cyan: #17a2b8;
+  --white: #fff;
+  --gray: #6c757d;
+  --gray-dark: #343a40;
+  --primary: #007bff;
+  --secondary: #6c757d;
+  --success: #28a745;
+  --info: #17a2b8;
+  --warning: #ffc107;
+  --danger: #dc3545;
+  --light: #f8f9fa;
+  --dark: #343a40;
+  --breakpoint-xs: 0;
+  --breakpoint-sm: 576px;
+  --breakpoint-md: 768px;
+  --breakpoint-lg: 992px;
+  --breakpoint-xl: 1200px;
+  --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+  --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+}
+
+*,
+*::before,
+*::after {
+  box-sizing: border-box;
+}
+
+html {
+  font-family: sans-serif;
+  line-height: 1.15;
+  -webkit-text-size-adjust: 100%;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+
+article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
+  display: block;
+}
+
+body {
+  margin: 0;
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+  font-size: 1rem;
+  font-weight: 400;
+  line-height: 1.5;
+  color: #212529;
+  text-align: left;
+  background-color: #fff;
+}
+
+[tabindex="-1"]:focus {
+  outline: 0 !important;
+}
+
+hr {
+  box-sizing: content-box;
+  height: 0;
+  overflow: visible;
+}
+
+h1, h2, h3, h4, h5, h6 {
+  margin-top: 0;
+  margin-bottom: 0.5rem;
+}
+
+p {
+  margin-top: 0;
+  margin-bottom: 1rem;
+}
+
+abbr[title],
+abbr[data-original-title] {
+  text-decoration: underline;
+  -webkit-text-decoration: underline dotted;
+  text-decoration: underline dotted;
+  cursor: help;
+  border-bottom: 0;
+  -webkit-text-decoration-skip-ink: none;
+  text-decoration-skip-ink: none;
+}
+
+address {
+  margin-bottom: 1rem;
+  font-style: normal;
+  line-height: inherit;
+}
+
+ol,
+ul,
+dl {
+  margin-top: 0;
+  margin-bottom: 1rem;
+}
+
+ol ol,
+ul ul,
+ol ul,
+ul ol {
+  margin-bottom: 0;
+}
+
+dt {
+  font-weight: 700;
+}
+
+dd {
+  margin-bottom: .5rem;
+  margin-left: 0;
+}
+
+blockquote {
+  margin: 0 0 1rem;
+}
+
+b,
+strong {
+  font-weight: bolder;
+}
+
+small {
+  font-size: 80%;
+}
+
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline;
+}
+
+sub {
+  bottom: -.25em;
+}
+
+sup {
+  top: -.5em;
+}
+
+a {
+  color: #007bff;
+  text-decoration: none;
+  background-color: transparent;
+}
+
+a:hover {
+  color: #0056b3;
+  text-decoration: underline;
+}
+
+a:not([href]):not([tabindex]) {
+  color: inherit;
+  text-decoration: none;
+}
+
+a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {
+  color: inherit;
+  text-decoration: none;
+}
+
+a:not([href]):not([tabindex]):focus {
+  outline: 0;
+}
+
+pre,
+code,
+kbd,
+samp {
+  font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+  font-size: 1em;
+}
+
+pre {
+  margin-top: 0;
+  margin-bottom: 1rem;
+  overflow: auto;
+}
+
+figure {
+  margin: 0 0 1rem;
+}
+
+img {
+  vertical-align: middle;
+  border-style: none;
+}
+
+svg {
+  overflow: hidden;
+  vertical-align: middle;
+}
+
+table {
+  border-collapse: collapse;
+}
+
+caption {
+  padding-top: 0.75rem;
+  padding-bottom: 0.75rem;
+  color: #6c757d;
+  text-align: left;
+  caption-side: bottom;
+}
+
+th {
+  text-align: inherit;
+}
+
+label {
+  display: inline-block;
+  margin-bottom: 0.5rem;
+}
+
+button {
+  border-radius: 0;
+}
+
+button:focus {
+  outline: 1px dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+}
+
+input,
+button,
+select,
+optgroup,
+textarea {
+  margin: 0;
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+}
+
+button,
+input {
+  overflow: visible;
+}
+
+button,
+select {
+  text-transform: none;
+}
+
+select {
+  word-wrap: normal;
+}
+
+button,
+[type="button"],
+[type="reset"],
+[type="submit"] {
+  -webkit-appearance: button;
+}
+
+button:not(:disabled),
+[type="button"]:not(:disabled),
+[type="reset"]:not(:disabled),
+[type="submit"]:not(:disabled) {
+  cursor: pointer;
+}
+
+button::-moz-focus-inner,
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
+[type="submit"]::-moz-focus-inner {
+  padding: 0;
+  border-style: none;
+}
+
+input[type="radio"],
+input[type="checkbox"] {
+  box-sizing: border-box;
+  padding: 0;
+}
+
+input[type="date"],
+input[type="time"],
+input[type="datetime-local"],
+input[type="month"] {
+  -webkit-appearance: listbox;
+}
+
+textarea {
+  overflow: auto;
+  resize: vertical;
+}
+
+fieldset {
+  min-width: 0;
+  padding: 0;
+  margin: 0;
+  border: 0;
+}
+
+legend {
+  display: block;
+  width: 100%;
+  max-width: 100%;
+  padding: 0;
+  margin-bottom: .5rem;
+  font-size: 1.5rem;
+  line-height: inherit;
+  color: inherit;
+  white-space: normal;
+}
+
+progress {
+  vertical-align: baseline;
+}
+
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
+  height: auto;
+}
+
+[type="search"] {
+  outline-offset: -2px;
+  -webkit-appearance: none;
+}
+
+[type="search"]::-webkit-search-decoration {
+  -webkit-appearance: none;
+}
+
+::-webkit-file-upload-button {
+  font: inherit;
+  -webkit-appearance: button;
+}
+
+output {
+  display: inline-block;
+}
+
+summary {
+  display: list-item;
+  cursor: pointer;
+}
+
+template {
+  display: none;
+}
+
+[hidden] {
+  display: none !important;
+}
+
+h1, h2, h3, h4, h5, h6,
+.h1, .h2, .h3, .h4, .h5, .h6 {
+  margin-bottom: 0.5rem;
+  font-weight: 500;
+  line-height: 1.2;
+}
+
+h1, .h1 {
+  font-size: 2.5rem;
+}
+
+h2, .h2 {
+  font-size: 2rem;
+}
+
+h3, .h3 {
+  font-size: 1.75rem;
+}
+
+h4, .h4 {
+  font-size: 1.5rem;
+}
+
+h5, .h5 {
+  font-size: 1.25rem;
+}
+
+h6, .h6 {
+  font-size: 1rem;
+}
+
+.lead {
+  font-size: 1.25rem;
+  font-weight: 300;
+}
+
+.display-1 {
+  font-size: 6rem;
+  font-weight: 300;
+  line-height: 1.2;
+}
+
+.display-2 {
+  font-size: 5.5rem;
+  font-weight: 300;
+  line-height: 1.2;
+}
+
+.display-3 {
+  font-size: 4.5rem;
+  font-weight: 300;
+  line-height: 1.2;
+}
+
+.display-4 {
+  font-size: 3.5rem;
+  font-weight: 300;
+  line-height: 1.2;
+}
+
+hr {
+  margin-top: 1rem;
+  margin-bottom: 1rem;
+  border: 0;
+  border-top: 1px solid rgba(0, 0, 0, 0.1);
+}
+
+small,
+.small {
+  font-size: 80%;
+  font-weight: 400;
+}
+
+mark,
+.mark {
+  padding: 0.2em;
+  background-color: #fcf8e3;
+}
+
+.list-unstyled {
+  padding-left: 0;
+  list-style: none;
+}
+
+.list-inline {
+  padding-left: 0;
+  list-style: none;
+}
+
+.list-inline-item {
+  display: inline-block;
+}
+
+.list-inline-item:not(:last-child) {
+  margin-right: 0.5rem;
+}
+
+.initialism {
+  font-size: 90%;
+  text-transform: uppercase;
+}
+
+.blockquote {
+  margin-bottom: 1rem;
+  font-size: 1.25rem;
+}
+
+.blockquote-footer {
+  display: block;
+  font-size: 80%;
+  color: #6c757d;
+}
+
+.blockquote-footer::before {
+  content: "\2014\00A0";
+}
+
+.img-fluid {
+  max-width: 100%;
+  height: auto;
+}
+
+.img-thumbnail {
+  padding: 0.25rem;
+  background-color: #fff;
+  border: 1px solid #dee2e6;
+  border-radius: 0.25rem;
+  max-width: 100%;
+  height: auto;
+}
+
+.figure {
+  display: inline-block;
+}
+
+.figure-img {
+  margin-bottom: 0.5rem;
+  line-height: 1;
+}
+
+.figure-caption {
+  font-size: 90%;
+  color: #6c757d;
+}
+
+code {
+  font-size: 87.5%;
+  color: #e83e8c;
+  word-break: break-word;
+}
+
+a > code {
+  color: inherit;
+}
+
+kbd {
+  padding: 0.2rem 0.4rem;
+  font-size: 87.5%;
+  color: #fff;
+  background-color: #212529;
+  border-radius: 0.2rem;
+}
+
+kbd kbd {
+  padding: 0;
+  font-size: 100%;
+  font-weight: 700;
+}
+
+pre {
+  display: block;
+  font-size: 87.5%;
+  color: #212529;
+}
+
+pre code {
+  font-size: inherit;
+  color: inherit;
+  word-break: normal;
+}
+
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll;
+}
+
+.container {
+  width: 100%;
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-right: auto;
+  margin-left: auto;
+}
+
+@media (min-width: 576px) {
+  .container {
+    max-width: 540px;
+  }
+}
+
+@media (min-width: 768px) {
+  .container {
+    max-width: 720px;
+  }
+}
+
+@media (min-width: 992px) {
+  .container {
+    max-width: 960px;
+  }
+}
+
+@media (min-width: 1200px) {
+  .container {
+    max-width: 1140px;
+  }
+}
+
+.container-fluid {
+  width: 100%;
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-right: auto;
+  margin-left: auto;
+}
+
+.row {
+  display: -ms-flexbox;
+  display: flex;
+  -ms-flex-wrap: wrap;
+  flex-wrap: wrap;
+  margin-right: -15px;
+  margin-left: -15px;
+}
+
+.no-gutters {
+  margin-right: 0;
+  margin-left: 0;
+}
+
+.no-gutters > .col,
+.no-gutters > [class*="col-"] {
+  padding-right: 0;
+  padding-left: 0;
+}
+
+.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+.col-xl-auto {
+  position: relative;
+  width: 100%;
+  padding-right: 15px;
+  padding-left: 15px;
+}
+
+.col {
+  -ms-flex-preferred-size: 0;
+  flex-basis: 0;
+  -ms-flex-positive: 1;
+  flex-grow: 1;
+  max-width: 100%;
+}
+
+.col-auto {
+  -ms-flex: 0 0 auto;
+  flex: 0 0 auto;
+  width: auto;
+  max-width: 100%;
+}
+
+.col-1 {
+  -ms-flex: 0 0 8.333333%;
+  flex: 0 0 8.333333%;
+  max-width: 8.333333%;
+}
+
+.col-2 {
+  -ms-flex: 0 0 16.666667%;
+  flex: 0 0 16.666667%;
+  max-width: 16.666667%;
+}
+
+.col-3 {
+  -ms-flex: 0 0 25%;
+  flex: 0 0 25%;
+  max-width: 25%;
+}
+
+.col-4 {
+  -ms-flex: 0 0 33.333333%;
+  flex: 0 0 33.333333%;
+  max-width: 33.333333%;
+}
+
+.col-5 {
+  -ms-flex: 0 0 41.666667%;
+  flex: 0 0 41.666667%;
+  max-width: 41.666667%;
+}
+
+.col-6 {
+  -ms-flex: 0 0 50%;
+  flex: 0 0 50%;
+  max-width: 50%;
+}
+
+.col-7 {
+  -ms-flex: 0 0 58.333333%;
+  flex: 0 0 58.333333%;
+  max-width: 58.333333%;
+}
+
+.col-8 {
+  -ms-flex: 0 0 66.666667%;
+  flex: 0 0 66.666667%;
+  max-width: 66.666667%;
+}
+
+.col-9 {
+  -ms-flex: 0 0 75%;
+  flex: 0 0 75%;
+  max-width: 75%;
+}
+
+.col-10 {
+  -ms-flex: 0 0 83.333333%;
+  flex: 0 0 83.333333%;
+  max-width: 83.333333%;
+}
+
+.col-11 {
+  -ms-flex: 0 0 91.666667%;
+  flex: 0 0 91.666667%;
+  max-width: 91.666667%;
+}
+
+.col-12 {
+  -ms-flex: 0 0 100%;
+  flex: 0 0 100%;
+  max-width: 100%;
+}
+
+.order-first {
+  -ms-flex-order: -1;
+  order: -1;
+}
+
+.order-last {
+  -ms-flex-order: 13;
+  order: 13;
+}
+
+.order-0 {
+  -ms-flex-order: 0;
+  order: 0;
+}
+
+.order-1 {
+  -ms-flex-order: 1;
+  order: 1;
+}
+
+.order-2 {
+  -ms-flex-order: 2;
+  order: 2;
+}
+
+.order-3 {
+  -ms-flex-order: 3;
+  order: 3;
+}
+
+.order-4 {
+  -ms-flex-order: 4;
+  order: 4;
+}
+
+.order-5 {
+  -ms-flex-order: 5;
+  order: 5;
+}
+
+.order-6 {
+  -ms-flex-order: 6;
+  order: 6;
+}
+
+.order-7 {
+  -ms-flex-order: 7;
+  order: 7;
+}
+
+.order-8 {
+  -ms-flex-order: 8;
+  order: 8;
+}
+
+.order-9 {
+  -ms-flex-order: 9;
+  order: 9;
+}
+
+.order-10 {
+  -ms-flex-order: 10;
+  order: 10;
+}
+
+.order-11 {
+  -ms-flex-order: 11;
+  order: 11;
+}
+
+.order-12 {
+  -ms-flex-order: 12;
+  order: 12;
+}
+
+.offset-1 {
+  margin-left: 8.333333%;
+}
+
+.offset-2 {
+  margin-left: 16.666667%;
+}
+
+.offset-3 {
+  margin-left: 25%;
+}
+
+.offset-4 {
+  margin-left: 33.333333%;
+}
+
+.offset-5 {
+  margin-left: 41.666667%;
+}
+
+.offset-6 {
+  margin-left: 50%;
+}
+
+.offset-7 {
+  margin-left: 58.333333%;
+}
+
+.offset-8 {
+  margin-left: 66.666667%;
+}
+
+.offset-9 {
+  margin-left: 75%;
+}
+
+.offset-10 {
+  margin-left: 83.333333%;
+}
+
+.offset-11 {
+  margin-left: 91.666667%;
+}
+
+@media (min-width: 576px) {
+  .col-sm {
+    -ms-flex-preferred-size: 0;
+    flex-basis: 0;
+    -ms-flex-positive: 1;
+    flex-grow: 1;
+    max-width: 100%;
+  }
+  .col-sm-auto {
+    -ms-flex: 0 0 auto;
+    flex: 0 0 auto;
+    width: auto;
+    max-width: 100%;
+  }
+  .col-sm-1 {
+    -ms-flex: 0 0 8.333333%;
+    flex: 0 0 8.333333%;
+    max-width: 8.333333%;
+  }
+  .col-sm-2 {
+    -ms-flex: 0 0 16.666667%;
+    flex: 0 0 16.666667%;
+    max-width: 16.666667%;
+  }
+  .col-sm-3 {
+    -ms-flex: 0 0 25%;
+    flex: 0 0 25%;
+    max-width: 25%;
+  }
+  .col-sm-4 {
+    -ms-flex: 0 0 33.333333%;
+    flex: 0 0 33.333333%;
+    max-width: 33.333333%;
+  }
+  .col-sm-5 {
+    -ms-flex: 0 0 41.666667%;
+    flex: 0 0 41.666667%;
+    max-width: 41.666667%;
+  }
+  .col-sm-6 {
+    -ms-flex: 0 0 50%;
+    flex: 0 0 50%;
+    max-width: 50%;
+  }
+  .col-sm-7 {
+    -ms-flex: 0 0 58.333333%;
+    flex: 0 0 58.333333%;
+    max-width: 58.333333%;
+  }
+  .col-sm-8 {
+    -ms-flex: 0 0 66.666667%;
+    flex: 0 0 66.666667%;
+    max-width: 66.666667%;
+  }
+  .col-sm-9 {
+    -ms-flex: 0 0 75%;
+    flex: 0 0 75%;
+    max-width: 75%;
+  }
+  .col-sm-10 {
+    -ms-flex: 0 0 83.333333%;
+    flex: 0 0 83.333333%;
+    max-width: 83.333333%;
+  }
+  .col-sm-11 {
+    -ms-flex: 0 0 91.666667%;
+    flex: 0 0 91.666667%;
+    max-width: 91.666667%;
+  }
+  .col-sm-12 {
+    -ms-flex: 0 0 100%;
+    flex: 0 0 100%;
+    max-width: 100%;
+  }
+  .order-sm-first {
+    -ms-flex-order: -1;
+    order: -1;
+  }
+  .order-sm-last {
+    -ms-flex-order: 13;
+    order: 13;
+  }
+  .order-sm-0 {
+    -ms-flex-order: 0;
+    order: 0;
+  }
+  .order-sm-1 {
+    -ms-flex-order: 1;
+    order: 1;
+  }
+  .order-sm-2 {
+    -ms-flex-order: 2;
+    order: 2;
+  }
+  .order-sm-3 {
+    -ms-flex-order: 3;
+    order: 3;
+  }
+  .order-sm-4 {
+    -ms-flex-order: 4;
+    order: 4;
+  }
+  .order-sm-5 {
+    -ms-flex-order: 5;
+    order: 5;
+  }
+  .order-sm-6 {
+    -ms-flex-order: 6;
+    order: 6;
+  }
+  .order-sm-7 {
+    -ms-flex-order: 7;
+    order: 7;
+  }
+  .order-sm-8 {
+    -ms-flex-order: 8;
+    order: 8;
+  }
+  .order-sm-9 {
+    -ms-flex-order: 9;
+    order: 9;
+  }
+  .order-sm-10 {
+    -ms-flex-order: 10;
+    order: 10;
+  }
+  .order-sm-11 {
+    -ms-flex-order: 11;
+    order: 11;
+  }
+  .order-sm-12 {
+    -ms-flex-order: 12;
+    order: 12;
+  }
+  .offset-sm-0 {
+    margin-left: 0;
+  }
+  .offset-sm-1 {
+    margin-left: 8.333333%;
+  }
+  .offset-sm-2 {
+    margin-left: 16.666667%;
+  }
+  .offset-sm-3 {
+    margin-left: 25%;
+  }
+  .offset-sm-4 {
+    margin-left: 33.333333%;
+  }
+  .offset-sm-5 {
+    margin-left: 41.666667%;
+  }
+  .offset-sm-6 {
+    margin-left: 50%;
+  }
+  .offset-sm-7 {
+    margin-left: 58.333333%;
+  }
+  .offset-sm-8 {
+    margin-left: 66.666667%;
+  }
+  .offset-sm-9 {
+    margin-left: 75%;
+  }
+  .offset-sm-10 {
+    margin-left: 83.333333%;
+  }
+  .offset-sm-11 {
+    margin-left: 91.666667%;
+  }
+}
+
+@media (min-width: 768px) {
+  .col-md {
+    -ms-flex-preferred-size: 0;
+    flex-basis: 0;
+    -ms-flex-positive: 1;
+    flex-grow: 1;
+    max-width: 100%;
+  }
+  .col-md-auto {
+    -ms-flex: 0 0 auto;
+    flex: 0 0 auto;
+    width: auto;
+    max-width: 100%;
+  }
+  .col-md-1 {
+    -ms-flex: 0 0 8.333333%;
+    flex: 0 0 8.333333%;
+    max-width: 8.333333%;
+  }
+  .col-md-2 {
+    -ms-flex: 0 0 16.666667%;
+    flex: 0 0 16.666667%;
+    max-width: 16.666667%;
+  }
+  .col-md-3 {
+    -ms-flex: 0 0 25%;
+    flex: 0 0 25%;
+    max-width: 25%;
+  }
+  .col-md-4 {
+    -ms-flex: 0 0 33.333333%;
+    flex: 0 0 33.333333%;
+    max-width: 33.333333%;
+  }
+  .col-md-5 {
+    -ms-flex: 0 0 41.666667%;
+    flex: 0 0 41.666667%;
+    max-width: 41.666667%;
+  }
+  .col-md-6 {
+    -ms-flex: 0 0 50%;
+    flex: 0 0 50%;
+    max-width: 50%;
+  }
+  .col-md-7 {
+    -ms-flex: 0 0 58.333333%;
+    flex: 0 0 58.333333%;
+    max-width: 58.333333%;
+  }
+  .col-md-8 {
+    -ms-flex: 0 0 66.666667%;
+    flex: 0 0 66.666667%;
+    max-width: 66.666667%;
+  }
+  .col-md-9 {
+    -ms-flex: 0 0 75%;
+    flex: 0 0 75%;
+    max-width: 75%;
+  }
+  .col-md-10 {
+    -ms-flex: 0 0 83.333333%;
+    flex: 0 0 83.333333%;
+    max-width: 83.333333%;
+  }
+  .col-md-11 {
+    -ms-flex: 0 0 91.666667%;
+    flex: 0 0 91.666667%;
+    max-width: 91.666667%;
+  }
+  .col-md-12 {
+    -ms-flex: 0 0 100%;
+    flex: 0 0 100%;
+    max-width: 100%;
+  }
+  .order-md-first {
+    -ms-flex-order: -1;
+    order: -1;
+  }
+  .order-md-last {
+    -ms-flex-order: 13;
+    order: 13;
+  }
+  .order-md-0 {
+    -ms-flex-order: 0;
+    order: 0;
+  }
+  .order-md-1 {
+    -ms-flex-order: 1;
+    order: 1;
+  }
+  .order-md-2 {
+    -ms-flex-order: 2;
+    order: 2;
+  }
+  .order-md-3 {
+    -ms-flex-order: 3;
+    order: 3;
+  }
+  .order-md-4 {
+    -ms-flex-order: 4;
+    order: 4;
+  }
+  .order-md-5 {
+    -ms-flex-order: 5;
+    order: 5;
+  }
+  .order-md-6 {
+    -ms-flex-order: 6;
+    order: 6;
+  }
+  .order-md-7 {
+    -ms-flex-order: 7;
+    order: 7;
+  }
+  .order-md-8 {
+    -ms-flex-order: 8;
+    order: 8;
+  }
+  .order-md-9 {
+    -ms-flex-order: 9;
+    order: 9;
+  }
+  .order-md-10 {
+    -ms-flex-order: 10;
+    order: 10;
+  }
+  .order-md-11 {
+    -ms-flex-order: 11;
+    order: 11;
+  }
+  .order-md-12 {
+    -ms-flex-order: 12;
+    order: 12;
+  }
+  .offset-md-0 {
+    margin-left: 0;
+  }
+  .offset-md-1 {
+    margin-left: 8.333333%;
+  }
+  .offset-md-2 {
+    margin-left: 16.666667%;
+  }
+  .offset-md-3 {
+    margin-left: 25%;
+  }
+  .offset-md-4 {
+    margin-left: 33.333333%;
+  }
+  .offset-md-5 {
+    margin-left: 41.666667%;
+  }
+  .offset-md-6 {
+    margin-left: 50%;
+  }
+  .offset-md-7 {
+    margin-left: 58.333333%;
+  }
+  .offset-md-8 {
+    margin-left: 66.666667%;
+  }
+  .offset-md-9 {
+    margin-left: 75%;
+  }
+  .offset-md-10 {
+    margin-left: 83.333333%;
+  }
+  .offset-md-11 {
+    margin-left: 91.666667%;
+  }
+}
+
+@media (min-width: 992px) {
+  .col-lg {
+    -ms-flex-preferred-size: 0;
+    flex-basis: 0;
+    -ms-flex-positive: 1;
+    flex-grow: 1;
+    max-width: 100%;
+  }
+  .col-lg-auto {
+    -ms-flex: 0 0 auto;
+    flex: 0 0 auto;
+    width: auto;
+    max-width: 100%;
+  }
+  .col-lg-1 {
+    -ms-flex: 0 0 8.333333%;
+    flex: 0 0 8.333333%;
+    max-width: 8.333333%;
+  }
+  .col-lg-2 {
+    -ms-flex: 0 0 16.666667%;
+    flex: 0 0 16.666667%;
+    max-width: 16.666667%;
+  }
+  .col-lg-3 {
+    -ms-flex: 0 0 25%;
+    flex: 0 0 25%;
+    max-width: 25%;
+  }
+  .col-lg-4 {
+    -ms-flex: 0 0 33.333333%;
+    flex: 0 0 33.333333%;
+    max-width: 33.333333%;
+  }
+  .col-lg-5 {
+    -ms-flex: 0 0 41.666667%;
+    flex: 0 0 41.666667%;
+    max-width: 41.666667%;
+  }
+  .col-lg-6 {
+    -ms-flex: 0 0 50%;
+    flex: 0 0 50%;
+    max-width: 50%;
+  }
+  .col-lg-7 {
+    -ms-flex: 0 0 58.333333%;
+    flex: 0 0 58.333333%;
+    max-width: 58.333333%;
+  }
+  .col-lg-8 {
+    -ms-flex: 0 0 66.666667%;
+    flex: 0 0 66.666667%;
+    max-width: 66.666667%;
+  }
+  .col-lg-9 {
+    -ms-flex: 0 0 75%;
+    flex: 0 0 75%;
+    max-width: 75%;
+  }
+  .col-lg-10 {
+    -ms-flex: 0 0 83.333333%;
+    flex: 0 0 83.333333%;
+    max-width: 83.333333%;
+  }
+  .col-lg-11 {
+    -ms-flex: 0 0 91.666667%;
+    flex: 0 0 91.666667%;
+    max-width: 91.666667%;
+  }
+  .col-lg-12 {
+    -ms-flex: 0 0 100%;
+    flex: 0 0 100%;
+    max-width: 100%;
+  }
+  .order-lg-first {
+    -ms-flex-order: -1;
+    order: -1;
+  }
+  .order-lg-last {
+    -ms-flex-order: 13;
+    order: 13;
+  }
+  .order-lg-0 {
+    -ms-flex-order: 0;
+    order: 0;
+  }
+  .order-lg-1 {
+    -ms-flex-order: 1;
+    order: 1;
+  }
+  .order-lg-2 {
+    -ms-flex-order: 2;
+    order: 2;
+  }
+  .order-lg-3 {
+    -ms-flex-order: 3;
+    order: 3;
+  }
+  .order-lg-4 {
+    -ms-flex-order: 4;
+    order: 4;
+  }
+  .order-lg-5 {
+    -ms-flex-order: 5;
+    order: 5;
+  }
+  .order-lg-6 {
+    -ms-flex-order: 6;
+    order: 6;
+  }
+  .order-lg-7 {
+    -ms-flex-order: 7;
+    order: 7;
+  }
+  .order-lg-8 {
+    -ms-flex-order: 8;
+    order: 8;
+  }
+  .order-lg-9 {
+    -ms-flex-order: 9;
+    order: 9;
+  }
+  .order-lg-10 {
+    -ms-flex-order: 10;
+    order: 10;
+  }
+  .order-lg-11 {
+    -ms-flex-order: 11;
+    order: 11;
+  }
+  .order-lg-12 {
+    -ms-flex-order: 12;
+    order: 12;
+  }
+  .offset-lg-0 {
+    margin-left: 0;
+  }
+  .offset-lg-1 {
+    margin-left: 8.333333%;
+  }
+  .offset-lg-2 {
+    margin-left: 16.666667%;
+  }
+  .offset-lg-3 {
+    margin-left: 25%;
+  }
+  .offset-lg-4 {
+    margin-left: 33.333333%;
+  }
+  .offset-lg-5 {
+    margin-left: 41.666667%;
+  }
+  .offset-lg-6 {
+    margin-left: 50%;
+  }
+  .offset-lg-7 {
+    margin-left: 58.333333%;
+  }
+  .offset-lg-8 {
+    margin-left: 66.666667%;
+  }
+  .offset-lg-9 {
+    margin-left: 75%;
+  }
+  .offset-lg-10 {
+    margin-left: 83.333333%;
+  }
+  .offset-lg-11 {
+    margin-left: 91.666667%;
+  }
+}
+
+@media (min-width: 1200px) {
+  .col-xl {
+    -ms-flex-preferred-size: 0;
+    flex-basis: 0;
+    -ms-flex-positive: 1;
+    flex-grow: 1;
+    max-width: 100%;
+  }
+  .col-xl-auto {
+    -ms-flex: 0 0 auto;
+    flex: 0 0 auto;
+    width: auto;
+    max-width: 100%;
+  }
+  .col-xl-1 {
+    -ms-flex: 0 0 8.333333%;
+    flex: 0 0 8.333333%;
+    max-width: 8.333333%;
+  }
+  .col-xl-2 {
+    -ms-flex: 0 0 16.666667%;
+    flex: 0 0 16.666667%;
+    max-width: 16.666667%;
+  }
+  .col-xl-3 {
+    -ms-flex: 0 0 25%;
+    flex: 0 0 25%;
+    max-width: 25%;
+  }
+  .col-xl-4 {
+    -ms-flex: 0 0 33.333333%;
+    flex: 0 0 33.333333%;
+    max-width: 33.333333%;
+  }
+  .col-xl-5 {
+    -ms-flex: 0 0 41.666667%;
+    flex: 0 0 41.666667%;
+    max-width: 41.666667%;
+  }
+  .col-xl-6 {
+    -ms-flex: 0 0 50%;
+    flex: 0 0 50%;
+    max-width: 50%;
+  }
+  .col-xl-7 {
+    -ms-flex: 0 0 58.333333%;
+    flex: 0 0 58.333333%;
+    max-width: 58.333333%;
+  }
+  .col-xl-8 {
+    -ms-flex: 0 0 66.666667%;
+    flex: 0 0 66.666667%;
+    max-width: 66.666667%;
+  }
+  .col-xl-9 {
+    -ms-flex: 0 0 75%;
+    flex: 0 0 75%;
+    max-width: 75%;
+  }
+  .col-xl-10 {
+    -ms-flex: 0 0 83.333333%;
+    flex: 0 0 83.333333%;
+    max-width: 83.333333%;
+  }
+  .col-xl-11 {
+    -ms-flex: 0 0 91.666667%;
+    flex: 0 0 91.666667%;
+    max-width: 91.666667%;
+  }
+  .col-xl-12 {
+    -ms-flex: 0 0 100%;
+    flex: 0 0 100%;
+    max-width: 100%;
+  }
+  .order-xl-first {
+    -ms-flex-order: -1;
+    order: -1;
+  }
+  .order-xl-last {
+    -ms-flex-order: 13;
+    order: 13;
+  }
+  .order-xl-0 {
+    -ms-flex-order: 0;
+    order: 0;
+  }
+  .order-xl-1 {
+    -ms-flex-order: 1;
+    order: 1;
+  }
+  .order-xl-2 {
+    -ms-flex-order: 2;
+    order: 2;
+  }
+  .order-xl-3 {
+    -ms-flex-order: 3;
+    order: 3;
+  }
+  .order-xl-4 {
+    -ms-flex-order: 4;
+    order: 4;
+  }
+  .order-xl-5 {
+    -ms-flex-order: 5;
+    order: 5;
+  }
+  .order-xl-6 {
+    -ms-flex-order: 6;
+    order: 6;
+  }
+  .order-xl-7 {
+    -ms-flex-order: 7;
+    order: 7;
+  }
+  .order-xl-8 {
+    -ms-flex-order: 8;
+    order: 8;
+  }
+  .order-xl-9 {
+    -ms-flex-order: 9;
+    order: 9;
+  }
+  .order-xl-10 {
+    -ms-flex-order: 10;
+    order: 10;
+  }
+  .order-xl-11 {
+    -ms-flex-order: 11;
+    order: 11;
+  }
+  .order-xl-12 {
+    -ms-flex-order: 12;
+    order: 12;
+  }
+  .offset-xl-0 {
+    margin-left: 0;
+  }
+  .offset-xl-1 {
+    margin-left: 8.333333%;
+  }
+  .offset-xl-2 {
+    margin-left: 16.666667%;
+  }
+  .offset-xl-3 {
+    margin-left: 25%;
+  }
+  .offset-xl-4 {
+    margin-left: 33.333333%;
+  }
+  .offset-xl-5 {
+    margin-left: 41.666667%;
+  }
+  .offset-xl-6 {
+    margin-left: 50%;
+  }
+  .offset-xl-7 {
+    margin-left: 58.333333%;
+  }
+  .offset-xl-8 {
+    margin-left: 66.666667%;
+  }
+  .offset-xl-9 {
+    margin-left: 75%;
+  }
+  .offset-xl-10 {
+    margin-left: 83.333333%;
+  }
+  .offset-xl-11 {
+    margin-left: 91.666667%;
+  }
+}
+
+.table {
+  width: 100%;
+  margin-bottom: 1rem;
+  color: #212529;
+}
+
+.table th,
+.table td {
+  padding: 0.75rem;
+  vertical-align: top;
+  border-top: 1px solid #dee2e6;
+}
+
+.table thead th {
+  vertical-align: bottom;
+  border-bottom: 2px solid #dee2e6;
+}
+
+.table tbody + tbody {
+  border-top: 2px solid #dee2e6;
+}
+
+.table-sm th,
+.table-sm td {
+  padding: 0.3rem;
+}
+
+.table-bordered {
+  border: 1px solid #dee2e6;
+}
+
+.table-bordered th,
+.table-bordered td {
+  border: 1px solid #dee2e6;
+}
+
+.table-bordered thead th,
+.table-bordered thead td {
+  border-bottom-width: 2px;
+}
+
+.table-borderless th,
+.table-borderless td,
+.table-borderless thead th,
+.table-borderless tbody + tbody {
+  border: 0;
+}
+
+.table-striped tbody tr:nth-of-type(odd) {
+  background-color: rgba(0, 0, 0, 0.05);
+}
+
+.table-hover tbody tr:hover {
+  color: #212529;
+  background-color: rgba(0, 0, 0, 0.075);
+}
+
+.table-primary,
+.table-primary > th,
+.table-primary > td {
+  background-color: #b8daff;
+}
+
+.table-primary th,
+.table-primary td,
+.table-primary thead th,
+.table-primary tbody + tbody {
+  border-color: #7abaff;
+}
+
+.table-hover .table-primary:hover {
+  background-color: #9fcdff;
+}
+
+.table-hover .table-primary:hover > td,
+.table-hover .table-primary:hover > th {
+  background-color: #9fcdff;
+}
+
+.table-secondary,
+.table-secondary > th,
+.table-secondary > td {
+  background-color: #d6d8db;
+}
+
+.table-secondary th,
+.table-secondary td,
+.table-secondary thead th,
+.table-secondary tbody + tbody {
+  border-color: #b3b7bb;
+}
+
+.table-hover .table-secondary:hover {
+  background-color: #c8cbcf;
+}
+
+.table-hover .table-secondary:hover > td,
+.table-hover .table-secondary:hover > th {
+  background-color: #c8cbcf;
+}
+
+.table-success,
+.table-success > th,
+.table-success > td {
+  background-color: #c3e6cb;
+}
+
+.table-success th,
+.table-success td,
+.table-success thead th,
+.table-success tbody + tbody {
+  border-color: #8fd19e;
+}
+
+.table-hover .table-success:hover {
+  background-color: #b1dfbb;
+}
+
+.table-hover .table-success:hover > td,
+.table-hover .table-success:hover > th {
+  background-color: #b1dfbb;
+}
+
+.table-info,
+.table-info > th,
+.table-info > td {
+  background-color: #bee5eb;
+}
+
+.table-info th,
+.table-info td,
+.table-info thead th,
+.table-info tbody + tbody {
+  border-color: #86cfda;
+}
+
+.table-hover .table-info:hover {
+  background-color: #abdde5;
+}
+
+.table-hover .table-info:hover > td,
+.table-hover .table-info:hover > th {
+  background-color: #abdde5;
+}
+
+.table-warning,
+.table-warning > th,
+.table-warning > td {
+  background-color: #ffeeba;
+}
+
+.table-warning th,
+.table-warning td,
+.table-warning thead th,
+.table-warning tbody + tbody {
+  border-color: #ffdf7e;
+}
+
+.table-hover .table-warning:hover {
+  background-color: #ffe8a1;
+}
+
+.table-hover .table-warning:hover > td,
+.table-hover .table-warning:hover > th {
+  background-color: #ffe8a1;
+}
+
+.table-danger,
+.table-danger > th,
+.table-danger > td {
+  background-color: #f5c6cb;
+}
+
+.table-danger th,
+.table-danger td,
+.table-danger thead th,
+.table-danger tbody + tbody {
+  border-color: #ed969e;
+}
+
+.table-hover .table-danger:hover {
+  background-color: #f1b0b7;
+}
+
+.table-hover .table-danger:hover > td,
+.table-hover .table-danger:hover > th {
+  background-color: #f1b0b7;
+}
+
+.table-light,
+.table-light > th,
+.table-light > td {
+  background-color: #fdfdfe;
+}
+
+.table-light th,
+.table-light td,
+.table-light thead th,
+.table-light tbody + tbody {
+  border-color: #fbfcfc;
+}
+
+.table-hover .table-light:hover {
+  background-color: #ececf6;
+}
+
+.table-hover .table-light:hover > td,
+.table-hover .table-light:hover > th {
+  background-color: #ececf6;
+}
+
+.table-dark,
+.table-dark > th,
+.table-dark > td {
+  background-color: #c6c8ca;
+}
+
+.table-dark th,
+.table-dark td,
+.table-dark thead th,
+.table-dark tbody + tbody {
+  border-color: #95999c;
+}
+
+.table-hover .table-dark:hover {
+  background-color: #b9bbbe;
+}
+
+.table-hover .table-dark:hover > td,
+.table-hover .table-dark:hover > th {
+  background-color: #b9bbbe;
+}
+
+.table-active,
+.table-active > th,
+.table-active > td {
+  background-color: rgba(0, 0, 0, 0.075);
+}
+
+.table-hover .table-active:hover {
+  background-color: rgba(0, 0, 0, 0.075);
+}
+
+.table-hover .table-active:hover > td,
+.table-hover .table-active:hover > th {
+  background-color: rgba(0, 0, 0, 0.075);
+}
+
+.table .thead-dark th {
+  color: #fff;
+  background-color: #343a40;
+  border-color: #454d55;
+}
+
+.table .thead-light th {
+  color: #495057;
+  background-color: #e9ecef;
+  border-color: #dee2e6;
+}
+
+.table-dark {
+  color: #fff;
+  background-color: #343a40;
+}
+
+.table-dark th,
+.table-dark td,
+.table-dark thead th {
+  border-color: #454d55;
+}
+
+.table-dark.table-bordered {
+  border: 0;
+}
+
+.table-dark.table-striped tbody tr:nth-of-type(odd) {
+  background-color: rgba(255, 255, 255, 0.05);
+}
+
+.table-dark.table-hover tbody tr:hover {
+  color: #fff;
+  background-color: rgba(255, 255, 255, 0.075);
+}
+
+@media (max-width: 575.98px) {
+  .table-responsive-sm {
+    display: block;
+    width: 100%;
+    overflow-x: auto;
+    -webkit-overflow-scrolling: touch;
+  }
+  .table-responsive-sm > .table-bordered {
+    border: 0;
+  }
+}
+
+@media (max-width: 767.98px) {
+  .table-responsive-md {
+    display: block;
+    width: 100%;
+    overflow-x: auto;
+    -webkit-overflow-scrolling: touch;
+  }
+  .table-responsive-md > .table-bordered {
+    border: 0;
+  }
+}
+
+@media (max-width: 991.98px) {
+  .table-responsive-lg {
+    display: block;
+    width: 100%;
+    overflow-x: auto;
+    -webkit-overflow-scrolling: touch;
+  }
+  .table-responsive-lg > .table-bordered {
+    border: 0;
+  }
+}
+
+@media (max-width: 1199.98px) {
+  .table-responsive-xl {
+    display: block;
+    width: 100%;
+    overflow-x: auto;
+    -webkit-overflow-scrolling: touch;
+  }
+  .table-responsive-xl > .table-bordered {
+    border: 0;
+  }
+}
+
+.table-responsive {
+  display: block;
+  width: 100%;
+  overflow-x: auto;
+  -webkit-overflow-scrolling: touch;
+}
+
+.table-responsive > .table-bordered {
+  border: 0;
+}
+
+.form-control {
+  display: block;
+  width: 100%;
+  height: calc(1.5em + 0.75rem + 2px);
+  padding: 0.375rem 0.75rem;
+  font-size: 1rem;
+  font-weight: 400;
+  line-height: 1.5;
+  color: #495057;
+  background-color: #fff;
+  background-clip: padding-box;
+  border: 1px solid #ced4da;
+  border-radius: 0.25rem;
+  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+  .form-control {
+    transition: none;
+  }
+}
+
+.form-control::-ms-expand {
+  background-color: transparent;
+  border: 0;
+}
+
+.form-control:focus {
+  color: #495057;
+  background-color: #fff;
+  border-color: #80bdff;
+  outline: 0;
+  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
+}
+
+.form-control::-webkit-input-placeholder {
+  color: #6c757d;
+  opacity: 1;
+}
+
+.form-control::-moz-placeholder {
+  color: #6c757d;
+  opacity: 1;
+}
+
+.form-control:-ms-input-placeholder {
+  color: #6c757d;
+  opacity: 1;
+}
+
+.form-control::-ms-input-placeholder {
+  color: #6c757d;
+  opacity: 1;
+}
+
+.form-control::placeholder {
+  color: #6c757d;
+  opacity: 1;
+}
+
+.form-control:disabled, .form-control[readonly] {
+  background-color: #e9ecef;
+  opacity: 1;
+}
+
+select.form-control:focus::-ms-value {
+  color: #495057;
+  background-color: #fff;
+}
+
+.form-control-file,
+.form-control-range {
+  display: block;
+  width: 100%;
+}
+
+.col-form-label {
+  padding-top: calc(0.375rem + 1px);
+  padding-bottom: calc(0.375rem + 1px);
+  margin-bottom: 0;
+  font-size: inherit;
+  line-height: 1.5;
+}
+
+.col-form-label-lg {
+  padding-top: calc(0.5rem + 1px);
+  padding-bottom: calc(0.5rem + 1px);
+  font-size: 1.25rem;
+  line-height: 1.5;
+}
+
+.col-form-label-sm {
+  padding-top: calc(0.25rem + 1px);
+  padding-bottom: calc(0.25rem + 1px);
+  font-size: 0.875rem;
+  line-height: 1.5;
+}
+
+.form-control-plaintext {
+  display: block;
+  width: 100%;
+  padding-top: 0.375rem;
+  padding-bottom: 0.375rem;
+  margin-bottom: 0;
+  line-height: 1.5;
+  color: #212529;
+  background-color: transparent;
+  border: solid transparent;
+  border-width: 1px 0;
+}
+
+.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {
+  padding-right: 0;
+  padding-left: 0;
+}
+
+.form-control-sm {
+  height: calc(1.5em + 0.5rem + 2px);
+  padding: 0.25rem 0.5rem;
+  font-size: 0.875rem;
+  line-height: 1.5;
+  border-radius: 0.2rem;
+}
+
+.form-control-lg {
+  height: calc(1.5em + 1rem + 2px);
+  padding: 0.5rem 1rem;
+  font-size: 1.25rem;
+  line-height: 1.5;
+  border-radius: 0.3rem;
+}
+
+select.form-control[size], select.form-control[multiple] {
+  height: auto;
+}
+
+textarea.form-control {
+  height: auto;
+}
+
+.form-group {
+  margin-bottom: 1rem;
+}
+
+.form-text {
+  display: block;
+  margin-top: 0.25rem;
+}
+
+.form-row {
+  display: -ms-flexbox;
+  display: flex;
+  -ms-flex-wrap: wrap;
+  flex-wrap: wrap;
+  margin-right: -5px;
+  margin-left: -5px;
+}
+
+.form-row > .col,
+.form-row > [class*="col-"] {
+  padding-right: 5px;
+  padding-left: 5px;
+}
+
+.form-check {
+  position: relative;
+  display: block;
+  padding-left: 1.25rem;
+}
+
+.form-check-input {
+  position: absolute;
+  margin-top: 0.3rem;
+  margin-left: -1.25rem;
+}
+
+.form-check-input:disabled ~ .form-check-label {
+  color: #6c757d;
+}
+
+.form-check-label {
+  margin-bottom: 0;
+}
+
+.form-check-inline {
+  display: -ms-inline-flexbox;
+  display: inline-flex;
+  -ms-flex-align: center;
+  align-items: center;
+  padding-left: 0;
+  margin-right: 0.75rem;
+}
+
+.form-check-inline .form-check-input {
+  position: static;
+  margin-top: 0;
+  margin-right: 0.3125rem;
+  margin-left: 0;
+}
+
+.valid-feedback {
+  display: none;
+  width: 100%;
+  margin-top: 0.25rem;
+  font-size: 80%;
+  color: #28a745;
+}
+
+.valid-tooltip {
+  position: absolute;
+  top: 100%;
+  z-index: 5;
+  display: none;
+  max-width: 100%;
+  padding: 0.25rem 0.5rem;
+  margin-top: .1rem;
+  font-size: 0.875rem;
+  line-height: 1.5;
+  color: #fff;
+  background-color: rgba(40, 167, 69, 0.9);
+  border-radius: 0.25rem;
+}
+
+.was-validated .form-control:valid, .form-control.is-valid {
+  border-color: #28a745;
+  padding-right: calc(1.5em + 0.75rem);
+  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
+  background-repeat: no-repeat;
+  background-position: center right calc(0.375em + 0.1875rem);
+  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+}
+
+.was-validated .form-control:valid:focus, .form-control.is-valid:focus {
+  border-color: #28a745;
+  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
+}
+
+.was-validated .form-control:valid ~ .valid-feedback,
+.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback,
+.form-control.is-valid ~ .valid-tooltip {
+  display: block;
+}
+
+.was-validated textarea.form-control:valid, textarea.form-control.is-valid {
+  padding-right: calc(1.5em + 0.75rem);
+  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
+}
+
+.was-validated .custom-select:valid, .custom-select.is-valid {
+  border-color: #28a745;
+  padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);
+  background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+}
+
+.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {
+  border-color: #28a745;
+  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
+}
+
+.was-validated .custom-select:valid ~ .valid-feedback,
+.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,
+.custom-select.is-valid ~ .valid-tooltip {
+  display: block;
+}
+
+.was-validated .form-control-file:valid ~ .valid-feedback,
+.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,
+.form-control-file.is-valid ~ .valid-tooltip {
+  display: block;
+}
+
+.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {
+  color: #28a745;
+}
+
+.was-validated .form-check-input:valid ~ .valid-feedback,
+.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,
+.form-check-input.is-valid ~ .valid-tooltip {
+  display: block;
+}
+
+.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {
+  color: #28a745;
+}
+
+.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {
+  border-color: #28a745;
+}
+
+.was-validated .custom-control-input:valid ~ .valid-feedback,
+.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,
+.custom-control-input.is-valid ~ .valid-tooltip {
+  display: block;
+}
+
+.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {
+  border-color: #34ce57;
+  background-color: #34ce57;
+}
+
+.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {
+  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
+}
+
+.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {
+  border-color: #28a745;
+}
+
+.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {
+  border-color: #28a745;
+}
+
+.was-validated .custom-file-input:valid ~ .valid-feedback,
+.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,
+.custom-file-input.is-valid ~ .valid-tooltip {
+  display: block;
+}
+
+.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {
+  border-color: #28a745;
+  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
+}
+
+.invalid-feedback {
+  display: none;
+  width: 100%;
+  margin-top: 0.25rem;
+  font-size: 80%;
+  color: #dc3545;
+}
+
+.invalid-tooltip {
+  position: absolute;
+  top: 100%;
+  z-index: 5;
+  display: none;
+  max-width: 100%;
+  padding: 0.25rem 0.5rem;
+  margin-top: .1rem;
+  font-size: 0.875rem;
+  line-height: 1.5;
+  color: #fff;
+  background-color: rgba(220, 53, 69, 0.9);
+  border-radius: 0.25rem;
+}
+
+.was-validated .form-control:invalid, .form-control.is-invalid {
+  border-color: #dc3545;
+  padding-right: calc(1.5em + 0.75rem);
+  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E");
+  background-repeat: no-repeat;
+  background-position: center right calc(0.375em + 0.1875rem);
+  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+}
+
+.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {
+  border-color: #dc3545;
+  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
+}
+
+.was-validated .form-control:invalid ~ .invalid-feedback,
+.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,
+.form-control.is-invalid ~ .invalid-tooltip {
+  display: block;
+}
+
+.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {
+  padding-right: calc(1.5em + 0.75rem);
+  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
+}
+
+.was-validated .custom-select:invalid, .custom-select.is-invalid {
+  border-color: #dc3545;
+  padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);
+  background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+}
+
+.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {
+  border-color: #dc3545;
+  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
+}
+
+.was-validated .custom-select:invalid ~ .invalid-feedback,
+.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,
+.custom-select.is-invalid ~ .invalid-tooltip {
+  display: block;
+}
+
+.was-validated .form-control-file:invalid ~ .invalid-feedback,
+.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,
+.form-control-file.is-invalid ~ .invalid-tooltip {
+  display: block;
+}
+
+.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {
+  color: #dc3545;
+}
+
+.was-validated .form-check-input:invalid ~ .invalid-feedback,
+.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,
+.form-check-input.is-invalid ~ .invalid-tooltip {
+  display: block;
+}
+
+.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {
+  color: #dc3545;
+}
+
+.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {
+  border-color: #dc3545;
+}
+
+.was-validated .custom-control-input:invalid ~ .invalid-feedback,
+.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,
+.custom-control-input.is-invalid ~ .invalid-tooltip {
+  display: block;
+}
+
+.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {
+  border-color: #e4606d;
+  background-color: #e4606d;
+}
+
+.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {
+  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
+}
+
+.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {
+  border-color: #dc3545;
+}
+
+.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {
+  border-color: #dc3545;
+}
+
+.was-validated .custom-file-input:invalid ~ .invalid-feedback,
+.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,
+.custom-file-input.is-invalid ~ .invalid-tooltip {
+  display: block;
+}
+
+.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {
+  border-color: #dc3545;
+  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
+}
+
+.form-inline {
+  display: -ms-flexbox;
+  display: flex;
+  -ms-flex-flow: row wrap;
+  flex-flow: row wrap;
+  -ms-flex-align: center;
+  align-items: center;
+}
+
+.form-inline .form-check {
+  width: 100%;
+}
+
+@media (min-width: 576px) {
+  .form-inline label {
+    display: -ms-flexbox;
+    display: flex;
+    -ms-flex-align: center;
+    align-items: center;
+    -ms-flex-pack: center;
+    justify-content: center;
+    margin-bottom: 0;
+  }
+  .form-inline .form-group {
+    display: -ms-flexbox;
+    display: flex;
+    -ms-flex: 0 0 auto;
+    flex: 0 0 auto;
+    -ms-flex-flow: row wrap;
+    flex-flow: row wrap;
+    -ms-flex-align: center;
+    align-items: center;
+    margin-bottom: 0;
+  }
+  .form-inline .form-control {
+    display: inline-block;
+    width: auto;
+    vertical-align: middle;
+  }
+  .form-inline .form-control-plaintext {
+    display: inline-block;
+  }
+  .form-inline .input-group,
+  .form-inline .custom-select {
+    width: auto;
+  }
+  .form-inline .form-check {
+    display: -ms-flexbox;
+    display: flex;
+    -ms-flex-align: center;
+    align-items: center;
+    -ms-flex-pack: center;
+    justify-content: center;
+    width: auto;
+    padding-left: 0;
+  }
+  .form-inline .form-check-input {
+    position: relative;
+    -ms-flex-negative: 0;
+    flex-shrink: 0;
+    margin-top: 0;
+    margin-right: 0.25rem;
+    margin-left: 0;
+  }
+  .form-inline .custom-control {
+    -ms-flex-align: center;
+    align-items: center;
+    -ms-flex-pack: center;
+    justify-content: center;
+  }
+  .form-inline .custom-control-label {
+    margin-bottom: 0;
+  }
+}
+
+.btn {
+  display: inline-block;
+  font-weight: 400;
+  color: #212529;
+  text-align: center;
+  vertical-align: middle;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  background-color: transparent;
+  border: 1px solid transparent;
+  padding: 0.375rem 0.75rem;
+  font-size: 1rem;
+  line-height: 1.5;
+  border-radius: 0.25rem;
+  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+  .btn {
+    transition: none;
+  }
+}
+
+.btn:hover {
+  color: #212529;
+  text-decoration: none;
+}
+
+.btn:focus, .btn.focus {
+  outline: 0;
+  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
+}
+
+.btn.disabled, .btn:disabled {
+  opacity: 0.65;
+}
+
+a.btn.disabled,
+fieldset:disabled a.btn {
+  pointer-events: none;
+}
+
+.btn-primary {
+  color: #fff;
+  background-color: #007bff;
+  border-color: #007bff;
+}
+
+.btn-primary:hover {
+  color: #fff;
+  background-color: #0069d9;
+  border-color: #0062cc;
+}
+
+.btn-primary:focus, .btn-primary.focus {
+  box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);
+}
+
+.btn-primary.disabled, .btn-primary:disabled {
+  color: #fff;
+  background-color: #007bff;
+  border-color: #007bff;
+}
+
+.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,
+.show > .btn-primary.dropdown-toggle {
+  color: #fff;
+  background-color: #0062cc;
+  border-color: #005cbf;
+}
+
+.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus,
+.show > .btn-primary.dropdown-toggle:focus {
+  box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);
+}
+
+.btn-secondary {
+  color: #fff;
+  background-color: #6c757d;
+  border-color: #6c757d;
+}
+
+.btn-secondary:hover {
+  color: #fff;
+  background-color: #5a6268;
+  border-color: #545b62;
+}
+
+.btn-secondary:focus, .btn-secondary.focus {
+  box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);
+}
+
+.btn-secondary.disabled, .btn-secondary:disabled {
+  color: #fff;
+  background-color: #6c757d;
+  border-color: #6c757d;
+}
+
+.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,
+.show > .btn-secondary.dropdown-toggle {
+  color: #fff;
+  background-color: #545b62;
+  border-color: #4e555b;
+}
+
+.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus,
+.show > .btn-secondary.dropdown-toggle:focus {
+  box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);
+}
+
+.btn-success {
+  color: #fff;
+  background-color: #28a745;
+  border-color: #28a745;
+}
+
+.btn-success:hover {
+  color: #fff;
+  background-color: #218838;
+  border-color: #1e7e34;
+}
+
+.btn-success:focus, .btn-success.focus {
+  box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);
+}
+
+.btn-success.disabled, .btn-success:disabled {
+  color: #fff;
+  background-color: #28a745;
+  border-color: #28a745;
+}
+
+.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,
+.show > .btn-success.dropdown-toggle {
+  color: #fff;
+  background-color: #1e7e34;
+  border-color: #1c7430;
+}
+
+.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus,
+.show > .btn-success.dropdown-toggle:focus {
+  box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);
+}
+
+.btn-info {
+  color: #fff;
+  background-color: #17a2b8;
+  border-color: #17a2b8;
+}
+
+.btn-info:hover {
+  color: #fff;
+  background-color: #138496;
+  border-color: #117a8b;
+}
+
+.btn-info:focus, .btn-info.focus {
+  box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);
+}
+
+.btn-info.disabled, .btn-info:disabled {
+  color: #fff;
+  background-color: #17a2b8;
+  border-color: #17a2b8;
+}
+
+.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,
+.show > .btn-info.dropdown-toggle {
+  color: #fff;
+  background-color: #117a8b;
+  border-color: #10707f;
+}
+
+.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus,
+.show > .btn-info.dropdown-toggle:focus {
+  box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);
+}
+
+.btn-warning {
+  color: #212529;
+  background-color: #ffc107;
+  border-color: #ffc107;
+}
+
+.btn-warning:hover {
+  color: #212529;
+  background-color: #e0a800;
+  border-color: #d39e00;
+}
+
+.btn-warning:focus, .btn-warning.focus {
+  box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);
+}
+
+.btn-warning.disabled, .btn-warning:disabled {
+  color: #212529;
+  background-color: #ffc107;
+  border-color: #ffc107;
+}
+
+.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active,
+.show > .btn-warning.dropdown-toggle {
+  color: #212529;
+  background-color: #d39e00;
+  border-color: #c69500;
+}
+
+.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus,
+.show > .btn-warning.dropdown-toggle:focus {
+  box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);
+}
+
+.btn-danger {
+  color: #fff;
+  background-color: #dc3545;
+  border-color: #dc3545;
+}
+
+.btn-danger:hover {
+  color: #fff;
+  background-color: #c82333;
+  border-color: #bd2130;
+}
+
+.btn-danger:focus, .btn-danger.focus {
+  box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);
+}
+
+.btn-danger.disabled, .btn-danger:disabled {
+  color: #fff;
+  background-color: #dc3545;
+  border-color: #dc3545;
+}
+
+.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,
+.show > .btn-danger.dropdown-toggle {
+  color: #fff;
+  background-color: #bd2130;
+  border-color: #b21f2d;
+}
+
+.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus,
+.show > .btn-danger.dropdown-toggle:focus {
+  box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);
+}
+
+.btn-light {
+  color: #212529;
+  background-color: #f8f9fa;
+  border-color: #f8f9fa;
+}
+
+.btn-light:hover {
+  color: #212529;
+  background-color: #e2e6ea;
+  border-color: #dae0e5;
+}
+
+.btn-light:focus, .btn-light.focus {
+  box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);
+}
+
+.btn-light.disabled, .btn-light:disabled {
+  color: #212529;
+  background-color: #f8f9fa;
+  border-color: #f8f9fa;
+}
+
+.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active,
+.show > .btn-light.dropdown-toggle {
+  color: #212529;
+  background-color: #dae0e5;
+  border-color: #d3d9df;
+}
+
+.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus,
+.show > .btn-light.dropdown-toggle:focus {
+  box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);
+}
+
+.btn-dark {
+  color: #fff;
+  background-color: #343a40;
+  border-color: #343a40;
+}
+
+.btn-dark:hover {
+  color: #fff;
+  background-color: #23272b;
+  border-color: #1d2124;
+}
+
+.btn-dark:focus, .btn-dark.focus {
+  box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);
+}
+
+.btn-dark.disabled, .btn-dark:disabled {
+  color: #fff;
+  background-color: #343a40;
+  border-color: #343a40;
+}
+
+.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active,
+.show > .btn-dark.dropdown-toggle {
+  color: #fff;
+  background-color: #1d2124;
+  border-color: #171a1d;
+}
+
+.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus,
+.show > .btn-dark.dropdown-toggle:focus {
+  box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);
+}
+
+.btn-outline-primary {
+  color: #007bff;
+  border-color: #007bff;
+}
+
+.btn-outline-primary:hover {
+  color: #fff;
+  background-color: #007bff;
+  border-color: #007bff;
+}
+
+.btn-outline-primary:focus, .btn-outline-primary.focus {
+  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);
+}
+
+.btn-outline-primary.disabled, .btn-outline-primary:disabled {
+  color: #007bff;
+  background-color: transparent;
+}
+
+.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,
+.show > .btn-outline-primary.dropdown-toggle {
+  color: #fff;
+  background-color: #007bff;
+  border-color: #007bff;
+}
+
+.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,
+.show > .btn-outline-primary.dropdown-toggle:focus {
+  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);
+}
+
+.btn-outline-secondary {
+  color: #6c757d;
+  border-color: #6c757d;
+}
+
+.btn-outline-secondary:hover {
+  color: #fff;
+  background-color: #6c757d;
+  border-color: #6c757d;
+}
+
+.btn-outline-secondary:focus, .btn-outline-secondary.focus {
+  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);
+}
+
+.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {
+  color: #6c757d;
+  background-color: transparent;
+}
+
+.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,
+.show > .btn-outline-secondary.dropdown-toggle {
+  color: #fff;
+  background-color: #6c757d;
+  border-color: #6c757d;
+}
+
+.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,
+.show > .btn-outline-secondary.dropdown-toggle:focus {
+  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);
+}
+
+.btn-outline-success {
+  color: #28a745;
+  border-color: #28a745;
+}
+
+.btn-outline-success:hover {
+  color: #fff;
+  background-color: #28a745;
+  border-color: #28a745;
+}
+
+.btn-outline-success:focus, .btn-outline-success.focus {
+  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);
+}
+
+.btn-outline-success.disabled, .btn-outline-success:disabled {
+  color: #28a745;
+  background-color: transparent;
+}
+
+.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,
+.show > .btn-outline-success.dropdown-toggle {
+  color: #fff;
+  background-color: #28a745;
+  border-color: #28a745;
+}
+
+.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,
+.show > .btn-outline-success.dropdown-toggle:focus {
+  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);
+}
+
+.btn-outline-info {
+  color: #17a2b8;
+  border-color: #17a2b8;
+}
+
+.btn-outline-info:hover {
+  color: #fff;
+  background-color: #17a2b8;
+  border-color: #17a2b8;
+}
+
+.btn-outline-info:focus, .btn-outline-info.focus {
+  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);
+}
+
+.btn-outline-info.disabled, .btn-outline-info:disabled {
+  color: #17a2b8;
+  background-color: transparent;
+}
+
+.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,
+.show > .btn-outline-info.dropdown-toggle {
+  color: #fff;
+  background-color: #17a2b8;
+  border-color: #17a2b8;
+}
+
+.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,
+.show > .btn-outline-info.dropdown-toggle:focus {
+  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);
+}
+
+.btn-outline-warning {
+  color: #ffc107;
+  border-color: #ffc107;
+}
+
+.btn-outline-warning:hover {
+  color: #212529;
+  background-color: #ffc107;
+  border-color: #ffc107;
+}
+
+.btn-outline-warning:focus, .btn-outline-warning.focus {
+  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
+}
+
+.btn-outline-warning.disabled, .btn-outline-warning:disabled {
+  color: #ffc107;
+  background-color: transparent;
+}
+
+.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,
+.show > .btn-outline-warning.dropdown-toggle {
+  color: #212529;
+  background-color: #ffc107;
+  border-color: #ffc107;
+}
+
+.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,
+.show > .btn-outline-warning.dropdown-toggle:focus {
+  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
+}
+
+.btn-outline-danger {
+  color: #dc3545;
+  border-color: #dc3545;
+}
+
+.btn-outline-danger:hover {
+  color: #fff;
+  background-color: #dc3545;
+  border-color: #dc3545;
+}
+
+.btn-outline-danger:focus, .btn-outline-danger.focus {
+  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);
+}
+
+.btn-outline-danger.disabled, .btn-outline-danger:disabled {
+  color: #dc3545;
+  background-color: transparent;
+}
+
+.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,
+.show > .btn-outline-danger.dropdown-toggle {
+  color: #fff;
+  background-color: #dc3545;
+  border-color: #dc3545;
+}
+
+.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,
+.show > .btn-outline-danger.dropdown-toggle:focus {
+  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);
+}
+
+.btn-outline-light {
+  color: #f8f9fa;
+  border-color: #f8f9fa;
+}
+
+.btn-outline-light:hover {
+  color: #212529;
+  background-color: #f8f9fa;
+  border-color: #f8f9fa;
+}
+
+.btn-outline-light:focus, .btn-outline-light.focus {
+  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);
+}
+
+.btn-outline-light.disabled, .btn-outline-light:disabled {
+  color: #f8f9fa;
+  background-color: transparent;
+}
+
+.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,
+.show > .btn-outline-light.dropdown-toggle {
+  color: #212529;
+  background-color: #f8f9fa;
+  border-color: #f8f9fa;
+}
+
+.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,
+.show > .btn-outline-light.dropdown-toggle:focus {
+  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);
+}
+
+.btn-outline-dark {
+  color: #343a40;
+  border-color: #343a40;
+}
+
+.btn-outline-dark:hover {
+  color: #fff;
+  background-color: #343a40;
+  border-color: #343a40;
+}
+
+.btn-outline-dark:focus, .btn-outline-dark.focus {
+  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);
+}
+
+.btn-outline-dark.disabled, .btn-outline-dark:disabled {
+  color: #343a40;
+  background-color: transparent;
+}
+
+.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,
+.show > .btn-outline-dark.dropdown-toggle {
+  color: #fff;
+  background-color: #343a40;
+  border-color: #343a40;
+}
+
+.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,
+.show > .btn-outline-dark.dropdown-toggle:focus {
+  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);
+}
+
+.btn-link {
+  font-weight: 400;
+  color: #007bff;
+  text-decoration: none;
+}
+
+.btn-link:hover {
+  color: #0056b3;
+  text-decoration: underline;
+}
+
+.btn-link:focus, .btn-link.focus {
+  text-decoration: underline;
+  box-shadow: none;
+}
+
+.btn-link:disabled, .btn-link.disabled {
+  color: #6c757d;
+  pointer-events: none;
+}
+
+.btn-lg, .btn-group-lg > .btn {
+  padding: 0.5rem 1rem;
+  font-size: 1.25rem;
+  line-height: 1.5;
+  border-radius: 0.3rem;
+}
+
+.btn-sm, .btn-group-sm > .btn {
+  padding: 0.25rem 0.5rem;
+  font-size: 0.875rem;
+  line-height: 1.5;
+  border-radius: 0.2rem;
+}
+
+.btn-block {
+  display: block;
+  width: 100%;
+}
+
+.btn-block + .btn-block {
+  margin-top: 0.5rem;
+}
+
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+  width: 100%;
+}
+
+.fade {
+  transition: opacity 0.15s linear;
+}
+
+@media (prefers-reduced-motion: reduce) {
+  .fade {
+    transition: none;
+  }
+}
+
+.fade:not(.show) {
+  opacity: 0;
+}
+
+.collapse:not(.show) {
+  display: none;
+}
+
+.collapsing {
+  position: relative;
+  height: 0;
+  overflow: hidden;
+  transition: height 0.35s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+  .collapsing {
+    transition: none;
+  }
+}
+
+.dropup,
+.dropright,
+.dropdown,
+.dropleft {
+  position: relative;
+}
+
+.dropdown-toggle {
+  white-space: nowrap;
+}
+
+.dropdown-toggle::after {
+  display: inline-block;
+  margin-left: 0.255em;
+  vertical-align: 0.255em;
+  content: "";
+  border-top: 0.3em solid;
+  border-right: 0.3em solid transparent;
+  border-bottom: 0;
+  border-left: 0.3em solid transparent;
+}
+
+.dropdown-toggle:empty::after {
+  margin-left: 0;
+}
+
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: 1000;
+  display: none;
+  float: left;
+  min-width: 10rem;
+  padding: 0.5rem 0;
+  margin: 0.125rem 0 0;
+  font-size: 1rem;
+  color: #212529;
+  text-align: left;
+  list-style: none;
+  background-color: #fff;
+  background-clip: padding-box;
+  border: 1px solid rgba(0, 0, 0, 0.15);
+  border-radius: 0.25rem;
+}
+
+.dropdown-menu-left {
+  right: auto;
+  left: 0;
+}
+
+.dropdown-menu-right {
+  right: 0;
+  left: auto;
+}
+
+@media (min-width: 576px) {
+  .dropdown-menu-sm-left {
+    right: auto;
+    left: 0;
+  }
+  .dropdown-menu-sm-right {
+    right: 0;
+    left: auto;
+  }
+}
+
+@media (min-width: 768px) {
+  .dropdown-menu-md-left {
+    right: auto;
+    left: 0;
+  }
+  .dropdown-menu-md-right {
+    right: 0;
+    left: auto;
+  }
+}
+
+@media (min-width: 992px) {
+  .dropdown-menu-lg-left {
+    right: auto;
+    left: 0;
+  }
+  .dropdown-menu-lg-right {
+    right: 0;
+    left: auto;
+  }
+}
+
+@media (min-width: 1200px) {
+  .dropdown-menu-xl-left {
+    right: auto;
+    left: 0;
+  }
+  .dropdown-menu-xl-right {
+    right: 0;
+    left: auto;
+  }
+}
+
+.dropup .dropdown-menu {
+  top: auto;
+  bottom: 100%;
+  margin-top: 0;
+  margin-bottom: 0.125rem;
+}
+
+.dropup .dropdown-toggle::after {
+  display: inline-block;
+  margin-left: 0.255em;
+  vertical-align: 0.255em;
+  content: "";
+  border-top: 0;
+  border-right: 0.3em solid transparent;
+  border-bottom: 0.3em solid;
+  border-left: 0.3em solid transparent;
+}
+
+.dropup .dropdown-toggle:empty::after {
+  margin-left: 0;
+}
+
+.dropright .dropdown-menu {
+  top: 0;
+  right: auto;
+  left: 100%;
+  margin-top: 0;
+  margin-left: 0.125rem;
+}
+
+.dropright .dropdown-toggle::after {
+  display: inline-block;
+  margin-left: 0.255em;
+  vertical-align: 0.255em;
+  content: "";
+  border-top: 0.3em solid transparent;
+  border-right: 0;
+  border-bottom: 0.3em solid transparent;
+  border-left: 0.3em solid;
+}
+
+.dropright .dropdown-toggle:empty::after {
+  margin-left: 0;
+}
+
+.dropright .dropdown-toggle::after {
+  vertical-align: 0;
+}
+
+.dropleft .dropdown-menu {
+  top: 0;
+  right: 100%;
+  left: auto;
+  margin-top: 0;
+  margin-right: 0.125rem;
+}
+
+.dropleft .dropdown-toggle::after {
+  display: inline-block;
+  margin-left: 0.255em;
+  vertical-align: 0.255em;
+  content: "";
+}
+
+.dropleft .dropdown-toggle::after {
+  display: none;
+}
+
+.dropleft .dropdown-toggle::before {
+  display: inline-block;
+  margin-right: 0.255em;
+  vertical-align: 0.255em;
+  content: "";
+  border-top: 0.3em solid transparent;
+  border-right: 0.3em solid;
+  border-bottom: 0.3em solid transparent;
+}
+
+.dropleft .dropdown-toggle:empty::after {
+  margin-left: 0;
+}
+
+.dropleft .dropdown-toggle::before {
+  vertical-align: 0;
+}
+
+.dropdown-menu[x-placement^="top"], .dropdown-menu[x-placement^="right"], .dropdown-menu[x-placement^="bottom"], .dropdown-menu[x-placement^="left"] {
+  right: auto;
+  bottom: auto;
+}
+
+.dropdown-divider {
+  height: 0;
+  margin: 0.5rem 0;
+  overflow: hidden;
+  border-top: 1px solid #e9ecef;
+}
+
+.dropdown-item {
+  display: block;
+  width: 100%;
+  padding: 0.25rem 1.5rem;
+  clear: both;
+  font-weight: 400;
+  color: #212529;
+  text-align: inherit;
+  white-space: nowrap;
+  background-color: transparent;
+  border: 0;
+}
+
+.dropdown-item:hover, .dropdown-item:focus {
+  color: #16181b;
+  text-decoration: none;
+  background-color: #f8f9fa;
+}
+
+.dropdown-item.active, .dropdown-item:active {
+  color: #fff;
+  text-decoration: none;
+  background-color: #007bff;
+}
+
+.dropdown-item.disabled, .dropdown-item:disabled {
+  color: #6c757d;
+  pointer-events: none;
+  background-color: transparent;
+}
+
+.dropdown-menu.show {
+  display: block;
+}
+
+.dropdown-header {
+  display: block;
+  padding: 0.5rem 1.5rem;
+  margin-bottom: 0;
+  font-size: 0.875rem;
+  color: #6c757d;
+  white-space: nowrap;
+}
+
+.dropdown-item-text {
+  display: block;
+  padding: 0.25rem 1.5rem;
+  color: #212529;
+}
+
+.btn-group,
+.btn-group-vertical {
+  position: relative;
+  display: -ms-inline-flexbox;
+  display: inline-flex;
+  vertical-align: middle;
+}
+
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+  position: relative;
+  -ms-flex: 1 1 auto;
+  flex: 1 1 auto;
+}
+
+.btn-group > .btn:hover,
+.btn-group-vertical > .btn:hover {
+  z-index: 1;
+}
+
+.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,
+.btn-group-vertical > .btn:focus,
+.btn-group-vertical > .btn:active,
+.btn-group-vertical > .btn.active {
+  z-index: 1;
+}
+
+.btn-toolbar {
+  display: -ms-flexbox;
+  display: flex;
+  -ms-flex-wrap: wrap;
+  flex-wrap: wrap;
+  -ms-flex-pack: start;
+  justify-content: flex-start;
+}
+
+.btn-toolbar .input-group {
+  width: auto;
+}
+
+.btn-group > .btn:not(:first-child),
+.btn-group > .btn-group:not(:first-child) {
+  margin-left: -1px;
+}
+
+.btn-group > .btn:not(:last-child):not(.dropdown-toggle),
+.btn-group > .btn-group:not(:last-child) > .btn {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+}
+
+.btn-group > .btn:not(:first-child),
+.btn-group > .btn-group:not(:first-child) > .btn {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
+
+.dropdown-toggle-split {
+  padding-right: 0.5625rem;
+  padding-left: 0.5625rem;
+}
+
+.dropdown-toggle-split::after,
+.dropup .dropdown-toggle-split::after,
+.dropright .dropdown-toggle-split::after {
+  margin-left: 0;
+}
+
+.dropleft .dropdown-toggle-split::before {
+  margin-right: 0;
+}
+
+.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {
+  padding-right: 0.375rem;
+  padding-left: 0.375rem;
+}
+
+.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {
+  padding-right: 0.75rem;
+  padding-left: 0.75rem;
+}
+
+.btn-group-vertical {
+  -ms-flex-direction: column;
+  flex-direction: column;
+  -ms-flex-align: start;
+  align-items: flex-start;
+  -ms-flex-pack: center;
+  justify-content: center;
+}
+
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group {
+  width: 100%;
+}
+
+.btn-group-vertical > .btn:not(:first-child),
+.btn-group-vertical > .btn-group:not(:first-child) {
+  margin-top: -1px;
+}
+
+.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),
+.btn-group-vertical > .btn-group:not(:last-child) > .btn {
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+
+.btn-group-vertical > .btn:not(:first-child),
+.btn-group-vertical > .btn-group:not(:first-child) > .btn {
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+
+.btn-group-toggle > .btn,
+.btn-group-toggle > .btn-group > .btn {
+  margin-bottom: 0;
+}
+
+.btn-group-toggle > .btn input[type="radio"],
+.btn-group-toggle > .btn input[type="checkbox"],
+.btn-group-toggle > .btn-group > .btn input[type="radio"],
+.btn-group-toggle > .btn-group > .btn input[type="checkbox"] {
+  position: absolute;
+  clip: rect(0, 0, 0, 0);
+  pointer-events: none;
+}
+
+.input-group {
+  position: relative;
+  display: -ms-flexbox;
+  display: flex;
+  -ms-flex-wrap: wrap;
+  flex-wrap: wrap;
+  -ms-flex-align: stretch;
+  align-items: stretch;
+  width: 100%;
+}
+
+.input-group > .form-control,
+.input-group > .form-control-plaintext,
+.input-group > .custom-select,
+.input-group > .custom-file {
+  position: relative;
+  -ms-flex: 1 1 auto;
+  flex: 1 1 auto;
+  width: 1%;
+  margin-bottom: 0;
+}
+
+.input-group > .form-control + .form-control,
+.input-group > .form-control + .custom-select,
+.input-group > .form-control + .custom-file,
+.input-group > .form-control-plaintext + .form-control,
+.input-group > .form-control-plaintext + .custom-select,
+.input-group > .form-control-plaintext + .custom-file,
+.input-group > .custom-select + .form-control,
+.input-group > .custom-select + .custom-select,
+.input-group > .custom-select + .custom-file,
+.input-group > .custom-file + .form-control,
+.input-group > .custom-file + .custom-select,
+.input-group > .custom-file + .custom-file {
+  margin-left: -1px;
+}
+
+.input-group > .form-control:focus,
+.input-group > .custom-select:focus,
+.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {
+  z-index: 3;
+}
+
+.input-group > .custom-file .custom-file-input:focus {
+  z-index: 4;
+}
+
+.input-group > .form-control:not(:last-child),
+.input-group > .custom-select:not(:last-child) {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+}
+
+.input-group > .form-control:not(:first-child),
+.input-group > .custom-select:not(:first-child) {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
+
+.input-group > .custom-file {
+  display: -ms-flexbox;
+  display: flex;
+  -ms-flex-align: center;
+  align-items: center;
+}
+
+.input-group > .custom-file:not(:last-child) .custom-file-label,
+.input-group > .custom-file:not(:last-child) .custom-file-label::after {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+}
+
+.input-group > .custom-file:not(:first-child) .custom-file-label {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
+
+.input-group-prepend,
+.input-group-append {
+  display: -ms-flexbox;
+  display: flex;
+}
+
+.input-group-prepend .btn,
+.input-group-append .btn {
+  position: relative;
+  z-index: 2;
+}
+
+.input-group-prepend .btn:focus,
+.input-group-append .btn:focus {
+  z-index: 3;
+}
+
+.input-group-prepend .btn + .btn,
+.input-group-prepend .btn + .input-group-text,
+.input-group-prepend .input-group-text + .input-group-text,
+.input-group-prepend .input-group-text + .btn,
+.input-group-append .btn + .btn,
+.input-group-append .btn + .input-group-text,
+.input-group-append .input-group-text + .input-group-text,
+.input-group-append .input-group-text + .btn {
+  margin-left: -1px;
+}
+
+.input-group-prepend {
+  margin-right: -1px;
+}
+
+.input-group-append {
+  margin-left: -1px;
+}
+
+.input-group-text {
+  display: -ms-flexbox;
+  display: flex;
+  -ms-flex-align: center;
+  align-items: center;
+  padding: 0.375rem 0.75rem;
+  margin-bottom: 0;
+  font-size: 1rem;
+  font-weight: 400;
+  line-height: 1.5;
+  color: #495057;
+  text-align: center;
+  white-space: nowrap;
+  background-color: #e9ecef;
+  border: 1px solid #ced4da;
+  border-radius: 0.25rem;
+}
+
+.input-group-text input[type="radio"],
+.input-group-text input[type="checkbox"] {
+  margin-top: 0;
+}
+
+.input-group-lg > .form-control:not(textarea),
+.input-group-lg > .custom-select {
+  height: calc(1.5em + 1rem + 2px);
+}
+
+.input-group-lg > .form-control,
+.input-group-lg > .custom-select,
+.input-group-lg > .input-group-prepend > .input-group-text,
+.input-group-lg > .input-group-append > .input-group-text,
+.input-group-lg > .input-group-prepend > .btn,
+.input-group-lg > .input-group-append > .btn {
+  padding: 0.5rem 1rem;
+  font-size: 1.25rem;
+  line-height: 1.5;
+  border-radius: 0.3rem;
+}
+
+.input-group-sm > .form-control:not(textarea),
+.input-group-sm > .custom-select {
+  height: calc(1.5em + 0.5rem + 2px);
+}
+
+.input-group-sm > .form-control,
+.input-group-sm > .custom-select,
+.input-group-sm > .input-group-prepend > .input-group-text,
+.input-group-sm > .input-group-append > .input-group-text,
+.input-group-sm > .input-group-prepend > .btn,
+.input-group-sm > .input-group-append > .btn {
+  padding: 0.25rem 0.5rem;
+  font-size: 0.875rem;
+  line-height: 1.5;
+  border-radius: 0.2rem;
+}
+
+.input-group-lg > .custom-select,
+.input-group-sm > .custom-select {
+  padding-right: 1.75rem;
+}
+
+.input-group > .input-group-prepend > .btn,
+.input-group > .input-group-prepend > .input-group-text,
+.input-group > .input-group-append:not(:last-child) > .btn,
+.input-group > .input-group-append:not(:last-child) > .input-group-text,
+.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),
+.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+}
+
+.input-group > .input-group-append > .btn,
+.input-group > .input-group-append > .input-group-text,
+.input-group > .input-group-prepend:not(:first-child) > .btn,
+.input-group > .input-group-prepend:not(:first-child) > .input-group-text,
+.input-group > .input-group-prepend:first-child > .btn:not(:first-child),
+.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
+
+.custom-control {
+  position: relative;
+  display: block;
+  min-height: 1.5rem;
+  padding-left: 1.5rem;
+}
+
+.custom-control-inline {
+  display: -ms-inline-flexbox;
+  display: inline-flex;
+  margin-right: 1rem;
+}
+
+.custom-control-input {
+  position: absolute;
+  z-index: -1;
+  opacity: 0;
+}
+
+.custom-control-input:checked ~ .custom-control-label::before {
+  color: #fff;
+  border-color: #007bff;
+  background-color: #007bff;
+}
+
+.custom-control-input:focus ~ .custom-control-label::before {
+  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
+}
+
+.custom-control-input:focus:not(:checked) ~ .custom-control-label::before {
+  border-color: #80bdff;
+}
+
+.custom-control-input:not(:disabled):active ~ .custom-control-label::before {
+  color: #fff;
+  background-color: #b3d7ff;
+  border-color: #b3d7ff;
+}
+
+.custom-control-input:disabled ~ .custom-control-label {
+  color: #6c757d;
+}
+
+.custom-control-input:disabled ~ .custom-control-label::before {
+  background-color: #e9ecef;
+}
+
+.custom-control-label {
+  position: relative;
+  margin-bottom: 0;
+  vertical-align: top;
+}
+
+.custom-control-label::before {
+  position: absolute;
+  top: 0.25rem;
+  left: -1.5rem;
+  display: block;
+  width: 1rem;
+  height: 1rem;
+  pointer-events: none;
+  content: "";
+  background-color: #fff;
+  border: #adb5bd solid 1px;
+}
+
+.custom-control-label::after {
+  position: absolute;
+  top: 0.25rem;
+  left: -1.5rem;
+  display: block;
+  width: 1rem;
+  height: 1rem;
+  content: "";
+  background: no-repeat 50% / 50% 50%;
+}
+
+.custom-checkbox .custom-control-label::before {
+  border-radius: 0.25rem;
+}
+
+.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {
+  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e");
+}
+
+.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {
+  border-color: #007bff;
+  background-color: #007bff;
+}
+
+.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {
+  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e");
+}
+
+.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {
+  background-color: rgba(0, 123, 255, 0.5);
+}
+
+.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {
+  background-color: rgba(0, 123, 255, 0.5);
+}
+
+.custom-radio .custom-control-label::before {
+  border-radius: 50%;
+}
+
+.custom-radio .custom-control-input:checked ~ .custom-control-label::after {
+  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e");
+}
+
+.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {
+  background-color: rgba(0, 123, 255, 0.5);
+}
+
+.custom-switch {
+  padding-left: 2.25rem;
+}
+
+.custom-switch .custom-control-label::before {
+  left: -2.25rem;
+  width: 1.75rem;
+  pointer-events: all;
+  border-radius: 0.5rem;
+}
+
+.custom-switch .custom-control-label::after {
+  top: calc(0.25rem + 2px);
+  left: calc(-2.25rem + 2px);
+  width: calc(1rem - 4px);
+  height: calc(1rem - 4px);
+  background-color: #adb5bd;
+  border-radius: 0.5rem;
+  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;
+  transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+  transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+  .custom-switch .custom-control-label::after {
+    transition: none;
+  }
+}
+
+.custom-switch .custom-control-input:checked ~ .custom-control-label::after {
+  background-color: #fff;
+  -webkit-transform: translateX(0.75rem);
+  transform: translateX(0.75rem);
+}
+
+.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {
+  background-color: rgba(0, 123, 255, 0.5);
+}
+
+.custom-select {
+  display: inline-block;
+  width: 100%;
+  height: calc(1.5em + 0.75rem + 2px);
+  padding: 0.375rem 1.75rem 0.375rem 0.75rem;
+  font-size: 1rem;
+  font-weight: 400;
+  line-height: 1.5;
+  color: #495057;
+  vertical-align: middle;
+  background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px;
+  background-color: #fff;
+  border: 1px solid #ced4da;
+  border-radius: 0.25rem;
+  -webkit-appearance: none;
+  -moz-appearance: none;
+  appearance: none;
+}
+
+.custom-select:focus {
+  border-color: #80bdff;
+  outline: 0;
+  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
+}
+
+.custom-select:focus::-ms-value {
+  color: #495057;
+  background-color: #fff;
+}
+
+.custom-select[multiple], .custom-select[size]:not([size="1"]) {
+  height: auto;
+  padding-right: 0.75rem;
+  background-image: none;
+}
+
+.custom-select:disabled {
+  color: #6c757d;
+  background-color: #e9ecef;
+}
+
+.custom-select::-ms-expand {
+  display: none;
+}
+
+.custom-select-sm {
+  height: calc(1.5em + 0.5rem + 2px);
+  padding-top: 0.25rem;
+  padding-bottom: 0.25rem;
+  padding-left: 0.5rem;
+  font-size: 0.875rem;
+}
+
+.custom-select-lg {
+  height: calc(1.5em + 1rem + 2px);
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  padding-left: 1rem;
+  font-size: 1.25rem;
+}
+
+.custom-file {
+  position: relative;
+  display: inline-block;
+  width: 100%;
+  height: calc(1.5em + 0.75rem + 2px);
+  margin-bottom: 0;
+}
+
+.custom-file-input {
+  position: relative;
+  z-index: 2;
+  width: 100%;
+  height: calc(1.5em + 0.75rem + 2px);
+  margin: 0;
+  opacity: 0;
+}
+
+.custom-file-input:focus ~ .custom-file-label {
+  border-color: #80bdff;
+  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
+}
+
+.custom-file-input:disabled ~ .custom-file-label {
+  background-color: #e9ecef;
+}
+
+.custom-file-input:lang(en) ~ .custom-file-label::after {
+  content: "Browse";
+}
+
+.custom-file-input ~ .custom-file-label[data-browse]::after {
+  content: attr(data-browse);
+}
+
+.custom-file-label {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  z-index: 1;
+  height: calc(1.5em + 0.75rem + 2px);
+  padding: 0.375rem 0.75rem;
+  font-weight: 400;
+  line-height: 1.5;
+  color: #495057;
+  background-color: #fff;
+  border: 1px solid #ced4da;
+  border-radius: 0.25rem;
+}
+
+.custom-file-label::after {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  z-index: 3;
+  display: block;
+  height: calc(1.5em + 0.75rem);
+  padding: 0.375rem 0.75rem;
+  line-height: 1.5;
+  color: #495057;
+  content: "Browse";
+  background-color: #e9ecef;
+  border-left: inherit;
+  border-radius: 0 0.25rem 0.25rem 0;
+}
+
+.custom-range {
+  width: 100%;
+  height: calc(1rem + 0.4rem);
+  padding: 0;
+  background-color: transparent;
+  -webkit-appearance: none;
+  -moz-appearance: none;
+  appearance: none;
+}
+
+.custom-range:focus {
+  outline: none;
+}
+
+.custom-range:focus::-webkit-slider-thumb {
+  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
+}
+
+.custom-range:focus::-moz-range-thumb {
+  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
+}
+
+.custom-range:focus::-ms-thumb {
+  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
+}
+
+.custom-range::-moz-focus-outer {
+  border: 0;
+}
+
+.custom-range::-webkit-slider-thumb {
+  width: 1rem;
+  height: 1rem;
+  margin-top: -0.25rem;
+  background-color: #007bff;
+  border: 0;
+  border-radius: 1rem;
+  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+  -webkit-appearance: none;
+  appearance: none;
+}
+
+@media (prefers-reduced-motion: reduce) {
+  .custom-range::-webkit-slider-thumb {
+    transition: none;
+  }
+}
+
+.custom-range::-webkit-slider-thumb:active {
+  background-color: #b3d7ff;
+}
+
+.custom-range::-webkit-slider-runnable-track {
+  width: 100%;
+  height: 0.5rem;
+  color: transparent;
+  cursor: pointer;
+  background-color: #dee2e6;
+  border-color: transparent;
+  border-radius: 1rem;
+}
+
+.custom-range::-moz-range-thumb {
+  width: 1rem;
+  height: 1rem;
+  background-color: #007bff;
+  border: 0;
+  border-radius: 1rem;
+  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+  -moz-appearance: none;
+  appearance: none;
+}
+
+@media (prefers-reduced-motion: reduce) {
+  .custom-range::-moz-range-thumb {
+    transition: none;
+  }
+}
+
+.custom-range::-moz-range-thumb:active {
+  background-color: #b3d7ff;
+}
+
+.custom-range::-moz-range-track {
+  width: 100%;
+  height: 0.5rem;
+  color: transparent;
+  cursor: pointer;
+  background-color: #dee2e6;
+  border-color: transparent;
+  border-radius: 1rem;
+}
+
+.custom-range::-ms-thumb {
+  width: 1rem;
+  height: 1rem;
+  margin-top: 0;
+  margin-right: 0.2rem;
+  margin-left: 0.2rem;
+  background-color: #007bff;
+  border: 0;
+  border-radius: 1rem;
+  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+  appearance: none;
+}
+
+@media (prefers-reduced-motion: reduce) {
+  .custom-range::-ms-thumb {
+    transition: none;
+  }
+}
+
+.custom-range::-ms-thumb:active {
+  background-color: #b3d7ff;
+}
+
+.custom-range::-ms-track {
+  width: 100%;
+  height: 0.5rem;
+  color: transparent;
+  cursor: pointer;
+  background-color: transparent;
+  border-color: transparent;
+  border-width: 0.5rem;
+}
+
+.custom-range::-ms-fill-lower {
+  background-color: #dee2e6;
+  border-radius: 1rem;
+}
+
+.custom-range::-ms-fill-upper {
+  margin-right: 15px;
+  background-color: #dee2e6;
+  border-radius: 1rem;
+}
+
+.custom-range:disabled::-webkit-slider-thumb {
+  background-color: #adb5bd;
+}
+
+.custom-range:disabled::-webkit-slider-runnable-track {
+  cursor: default;
+}
+
+.custom-range:disabled::-moz-range-thumb {
+  background-color: #adb5bd;
+}
+
+.custom-range:disabled::-moz-range-track {
+  cursor: default;
+}
+
+.custom-range:disabled::-ms-thumb {
+  background-color: #adb5bd;
+}
+
+.custom-control-label::before,
+.custom-file-label,
+.custom-select {
+  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+  .custom-control-label::before,
+  .custom-file-label,
+  .custom-select {
+    transition: none;
+  }
+}
+
+.nav {
+  display: -ms-flexbox;
+  display: flex;
+  -ms-flex-wrap: wrap;
+  flex-wrap: wrap;
+  padding-left: 0;
+  margin-bottom: 0;
+  list-style: none;
+}
+
+.nav-link {
+  display: block;
+  padding: 0.5rem 1rem;
+}
+
+.nav-link:hover, .nav-link:focus {
+  text-decoration: none;
+}
+
+.nav-link.disabled {
+  color: #6c757d;
+  pointer-events: none;
+  cursor: default;
+}
+
+.nav-tabs {
+  border-bottom: 1px solid #dee2e6;
+}
+
+.nav-tabs .nav-item {
+  margin-bottom: -1px;
+}
+
+.nav-tabs .nav-link {
+  border: 1px solid transparent;
+  border-top-left-radius: 0.25rem;
+  border-top-right-radius: 0.25rem;
+}
+
+.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {
+  border-color: #e9ecef #e9ecef #dee2e6;
+}
+
+.nav-tabs .nav-link.disabled {
+  color: #6c757d;
+  background-color: transparent;
+  border-color: transparent;
+}
+
+.nav-tabs .nav-link.active,
+.nav-tabs .nav-item.show .nav-link {
+  color: #495057;
+  background-color: #fff;
+  border-color: #dee2e6 #dee2e6 #fff;
+}
+
+.nav-tabs .dropdown-menu {
+  margin-top: -1px;
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+
+.nav-pills .nav-link {
+  border-radius: 0.25rem;
+}
+
+.nav-pills .nav-link.active,
+.nav-pills .show > .nav-link {
+  color: #fff;
+  background-color: #007bff;
+}
+
+.nav-fill .nav-item {
+  -ms-flex: 1 1 auto;
+  flex: 1 1 auto;
+  text-align: center;
+}
+
+.nav-justified .nav-item {
+  -ms-flex-preferred-size: 0;
+  flex-basis: 0;
+  -ms-flex-positive: 1;
+  flex-grow: 1;
+  text-align: center;
+}
+
+.tab-content > .tab-pane {
+  display: none;
+}
+
+.tab-content > .active {
+  display: block;
+}
+
+.navbar {
+  position: relative;
+  display: -ms-flexbox;
+  display: flex;
+  -ms-flex-wrap: wrap;
+  flex-wrap: wrap;
+  -ms-flex-align: center;
+  align-items: center;
+  -ms-flex-pack: justify;
+  justify-content: space-between;
+  padding: 0.5rem 1rem;
+}
+
+.navbar > .container,
+.navbar > .container-fluid {
+  display: -ms-flexbox;
+  display: flex;
+  -ms-flex-wrap: wrap;
+  flex-wrap: wrap;
+  -ms-flex-align: center;
+  align-items: center;
+  -ms-flex-pack: justify;
+  justify-content: space-between;
+}
+
+.navbar-brand {
+  display: inline-block;
+  padding-top: 0.3125rem;
+  padding-bottom: 0.3125rem;
+  margin-right: 1rem;
+  font-size: 1.25rem;
+  line-height: inherit;
+  white-space: nowrap;
+}
+
+.navbar-brand:hover, .navbar-brand:focus {
+  text-decoration: none;
+}
+
+.navbar-nav {
+  display: -ms-flexbox;
+  display: flex;
+  -ms-flex-direction: column;
+  flex-direction: column;
+  padding-left: 0;
+  margin-bottom: 0;
+  list-style: none;
+}
+
+.navbar-nav .nav-link {
+  padding-right: 0;
+  padding-left: 0;
+}
+
+.navbar-nav .dropdown-menu {
+  position: static;
+  float: none;
+}
+
+.navbar-text {
+  display: inline-block;
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+}
+
+.navbar-collapse {
+  -ms-flex-preferred-size: 100%;
+  flex-basis: 100%;
+  -ms-flex-positive: 1;
+  flex-grow: 1;
+  -ms-flex-align: center;
+  align-items: center;
+}
+
+.navbar-toggler {
+  padding: 0.25rem 0.75rem;
+  font-size: 1.25rem;
+  line-height: 1;
+  background-color: transparent;
+  border: 1px solid transparent;
+  border-radius: 0.25rem;
+}
+
+.navbar-toggler:hover, .navbar-toggler:focus {
+  text-decoration: none;
+}
+
+.navbar-toggler-icon {
+  display: inline-block;
+  width: 1.5em;
+  height: 1.5em;
+  vertical-align: middle;
+  content: "";
+  background: no-repeat center center;
+  background-size: 100% 100%;
+}
+
+@media (max-width: 575.98px) {
+  .navbar-expand-sm > .container,
+  .navbar-expand-sm > .container-fluid {
+    padding-right: 0;
+    padding-left: 0;
+  }
+}
+
+@media (min-width: 576px) {
+  .navbar-expand-sm {
+    -ms-flex-flow: row nowrap;
+    flex-flow: row nowrap;
+    -ms-flex-pack: start;
+    justify-content: flex-start;
+  }
+  .navbar-expand-sm .navbar-nav {
+    -ms-flex-direction: row;
+    flex-direction: row;
+  }
+  .navbar-expand-sm .navbar-nav .dropdown-menu {
+    position: absolute;
+  }
+  .navbar-expand-sm .navbar-nav .nav-link {
+    padding-right: 0.5rem;
+    padding-left: 0.5rem;
+  }
+  .navbar-expand-sm > .container,
+  .navbar-expand-sm > .container-fluid {
+    -ms-flex-wrap: nowrap;
+    flex-wrap: nowrap;
+  }
+  .navbar-expand-sm .navbar-collapse {
+    display: -ms-flexbox !important;
+    display: flex !important;
+    -ms-flex-preferred-size: auto;
+    flex-basis: auto;
+  }
+  .navbar-expand-sm .navbar-toggler {
+    display: none;
+  }
+}
+
+@media (max-width: 767.98px) {
+  .navbar-expand-md > .container,
+  .navbar-expand-md > .container-fluid {
+    padding-right: 0;
+    padding-left: 0;
+  }
+}
+
+@media (min-width: 768px) {
+  .navbar-expand-md {
+    -ms-flex-flow: row nowrap;
+    flex-flow: row nowrap;
+    -ms-flex-pack: start;
+    justify-content: flex-start;
+  }
+  .navbar-expand-md .navbar-nav {
+    -ms-flex-direction: row;
+    flex-direction: row;
+  }
+  .navbar-expand-md .navbar-nav .dropdown-menu {
+    position: absolute;
+  }
+  .navbar-expand-md .navbar-nav .nav-link {
+    padding-right: 0.5rem;
+    padding-left: 0.5rem;
+  }
+  .navbar-expand-md > .container,
+  .navbar-expand-md > .container-fluid {
+    -ms-flex-wrap: nowrap;
+    flex-wrap: nowrap;
+  }
+  .navbar-expand-md .navbar-collapse {
+    display: -ms-flexbox !important;
+    display: flex !important;
+    -ms-flex-preferred-size: auto;
+    flex-basis: auto;
+  }
+  .navbar-expand-md .navbar-toggler {
+    display: none;
+  }
+}
+
+@media (max-width: 991.98px) {
+  .navbar-expand-lg > .container,
+  .navbar-expand-lg > .container-fluid {
+    padding-right: 0;
+    padding-left: 0;
+  }
+}
+
+@media (min-width: 992px) {
+  .navbar-expand-lg {
+    -ms-flex-flow: row nowrap;
+    flex-flow: row nowrap;
+    -ms-flex-pack: start;
+    justify-content: flex-start;
+  }
+  .navbar-expand-lg .navbar-nav {
+    -ms-flex-direction: row;
+    flex-direction: row;
+  }
+  .navbar-expand-lg .navbar-nav .dropdown-menu {
+    position: absolute;
+  }
+  .navbar-expand-lg .navbar-nav .nav-link {
+    padding-right: 0.5rem;
+    padding-left: 0.5rem;
+  }
+  .navbar-expand-lg > .container,
+  .navbar-expand-lg > .container-fluid {
+    -ms-flex-wrap: nowrap;
+    flex-wrap: nowrap;
+  }
+  .navbar-expand-lg .navbar-collapse {
+    display: -ms-flexbox !important;
+    display: flex !important;
+    -ms-flex-preferred-size: auto;
+    flex-basis: auto;
+  }
+  .navbar-expand-lg .navbar-toggler {
+    display: none;
+  }
+}
+
+@media (max-width: 1199.98px) {
+  .navbar-expand-xl > .container,
+  .navbar-expand-xl > .container-fluid {
+    padding-right: 0;
+    padding-left: 0;
+  }
+}
+
+@media (min-width: 1200px) {
+  .navbar-expand-xl {
+    -ms-flex-flow: row nowrap;
+    flex-flow: row nowrap;
+    -ms-flex-pack: start;
+    justify-content: flex-start;
+  }
+  .navbar-expand-xl .navbar-nav {
+    -ms-flex-direction: row;
+    flex-direction: row;
+  }
+  .navbar-expand-xl .navbar-nav .dropdown-menu {
+    position: absolute;
+  }
+  .navbar-expand-xl .navbar-nav .nav-link {
+    padding-right: 0.5rem;
+    padding-left: 0.5rem;
+  }
+  .navbar-expand-xl > .container,
+  .navbar-expand-xl > .container-fluid {
+    -ms-flex-wrap: nowrap;
+    flex-wrap: nowrap;
+  }
+  .navbar-expand-xl .navbar-collapse {
+    display: -ms-flexbox !important;
+    display: flex !important;
+    -ms-flex-preferred-size: auto;
+    flex-basis: auto;
+  }
+  .navbar-expand-xl .navbar-toggler {
+    display: none;
+  }
+}
+
+.navbar-expand {
+  -ms-flex-flow: row nowrap;
+  flex-flow: row nowrap;
+  -ms-flex-pack: start;
+  justify-content: flex-start;
+}
+
+.navbar-expand > .container,
+.navbar-expand > .container-fluid {
+  padding-right: 0;
+  padding-left: 0;
+}
+
+.navbar-expand .navbar-nav {
+  -ms-flex-direction: row;
+  flex-direction: row;
+}
+
+.navbar-expand .navbar-nav .dropdown-menu {
+  position: absolute;
+}
+
+.navbar-expand .navbar-nav .nav-link {
+  padding-right: 0.5rem;
+  padding-left: 0.5rem;
+}
+
+.navbar-expand > .container,
+.navbar-expand > .container-fluid {
+  -ms-flex-wrap: nowrap;
+  flex-wrap: nowrap;
+}
+
+.navbar-expand .navbar-collapse {
+  display: -ms-flexbox !important;
+  display: flex !important;
+  -ms-flex-preferred-size: auto;
+  flex-basis: auto;
+}
+
+.navbar-expand .navbar-toggler {
+  display: none;
+}
+
+.navbar-light .navbar-brand {
+  color: rgba(0, 0, 0, 0.9);
+}
+
+.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {
+  color: rgba(0, 0, 0, 0.9);
+}
+
+.navbar-light .navbar-nav .nav-link {
+  color: rgba(0, 0, 0, 0.5);
+}
+
+.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {
+  color: rgba(0, 0, 0, 0.7);
+}
+
+.navbar-light .navbar-nav .nav-link.disabled {
+  color: rgba(0, 0, 0, 0.3);
+}
+
+.navbar-light .navbar-nav .show > .nav-link,
+.navbar-light .navbar-nav .active > .nav-link,
+.navbar-light .navbar-nav .nav-link.show,
+.navbar-light .navbar-nav .nav-link.active {
+  color: rgba(0, 0, 0, 0.9);
+}
+
+.navbar-light .navbar-toggler {
+  color: rgba(0, 0, 0, 0.5);
+  border-color: rgba(0, 0, 0, 0.1);
+}
+
+.navbar-light .navbar-toggler-icon {
+  background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
+}
+
+.navbar-light .navbar-text {
+  color: rgba(0, 0, 0, 0.5);
+}
+
+.navbar-light .navbar-text a {
+  color: rgba(0, 0, 0, 0.9);
+}
+
+.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {
+  color: rgba(0, 0, 0, 0.9);
+}
+
+.navbar-dark .navbar-brand {
+  color: #fff;
+}
+
+.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {
+  color: #fff;
+}
+
+.navbar-dark .navbar-nav .nav-link {
+  color: rgba(255, 255, 255, 0.5);
+}
+
+.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {
+  color: rgba(255, 255, 255, 0.75);
+}
+
+.navbar-dark .navbar-nav .nav-link.disabled {
+  color: rgba(255, 255, 255, 0.25);
+}
+
+.navbar-dark .navbar-nav .show > .nav-link,
+.navbar-dark .navbar-nav .active > .nav-link,
+.navbar-dark .navbar-nav .nav-link.show,
+.navbar-dark .navbar-nav .nav-link.active {
+  color: #fff;
+}
+
+.navbar-dark .navbar-toggler {
+  color: rgba(255, 255, 255, 0.5);
+  border-color: rgba(255, 255, 255, 0.1);
+}
+
+.navbar-dark .navbar-toggler-icon {
+  background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
+}
+
+.navbar-dark .navbar-text {
+  color: rgba(255, 255, 255, 0.5);
+}
+
+.navbar-dark .navbar-text a {
+  color: #fff;
+}
+
+.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {
+  color: #fff;
+}
+
+.card {
+  position: relative;
+  display: -ms-flexbox;
+  display: flex;
+  -ms-flex-direction: column;
+  flex-direction: column;
+  min-width: 0;
+  word-wrap: break-word;
+  background-color: #fff;
+  background-clip: border-box;
+  border: 1px solid rgba(0, 0, 0, 0.125);
+  border-radius: 0.25rem;
+}
+
+.card > hr {
+  margin-right: 0;
+  margin-left: 0;
+}
+
+.card > .list-group:first-child .list-group-item:first-child {
+  border-top-left-radius: 0.25rem;
+  border-top-right-radius: 0.25rem;
+}
+
+.card > .list-group:last-child .list-group-item:last-child {
+  border-bottom-right-radius: 0.25rem;
+  border-bottom-left-radius: 0.25rem;
+}
+
+.card-body {
+  -ms-flex: 1 1 auto;
+  flex: 1 1 auto;
+  padding: 1.25rem;
+}
+
+.card-title {
+  margin-bottom: 0.75rem;
+}
+
+.card-subtitle {
+  margin-top: -0.375rem;
+  margin-bottom: 0;
+}
+
+.card-text:last-child {
+  margin-bottom: 0;
+}
+
+.card-link:hover {
+  text-decoration: none;
+}
+
+.card-link + .card-link {
+  margin-left: 1.25rem;
+}
+
+.card-header {
+  padding: 0.75rem 1.25rem;
+  margin-bottom: 0;
+  background-color: rgba(0, 0, 0, 0.03);
+  border-bottom: 1px solid rgba(0, 0, 0, 0.125);
+}
+
+.card-header:first-child {
+  border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;
+}
+
+.card-header + .list-group .list-group-item:first-child {
+  border-top: 0;
+}
+
+.card-footer {
+  padding: 0.75rem 1.25rem;
+  background-color: rgba(0, 0, 0, 0.03);
+  border-top: 1px solid rgba(0, 0, 0, 0.125);
+}
+
+.card-footer:last-child {
+  border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);
+}
+
+.card-header-tabs {
+  margin-right: -0.625rem;
+  margin-bottom: -0.75rem;
+  margin-left: -0.625rem;
+  border-bottom: 0;
+}
+
+.card-header-pills {
+  margin-right: -0.625rem;
+  margin-left: -0.625rem;
+}
+
+.card-img-overlay {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  padding: 1.25rem;
+}
+
+.card-img {
+  width: 100%;
+  border-radius: calc(0.25rem - 1px);
+}
+
+.card-img-top {
+  width: 100%;
+  border-top-left-radius: calc(0.25rem - 1px);
+  border-top-right-radius: calc(0.25rem - 1px);
+}
+
+.card-img-bottom {
+  width: 100%;
+  border-bottom-right-radius: calc(0.25rem - 1px);
+  border-bottom-left-radius: calc(0.25rem - 1px);
+}
+
+.card-deck {
+  display: -ms-flexbox;
+  display: flex;
+  -ms-flex-direction: column;
+  flex-direction: column;
+}
+
+.card-deck .card {
+  margin-bottom: 15px;
+}
+
+@media (min-width: 576px) {
+  .card-deck {
+    -ms-flex-flow: row wrap;
+    flex-flow: row wrap;
+    margin-right: -15px;
+    margin-left: -15px;
+  }
+  .card-deck .card {
+    display: -ms-flexbox;
+    display: flex;
+    -ms-flex: 1 0 0%;
+    flex: 1 0 0%;
+    -ms-flex-direction: column;
+    flex-direction: column;
+    margin-right: 15px;
+    margin-bottom: 0;
+    margin-left: 15px;
+  }
+}
+
+.card-group {
+  display: -ms-flexbox;
+  display: flex;
+  -ms-flex-direction: column;
+  flex-direction: column;
+}
+
+.card-group > .card {
+  margin-bottom: 15px;
+}
+
+@media (min-width: 576px) {
+  .card-group {
+    -ms-flex-flow: row wrap;
+    flex-flow: row wrap;
+  }
+  .card-group > .card {
+    -ms-flex: 1 0 0%;
+    flex: 1 0 0%;
+    margin-bottom: 0;
+  }
+  .card-group > .card + .card {
+    margin-left: 0;
+    border-left: 0;
+  }
+  .card-group > .card:not(:last-child) {
+    border-top-right-radius: 0;
+    border-bottom-right-radius: 0;
+  }
+  .card-group > .card:not(:last-child) .card-img-top,
+  .card-group > .card:not(:last-child) .card-header {
+    border-top-right-radius: 0;
+  }
+  .card-group > .card:not(:last-child) .card-img-bottom,
+  .card-group > .card:not(:last-child) .card-footer {
+    border-bottom-right-radius: 0;
+  }
+  .card-group > .card:not(:first-child) {
+    border-top-left-radius: 0;
+    border-bottom-left-radius: 0;
+  }
+  .card-group > .card:not(:first-child) .card-img-top,
+  .card-group > .card:not(:first-child) .card-header {
+    border-top-left-radius: 0;
+  }
+  .card-group > .card:not(:first-child) .card-img-bottom,
+  .card-group > .card:not(:first-child) .card-footer {
+    border-bottom-left-radius: 0;
+  }
+}
+
+.card-columns .card {
+  margin-bottom: 0.75rem;
+}
+
+@media (min-width: 576px) {
+  .card-columns {
+    -webkit-column-count: 3;
+    -moz-column-count: 3;
+    column-count: 3;
+    -webkit-column-gap: 1.25rem;
+    -moz-column-gap: 1.25rem;
+    column-gap: 1.25rem;
+    orphans: 1;
+    widows: 1;
+  }
+  .card-columns .card {
+    display: inline-block;
+    width: 100%;
+  }
+}
+
+.accordion > .card {
+  overflow: hidden;
+}
+
+.accordion > .card:not(:first-of-type) .card-header:first-child {
+  border-radius: 0;
+}
+
+.accordion > .card:not(:first-of-type):not(:last-of-type) {
+  border-bottom: 0;
+  border-radius: 0;
+}
+
+.accordion > .card:first-of-type {
+  border-bottom: 0;
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+
+.accordion > .card:last-of-type {
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+
+.accordion > .card .card-header {
+  margin-bottom: -1px;
+}
+
+.breadcrumb {
+  display: -ms-flexbox;
+  display: flex;
+  -ms-flex-wrap: wrap;
+  flex-wrap: wrap;
+  padding: 0.75rem 1rem;
+  margin-bottom: 1rem;
+  list-style: none;
+  background-color: #e9ecef;
+  border-radius: 0.25rem;
+}
+
+.breadcrumb-item + .breadcrumb-item {
+  padding-left: 0.5rem;
+}
+
+.breadcrumb-item + .breadcrumb-item::before {
+  display: inline-block;
+  padding-right: 0.5rem;
+  color: #6c757d;
+  content: "/";
+}
+
+.breadcrumb-item + .breadcrumb-item:hover::before {
+  text-decoration: underline;
+}
+
+.breadcrumb-item + .breadcrumb-item:hover::before {
+  text-decoration: none;
+}
+
+.breadcrumb-item.active {
+  color: #6c757d;
+}
+
+.pagination {
+  display: -ms-flexbox;
+  display: flex;
+  padding-left: 0;
+  list-style: none;
+  border-radius: 0.25rem;
+}
+
+.page-link {
+  position: relative;
+  display: block;
+  padding: 0.5rem 0.75rem;
+  margin-left: -1px;
+  line-height: 1.25;
+  color: #007bff;
+  background-color: #fff;
+  border: 1px solid #dee2e6;
+}
+
+.page-link:hover {
+  z-index: 2;
+  color: #0056b3;
+  text-decoration: none;
+  background-color: #e9ecef;
+  border-color: #dee2e6;
+}
+
+.page-link:focus {
+  z-index: 2;
+  outline: 0;
+  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
+}
+
+.page-item:first-child .page-link {
+  margin-left: 0;
+  border-top-left-radius: 0.25rem;
+  border-bottom-left-radius: 0.25rem;
+}
+
+.page-item:last-child .page-link {
+  border-top-right-radius: 0.25rem;
+  border-bottom-right-radius: 0.25rem;
+}
+
+.page-item.active .page-link {
+  z-index: 1;
+  color: #fff;
+  background-color: #007bff;
+  border-color: #007bff;
+}
+
+.page-item.disabled .page-link {
+  color: #6c757d;
+  pointer-events: none;
+  cursor: auto;
+  background-color: #fff;
+  border-color: #dee2e6;
+}
+
+.pagination-lg .page-link {
+  padding: 0.75rem 1.5rem;
+  font-size: 1.25rem;
+  line-height: 1.5;
+}
+
+.pagination-lg .page-item:first-child .page-link {
+  border-top-left-radius: 0.3rem;
+  border-bottom-left-radius: 0.3rem;
+}
+
+.pagination-lg .page-item:last-child .page-link {
+  border-top-right-radius: 0.3rem;
+  border-bottom-right-radius: 0.3rem;
+}
+
+.pagination-sm .page-link {
+  padding: 0.25rem 0.5rem;
+  font-size: 0.875rem;
+  line-height: 1.5;
+}
+
+.pagination-sm .page-item:first-child .page-link {
+  border-top-left-radius: 0.2rem;
+  border-bottom-left-radius: 0.2rem;
+}
+
+.pagination-sm .page-item:last-child .page-link {
+  border-top-right-radius: 0.2rem;
+  border-bottom-right-radius: 0.2rem;
+}
+
+.badge {
+  display: inline-block;
+  padding: 0.25em 0.4em;
+  font-size: 75%;
+  font-weight: 700;
+  line-height: 1;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: baseline;
+  border-radius: 0.25rem;
+  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+  .badge {
+    transition: none;
+  }
+}
+
+a.badge:hover, a.badge:focus {
+  text-decoration: none;
+}
+
+.badge:empty {
+  display: none;
+}
+
+.btn .badge {
+  position: relative;
+  top: -1px;
+}
+
+.badge-pill {
+  padding-right: 0.6em;
+  padding-left: 0.6em;
+  border-radius: 10rem;
+}
+
+.badge-primary {
+  color: #fff;
+  background-color: #007bff;
+}
+
+a.badge-primary:hover, a.badge-primary:focus {
+  color: #fff;
+  background-color: #0062cc;
+}
+
+a.badge-primary:focus, a.badge-primary.focus {
+  outline: 0;
+  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);
+}
+
+.badge-secondary {
+  color: #fff;
+  background-color: #6c757d;
+}
+
+a.badge-secondary:hover, a.badge-secondary:focus {
+  color: #fff;
+  background-color: #545b62;
+}
+
+a.badge-secondary:focus, a.badge-secondary.focus {
+  outline: 0;
+  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);
+}
+
+.badge-success {
+  color: #fff;
+  background-color: #28a745;
+}
+
+a.badge-success:hover, a.badge-success:focus {
+  color: #fff;
+  background-color: #1e7e34;
+}
+
+a.badge-success:focus, a.badge-success.focus {
+  outline: 0;
+  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);
+}
+
+.badge-info {
+  color: #fff;
+  background-color: #17a2b8;
+}
+
+a.badge-info:hover, a.badge-info:focus {
+  color: #fff;
+  background-color: #117a8b;
+}
+
+a.badge-info:focus, a.badge-info.focus {
+  outline: 0;
+  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);
+}
+
+.badge-warning {
+  color: #212529;
+  background-color: #ffc107;
+}
+
+a.badge-warning:hover, a.badge-warning:focus {
+  color: #212529;
+  background-color: #d39e00;
+}
+
+a.badge-warning:focus, a.badge-warning.focus {
+  outline: 0;
+  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
+}
+
+.badge-danger {
+  color: #fff;
+  background-color: #dc3545;
+}
+
+a.badge-danger:hover, a.badge-danger:focus {
+  color: #fff;
+  background-color: #bd2130;
+}
+
+a.badge-danger:focus, a.badge-danger.focus {
+  outline: 0;
+  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);
+}
+
+.badge-light {
+  color: #212529;
+  background-color: #f8f9fa;
+}
+
+a.badge-light:hover, a.badge-light:focus {
+  color: #212529;
+  background-color: #dae0e5;
+}
+
+a.badge-light:focus, a.badge-light.focus {
+  outline: 0;
+  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);
+}
+
+.badge-dark {
+  color: #fff;
+  background-color: #343a40;
+}
+
+a.badge-dark:hover, a.badge-dark:focus {
+  color: #fff;
+  background-color: #1d2124;
+}
+
+a.badge-dark:focus, a.badge-dark.focus {
+  outline: 0;
+  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);
+}
+
+.jumbotron {
+  padding: 2rem 1rem;
+  margin-bottom: 2rem;
+  background-color: #e9ecef;
+  border-radius: 0.3rem;
+}
+
+@media (min-width: 576px) {
+  .jumbotron {
+    padding: 4rem 2rem;
+  }
+}
+
+.jumbotron-fluid {
+  padding-right: 0;
+  padding-left: 0;
+  border-radius: 0;
+}
+
+.alert {
+  position: relative;
+  padding: 0.75rem 1.25rem;
+  margin-bottom: 1rem;
+  border: 1px solid transparent;
+  border-radius: 0.25rem;
+}
+
+.alert-heading {
+  color: inherit;
+}
+
+.alert-link {
+  font-weight: 700;
+}
+
+.alert-dismissible {
+  padding-right: 4rem;
+}
+
+.alert-dismissible .close {
+  position: absolute;
+  top: 0;
+  right: 0;
+  padding: 0.75rem 1.25rem;
+  color: inherit;
+}
+
+.alert-primary {
+  color: #004085;
+  background-color: #cce5ff;
+  border-color: #b8daff;
+}
+
+.alert-primary hr {
+  border-top-color: #9fcdff;
+}
+
+.alert-primary .alert-link {
+  color: #002752;
+}
+
+.alert-secondary {
+  color: #383d41;
+  background-color: #e2e3e5;
+  border-color: #d6d8db;
+}
+
+.alert-secondary hr {
+  border-top-color: #c8cbcf;
+}
+
+.alert-secondary .alert-link {
+  color: #202326;
+}
+
+.alert-success {
+  color: #155724;
+  background-color: #d4edda;
+  border-color: #c3e6cb;
+}
+
+.alert-success hr {
+  border-top-color: #b1dfbb;
+}
+
+.alert-success .alert-link {
+  color: #0b2e13;
+}
+
+.alert-info {
+  color: #0c5460;
+  background-color: #d1ecf1;
+  border-color: #bee5eb;
+}
+
+.alert-info hr {
+  border-top-color: #abdde5;
+}
+
+.alert-info .alert-link {
+  color: #062c33;
+}
+
+.alert-warning {
+  color: #856404;
+  background-color: #fff3cd;
+  border-color: #ffeeba;
+}
+
+.alert-warning hr {
+  border-top-color: #ffe8a1;
+}
+
+.alert-warning .alert-link {
+  color: #533f03;
+}
+
+.alert-danger {
+  color: #721c24;
+  background-color: #f8d7da;
+  border-color: #f5c6cb;
+}
+
+.alert-danger hr {
+  border-top-color: #f1b0b7;
+}
+
+.alert-danger .alert-link {
+  color: #491217;
+}
+
+.alert-light {
+  color: #818182;
+  background-color: #fefefe;
+  border-color: #fdfdfe;
+}
+
+.alert-light hr {
+  border-top-color: #ececf6;
+}
+
+.alert-light .alert-link {
+  color: #686868;
+}
+
+.alert-dark {
+  color: #1b1e21;
+  background-color: #d6d8d9;
+  border-color: #c6c8ca;
+}
+
+.alert-dark hr {
+  border-top-color: #b9bbbe;
+}
+
+.alert-dark .alert-link {
+  color: #040505;
+}
+
+@-webkit-keyframes progress-bar-stripes {
+  from {
+    background-position: 1rem 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+@keyframes progress-bar-stripes {
+  from {
+    background-position: 1rem 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+.progress {
+  display: -ms-flexbox;
+  display: flex;
+  height: 1rem;
+  overflow: hidden;
+  font-size: 0.75rem;
+  background-color: #e9ecef;
+  border-radius: 0.25rem;
+}
+
+.progress-bar {
+  display: -ms-flexbox;
+  display: flex;
+  -ms-flex-direction: column;
+  flex-direction: column;
+  -ms-flex-pack: center;
+  justify-content: center;
+  color: #fff;
+  text-align: center;
+  white-space: nowrap;
+  background-color: #007bff;
+  transition: width 0.6s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+  .progress-bar {
+    transition: none;
+  }
+}
+
+.progress-bar-striped {
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-size: 1rem 1rem;
+}
+
+.progress-bar-animated {
+  -webkit-animation: progress-bar-stripes 1s linear infinite;
+  animation: progress-bar-stripes 1s linear infinite;
+}
+
+@media (prefers-reduced-motion: reduce) {
+  .progress-bar-animated {
+    -webkit-animation: none;
+    animation: none;
+  }
+}
+
+.media {
+  display: -ms-flexbox;
+  display: flex;
+  -ms-flex-align: start;
+  align-items: flex-start;
+}
+
+.media-body {
+  -ms-flex: 1;
+  flex: 1;
+}
+
+.list-group {
+  display: -ms-flexbox;
+  display: flex;
+  -ms-flex-direction: column;
+  flex-direction: column;
+  padding-left: 0;
+  margin-bottom: 0;
+}
+
+.list-group-item-action {
+  width: 100%;
+  color: #495057;
+  text-align: inherit;
+}
+
+.list-group-item-action:hover, .list-group-item-action:focus {
+  z-index: 1;
+  color: #495057;
+  text-decoration: none;
+  background-color: #f8f9fa;
+}
+
+.list-group-item-action:active {
+  color: #212529;
+  background-color: #e9ecef;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 0.75rem 1.25rem;
+  margin-bottom: -1px;
+  background-color: #fff;
+  border: 1px solid rgba(0, 0, 0, 0.125);
+}
+
+.list-group-item:first-child {
+  border-top-left-radius: 0.25rem;
+  border-top-right-radius: 0.25rem;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  border-bottom-right-radius: 0.25rem;
+  border-bottom-left-radius: 0.25rem;
+}
+
+.list-group-item.disabled, .list-group-item:disabled {
+  color: #6c757d;
+  pointer-events: none;
+  background-color: #fff;
+}
+
+.list-group-item.active {
+  z-index: 2;
+  color: #fff;
+  background-color: #007bff;
+  border-color: #007bff;
+}
+
+.list-group-horizontal {
+  -ms-flex-direction: row;
+  flex-direction: row;
+}
+
+.list-group-horizontal .list-group-item {
+  margin-right: -1px;
+  margin-bottom: 0;
+}
+
+.list-group-horizontal .list-group-item:first-child {
+  border-top-left-radius: 0.25rem;
+  border-bottom-left-radius: 0.25rem;
+  border-top-right-radius: 0;
+}
+
+.list-group-horizontal .list-group-item:last-child {
+  margin-right: 0;
+  border-top-right-radius: 0.25rem;
+  border-bottom-right-radius: 0.25rem;
+  border-bottom-left-radius: 0;
+}
+
+@media (min-width: 576px) {
+  .list-group-horizontal-sm {
+    -ms-flex-direction: row;
+    flex-direction: row;
+  }
+  .list-group-horizontal-sm .list-group-item {
+    margin-right: -1px;
+    margin-bottom: 0;
+  }
+  .list-group-horizontal-sm .list-group-item:first-child {
+    border-top-left-radius: 0.25rem;
+    border-bottom-left-radius: 0.25rem;
+    border-top-right-radius: 0;
+  }
+  .list-group-horizontal-sm .list-group-item:last-child {
+    margin-right: 0;
+    border-top-right-radius: 0.25rem;
+    border-bottom-right-radius: 0.25rem;
+    border-bottom-left-radius: 0;
+  }
+}
+
+@media (min-width: 768px) {
+  .list-group-horizontal-md {
+    -ms-flex-direction: row;
+    flex-direction: row;
+  }
+  .list-group-horizontal-md .list-group-item {
+    margin-right: -1px;
+    margin-bottom: 0;
+  }
+  .list-group-horizontal-md .list-group-item:first-child {
+    border-top-left-radius: 0.25rem;
+    border-bottom-left-radius: 0.25rem;
+    border-top-right-radius: 0;
+  }
+  .list-group-horizontal-md .list-group-item:last-child {
+    margin-right: 0;
+    border-top-right-radius: 0.25rem;
+    border-bottom-right-radius: 0.25rem;
+    border-bottom-left-radius: 0;
+  }
+}
+
+@media (min-width: 992px) {
+  .list-group-horizontal-lg {
+    -ms-flex-direction: row;
+    flex-direction: row;
+  }
+  .list-group-horizontal-lg .list-group-item {
+    margin-right: -1px;
+    margin-bottom: 0;
+  }
+  .list-group-horizontal-lg .list-group-item:first-child {
+    border-top-left-radius: 0.25rem;
+    border-bottom-left-radius: 0.25rem;
+    border-top-right-radius: 0;
+  }
+  .list-group-horizontal-lg .list-group-item:last-child {
+    margin-right: 0;
+    border-top-right-radius: 0.25rem;
+    border-bottom-right-radius: 0.25rem;
+    border-bottom-left-radius: 0;
+  }
+}
+
+@media (min-width: 1200px) {
+  .list-group-horizontal-xl {
+    -ms-flex-direction: row;
+    flex-direction: row;
+  }
+  .list-group-horizontal-xl .list-group-item {
+    margin-right: -1px;
+    margin-bottom: 0;
+  }
+  .list-group-horizontal-xl .list-group-item:first-child {
+    border-top-left-radius: 0.25rem;
+    border-bottom-left-radius: 0.25rem;
+    border-top-right-radius: 0;
+  }
+  .list-group-horizontal-xl .list-group-item:last-child {
+    margin-right: 0;
+    border-top-right-radius: 0.25rem;
+    border-bottom-right-radius: 0.25rem;
+    border-bottom-left-radius: 0;
+  }
+}
+
+.list-group-flush .list-group-item {
+  border-right: 0;
+  border-left: 0;
+  border-radius: 0;
+}
+
+.list-group-flush .list-group-item:last-child {
+  margin-bottom: -1px;
+}
+
+.list-group-flush:first-child .list-group-item:first-child {
+  border-top: 0;
+}
+
+.list-group-flush:last-child .list-group-item:last-child {
+  margin-bottom: 0;
+  border-bottom: 0;
+}
+
+.list-group-item-primary {
+  color: #004085;
+  background-color: #b8daff;
+}
+
+.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {
+  color: #004085;
+  background-color: #9fcdff;
+}
+
+.list-group-item-primary.list-group-item-action.active {
+  color: #fff;
+  background-color: #004085;
+  border-color: #004085;
+}
+
+.list-group-item-secondary {
+  color: #383d41;
+  background-color: #d6d8db;
+}
+
+.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {
+  color: #383d41;
+  background-color: #c8cbcf;
+}
+
+.list-group-item-secondary.list-group-item-action.active {
+  color: #fff;
+  background-color: #383d41;
+  border-color: #383d41;
+}
+
+.list-group-item-success {
+  color: #155724;
+  background-color: #c3e6cb;
+}
+
+.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {
+  color: #155724;
+  background-color: #b1dfbb;
+}
+
+.list-group-item-success.list-group-item-action.active {
+  color: #fff;
+  background-color: #155724;
+  border-color: #155724;
+}
+
+.list-group-item-info {
+  color: #0c5460;
+  background-color: #bee5eb;
+}
+
+.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {
+  color: #0c5460;
+  background-color: #abdde5;
+}
+
+.list-group-item-info.list-group-item-action.active {
+  color: #fff;
+  background-color: #0c5460;
+  border-color: #0c5460;
+}
+
+.list-group-item-warning {
+  color: #856404;
+  background-color: #ffeeba;
+}
+
+.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {
+  color: #856404;
+  background-color: #ffe8a1;
+}
+
+.list-group-item-warning.list-group-item-action.active {
+  color: #fff;
+  background-color: #856404;
+  border-color: #856404;
+}
+
+.list-group-item-danger {
+  color: #721c24;
+  background-color: #f5c6cb;
+}
+
+.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {
+  color: #721c24;
+  background-color: #f1b0b7;
+}
+
+.list-group-item-danger.list-group-item-action.active {
+  color: #fff;
+  background-color: #721c24;
+  border-color: #721c24;
+}
+
+.list-group-item-light {
+  color: #818182;
+  background-color: #fdfdfe;
+}
+
+.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {
+  color: #818182;
+  background-color: #ececf6;
+}
+
+.list-group-item-light.list-group-item-action.active {
+  color: #fff;
+  background-color: #818182;
+  border-color: #818182;
+}
+
+.list-group-item-dark {
+  color: #1b1e21;
+  background-color: #c6c8ca;
+}
+
+.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {
+  color: #1b1e21;
+  background-color: #b9bbbe;
+}
+
+.list-group-item-dark.list-group-item-action.active {
+  color: #fff;
+  background-color: #1b1e21;
+  border-color: #1b1e21;
+}
+
+.close {
+  float: right;
+  font-size: 1.5rem;
+  font-weight: 700;
+  line-height: 1;
+  color: #000;
+  text-shadow: 0 1px 0 #fff;
+  opacity: .5;
+}
+
+.close:hover {
+  color: #000;
+  text-decoration: none;
+}
+
+.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {
+  opacity: .75;
+}
+
+button.close {
+  padding: 0;
+  background-color: transparent;
+  border: 0;
+  -webkit-appearance: none;
+  -moz-appearance: none;
+  appearance: none;
+}
+
+a.close.disabled {
+  pointer-events: none;
+}
+
+.toast {
+  max-width: 350px;
+  overflow: hidden;
+  font-size: 0.875rem;
+  background-color: rgba(255, 255, 255, 0.85);
+  background-clip: padding-box;
+  border: 1px solid rgba(0, 0, 0, 0.1);
+  box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);
+  -webkit-backdrop-filter: blur(10px);
+  backdrop-filter: blur(10px);
+  opacity: 0;
+  border-radius: 0.25rem;
+}
+
+.toast:not(:last-child) {
+  margin-bottom: 0.75rem;
+}
+
+.toast.showing {
+  opacity: 1;
+}
+
+.toast.show {
+  display: block;
+  opacity: 1;
+}
+
+.toast.hide {
+  display: none;
+}
+
+.toast-header {
+  display: -ms-flexbox;
+  display: flex;
+  -ms-flex-align: center;
+  align-items: center;
+  padding: 0.25rem 0.75rem;
+  color: #6c757d;
+  background-color: rgba(255, 255, 255, 0.85);
+  background-clip: padding-box;
+  border-bottom: 1px solid rgba(0, 0, 0, 0.05);
+}
+
+.toast-body {
+  padding: 0.75rem;
+}
+
+.modal-open {
+  overflow: hidden;
+}
+
+.modal-open .modal {
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+
+.modal {
+  position: fixed;
+  top: 0;
+  left: 0;
+  z-index: 1050;
+  display: none;
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  outline: 0;
+}
+
+.modal-dialog {
+  position: relative;
+  width: auto;
+  margin: 0.5rem;
+  pointer-events: none;
+}
+
+.modal.fade .modal-dialog {
+  transition: -webkit-transform 0.3s ease-out;
+  transition: transform 0.3s ease-out;
+  transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;
+  -webkit-transform: translate(0, -50px);
+  transform: translate(0, -50px);
+}
+
+@media (prefers-reduced-motion: reduce) {
+  .modal.fade .modal-dialog {
+    transition: none;
+  }
+}
+
+.modal.show .modal-dialog {
+  -webkit-transform: none;
+  transform: none;
+}
+
+.modal-dialog-scrollable {
+  display: -ms-flexbox;
+  display: flex;
+  max-height: calc(100% - 1rem);
+}
+
+.modal-dialog-scrollable .modal-content {
+  max-height: calc(100vh - 1rem);
+  overflow: hidden;
+}
+
+.modal-dialog-scrollable .modal-header,
+.modal-dialog-scrollable .modal-footer {
+  -ms-flex-negative: 0;
+  flex-shrink: 0;
+}
+
+.modal-dialog-scrollable .modal-body {
+  overflow-y: auto;
+}
+
+.modal-dialog-centered {
+  display: -ms-flexbox;
+  display: flex;
+  -ms-flex-align: center;
+  align-items: center;
+  min-height: calc(100% - 1rem);
+}
+
+.modal-dialog-centered::before {
+  display: block;
+  height: calc(100vh - 1rem);
+  content: "";
+}
+
+.modal-dialog-centered.modal-dialog-scrollable {
+  -ms-flex-direction: column;
+  flex-direction: column;
+  -ms-flex-pack: center;
+  justify-content: center;
+  height: 100%;
+}
+
+.modal-dialog-centered.modal-dialog-scrollable .modal-content {
+  max-height: none;
+}
+
+.modal-dialog-centered.modal-dialog-scrollable::before {
+  content: none;
+}
+
+.modal-content {
+  position: relative;
+  display: -ms-flexbox;
+  display: flex;
+  -ms-flex-direction: column;
+  flex-direction: column;
+  width: 100%;
+  pointer-events: auto;
+  background-color: #fff;
+  background-clip: padding-box;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  border-radius: 0.3rem;
+  outline: 0;
+}
+
+.modal-backdrop {
+  position: fixed;
+  top: 0;
+  left: 0;
+  z-index: 1040;
+  width: 100vw;
+  height: 100vh;
+  background-color: #000;
+}
+
+.modal-backdrop.fade {
+  opacity: 0;
+}
+
+.modal-backdrop.show {
+  opacity: 0.5;
+}
+
+.modal-header {
+  display: -ms-flexbox;
+  display: flex;
+  -ms-flex-align: start;
+  align-items: flex-start;
+  -ms-flex-pack: justify;
+  justify-content: space-between;
+  padding: 1rem 1rem;
+  border-bottom: 1px solid #dee2e6;
+  border-top-left-radius: 0.3rem;
+  border-top-right-radius: 0.3rem;
+}
+
+.modal-header .close {
+  padding: 1rem 1rem;
+  margin: -1rem -1rem -1rem auto;
+}
+
+.modal-title {
+  margin-bottom: 0;
+  line-height: 1.5;
+}
+
+.modal-body {
+  position: relative;
+  -ms-flex: 1 1 auto;
+  flex: 1 1 auto;
+  padding: 1rem;
+}
+
+.modal-footer {
+  display: -ms-flexbox;
+  display: flex;
+  -ms-flex-align: center;
+  align-items: center;
+  -ms-flex-pack: end;
+  justify-content: flex-end;
+  padding: 1rem;
+  border-top: 1px solid #dee2e6;
+  border-bottom-right-radius: 0.3rem;
+  border-bottom-left-radius: 0.3rem;
+}
+
+.modal-footer > :not(:first-child) {
+  margin-left: .25rem;
+}
+
+.modal-footer > :not(:last-child) {
+  margin-right: .25rem;
+}
+
+.modal-scrollbar-measure {
+  position: absolute;
+  top: -9999px;
+  width: 50px;
+  height: 50px;
+  overflow: scroll;
+}
+
+@media (min-width: 576px) {
+  .modal-dialog {
+    max-width: 500px;
+    margin: 1.75rem auto;
+  }
+  .modal-dialog-scrollable {
+    max-height: calc(100% - 3.5rem);
+  }
+  .modal-dialog-scrollable .modal-content {
+    max-height: calc(100vh - 3.5rem);
+  }
+  .modal-dialog-centered {
+    min-height: calc(100% - 3.5rem);
+  }
+  .modal-dialog-centered::before {
+    height: calc(100vh - 3.5rem);
+  }
+  .modal-sm {
+    max-width: 300px;
+  }
+}
+
+@media (min-width: 992px) {
+  .modal-lg,
+  .modal-xl {
+    max-width: 800px;
+  }
+}
+
+@media (min-width: 1200px) {
+  .modal-xl {
+    max-width: 1140px;
+  }
+}
+
+.tooltip {
+  position: absolute;
+  z-index: 1070;
+  display: block;
+  margin: 0;
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+  font-style: normal;
+  font-weight: 400;
+  line-height: 1.5;
+  text-align: left;
+  text-align: start;
+  text-decoration: none;
+  text-shadow: none;
+  text-transform: none;
+  letter-spacing: normal;
+  word-break: normal;
+  word-spacing: normal;
+  white-space: normal;
+  line-break: auto;
+  font-size: 0.875rem;
+  word-wrap: break-word;
+  opacity: 0;
+}
+
+.tooltip.show {
+  opacity: 0.9;
+}
+
+.tooltip .arrow {
+  position: absolute;
+  display: block;
+  width: 0.8rem;
+  height: 0.4rem;
+}
+
+.tooltip .arrow::before {
+  position: absolute;
+  content: "";
+  border-color: transparent;
+  border-style: solid;
+}
+
+.bs-tooltip-top, .bs-tooltip-auto[x-placement^="top"] {
+  padding: 0.4rem 0;
+}
+
+.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^="top"] .arrow {
+  bottom: 0;
+}
+
+.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^="top"] .arrow::before {
+  top: 0;
+  border-width: 0.4rem 0.4rem 0;
+  border-top-color: #000;
+}
+
+.bs-tooltip-right, .bs-tooltip-auto[x-placement^="right"] {
+  padding: 0 0.4rem;
+}
+
+.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^="right"] .arrow {
+  left: 0;
+  width: 0.4rem;
+  height: 0.8rem;
+}
+
+.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^="right"] .arrow::before {
+  right: 0;
+  border-width: 0.4rem 0.4rem 0.4rem 0;
+  border-right-color: #000;
+}
+
+.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^="bottom"] {
+  padding: 0.4rem 0;
+}
+
+.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^="bottom"] .arrow {
+  top: 0;
+}
+
+.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^="bottom"] .arrow::before {
+  bottom: 0;
+  border-width: 0 0.4rem 0.4rem;
+  border-bottom-color: #000;
+}
+
+.bs-tooltip-left, .bs-tooltip-auto[x-placement^="left"] {
+  padding: 0 0.4rem;
+}
+
+.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^="left"] .arrow {
+  right: 0;
+  width: 0.4rem;
+  height: 0.8rem;
+}
+
+.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^="left"] .arrow::before {
+  left: 0;
+  border-width: 0.4rem 0 0.4rem 0.4rem;
+  border-left-color: #000;
+}
+
+.tooltip-inner {
+  max-width: 200px;
+  padding: 0.25rem 0.5rem;
+  color: #fff;
+  text-align: center;
+  background-color: #000;
+  border-radius: 0.25rem;
+}
+
+.popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 1060;
+  display: block;
+  max-width: 276px;
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+  font-style: normal;
+  font-weight: 400;
+  line-height: 1.5;
+  text-align: left;
+  text-align: start;
+  text-decoration: none;
+  text-shadow: none;
+  text-transform: none;
+  letter-spacing: normal;
+  word-break: normal;
+  word-spacing: normal;
+  white-space: normal;
+  line-break: auto;
+  font-size: 0.875rem;
+  word-wrap: break-word;
+  background-color: #fff;
+  background-clip: padding-box;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  border-radius: 0.3rem;
+}
+
+.popover .arrow {
+  position: absolute;
+  display: block;
+  width: 1rem;
+  height: 0.5rem;
+  margin: 0 0.3rem;
+}
+
+.popover .arrow::before, .popover .arrow::after {
+  position: absolute;
+  display: block;
+  content: "";
+  border-color: transparent;
+  border-style: solid;
+}
+
+.bs-popover-top, .bs-popover-auto[x-placement^="top"] {
+  margin-bottom: 0.5rem;
+}
+
+.bs-popover-top > .arrow, .bs-popover-auto[x-placement^="top"] > .arrow {
+  bottom: calc((0.5rem + 1px) * -1);
+}
+
+.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^="top"] > .arrow::before {
+  bottom: 0;
+  border-width: 0.5rem 0.5rem 0;
+  border-top-color: rgba(0, 0, 0, 0.25);
+}
+
+.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^="top"] > .arrow::after {
+  bottom: 1px;
+  border-width: 0.5rem 0.5rem 0;
+  border-top-color: #fff;
+}
+
+.bs-popover-right, .bs-popover-auto[x-placement^="right"] {
+  margin-left: 0.5rem;
+}
+
+.bs-popover-right > .arrow, .bs-popover-auto[x-placement^="right"] > .arrow {
+  left: calc((0.5rem + 1px) * -1);
+  width: 0.5rem;
+  height: 1rem;
+  margin: 0.3rem 0;
+}
+
+.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^="right"] > .arrow::before {
+  left: 0;
+  border-width: 0.5rem 0.5rem 0.5rem 0;
+  border-right-color: rgba(0, 0, 0, 0.25);
+}
+
+.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^="right"] > .arrow::after {
+  left: 1px;
+  border-width: 0.5rem 0.5rem 0.5rem 0;
+  border-right-color: #fff;
+}
+
+.bs-popover-bottom, .bs-popover-auto[x-placement^="bottom"] {
+  margin-top: 0.5rem;
+}
+
+.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^="bottom"] > .arrow {
+  top: calc((0.5rem + 1px) * -1);
+}
+
+.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^="bottom"] > .arrow::before {
+  top: 0;
+  border-width: 0 0.5rem 0.5rem 0.5rem;
+  border-bottom-color: rgba(0, 0, 0, 0.25);
+}
+
+.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^="bottom"] > .arrow::after {
+  top: 1px;
+  border-width: 0 0.5rem 0.5rem 0.5rem;
+  border-bottom-color: #fff;
+}
+
+.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^="bottom"] .popover-header::before {
+  position: absolute;
+  top: 0;
+  left: 50%;
+  display: block;
+  width: 1rem;
+  margin-left: -0.5rem;
+  content: "";
+  border-bottom: 1px solid #f7f7f7;
+}
+
+.bs-popover-left, .bs-popover-auto[x-placement^="left"] {
+  margin-right: 0.5rem;
+}
+
+.bs-popover-left > .arrow, .bs-popover-auto[x-placement^="left"] > .arrow {
+  right: calc((0.5rem + 1px) * -1);
+  width: 0.5rem;
+  height: 1rem;
+  margin: 0.3rem 0;
+}
+
+.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^="left"] > .arrow::before {
+  right: 0;
+  border-width: 0.5rem 0 0.5rem 0.5rem;
+  border-left-color: rgba(0, 0, 0, 0.25);
+}
+
+.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^="left"] > .arrow::after {
+  right: 1px;
+  border-width: 0.5rem 0 0.5rem 0.5rem;
+  border-left-color: #fff;
+}
+
+.popover-header {
+  padding: 0.5rem 0.75rem;
+  margin-bottom: 0;
+  font-size: 1rem;
+  background-color: #f7f7f7;
+  border-bottom: 1px solid #ebebeb;
+  border-top-left-radius: calc(0.3rem - 1px);
+  border-top-right-radius: calc(0.3rem - 1px);
+}
+
+.popover-header:empty {
+  display: none;
+}
+
+.popover-body {
+  padding: 0.5rem 0.75rem;
+  color: #212529;
+}
+
+.carousel {
+  position: relative;
+}
+
+.carousel.pointer-event {
+  -ms-touch-action: pan-y;
+  touch-action: pan-y;
+}
+
+.carousel-inner {
+  position: relative;
+  width: 100%;
+  overflow: hidden;
+}
+
+.carousel-inner::after {
+  display: block;
+  clear: both;
+  content: "";
+}
+
+.carousel-item {
+  position: relative;
+  display: none;
+  float: left;
+  width: 100%;
+  margin-right: -100%;
+  -webkit-backface-visibility: hidden;
+  backface-visibility: hidden;
+  transition: -webkit-transform 0.6s ease-in-out;
+  transition: transform 0.6s ease-in-out;
+  transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+  .carousel-item {
+    transition: none;
+  }
+}
+
+.carousel-item.active,
+.carousel-item-next,
+.carousel-item-prev {
+  display: block;
+}
+
+.carousel-item-next:not(.carousel-item-left),
+.active.carousel-item-right {
+  -webkit-transform: translateX(100%);
+  transform: translateX(100%);
+}
+
+.carousel-item-prev:not(.carousel-item-right),
+.active.carousel-item-left {
+  -webkit-transform: translateX(-100%);
+  transform: translateX(-100%);
+}
+
+.carousel-fade .carousel-item {
+  opacity: 0;
+  transition-property: opacity;
+  -webkit-transform: none;
+  transform: none;
+}
+
+.carousel-fade .carousel-item.active,
+.carousel-fade .carousel-item-next.carousel-item-left,
+.carousel-fade .carousel-item-prev.carousel-item-right {
+  z-index: 1;
+  opacity: 1;
+}
+
+.carousel-fade .active.carousel-item-left,
+.carousel-fade .active.carousel-item-right {
+  z-index: 0;
+  opacity: 0;
+  transition: 0s 0.6s opacity;
+}
+
+@media (prefers-reduced-motion: reduce) {
+  .carousel-fade .active.carousel-item-left,
+  .carousel-fade .active.carousel-item-right {
+    transition: none;
+  }
+}
+
+.carousel-control-prev,
+.carousel-control-next {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  z-index: 1;
+  display: -ms-flexbox;
+  display: flex;
+  -ms-flex-align: center;
+  align-items: center;
+  -ms-flex-pack: center;
+  justify-content: center;
+  width: 15%;
+  color: #fff;
+  text-align: center;
+  opacity: 0.5;
+  transition: opacity 0.15s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+  .carousel-control-prev,
+  .carousel-control-next {
+    transition: none;
+  }
+}
+
+.carousel-control-prev:hover, .carousel-control-prev:focus,
+.carousel-control-next:hover,
+.carousel-control-next:focus {
+  color: #fff;
+  text-decoration: none;
+  outline: 0;
+  opacity: 0.9;
+}
+
+.carousel-control-prev {
+  left: 0;
+}
+
+.carousel-control-next {
+  right: 0;
+}
+
+.carousel-control-prev-icon,
+.carousel-control-next-icon {
+  display: inline-block;
+  width: 20px;
+  height: 20px;
+  background: no-repeat 50% / 100% 100%;
+}
+
+.carousel-control-prev-icon {
+  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e");
+}
+
+.carousel-control-next-icon {
+  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e");
+}
+
+.carousel-indicators {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 15;
+  display: -ms-flexbox;
+  display: flex;
+  -ms-flex-pack: center;
+  justify-content: center;
+  padding-left: 0;
+  margin-right: 15%;
+  margin-left: 15%;
+  list-style: none;
+}
+
+.carousel-indicators li {
+  box-sizing: content-box;
+  -ms-flex: 0 1 auto;
+  flex: 0 1 auto;
+  width: 30px;
+  height: 3px;
+  margin-right: 3px;
+  margin-left: 3px;
+  text-indent: -999px;
+  cursor: pointer;
+  background-color: #fff;
+  background-clip: padding-box;
+  border-top: 10px solid transparent;
+  border-bottom: 10px solid transparent;
+  opacity: .5;
+  transition: opacity 0.6s ease;
+}
+
+@media (prefers-reduced-motion: reduce) {
+  .carousel-indicators li {
+    transition: none;
+  }
+}
+
+.carousel-indicators .active {
+  opacity: 1;
+}
+
+.carousel-caption {
+  position: absolute;
+  right: 15%;
+  bottom: 20px;
+  left: 15%;
+  z-index: 10;
+  padding-top: 20px;
+  padding-bottom: 20px;
+  color: #fff;
+  text-align: center;
+}
+
+@-webkit-keyframes spinner-border {
+  to {
+    -webkit-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
+
+@keyframes spinner-border {
+  to {
+    -webkit-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
+
+.spinner-border {
+  display: inline-block;
+  width: 2rem;
+  height: 2rem;
+  vertical-align: text-bottom;
+  border: 0.25em solid currentColor;
+  border-right-color: transparent;
+  border-radius: 50%;
+  -webkit-animation: spinner-border .75s linear infinite;
+  animation: spinner-border .75s linear infinite;
+}
+
+.spinner-border-sm {
+  width: 1rem;
+  height: 1rem;
+  border-width: 0.2em;
+}
+
+@-webkit-keyframes spinner-grow {
+  0% {
+    -webkit-transform: scale(0);
+    transform: scale(0);
+  }
+  50% {
+    opacity: 1;
+  }
+}
+
+@keyframes spinner-grow {
+  0% {
+    -webkit-transform: scale(0);
+    transform: scale(0);
+  }
+  50% {
+    opacity: 1;
+  }
+}
+
+.spinner-grow {
+  display: inline-block;
+  width: 2rem;
+  height: 2rem;
+  vertical-align: text-bottom;
+  background-color: currentColor;
+  border-radius: 50%;
+  opacity: 0;
+  -webkit-animation: spinner-grow .75s linear infinite;
+  animation: spinner-grow .75s linear infinite;
+}
+
+.spinner-grow-sm {
+  width: 1rem;
+  height: 1rem;
+}
+
+.align-baseline {
+  vertical-align: baseline !important;
+}
+
+.align-top {
+  vertical-align: top !important;
+}
+
+.align-middle {
+  vertical-align: middle !important;
+}
+
+.align-bottom {
+  vertical-align: bottom !important;
+}
+
+.align-text-bottom {
+  vertical-align: text-bottom !important;
+}
+
+.align-text-top {
+  vertical-align: text-top !important;
+}
+
+.bg-primary {
+  background-color: #007bff !important;
+}
+
+a.bg-primary:hover, a.bg-primary:focus,
+button.bg-primary:hover,
+button.bg-primary:focus {
+  background-color: #0062cc !important;
+}
+
+.bg-secondary {
+  background-color: #6c757d !important;
+}
+
+a.bg-secondary:hover, a.bg-secondary:focus,
+button.bg-secondary:hover,
+button.bg-secondary:focus {
+  background-color: #545b62 !important;
+}
+
+.bg-success {
+  background-color: #28a745 !important;
+}
+
+a.bg-success:hover, a.bg-success:focus,
+button.bg-success:hover,
+button.bg-success:focus {
+  background-color: #1e7e34 !important;
+}
+
+.bg-info {
+  background-color: #17a2b8 !important;
+}
+
+a.bg-info:hover, a.bg-info:focus,
+button.bg-info:hover,
+button.bg-info:focus {
+  background-color: #117a8b !important;
+}
+
+.bg-warning {
+  background-color: #ffc107 !important;
+}
+
+a.bg-warning:hover, a.bg-warning:focus,
+button.bg-warning:hover,
+button.bg-warning:focus {
+  background-color: #d39e00 !important;
+}
+
+.bg-danger {
+  background-color: #dc3545 !important;
+}
+
+a.bg-danger:hover, a.bg-danger:focus,
+button.bg-danger:hover,
+button.bg-danger:focus {
+  background-color: #bd2130 !important;
+}
+
+.bg-light {
+  background-color: #f8f9fa !important;
+}
+
+a.bg-light:hover, a.bg-light:focus,
+button.bg-light:hover,
+button.bg-light:focus {
+  background-color: #dae0e5 !important;
+}
+
+.bg-dark {
+  background-color: #343a40 !important;
+}
+
+a.bg-dark:hover, a.bg-dark:focus,
+button.bg-dark:hover,
+button.bg-dark:focus {
+  background-color: #1d2124 !important;
+}
+
+.bg-white {
+  background-color: #fff !important;
+}
+
+.bg-transparent {
+  background-color: transparent !important;
+}
+
+.border {
+  border: 1px solid #dee2e6 !important;
+}
+
+.border-top {
+  border-top: 1px solid #dee2e6 !important;
+}
+
+.border-right {
+  border-right: 1px solid #dee2e6 !important;
+}
+
+.border-bottom {
+  border-bottom: 1px solid #dee2e6 !important;
+}
+
+.border-left {
+  border-left: 1px solid #dee2e6 !important;
+}
+
+.border-0 {
+  border: 0 !important;
+}
+
+.border-top-0 {
+  border-top: 0 !important;
+}
+
+.border-right-0 {
+  border-right: 0 !important;
+}
+
+.border-bottom-0 {
+  border-bottom: 0 !important;
+}
+
+.border-left-0 {
+  border-left: 0 !important;
+}
+
+.border-primary {
+  border-color: #007bff !important;
+}
+
+.border-secondary {
+  border-color: #6c757d !important;
+}
+
+.border-success {
+  border-color: #28a745 !important;
+}
+
+.border-info {
+  border-color: #17a2b8 !important;
+}
+
+.border-warning {
+  border-color: #ffc107 !important;
+}
+
+.border-danger {
+  border-color: #dc3545 !important;
+}
+
+.border-light {
+  border-color: #f8f9fa !important;
+}
+
+.border-dark {
+  border-color: #343a40 !important;
+}
+
+.border-white {
+  border-color: #fff !important;
+}
+
+.rounded-sm {
+  border-radius: 0.2rem !important;
+}
+
+.rounded {
+  border-radius: 0.25rem !important;
+}
+
+.rounded-top {
+  border-top-left-radius: 0.25rem !important;
+  border-top-right-radius: 0.25rem !important;
+}
+
+.rounded-right {
+  border-top-right-radius: 0.25rem !important;
+  border-bottom-right-radius: 0.25rem !important;
+}
+
+.rounded-bottom {
+  border-bottom-right-radius: 0.25rem !important;
+  border-bottom-left-radius: 0.25rem !important;
+}
+
+.rounded-left {
+  border-top-left-radius: 0.25rem !important;
+  border-bottom-left-radius: 0.25rem !important;
+}
+
+.rounded-lg {
+  border-radius: 0.3rem !important;
+}
+
+.rounded-circle {
+  border-radius: 50% !important;
+}
+
+.rounded-pill {
+  border-radius: 50rem !important;
+}
+
+.rounded-0 {
+  border-radius: 0 !important;
+}
+
+.clearfix::after {
+  display: block;
+  clear: both;
+  content: "";
+}
+
+.d-none {
+  display: none !important;
+}
+
+.d-inline {
+  display: inline !important;
+}
+
+.d-inline-block {
+  display: inline-block !important;
+}
+
+.d-block {
+  display: block !important;
+}
+
+.d-table {
+  display: table !important;
+}
+
+.d-table-row {
+  display: table-row !important;
+}
+
+.d-table-cell {
+  display: table-cell !important;
+}
+
+.d-flex {
+  display: -ms-flexbox !important;
+  display: flex !important;
+}
+
+.d-inline-flex {
+  display: -ms-inline-flexbox !important;
+  display: inline-flex !important;
+}
+
+@media (min-width: 576px) {
+  .d-sm-none {
+    display: none !important;
+  }
+  .d-sm-inline {
+    display: inline !important;
+  }
+  .d-sm-inline-block {
+    display: inline-block !important;
+  }
+  .d-sm-block {
+    display: block !important;
+  }
+  .d-sm-table {
+    display: table !important;
+  }
+  .d-sm-table-row {
+    display: table-row !important;
+  }
+  .d-sm-table-cell {
+    display: table-cell !important;
+  }
+  .d-sm-flex {
+    display: -ms-flexbox !important;
+    display: flex !important;
+  }
+  .d-sm-inline-flex {
+    display: -ms-inline-flexbox !important;
+    display: inline-flex !important;
+  }
+}
+
+@media (min-width: 768px) {
+  .d-md-none {
+    display: none !important;
+  }
+  .d-md-inline {
+    display: inline !important;
+  }
+  .d-md-inline-block {
+    display: inline-block !important;
+  }
+  .d-md-block {
+    display: block !important;
+  }
+  .d-md-table {
+    display: table !important;
+  }
+  .d-md-table-row {
+    display: table-row !important;
+  }
+  .d-md-table-cell {
+    display: table-cell !important;
+  }
+  .d-md-flex {
+    display: -ms-flexbox !important;
+    display: flex !important;
+  }
+  .d-md-inline-flex {
+    display: -ms-inline-flexbox !important;
+    display: inline-flex !important;
+  }
+}
+
+@media (min-width: 992px) {
+  .d-lg-none {
+    display: none !important;
+  }
+  .d-lg-inline {
+    display: inline !important;
+  }
+  .d-lg-inline-block {
+    display: inline-block !important;
+  }
+  .d-lg-block {
+    display: block !important;
+  }
+  .d-lg-table {
+    display: table !important;
+  }
+  .d-lg-table-row {
+    display: table-row !important;
+  }
+  .d-lg-table-cell {
+    display: table-cell !important;
+  }
+  .d-lg-flex {
+    display: -ms-flexbox !important;
+    display: flex !important;
+  }
+  .d-lg-inline-flex {
+    display: -ms-inline-flexbox !important;
+    display: inline-flex !important;
+  }
+}
+
+@media (min-width: 1200px) {
+  .d-xl-none {
+    display: none !important;
+  }
+  .d-xl-inline {
+    display: inline !important;
+  }
+  .d-xl-inline-block {
+    display: inline-block !important;
+  }
+  .d-xl-block {
+    display: block !important;
+  }
+  .d-xl-table {
+    display: table !important;
+  }
+  .d-xl-table-row {
+    display: table-row !important;
+  }
+  .d-xl-table-cell {
+    display: table-cell !important;
+  }
+  .d-xl-flex {
+    display: -ms-flexbox !important;
+    display: flex !important;
+  }
+  .d-xl-inline-flex {
+    display: -ms-inline-flexbox !important;
+    display: inline-flex !important;
+  }
+}
+
+@media print {
+  .d-print-none {
+    display: none !important;
+  }
+  .d-print-inline {
+    display: inline !important;
+  }
+  .d-print-inline-block {
+    display: inline-block !important;
+  }
+  .d-print-block {
+    display: block !important;
+  }
+  .d-print-table {
+    display: table !important;
+  }
+  .d-print-table-row {
+    display: table-row !important;
+  }
+  .d-print-table-cell {
+    display: table-cell !important;
+  }
+  .d-print-flex {
+    display: -ms-flexbox !important;
+    display: flex !important;
+  }
+  .d-print-inline-flex {
+    display: -ms-inline-flexbox !important;
+    display: inline-flex !important;
+  }
+}
+
+.embed-responsive {
+  position: relative;
+  display: block;
+  width: 100%;
+  padding: 0;
+  overflow: hidden;
+}
+
+.embed-responsive::before {
+  display: block;
+  content: "";
+}
+
+.embed-responsive .embed-responsive-item,
+.embed-responsive iframe,
+.embed-responsive embed,
+.embed-responsive object,
+.embed-responsive video {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  border: 0;
+}
+
+.embed-responsive-21by9::before {
+  padding-top: 42.857143%;
+}
+
+.embed-responsive-16by9::before {
+  padding-top: 56.25%;
+}
+
+.embed-responsive-4by3::before {
+  padding-top: 75%;
+}
+
+.embed-responsive-1by1::before {
+  padding-top: 100%;
+}
+
+.flex-row {
+  -ms-flex-direction: row !important;
+  flex-direction: row !important;
+}
+
+.flex-column {
+  -ms-flex-direction: column !important;
+  flex-direction: column !important;
+}
+
+.flex-row-reverse {
+  -ms-flex-direction: row-reverse !important;
+  flex-direction: row-reverse !important;
+}
+
+.flex-column-reverse {
+  -ms-flex-direction: column-reverse !important;
+  flex-direction: column-reverse !important;
+}
+
+.flex-wrap {
+  -ms-flex-wrap: wrap !important;
+  flex-wrap: wrap !important;
+}
+
+.flex-nowrap {
+  -ms-flex-wrap: nowrap !important;
+  flex-wrap: nowrap !important;
+}
+
+.flex-wrap-reverse {
+  -ms-flex-wrap: wrap-reverse !important;
+  flex-wrap: wrap-reverse !important;
+}
+
+.flex-fill {
+  -ms-flex: 1 1 auto !important;
+  flex: 1 1 auto !important;
+}
+
+.flex-grow-0 {
+  -ms-flex-positive: 0 !important;
+  flex-grow: 0 !important;
+}
+
+.flex-grow-1 {
+  -ms-flex-positive: 1 !important;
+  flex-grow: 1 !important;
+}
+
+.flex-shrink-0 {
+  -ms-flex-negative: 0 !important;
+  flex-shrink: 0 !important;
+}
+
+.flex-shrink-1 {
+  -ms-flex-negative: 1 !important;
+  flex-shrink: 1 !important;
+}
+
+.justify-content-start {
+  -ms-flex-pack: start !important;
+  justify-content: flex-start !important;
+}
+
+.justify-content-end {
+  -ms-flex-pack: end !important;
+  justify-content: flex-end !important;
+}
+
+.justify-content-center {
+  -ms-flex-pack: center !important;
+  justify-content: center !important;
+}
+
+.justify-content-between {
+  -ms-flex-pack: justify !important;
+  justify-content: space-between !important;
+}
+
+.justify-content-around {
+  -ms-flex-pack: distribute !important;
+  justify-content: space-around !important;
+}
+
+.align-items-start {
+  -ms-flex-align: start !important;
+  align-items: flex-start !important;
+}
+
+.align-items-end {
+  -ms-flex-align: end !important;
+  align-items: flex-end !important;
+}
+
+.align-items-center {
+  -ms-flex-align: center !important;
+  align-items: center !important;
+}
+
+.align-items-baseline {
+  -ms-flex-align: baseline !important;
+  align-items: baseline !important;
+}
+
+.align-items-stretch {
+  -ms-flex-align: stretch !important;
+  align-items: stretch !important;
+}
+
+.align-content-start {
+  -ms-flex-line-pack: start !important;
+  align-content: flex-start !important;
+}
+
+.align-content-end {
+  -ms-flex-line-pack: end !important;
+  align-content: flex-end !important;
+}
+
+.align-content-center {
+  -ms-flex-line-pack: center !important;
+  align-content: center !important;
+}
+
+.align-content-between {
+  -ms-flex-line-pack: justify !important;
+  align-content: space-between !important;
+}
+
+.align-content-around {
+  -ms-flex-line-pack: distribute !important;
+  align-content: space-around !important;
+}
+
+.align-content-stretch {
+  -ms-flex-line-pack: stretch !important;
+  align-content: stretch !important;
+}
+
+.align-self-auto {
+  -ms-flex-item-align: auto !important;
+  align-self: auto !important;
+}
+
+.align-self-start {
+  -ms-flex-item-align: start !important;
+  align-self: flex-start !important;
+}
+
+.align-self-end {
+  -ms-flex-item-align: end !important;
+  align-self: flex-end !important;
+}
+
+.align-self-center {
+  -ms-flex-item-align: center !important;
+  align-self: center !important;
+}
+
+.align-self-baseline {
+  -ms-flex-item-align: baseline !important;
+  align-self: baseline !important;
+}
+
+.align-self-stretch {
+  -ms-flex-item-align: stretch !important;
+  align-self: stretch !important;
+}
+
+@media (min-width: 576px) {
+  .flex-sm-row {
+    -ms-flex-direction: row !important;
+    flex-direction: row !important;
+  }
+  .flex-sm-column {
+    -ms-flex-direction: column !important;
+    flex-direction: column !important;
+  }
+  .flex-sm-row-reverse {
+    -ms-flex-direction: row-reverse !important;
+    flex-direction: row-reverse !important;
+  }
+  .flex-sm-column-reverse {
+    -ms-flex-direction: column-reverse !important;
+    flex-direction: column-reverse !important;
+  }
+  .flex-sm-wrap {
+    -ms-flex-wrap: wrap !important;
+    flex-wrap: wrap !important;
+  }
+  .flex-sm-nowrap {
+    -ms-flex-wrap: nowrap !important;
+    flex-wrap: nowrap !important;
+  }
+  .flex-sm-wrap-reverse {
+    -ms-flex-wrap: wrap-reverse !important;
+    flex-wrap: wrap-reverse !important;
+  }
+  .flex-sm-fill {
+    -ms-flex: 1 1 auto !important;
+    flex: 1 1 auto !important;
+  }
+  .flex-sm-grow-0 {
+    -ms-flex-positive: 0 !important;
+    flex-grow: 0 !important;
+  }
+  .flex-sm-grow-1 {
+    -ms-flex-positive: 1 !important;
+    flex-grow: 1 !important;
+  }
+  .flex-sm-shrink-0 {
+    -ms-flex-negative: 0 !important;
+    flex-shrink: 0 !important;
+  }
+  .flex-sm-shrink-1 {
+    -ms-flex-negative: 1 !important;
+    flex-shrink: 1 !important;
+  }
+  .justify-content-sm-start {
+    -ms-flex-pack: start !important;
+    justify-content: flex-start !important;
+  }
+  .justify-content-sm-end {
+    -ms-flex-pack: end !important;
+    justify-content: flex-end !important;
+  }
+  .justify-content-sm-center {
+    -ms-flex-pack: center !important;
+    justify-content: center !important;
+  }
+  .justify-content-sm-between {
+    -ms-flex-pack: justify !important;
+    justify-content: space-between !important;
+  }
+  .justify-content-sm-around {
+    -ms-flex-pack: distribute !important;
+    justify-content: space-around !important;
+  }
+  .align-items-sm-start {
+    -ms-flex-align: start !important;
+    align-items: flex-start !important;
+  }
+  .align-items-sm-end {
+    -ms-flex-align: end !important;
+    align-items: flex-end !important;
+  }
+  .align-items-sm-center {
+    -ms-flex-align: center !important;
+    align-items: center !important;
+  }
+  .align-items-sm-baseline {
+    -ms-flex-align: baseline !important;
+    align-items: baseline !important;
+  }
+  .align-items-sm-stretch {
+    -ms-flex-align: stretch !important;
+    align-items: stretch !important;
+  }
+  .align-content-sm-start {
+    -ms-flex-line-pack: start !important;
+    align-content: flex-start !important;
+  }
+  .align-content-sm-end {
+    -ms-flex-line-pack: end !important;
+    align-content: flex-end !important;
+  }
+  .align-content-sm-center {
+    -ms-flex-line-pack: center !important;
+    align-content: center !important;
+  }
+  .align-content-sm-between {
+    -ms-flex-line-pack: justify !important;
+    align-content: space-between !important;
+  }
+  .align-content-sm-around {
+    -ms-flex-line-pack: distribute !important;
+    align-content: space-around !important;
+  }
+  .align-content-sm-stretch {
+    -ms-flex-line-pack: stretch !important;
+    align-content: stretch !important;
+  }
+  .align-self-sm-auto {
+    -ms-flex-item-align: auto !important;
+    align-self: auto !important;
+  }
+  .align-self-sm-start {
+    -ms-flex-item-align: start !important;
+    align-self: flex-start !important;
+  }
+  .align-self-sm-end {
+    -ms-flex-item-align: end !important;
+    align-self: flex-end !important;
+  }
+  .align-self-sm-center {
+    -ms-flex-item-align: center !important;
+    align-self: center !important;
+  }
+  .align-self-sm-baseline {
+    -ms-flex-item-align: baseline !important;
+    align-self: baseline !important;
+  }
+  .align-self-sm-stretch {
+    -ms-flex-item-align: stretch !important;
+    align-self: stretch !important;
+  }
+}
+
+@media (min-width: 768px) {
+  .flex-md-row {
+    -ms-flex-direction: row !important;
+    flex-direction: row !important;
+  }
+  .flex-md-column {
+    -ms-flex-direction: column !important;
+    flex-direction: column !important;
+  }
+  .flex-md-row-reverse {
+    -ms-flex-direction: row-reverse !important;
+    flex-direction: row-reverse !important;
+  }
+  .flex-md-column-reverse {
+    -ms-flex-direction: column-reverse !important;
+    flex-direction: column-reverse !important;
+  }
+  .flex-md-wrap {
+    -ms-flex-wrap: wrap !important;
+    flex-wrap: wrap !important;
+  }
+  .flex-md-nowrap {
+    -ms-flex-wrap: nowrap !important;
+    flex-wrap: nowrap !important;
+  }
+  .flex-md-wrap-reverse {
+    -ms-flex-wrap: wrap-reverse !important;
+    flex-wrap: wrap-reverse !important;
+  }
+  .flex-md-fill {
+    -ms-flex: 1 1 auto !important;
+    flex: 1 1 auto !important;
+  }
+  .flex-md-grow-0 {
+    -ms-flex-positive: 0 !important;
+    flex-grow: 0 !important;
+  }
+  .flex-md-grow-1 {
+    -ms-flex-positive: 1 !important;
+    flex-grow: 1 !important;
+  }
+  .flex-md-shrink-0 {
+    -ms-flex-negative: 0 !important;
+    flex-shrink: 0 !important;
+  }
+  .flex-md-shrink-1 {
+    -ms-flex-negative: 1 !important;
+    flex-shrink: 1 !important;
+  }
+  .justify-content-md-start {
+    -ms-flex-pack: start !important;
+    justify-content: flex-start !important;
+  }
+  .justify-content-md-end {
+    -ms-flex-pack: end !important;
+    justify-content: flex-end !important;
+  }
+  .justify-content-md-center {
+    -ms-flex-pack: center !important;
+    justify-content: center !important;
+  }
+  .justify-content-md-between {
+    -ms-flex-pack: justify !important;
+    justify-content: space-between !important;
+  }
+  .justify-content-md-around {
+    -ms-flex-pack: distribute !important;
+    justify-content: space-around !important;
+  }
+  .align-items-md-start {
+    -ms-flex-align: start !important;
+    align-items: flex-start !important;
+  }
+  .align-items-md-end {
+    -ms-flex-align: end !important;
+    align-items: flex-end !important;
+  }
+  .align-items-md-center {
+    -ms-flex-align: center !important;
+    align-items: center !important;
+  }
+  .align-items-md-baseline {
+    -ms-flex-align: baseline !important;
+    align-items: baseline !important;
+  }
+  .align-items-md-stretch {
+    -ms-flex-align: stretch !important;
+    align-items: stretch !important;
+  }
+  .align-content-md-start {
+    -ms-flex-line-pack: start !important;
+    align-content: flex-start !important;
+  }
+  .align-content-md-end {
+    -ms-flex-line-pack: end !important;
+    align-content: flex-end !important;
+  }
+  .align-content-md-center {
+    -ms-flex-line-pack: center !important;
+    align-content: center !important;
+  }
+  .align-content-md-between {
+    -ms-flex-line-pack: justify !important;
+    align-content: space-between !important;
+  }
+  .align-content-md-around {
+    -ms-flex-line-pack: distribute !important;
+    align-content: space-around !important;
+  }
+  .align-content-md-stretch {
+    -ms-flex-line-pack: stretch !important;
+    align-content: stretch !important;
+  }
+  .align-self-md-auto {
+    -ms-flex-item-align: auto !important;
+    align-self: auto !important;
+  }
+  .align-self-md-start {
+    -ms-flex-item-align: start !important;
+    align-self: flex-start !important;
+  }
+  .align-self-md-end {
+    -ms-flex-item-align: end !important;
+    align-self: flex-end !important;
+  }
+  .align-self-md-center {
+    -ms-flex-item-align: center !important;
+    align-self: center !important;
+  }
+  .align-self-md-baseline {
+    -ms-flex-item-align: baseline !important;
+    align-self: baseline !important;
+  }
+  .align-self-md-stretch {
+    -ms-flex-item-align: stretch !important;
+    align-self: stretch !important;
+  }
+}
+
+@media (min-width: 992px) {
+  .flex-lg-row {
+    -ms-flex-direction: row !important;
+    flex-direction: row !important;
+  }
+  .flex-lg-column {
+    -ms-flex-direction: column !important;
+    flex-direction: column !important;
+  }
+  .flex-lg-row-reverse {
+    -ms-flex-direction: row-reverse !important;
+    flex-direction: row-reverse !important;
+  }
+  .flex-lg-column-reverse {
+    -ms-flex-direction: column-reverse !important;
+    flex-direction: column-reverse !important;
+  }
+  .flex-lg-wrap {
+    -ms-flex-wrap: wrap !important;
+    flex-wrap: wrap !important;
+  }
+  .flex-lg-nowrap {
+    -ms-flex-wrap: nowrap !important;
+    flex-wrap: nowrap !important;
+  }
+  .flex-lg-wrap-reverse {
+    -ms-flex-wrap: wrap-reverse !important;
+    flex-wrap: wrap-reverse !important;
+  }
+  .flex-lg-fill {
+    -ms-flex: 1 1 auto !important;
+    flex: 1 1 auto !important;
+  }
+  .flex-lg-grow-0 {
+    -ms-flex-positive: 0 !important;
+    flex-grow: 0 !important;
+  }
+  .flex-lg-grow-1 {
+    -ms-flex-positive: 1 !important;
+    flex-grow: 1 !important;
+  }
+  .flex-lg-shrink-0 {
+    -ms-flex-negative: 0 !important;
+    flex-shrink: 0 !important;
+  }
+  .flex-lg-shrink-1 {
+    -ms-flex-negative: 1 !important;
+    flex-shrink: 1 !important;
+  }
+  .justify-content-lg-start {
+    -ms-flex-pack: start !important;
+    justify-content: flex-start !important;
+  }
+  .justify-content-lg-end {
+    -ms-flex-pack: end !important;
+    justify-content: flex-end !important;
+  }
+  .justify-content-lg-center {
+    -ms-flex-pack: center !important;
+    justify-content: center !important;
+  }
+  .justify-content-lg-between {
+    -ms-flex-pack: justify !important;
+    justify-content: space-between !important;
+  }
+  .justify-content-lg-around {
+    -ms-flex-pack: distribute !important;
+    justify-content: space-around !important;
+  }
+  .align-items-lg-start {
+    -ms-flex-align: start !important;
+    align-items: flex-start !important;
+  }
+  .align-items-lg-end {
+    -ms-flex-align: end !important;
+    align-items: flex-end !important;
+  }
+  .align-items-lg-center {
+    -ms-flex-align: center !important;
+    align-items: center !important;
+  }
+  .align-items-lg-baseline {
+    -ms-flex-align: baseline !important;
+    align-items: baseline !important;
+  }
+  .align-items-lg-stretch {
+    -ms-flex-align: stretch !important;
+    align-items: stretch !important;
+  }
+  .align-content-lg-start {
+    -ms-flex-line-pack: start !important;
+    align-content: flex-start !important;
+  }
+  .align-content-lg-end {
+    -ms-flex-line-pack: end !important;
+    align-content: flex-end !important;
+  }
+  .align-content-lg-center {
+    -ms-flex-line-pack: center !important;
+    align-content: center !important;
+  }
+  .align-content-lg-between {
+    -ms-flex-line-pack: justify !important;
+    align-content: space-between !important;
+  }
+  .align-content-lg-around {
+    -ms-flex-line-pack: distribute !important;
+    align-content: space-around !important;
+  }
+  .align-content-lg-stretch {
+    -ms-flex-line-pack: stretch !important;
+    align-content: stretch !important;
+  }
+  .align-self-lg-auto {
+    -ms-flex-item-align: auto !important;
+    align-self: auto !important;
+  }
+  .align-self-lg-start {
+    -ms-flex-item-align: start !important;
+    align-self: flex-start !important;
+  }
+  .align-self-lg-end {
+    -ms-flex-item-align: end !important;
+    align-self: flex-end !important;
+  }
+  .align-self-lg-center {
+    -ms-flex-item-align: center !important;
+    align-self: center !important;
+  }
+  .align-self-lg-baseline {
+    -ms-flex-item-align: baseline !important;
+    align-self: baseline !important;
+  }
+  .align-self-lg-stretch {
+    -ms-flex-item-align: stretch !important;
+    align-self: stretch !important;
+  }
+}
+
+@media (min-width: 1200px) {
+  .flex-xl-row {
+    -ms-flex-direction: row !important;
+    flex-direction: row !important;
+  }
+  .flex-xl-column {
+    -ms-flex-direction: column !important;
+    flex-direction: column !important;
+  }
+  .flex-xl-row-reverse {
+    -ms-flex-direction: row-reverse !important;
+    flex-direction: row-reverse !important;
+  }
+  .flex-xl-column-reverse {
+    -ms-flex-direction: column-reverse !important;
+    flex-direction: column-reverse !important;
+  }
+  .flex-xl-wrap {
+    -ms-flex-wrap: wrap !important;
+    flex-wrap: wrap !important;
+  }
+  .flex-xl-nowrap {
+    -ms-flex-wrap: nowrap !important;
+    flex-wrap: nowrap !important;
+  }
+  .flex-xl-wrap-reverse {
+    -ms-flex-wrap: wrap-reverse !important;
+    flex-wrap: wrap-reverse !important;
+  }
+  .flex-xl-fill {
+    -ms-flex: 1 1 auto !important;
+    flex: 1 1 auto !important;
+  }
+  .flex-xl-grow-0 {
+    -ms-flex-positive: 0 !important;
+    flex-grow: 0 !important;
+  }
+  .flex-xl-grow-1 {
+    -ms-flex-positive: 1 !important;
+    flex-grow: 1 !important;
+  }
+  .flex-xl-shrink-0 {
+    -ms-flex-negative: 0 !important;
+    flex-shrink: 0 !important;
+  }
+  .flex-xl-shrink-1 {
+    -ms-flex-negative: 1 !important;
+    flex-shrink: 1 !important;
+  }
+  .justify-content-xl-start {
+    -ms-flex-pack: start !important;
+    justify-content: flex-start !important;
+  }
+  .justify-content-xl-end {
+    -ms-flex-pack: end !important;
+    justify-content: flex-end !important;
+  }
+  .justify-content-xl-center {
+    -ms-flex-pack: center !important;
+    justify-content: center !important;
+  }
+  .justify-content-xl-between {
+    -ms-flex-pack: justify !important;
+    justify-content: space-between !important;
+  }
+  .justify-content-xl-around {
+    -ms-flex-pack: distribute !important;
+    justify-content: space-around !important;
+  }
+  .align-items-xl-start {
+    -ms-flex-align: start !important;
+    align-items: flex-start !important;
+  }
+  .align-items-xl-end {
+    -ms-flex-align: end !important;
+    align-items: flex-end !important;
+  }
+  .align-items-xl-center {
+    -ms-flex-align: center !important;
+    align-items: center !important;
+  }
+  .align-items-xl-baseline {
+    -ms-flex-align: baseline !important;
+    align-items: baseline !important;
+  }
+  .align-items-xl-stretch {
+    -ms-flex-align: stretch !important;
+    align-items: stretch !important;
+  }
+  .align-content-xl-start {
+    -ms-flex-line-pack: start !important;
+    align-content: flex-start !important;
+  }
+  .align-content-xl-end {
+    -ms-flex-line-pack: end !important;
+    align-content: flex-end !important;
+  }
+  .align-content-xl-center {
+    -ms-flex-line-pack: center !important;
+    align-content: center !important;
+  }
+  .align-content-xl-between {
+    -ms-flex-line-pack: justify !important;
+    align-content: space-between !important;
+  }
+  .align-content-xl-around {
+    -ms-flex-line-pack: distribute !important;
+    align-content: space-around !important;
+  }
+  .align-content-xl-stretch {
+    -ms-flex-line-pack: stretch !important;
+    align-content: stretch !important;
+  }
+  .align-self-xl-auto {
+    -ms-flex-item-align: auto !important;
+    align-self: auto !important;
+  }
+  .align-self-xl-start {
+    -ms-flex-item-align: start !important;
+    align-self: flex-start !important;
+  }
+  .align-self-xl-end {
+    -ms-flex-item-align: end !important;
+    align-self: flex-end !important;
+  }
+  .align-self-xl-center {
+    -ms-flex-item-align: center !important;
+    align-self: center !important;
+  }
+  .align-self-xl-baseline {
+    -ms-flex-item-align: baseline !important;
+    align-self: baseline !important;
+  }
+  .align-self-xl-stretch {
+    -ms-flex-item-align: stretch !important;
+    align-self: stretch !important;
+  }
+}
+
+.float-left {
+  float: left !important;
+}
+
+.float-right {
+  float: right !important;
+}
+
+.float-none {
+  float: none !important;
+}
+
+@media (min-width: 576px) {
+  .float-sm-left {
+    float: left !important;
+  }
+  .float-sm-right {
+    float: right !important;
+  }
+  .float-sm-none {
+    float: none !important;
+  }
+}
+
+@media (min-width: 768px) {
+  .float-md-left {
+    float: left !important;
+  }
+  .float-md-right {
+    float: right !important;
+  }
+  .float-md-none {
+    float: none !important;
+  }
+}
+
+@media (min-width: 992px) {
+  .float-lg-left {
+    float: left !important;
+  }
+  .float-lg-right {
+    float: right !important;
+  }
+  .float-lg-none {
+    float: none !important;
+  }
+}
+
+@media (min-width: 1200px) {
+  .float-xl-left {
+    float: left !important;
+  }
+  .float-xl-right {
+    float: right !important;
+  }
+  .float-xl-none {
+    float: none !important;
+  }
+}
+
+.overflow-auto {
+  overflow: auto !important;
+}
+
+.overflow-hidden {
+  overflow: hidden !important;
+}
+
+.position-static {
+  position: static !important;
+}
+
+.position-relative {
+  position: relative !important;
+}
+
+.position-absolute {
+  position: absolute !important;
+}
+
+.position-fixed {
+  position: fixed !important;
+}
+
+.position-sticky {
+  position: -webkit-sticky !important;
+  position: sticky !important;
+}
+
+.fixed-top {
+  position: fixed;
+  top: 0;
+  right: 0;
+  left: 0;
+  z-index: 1030;
+}
+
+.fixed-bottom {
+  position: fixed;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1030;
+}
+
+@supports ((position: -webkit-sticky) or (position: sticky)) {
+  .sticky-top {
+    position: -webkit-sticky;
+    position: sticky;
+    top: 0;
+    z-index: 1020;
+  }
+}
+
+.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  padding: 0;
+  overflow: hidden;
+  clip: rect(0, 0, 0, 0);
+  white-space: nowrap;
+  border: 0;
+}
+
+.sr-only-focusable:active, .sr-only-focusable:focus {
+  position: static;
+  width: auto;
+  height: auto;
+  overflow: visible;
+  clip: auto;
+  white-space: normal;
+}
+
+.shadow-sm {
+  box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;
+}
+
+.shadow {
+  box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;
+}
+
+.shadow-lg {
+  box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;
+}
+
+.shadow-none {
+  box-shadow: none !important;
+}
+
+.w-25 {
+  width: 25% !important;
+}
+
+.w-50 {
+  width: 50% !important;
+}
+
+.w-75 {
+  width: 75% !important;
+}
+
+.w-100 {
+  width: 100% !important;
+}
+
+.w-auto {
+  width: auto !important;
+}
+
+.h-25 {
+  height: 25% !important;
+}
+
+.h-50 {
+  height: 50% !important;
+}
+
+.h-75 {
+  height: 75% !important;
+}
+
+.h-100 {
+  height: 100% !important;
+}
+
+.h-auto {
+  height: auto !important;
+}
+
+.mw-100 {
+  max-width: 100% !important;
+}
+
+.mh-100 {
+  max-height: 100% !important;
+}
+
+.min-vw-100 {
+  min-width: 100vw !important;
+}
+
+.min-vh-100 {
+  min-height: 100vh !important;
+}
+
+.vw-100 {
+  width: 100vw !important;
+}
+
+.vh-100 {
+  height: 100vh !important;
+}
+
+.stretched-link::after {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1;
+  pointer-events: auto;
+  content: "";
+  background-color: rgba(0, 0, 0, 0);
+}
+
+.m-0 {
+  margin: 0 !important;
+}
+
+.mt-0,
+.my-0 {
+  margin-top: 0 !important;
+}
+
+.mr-0,
+.mx-0 {
+  margin-right: 0 !important;
+}
+
+.mb-0,
+.my-0 {
+  margin-bottom: 0 !important;
+}
+
+.ml-0,
+.mx-0 {
+  margin-left: 0 !important;
+}
+
+.m-1 {
+  margin: 0.25rem !important;
+}
+
+.mt-1,
+.my-1 {
+  margin-top: 0.25rem !important;
+}
+
+.mr-1,
+.mx-1 {
+  margin-right: 0.25rem !important;
+}
+
+.mb-1,
+.my-1 {
+  margin-bottom: 0.25rem !important;
+}
+
+.ml-1,
+.mx-1 {
+  margin-left: 0.25rem !important;
+}
+
+.m-2 {
+  margin: 0.5rem !important;
+}
+
+.mt-2,
+.my-2 {
+  margin-top: 0.5rem !important;
+}
+
+.mr-2,
+.mx-2 {
+  margin-right: 0.5rem !important;
+}
+
+.mb-2,
+.my-2 {
+  margin-bottom: 0.5rem !important;
+}
+
+.ml-2,
+.mx-2 {
+  margin-left: 0.5rem !important;
+}
+
+.m-3 {
+  margin: 1rem !important;
+}
+
+.mt-3,
+.my-3 {
+  margin-top: 1rem !important;
+}
+
+.mr-3,
+.mx-3 {
+  margin-right: 1rem !important;
+}
+
+.mb-3,
+.my-3 {
+  margin-bottom: 1rem !important;
+}
+
+.ml-3,
+.mx-3 {
+  margin-left: 1rem !important;
+}
+
+.m-4 {
+  margin: 1.5rem !important;
+}
+
+.mt-4,
+.my-4 {
+  margin-top: 1.5rem !important;
+}
+
+.mr-4,
+.mx-4 {
+  margin-right: 1.5rem !important;
+}
+
+.mb-4,
+.my-4 {
+  margin-bottom: 1.5rem !important;
+}
+
+.ml-4,
+.mx-4 {
+  margin-left: 1.5rem !important;
+}
+
+.m-5 {
+  margin: 3rem !important;
+}
+
+.mt-5,
+.my-5 {
+  margin-top: 3rem !important;
+}
+
+.mr-5,
+.mx-5 {
+  margin-right: 3rem !important;
+}
+
+.mb-5,
+.my-5 {
+  margin-bottom: 3rem !important;
+}
+
+.ml-5,
+.mx-5 {
+  margin-left: 3rem !important;
+}
+
+.p-0 {
+  padding: 0 !important;
+}
+
+.pt-0,
+.py-0 {
+  padding-top: 0 !important;
+}
+
+.pr-0,
+.px-0 {
+  padding-right: 0 !important;
+}
+
+.pb-0,
+.py-0 {
+  padding-bottom: 0 !important;
+}
+
+.pl-0,
+.px-0 {
+  padding-left: 0 !important;
+}
+
+.p-1 {
+  padding: 0.25rem !important;
+}
+
+.pt-1,
+.py-1 {
+  padding-top: 0.25rem !important;
+}
+
+.pr-1,
+.px-1 {
+  padding-right: 0.25rem !important;
+}
+
+.pb-1,
+.py-1 {
+  padding-bottom: 0.25rem !important;
+}
+
+.pl-1,
+.px-1 {
+  padding-left: 0.25rem !important;
+}
+
+.p-2 {
+  padding: 0.5rem !important;
+}
+
+.pt-2,
+.py-2 {
+  padding-top: 0.5rem !important;
+}
+
+.pr-2,
+.px-2 {
+  padding-right: 0.5rem !important;
+}
+
+.pb-2,
+.py-2 {
+  padding-bottom: 0.5rem !important;
+}
+
+.pl-2,
+.px-2 {
+  padding-left: 0.5rem !important;
+}
+
+.p-3 {
+  padding: 1rem !important;
+}
+
+.pt-3,
+.py-3 {
+  padding-top: 1rem !important;
+}
+
+.pr-3,
+.px-3 {
+  padding-right: 1rem !important;
+}
+
+.pb-3,
+.py-3 {
+  padding-bottom: 1rem !important;
+}
+
+.pl-3,
+.px-3 {
+  padding-left: 1rem !important;
+}
+
+.p-4 {
+  padding: 1.5rem !important;
+}
+
+.pt-4,
+.py-4 {
+  padding-top: 1.5rem !important;
+}
+
+.pr-4,
+.px-4 {
+  padding-right: 1.5rem !important;
+}
+
+.pb-4,
+.py-4 {
+  padding-bottom: 1.5rem !important;
+}
+
+.pl-4,
+.px-4 {
+  padding-left: 1.5rem !important;
+}
+
+.p-5 {
+  padding: 3rem !important;
+}
+
+.pt-5,
+.py-5 {
+  padding-top: 3rem !important;
+}
+
+.pr-5,
+.px-5 {
+  padding-right: 3rem !important;
+}
+
+.pb-5,
+.py-5 {
+  padding-bottom: 3rem !important;
+}
+
+.pl-5,
+.px-5 {
+  padding-left: 3rem !important;
+}
+
+.m-n1 {
+  margin: -0.25rem !important;
+}
+
+.mt-n1,
+.my-n1 {
+  margin-top: -0.25rem !important;
+}
+
+.mr-n1,
+.mx-n1 {
+  margin-right: -0.25rem !important;
+}
+
+.mb-n1,
+.my-n1 {
+  margin-bottom: -0.25rem !important;
+}
+
+.ml-n1,
+.mx-n1 {
+  margin-left: -0.25rem !important;
+}
+
+.m-n2 {
+  margin: -0.5rem !important;
+}
+
+.mt-n2,
+.my-n2 {
+  margin-top: -0.5rem !important;
+}
+
+.mr-n2,
+.mx-n2 {
+  margin-right: -0.5rem !important;
+}
+
+.mb-n2,
+.my-n2 {
+  margin-bottom: -0.5rem !important;
+}
+
+.ml-n2,
+.mx-n2 {
+  margin-left: -0.5rem !important;
+}
+
+.m-n3 {
+  margin: -1rem !important;
+}
+
+.mt-n3,
+.my-n3 {
+  margin-top: -1rem !important;
+}
+
+.mr-n3,
+.mx-n3 {
+  margin-right: -1rem !important;
+}
+
+.mb-n3,
+.my-n3 {
+  margin-bottom: -1rem !important;
+}
+
+.ml-n3,
+.mx-n3 {
+  margin-left: -1rem !important;
+}
+
+.m-n4 {
+  margin: -1.5rem !important;
+}
+
+.mt-n4,
+.my-n4 {
+  margin-top: -1.5rem !important;
+}
+
+.mr-n4,
+.mx-n4 {
+  margin-right: -1.5rem !important;
+}
+
+.mb-n4,
+.my-n4 {
+  margin-bottom: -1.5rem !important;
+}
+
+.ml-n4,
+.mx-n4 {
+  margin-left: -1.5rem !important;
+}
+
+.m-n5 {
+  margin: -3rem !important;
+}
+
+.mt-n5,
+.my-n5 {
+  margin-top: -3rem !important;
+}
+
+.mr-n5,
+.mx-n5 {
+  margin-right: -3rem !important;
+}
+
+.mb-n5,
+.my-n5 {
+  margin-bottom: -3rem !important;
+}
+
+.ml-n5,
+.mx-n5 {
+  margin-left: -3rem !important;
+}
+
+.m-auto {
+  margin: auto !important;
+}
+
+.mt-auto,
+.my-auto {
+  margin-top: auto !important;
+}
+
+.mr-auto,
+.mx-auto {
+  margin-right: auto !important;
+}
+
+.mb-auto,
+.my-auto {
+  margin-bottom: auto !important;
+}
+
+.ml-auto,
+.mx-auto {
+  margin-left: auto !important;
+}
+
+@media (min-width: 576px) {
+  .m-sm-0 {
+    margin: 0 !important;
+  }
+  .mt-sm-0,
+  .my-sm-0 {
+    margin-top: 0 !important;
+  }
+  .mr-sm-0,
+  .mx-sm-0 {
+    margin-right: 0 !important;
+  }
+  .mb-sm-0,
+  .my-sm-0 {
+    margin-bottom: 0 !important;
+  }
+  .ml-sm-0,
+  .mx-sm-0 {
+    margin-left: 0 !important;
+  }
+  .m-sm-1 {
+    margin: 0.25rem !important;
+  }
+  .mt-sm-1,
+  .my-sm-1 {
+    margin-top: 0.25rem !important;
+  }
+  .mr-sm-1,
+  .mx-sm-1 {
+    margin-right: 0.25rem !important;
+  }
+  .mb-sm-1,
+  .my-sm-1 {
+    margin-bottom: 0.25rem !important;
+  }
+  .ml-sm-1,
+  .mx-sm-1 {
+    margin-left: 0.25rem !important;
+  }
+  .m-sm-2 {
+    margin: 0.5rem !important;
+  }
+  .mt-sm-2,
+  .my-sm-2 {
+    margin-top: 0.5rem !important;
+  }
+  .mr-sm-2,
+  .mx-sm-2 {
+    margin-right: 0.5rem !important;
+  }
+  .mb-sm-2,
+  .my-sm-2 {
+    margin-bottom: 0.5rem !important;
+  }
+  .ml-sm-2,
+  .mx-sm-2 {
+    margin-left: 0.5rem !important;
+  }
+  .m-sm-3 {
+    margin: 1rem !important;
+  }
+  .mt-sm-3,
+  .my-sm-3 {
+    margin-top: 1rem !important;
+  }
+  .mr-sm-3,
+  .mx-sm-3 {
+    margin-right: 1rem !important;
+  }
+  .mb-sm-3,
+  .my-sm-3 {
+    margin-bottom: 1rem !important;
+  }
+  .ml-sm-3,
+  .mx-sm-3 {
+    margin-left: 1rem !important;
+  }
+  .m-sm-4 {
+    margin: 1.5rem !important;
+  }
+  .mt-sm-4,
+  .my-sm-4 {
+    margin-top: 1.5rem !important;
+  }
+  .mr-sm-4,
+  .mx-sm-4 {
+    margin-right: 1.5rem !important;
+  }
+  .mb-sm-4,
+  .my-sm-4 {
+    margin-bottom: 1.5rem !important;
+  }
+  .ml-sm-4,
+  .mx-sm-4 {
+    margin-left: 1.5rem !important;
+  }
+  .m-sm-5 {
+    margin: 3rem !important;
+  }
+  .mt-sm-5,
+  .my-sm-5 {
+    margin-top: 3rem !important;
+  }
+  .mr-sm-5,
+  .mx-sm-5 {
+    margin-right: 3rem !important;
+  }
+  .mb-sm-5,
+  .my-sm-5 {
+    margin-bottom: 3rem !important;
+  }
+  .ml-sm-5,
+  .mx-sm-5 {
+    margin-left: 3rem !important;
+  }
+  .p-sm-0 {
+    padding: 0 !important;
+  }
+  .pt-sm-0,
+  .py-sm-0 {
+    padding-top: 0 !important;
+  }
+  .pr-sm-0,
+  .px-sm-0 {
+    padding-right: 0 !important;
+  }
+  .pb-sm-0,
+  .py-sm-0 {
+    padding-bottom: 0 !important;
+  }
+  .pl-sm-0,
+  .px-sm-0 {
+    padding-left: 0 !important;
+  }
+  .p-sm-1 {
+    padding: 0.25rem !important;
+  }
+  .pt-sm-1,
+  .py-sm-1 {
+    padding-top: 0.25rem !important;
+  }
+  .pr-sm-1,
+  .px-sm-1 {
+    padding-right: 0.25rem !important;
+  }
+  .pb-sm-1,
+  .py-sm-1 {
+    padding-bottom: 0.25rem !important;
+  }
+  .pl-sm-1,
+  .px-sm-1 {
+    padding-left: 0.25rem !important;
+  }
+  .p-sm-2 {
+    padding: 0.5rem !important;
+  }
+  .pt-sm-2,
+  .py-sm-2 {
+    padding-top: 0.5rem !important;
+  }
+  .pr-sm-2,
+  .px-sm-2 {
+    padding-right: 0.5rem !important;
+  }
+  .pb-sm-2,
+  .py-sm-2 {
+    padding-bottom: 0.5rem !important;
+  }
+  .pl-sm-2,
+  .px-sm-2 {
+    padding-left: 0.5rem !important;
+  }
+  .p-sm-3 {
+    padding: 1rem !important;
+  }
+  .pt-sm-3,
+  .py-sm-3 {
+    padding-top: 1rem !important;
+  }
+  .pr-sm-3,
+  .px-sm-3 {
+    padding-right: 1rem !important;
+  }
+  .pb-sm-3,
+  .py-sm-3 {
+    padding-bottom: 1rem !important;
+  }
+  .pl-sm-3,
+  .px-sm-3 {
+    padding-left: 1rem !important;
+  }
+  .p-sm-4 {
+    padding: 1.5rem !important;
+  }
+  .pt-sm-4,
+  .py-sm-4 {
+    padding-top: 1.5rem !important;
+  }
+  .pr-sm-4,
+  .px-sm-4 {
+    padding-right: 1.5rem !important;
+  }
+  .pb-sm-4,
+  .py-sm-4 {
+    padding-bottom: 1.5rem !important;
+  }
+  .pl-sm-4,
+  .px-sm-4 {
+    padding-left: 1.5rem !important;
+  }
+  .p-sm-5 {
+    padding: 3rem !important;
+  }
+  .pt-sm-5,
+  .py-sm-5 {
+    padding-top: 3rem !important;
+  }
+  .pr-sm-5,
+  .px-sm-5 {
+    padding-right: 3rem !important;
+  }
+  .pb-sm-5,
+  .py-sm-5 {
+    padding-bottom: 3rem !important;
+  }
+  .pl-sm-5,
+  .px-sm-5 {
+    padding-left: 3rem !important;
+  }
+  .m-sm-n1 {
+    margin: -0.25rem !important;
+  }
+  .mt-sm-n1,
+  .my-sm-n1 {
+    margin-top: -0.25rem !important;
+  }
+  .mr-sm-n1,
+  .mx-sm-n1 {
+    margin-right: -0.25rem !important;
+  }
+  .mb-sm-n1,
+  .my-sm-n1 {
+    margin-bottom: -0.25rem !important;
+  }
+  .ml-sm-n1,
+  .mx-sm-n1 {
+    margin-left: -0.25rem !important;
+  }
+  .m-sm-n2 {
+    margin: -0.5rem !important;
+  }
+  .mt-sm-n2,
+  .my-sm-n2 {
+    margin-top: -0.5rem !important;
+  }
+  .mr-sm-n2,
+  .mx-sm-n2 {
+    margin-right: -0.5rem !important;
+  }
+  .mb-sm-n2,
+  .my-sm-n2 {
+    margin-bottom: -0.5rem !important;
+  }
+  .ml-sm-n2,
+  .mx-sm-n2 {
+    margin-left: -0.5rem !important;
+  }
+  .m-sm-n3 {
+    margin: -1rem !important;
+  }
+  .mt-sm-n3,
+  .my-sm-n3 {
+    margin-top: -1rem !important;
+  }
+  .mr-sm-n3,
+  .mx-sm-n3 {
+    margin-right: -1rem !important;
+  }
+  .mb-sm-n3,
+  .my-sm-n3 {
+    margin-bottom: -1rem !important;
+  }
+  .ml-sm-n3,
+  .mx-sm-n3 {
+    margin-left: -1rem !important;
+  }
+  .m-sm-n4 {
+    margin: -1.5rem !important;
+  }
+  .mt-sm-n4,
+  .my-sm-n4 {
+    margin-top: -1.5rem !important;
+  }
+  .mr-sm-n4,
+  .mx-sm-n4 {
+    margin-right: -1.5rem !important;
+  }
+  .mb-sm-n4,
+  .my-sm-n4 {
+    margin-bottom: -1.5rem !important;
+  }
+  .ml-sm-n4,
+  .mx-sm-n4 {
+    margin-left: -1.5rem !important;
+  }
+  .m-sm-n5 {
+    margin: -3rem !important;
+  }
+  .mt-sm-n5,
+  .my-sm-n5 {
+    margin-top: -3rem !important;
+  }
+  .mr-sm-n5,
+  .mx-sm-n5 {
+    margin-right: -3rem !important;
+  }
+  .mb-sm-n5,
+  .my-sm-n5 {
+    margin-bottom: -3rem !important;
+  }
+  .ml-sm-n5,
+  .mx-sm-n5 {
+    margin-left: -3rem !important;
+  }
+  .m-sm-auto {
+    margin: auto !important;
+  }
+  .mt-sm-auto,
+  .my-sm-auto {
+    margin-top: auto !important;
+  }
+  .mr-sm-auto,
+  .mx-sm-auto {
+    margin-right: auto !important;
+  }
+  .mb-sm-auto,
+  .my-sm-auto {
+    margin-bottom: auto !important;
+  }
+  .ml-sm-auto,
+  .mx-sm-auto {
+    margin-left: auto !important;
+  }
+}
+
+@media (min-width: 768px) {
+  .m-md-0 {
+    margin: 0 !important;
+  }
+  .mt-md-0,
+  .my-md-0 {
+    margin-top: 0 !important;
+  }
+  .mr-md-0,
+  .mx-md-0 {
+    margin-right: 0 !important;
+  }
+  .mb-md-0,
+  .my-md-0 {
+    margin-bottom: 0 !important;
+  }
+  .ml-md-0,
+  .mx-md-0 {
+    margin-left: 0 !important;
+  }
+  .m-md-1 {
+    margin: 0.25rem !important;
+  }
+  .mt-md-1,
+  .my-md-1 {
+    margin-top: 0.25rem !important;
+  }
+  .mr-md-1,
+  .mx-md-1 {
+    margin-right: 0.25rem !important;
+  }
+  .mb-md-1,
+  .my-md-1 {
+    margin-bottom: 0.25rem !important;
+  }
+  .ml-md-1,
+  .mx-md-1 {
+    margin-left: 0.25rem !important;
+  }
+  .m-md-2 {
+    margin: 0.5rem !important;
+  }
+  .mt-md-2,
+  .my-md-2 {
+    margin-top: 0.5rem !important;
+  }
+  .mr-md-2,
+  .mx-md-2 {
+    margin-right: 0.5rem !important;
+  }
+  .mb-md-2,
+  .my-md-2 {
+    margin-bottom: 0.5rem !important;
+  }
+  .ml-md-2,
+  .mx-md-2 {
+    margin-left: 0.5rem !important;
+  }
+  .m-md-3 {
+    margin: 1rem !important;
+  }
+  .mt-md-3,
+  .my-md-3 {
+    margin-top: 1rem !important;
+  }
+  .mr-md-3,
+  .mx-md-3 {
+    margin-right: 1rem !important;
+  }
+  .mb-md-3,
+  .my-md-3 {
+    margin-bottom: 1rem !important;
+  }
+  .ml-md-3,
+  .mx-md-3 {
+    margin-left: 1rem !important;
+  }
+  .m-md-4 {
+    margin: 1.5rem !important;
+  }
+  .mt-md-4,
+  .my-md-4 {
+    margin-top: 1.5rem !important;
+  }
+  .mr-md-4,
+  .mx-md-4 {
+    margin-right: 1.5rem !important;
+  }
+  .mb-md-4,
+  .my-md-4 {
+    margin-bottom: 1.5rem !important;
+  }
+  .ml-md-4,
+  .mx-md-4 {
+    margin-left: 1.5rem !important;
+  }
+  .m-md-5 {
+    margin: 3rem !important;
+  }
+  .mt-md-5,
+  .my-md-5 {
+    margin-top: 3rem !important;
+  }
+  .mr-md-5,
+  .mx-md-5 {
+    margin-right: 3rem !important;
+  }
+  .mb-md-5,
+  .my-md-5 {
+    margin-bottom: 3rem !important;
+  }
+  .ml-md-5,
+  .mx-md-5 {
+    margin-left: 3rem !important;
+  }
+  .p-md-0 {
+    padding: 0 !important;
+  }
+  .pt-md-0,
+  .py-md-0 {
+    padding-top: 0 !important;
+  }
+  .pr-md-0,
+  .px-md-0 {
+    padding-right: 0 !important;
+  }
+  .pb-md-0,
+  .py-md-0 {
+    padding-bottom: 0 !important;
+  }
+  .pl-md-0,
+  .px-md-0 {
+    padding-left: 0 !important;
+  }
+  .p-md-1 {
+    padding: 0.25rem !important;
+  }
+  .pt-md-1,
+  .py-md-1 {
+    padding-top: 0.25rem !important;
+  }
+  .pr-md-1,
+  .px-md-1 {
+    padding-right: 0.25rem !important;
+  }
+  .pb-md-1,
+  .py-md-1 {
+    padding-bottom: 0.25rem !important;
+  }
+  .pl-md-1,
+  .px-md-1 {
+    padding-left: 0.25rem !important;
+  }
+  .p-md-2 {
+    padding: 0.5rem !important;
+  }
+  .pt-md-2,
+  .py-md-2 {
+    padding-top: 0.5rem !important;
+  }
+  .pr-md-2,
+  .px-md-2 {
+    padding-right: 0.5rem !important;
+  }
+  .pb-md-2,
+  .py-md-2 {
+    padding-bottom: 0.5rem !important;
+  }
+  .pl-md-2,
+  .px-md-2 {
+    padding-left: 0.5rem !important;
+  }
+  .p-md-3 {
+    padding: 1rem !important;
+  }
+  .pt-md-3,
+  .py-md-3 {
+    padding-top: 1rem !important;
+  }
+  .pr-md-3,
+  .px-md-3 {
+    padding-right: 1rem !important;
+  }
+  .pb-md-3,
+  .py-md-3 {
+    padding-bottom: 1rem !important;
+  }
+  .pl-md-3,
+  .px-md-3 {
+    padding-left: 1rem !important;
+  }
+  .p-md-4 {
+    padding: 1.5rem !important;
+  }
+  .pt-md-4,
+  .py-md-4 {
+    padding-top: 1.5rem !important;
+  }
+  .pr-md-4,
+  .px-md-4 {
+    padding-right: 1.5rem !important;
+  }
+  .pb-md-4,
+  .py-md-4 {
+    padding-bottom: 1.5rem !important;
+  }
+  .pl-md-4,
+  .px-md-4 {
+    padding-left: 1.5rem !important;
+  }
+  .p-md-5 {
+    padding: 3rem !important;
+  }
+  .pt-md-5,
+  .py-md-5 {
+    padding-top: 3rem !important;
+  }
+  .pr-md-5,
+  .px-md-5 {
+    padding-right: 3rem !important;
+  }
+  .pb-md-5,
+  .py-md-5 {
+    padding-bottom: 3rem !important;
+  }
+  .pl-md-5,
+  .px-md-5 {
+    padding-left: 3rem !important;
+  }
+  .m-md-n1 {
+    margin: -0.25rem !important;
+  }
+  .mt-md-n1,
+  .my-md-n1 {
+    margin-top: -0.25rem !important;
+  }
+  .mr-md-n1,
+  .mx-md-n1 {
+    margin-right: -0.25rem !important;
+  }
+  .mb-md-n1,
+  .my-md-n1 {
+    margin-bottom: -0.25rem !important;
+  }
+  .ml-md-n1,
+  .mx-md-n1 {
+    margin-left: -0.25rem !important;
+  }
+  .m-md-n2 {
+    margin: -0.5rem !important;
+  }
+  .mt-md-n2,
+  .my-md-n2 {
+    margin-top: -0.5rem !important;
+  }
+  .mr-md-n2,
+  .mx-md-n2 {
+    margin-right: -0.5rem !important;
+  }
+  .mb-md-n2,
+  .my-md-n2 {
+    margin-bottom: -0.5rem !important;
+  }
+  .ml-md-n2,
+  .mx-md-n2 {
+    margin-left: -0.5rem !important;
+  }
+  .m-md-n3 {
+    margin: -1rem !important;
+  }
+  .mt-md-n3,
+  .my-md-n3 {
+    margin-top: -1rem !important;
+  }
+  .mr-md-n3,
+  .mx-md-n3 {
+    margin-right: -1rem !important;
+  }
+  .mb-md-n3,
+  .my-md-n3 {
+    margin-bottom: -1rem !important;
+  }
+  .ml-md-n3,
+  .mx-md-n3 {
+    margin-left: -1rem !important;
+  }
+  .m-md-n4 {
+    margin: -1.5rem !important;
+  }
+  .mt-md-n4,
+  .my-md-n4 {
+    margin-top: -1.5rem !important;
+  }
+  .mr-md-n4,
+  .mx-md-n4 {
+    margin-right: -1.5rem !important;
+  }
+  .mb-md-n4,
+  .my-md-n4 {
+    margin-bottom: -1.5rem !important;
+  }
+  .ml-md-n4,
+  .mx-md-n4 {
+    margin-left: -1.5rem !important;
+  }
+  .m-md-n5 {
+    margin: -3rem !important;
+  }
+  .mt-md-n5,
+  .my-md-n5 {
+    margin-top: -3rem !important;
+  }
+  .mr-md-n5,
+  .mx-md-n5 {
+    margin-right: -3rem !important;
+  }
+  .mb-md-n5,
+  .my-md-n5 {
+    margin-bottom: -3rem !important;
+  }
+  .ml-md-n5,
+  .mx-md-n5 {
+    margin-left: -3rem !important;
+  }
+  .m-md-auto {
+    margin: auto !important;
+  }
+  .mt-md-auto,
+  .my-md-auto {
+    margin-top: auto !important;
+  }
+  .mr-md-auto,
+  .mx-md-auto {
+    margin-right: auto !important;
+  }
+  .mb-md-auto,
+  .my-md-auto {
+    margin-bottom: auto !important;
+  }
+  .ml-md-auto,
+  .mx-md-auto {
+    margin-left: auto !important;
+  }
+}
+
+@media (min-width: 992px) {
+  .m-lg-0 {
+    margin: 0 !important;
+  }
+  .mt-lg-0,
+  .my-lg-0 {
+    margin-top: 0 !important;
+  }
+  .mr-lg-0,
+  .mx-lg-0 {
+    margin-right: 0 !important;
+  }
+  .mb-lg-0,
+  .my-lg-0 {
+    margin-bottom: 0 !important;
+  }
+  .ml-lg-0,
+  .mx-lg-0 {
+    margin-left: 0 !important;
+  }
+  .m-lg-1 {
+    margin: 0.25rem !important;
+  }
+  .mt-lg-1,
+  .my-lg-1 {
+    margin-top: 0.25rem !important;
+  }
+  .mr-lg-1,
+  .mx-lg-1 {
+    margin-right: 0.25rem !important;
+  }
+  .mb-lg-1,
+  .my-lg-1 {
+    margin-bottom: 0.25rem !important;
+  }
+  .ml-lg-1,
+  .mx-lg-1 {
+    margin-left: 0.25rem !important;
+  }
+  .m-lg-2 {
+    margin: 0.5rem !important;
+  }
+  .mt-lg-2,
+  .my-lg-2 {
+    margin-top: 0.5rem !important;
+  }
+  .mr-lg-2,
+  .mx-lg-2 {
+    margin-right: 0.5rem !important;
+  }
+  .mb-lg-2,
+  .my-lg-2 {
+    margin-bottom: 0.5rem !important;
+  }
+  .ml-lg-2,
+  .mx-lg-2 {
+    margin-left: 0.5rem !important;
+  }
+  .m-lg-3 {
+    margin: 1rem !important;
+  }
+  .mt-lg-3,
+  .my-lg-3 {
+    margin-top: 1rem !important;
+  }
+  .mr-lg-3,
+  .mx-lg-3 {
+    margin-right: 1rem !important;
+  }
+  .mb-lg-3,
+  .my-lg-3 {
+    margin-bottom: 1rem !important;
+  }
+  .ml-lg-3,
+  .mx-lg-3 {
+    margin-left: 1rem !important;
+  }
+  .m-lg-4 {
+    margin: 1.5rem !important;
+  }
+  .mt-lg-4,
+  .my-lg-4 {
+    margin-top: 1.5rem !important;
+  }
+  .mr-lg-4,
+  .mx-lg-4 {
+    margin-right: 1.5rem !important;
+  }
+  .mb-lg-4,
+  .my-lg-4 {
+    margin-bottom: 1.5rem !important;
+  }
+  .ml-lg-4,
+  .mx-lg-4 {
+    margin-left: 1.5rem !important;
+  }
+  .m-lg-5 {
+    margin: 3rem !important;
+  }
+  .mt-lg-5,
+  .my-lg-5 {
+    margin-top: 3rem !important;
+  }
+  .mr-lg-5,
+  .mx-lg-5 {
+    margin-right: 3rem !important;
+  }
+  .mb-lg-5,
+  .my-lg-5 {
+    margin-bottom: 3rem !important;
+  }
+  .ml-lg-5,
+  .mx-lg-5 {
+    margin-left: 3rem !important;
+  }
+  .p-lg-0 {
+    padding: 0 !important;
+  }
+  .pt-lg-0,
+  .py-lg-0 {
+    padding-top: 0 !important;
+  }
+  .pr-lg-0,
+  .px-lg-0 {
+    padding-right: 0 !important;
+  }
+  .pb-lg-0,
+  .py-lg-0 {
+    padding-bottom: 0 !important;
+  }
+  .pl-lg-0,
+  .px-lg-0 {
+    padding-left: 0 !important;
+  }
+  .p-lg-1 {
+    padding: 0.25rem !important;
+  }
+  .pt-lg-1,
+  .py-lg-1 {
+    padding-top: 0.25rem !important;
+  }
+  .pr-lg-1,
+  .px-lg-1 {
+    padding-right: 0.25rem !important;
+  }
+  .pb-lg-1,
+  .py-lg-1 {
+    padding-bottom: 0.25rem !important;
+  }
+  .pl-lg-1,
+  .px-lg-1 {
+    padding-left: 0.25rem !important;
+  }
+  .p-lg-2 {
+    padding: 0.5rem !important;
+  }
+  .pt-lg-2,
+  .py-lg-2 {
+    padding-top: 0.5rem !important;
+  }
+  .pr-lg-2,
+  .px-lg-2 {
+    padding-right: 0.5rem !important;
+  }
+  .pb-lg-2,
+  .py-lg-2 {
+    padding-bottom: 0.5rem !important;
+  }
+  .pl-lg-2,
+  .px-lg-2 {
+    padding-left: 0.5rem !important;
+  }
+  .p-lg-3 {
+    padding: 1rem !important;
+  }
+  .pt-lg-3,
+  .py-lg-3 {
+    padding-top: 1rem !important;
+  }
+  .pr-lg-3,
+  .px-lg-3 {
+    padding-right: 1rem !important;
+  }
+  .pb-lg-3,
+  .py-lg-3 {
+    padding-bottom: 1rem !important;
+  }
+  .pl-lg-3,
+  .px-lg-3 {
+    padding-left: 1rem !important;
+  }
+  .p-lg-4 {
+    padding: 1.5rem !important;
+  }
+  .pt-lg-4,
+  .py-lg-4 {
+    padding-top: 1.5rem !important;
+  }
+  .pr-lg-4,
+  .px-lg-4 {
+    padding-right: 1.5rem !important;
+  }
+  .pb-lg-4,
+  .py-lg-4 {
+    padding-bottom: 1.5rem !important;
+  }
+  .pl-lg-4,
+  .px-lg-4 {
+    padding-left: 1.5rem !important;
+  }
+  .p-lg-5 {
+    padding: 3rem !important;
+  }
+  .pt-lg-5,
+  .py-lg-5 {
+    padding-top: 3rem !important;
+  }
+  .pr-lg-5,
+  .px-lg-5 {
+    padding-right: 3rem !important;
+  }
+  .pb-lg-5,
+  .py-lg-5 {
+    padding-bottom: 3rem !important;
+  }
+  .pl-lg-5,
+  .px-lg-5 {
+    padding-left: 3rem !important;
+  }
+  .m-lg-n1 {
+    margin: -0.25rem !important;
+  }
+  .mt-lg-n1,
+  .my-lg-n1 {
+    margin-top: -0.25rem !important;
+  }
+  .mr-lg-n1,
+  .mx-lg-n1 {
+    margin-right: -0.25rem !important;
+  }
+  .mb-lg-n1,
+  .my-lg-n1 {
+    margin-bottom: -0.25rem !important;
+  }
+  .ml-lg-n1,
+  .mx-lg-n1 {
+    margin-left: -0.25rem !important;
+  }
+  .m-lg-n2 {
+    margin: -0.5rem !important;
+  }
+  .mt-lg-n2,
+  .my-lg-n2 {
+    margin-top: -0.5rem !important;
+  }
+  .mr-lg-n2,
+  .mx-lg-n2 {
+    margin-right: -0.5rem !important;
+  }
+  .mb-lg-n2,
+  .my-lg-n2 {
+    margin-bottom: -0.5rem !important;
+  }
+  .ml-lg-n2,
+  .mx-lg-n2 {
+    margin-left: -0.5rem !important;
+  }
+  .m-lg-n3 {
+    margin: -1rem !important;
+  }
+  .mt-lg-n3,
+  .my-lg-n3 {
+    margin-top: -1rem !important;
+  }
+  .mr-lg-n3,
+  .mx-lg-n3 {
+    margin-right: -1rem !important;
+  }
+  .mb-lg-n3,
+  .my-lg-n3 {
+    margin-bottom: -1rem !important;
+  }
+  .ml-lg-n3,
+  .mx-lg-n3 {
+    margin-left: -1rem !important;
+  }
+  .m-lg-n4 {
+    margin: -1.5rem !important;
+  }
+  .mt-lg-n4,
+  .my-lg-n4 {
+    margin-top: -1.5rem !important;
+  }
+  .mr-lg-n4,
+  .mx-lg-n4 {
+    margin-right: -1.5rem !important;
+  }
+  .mb-lg-n4,
+  .my-lg-n4 {
+    margin-bottom: -1.5rem !important;
+  }
+  .ml-lg-n4,
+  .mx-lg-n4 {
+    margin-left: -1.5rem !important;
+  }
+  .m-lg-n5 {
+    margin: -3rem !important;
+  }
+  .mt-lg-n5,
+  .my-lg-n5 {
+    margin-top: -3rem !important;
+  }
+  .mr-lg-n5,
+  .mx-lg-n5 {
+    margin-right: -3rem !important;
+  }
+  .mb-lg-n5,
+  .my-lg-n5 {
+    margin-bottom: -3rem !important;
+  }
+  .ml-lg-n5,
+  .mx-lg-n5 {
+    margin-left: -3rem !important;
+  }
+  .m-lg-auto {
+    margin: auto !important;
+  }
+  .mt-lg-auto,
+  .my-lg-auto {
+    margin-top: auto !important;
+  }
+  .mr-lg-auto,
+  .mx-lg-auto {
+    margin-right: auto !important;
+  }
+  .mb-lg-auto,
+  .my-lg-auto {
+    margin-bottom: auto !important;
+  }
+  .ml-lg-auto,
+  .mx-lg-auto {
+    margin-left: auto !important;
+  }
+}
+
+@media (min-width: 1200px) {
+  .m-xl-0 {
+    margin: 0 !important;
+  }
+  .mt-xl-0,
+  .my-xl-0 {
+    margin-top: 0 !important;
+  }
+  .mr-xl-0,
+  .mx-xl-0 {
+    margin-right: 0 !important;
+  }
+  .mb-xl-0,
+  .my-xl-0 {
+    margin-bottom: 0 !important;
+  }
+  .ml-xl-0,
+  .mx-xl-0 {
+    margin-left: 0 !important;
+  }
+  .m-xl-1 {
+    margin: 0.25rem !important;
+  }
+  .mt-xl-1,
+  .my-xl-1 {
+    margin-top: 0.25rem !important;
+  }
+  .mr-xl-1,
+  .mx-xl-1 {
+    margin-right: 0.25rem !important;
+  }
+  .mb-xl-1,
+  .my-xl-1 {
+    margin-bottom: 0.25rem !important;
+  }
+  .ml-xl-1,
+  .mx-xl-1 {
+    margin-left: 0.25rem !important;
+  }
+  .m-xl-2 {
+    margin: 0.5rem !important;
+  }
+  .mt-xl-2,
+  .my-xl-2 {
+    margin-top: 0.5rem !important;
+  }
+  .mr-xl-2,
+  .mx-xl-2 {
+    margin-right: 0.5rem !important;
+  }
+  .mb-xl-2,
+  .my-xl-2 {
+    margin-bottom: 0.5rem !important;
+  }
+  .ml-xl-2,
+  .mx-xl-2 {
+    margin-left: 0.5rem !important;
+  }
+  .m-xl-3 {
+    margin: 1rem !important;
+  }
+  .mt-xl-3,
+  .my-xl-3 {
+    margin-top: 1rem !important;
+  }
+  .mr-xl-3,
+  .mx-xl-3 {
+    margin-right: 1rem !important;
+  }
+  .mb-xl-3,
+  .my-xl-3 {
+    margin-bottom: 1rem !important;
+  }
+  .ml-xl-3,
+  .mx-xl-3 {
+    margin-left: 1rem !important;
+  }
+  .m-xl-4 {
+    margin: 1.5rem !important;
+  }
+  .mt-xl-4,
+  .my-xl-4 {
+    margin-top: 1.5rem !important;
+  }
+  .mr-xl-4,
+  .mx-xl-4 {
+    margin-right: 1.5rem !important;
+  }
+  .mb-xl-4,
+  .my-xl-4 {
+    margin-bottom: 1.5rem !important;
+  }
+  .ml-xl-4,
+  .mx-xl-4 {
+    margin-left: 1.5rem !important;
+  }
+  .m-xl-5 {
+    margin: 3rem !important;
+  }
+  .mt-xl-5,
+  .my-xl-5 {
+    margin-top: 3rem !important;
+  }
+  .mr-xl-5,
+  .mx-xl-5 {
+    margin-right: 3rem !important;
+  }
+  .mb-xl-5,
+  .my-xl-5 {
+    margin-bottom: 3rem !important;
+  }
+  .ml-xl-5,
+  .mx-xl-5 {
+    margin-left: 3rem !important;
+  }
+  .p-xl-0 {
+    padding: 0 !important;
+  }
+  .pt-xl-0,
+  .py-xl-0 {
+    padding-top: 0 !important;
+  }
+  .pr-xl-0,
+  .px-xl-0 {
+    padding-right: 0 !important;
+  }
+  .pb-xl-0,
+  .py-xl-0 {
+    padding-bottom: 0 !important;
+  }
+  .pl-xl-0,
+  .px-xl-0 {
+    padding-left: 0 !important;
+  }
+  .p-xl-1 {
+    padding: 0.25rem !important;
+  }
+  .pt-xl-1,
+  .py-xl-1 {
+    padding-top: 0.25rem !important;
+  }
+  .pr-xl-1,
+  .px-xl-1 {
+    padding-right: 0.25rem !important;
+  }
+  .pb-xl-1,
+  .py-xl-1 {
+    padding-bottom: 0.25rem !important;
+  }
+  .pl-xl-1,
+  .px-xl-1 {
+    padding-left: 0.25rem !important;
+  }
+  .p-xl-2 {
+    padding: 0.5rem !important;
+  }
+  .pt-xl-2,
+  .py-xl-2 {
+    padding-top: 0.5rem !important;
+  }
+  .pr-xl-2,
+  .px-xl-2 {
+    padding-right: 0.5rem !important;
+  }
+  .pb-xl-2,
+  .py-xl-2 {
+    padding-bottom: 0.5rem !important;
+  }
+  .pl-xl-2,
+  .px-xl-2 {
+    padding-left: 0.5rem !important;
+  }
+  .p-xl-3 {
+    padding: 1rem !important;
+  }
+  .pt-xl-3,
+  .py-xl-3 {
+    padding-top: 1rem !important;
+  }
+  .pr-xl-3,
+  .px-xl-3 {
+    padding-right: 1rem !important;
+  }
+  .pb-xl-3,
+  .py-xl-3 {
+    padding-bottom: 1rem !important;
+  }
+  .pl-xl-3,
+  .px-xl-3 {
+    padding-left: 1rem !important;
+  }
+  .p-xl-4 {
+    padding: 1.5rem !important;
+  }
+  .pt-xl-4,
+  .py-xl-4 {
+    padding-top: 1.5rem !important;
+  }
+  .pr-xl-4,
+  .px-xl-4 {
+    padding-right: 1.5rem !important;
+  }
+  .pb-xl-4,
+  .py-xl-4 {
+    padding-bottom: 1.5rem !important;
+  }
+  .pl-xl-4,
+  .px-xl-4 {
+    padding-left: 1.5rem !important;
+  }
+  .p-xl-5 {
+    padding: 3rem !important;
+  }
+  .pt-xl-5,
+  .py-xl-5 {
+    padding-top: 3rem !important;
+  }
+  .pr-xl-5,
+  .px-xl-5 {
+    padding-right: 3rem !important;
+  }
+  .pb-xl-5,
+  .py-xl-5 {
+    padding-bottom: 3rem !important;
+  }
+  .pl-xl-5,
+  .px-xl-5 {
+    padding-left: 3rem !important;
+  }
+  .m-xl-n1 {
+    margin: -0.25rem !important;
+  }
+  .mt-xl-n1,
+  .my-xl-n1 {
+    margin-top: -0.25rem !important;
+  }
+  .mr-xl-n1,
+  .mx-xl-n1 {
+    margin-right: -0.25rem !important;
+  }
+  .mb-xl-n1,
+  .my-xl-n1 {
+    margin-bottom: -0.25rem !important;
+  }
+  .ml-xl-n1,
+  .mx-xl-n1 {
+    margin-left: -0.25rem !important;
+  }
+  .m-xl-n2 {
+    margin: -0.5rem !important;
+  }
+  .mt-xl-n2,
+  .my-xl-n2 {
+    margin-top: -0.5rem !important;
+  }
+  .mr-xl-n2,
+  .mx-xl-n2 {
+    margin-right: -0.5rem !important;
+  }
+  .mb-xl-n2,
+  .my-xl-n2 {
+    margin-bottom: -0.5rem !important;
+  }
+  .ml-xl-n2,
+  .mx-xl-n2 {
+    margin-left: -0.5rem !important;
+  }
+  .m-xl-n3 {
+    margin: -1rem !important;
+  }
+  .mt-xl-n3,
+  .my-xl-n3 {
+    margin-top: -1rem !important;
+  }
+  .mr-xl-n3,
+  .mx-xl-n3 {
+    margin-right: -1rem !important;
+  }
+  .mb-xl-n3,
+  .my-xl-n3 {
+    margin-bottom: -1rem !important;
+  }
+  .ml-xl-n3,
+  .mx-xl-n3 {
+    margin-left: -1rem !important;
+  }
+  .m-xl-n4 {
+    margin: -1.5rem !important;
+  }
+  .mt-xl-n4,
+  .my-xl-n4 {
+    margin-top: -1.5rem !important;
+  }
+  .mr-xl-n4,
+  .mx-xl-n4 {
+    margin-right: -1.5rem !important;
+  }
+  .mb-xl-n4,
+  .my-xl-n4 {
+    margin-bottom: -1.5rem !important;
+  }
+  .ml-xl-n4,
+  .mx-xl-n4 {
+    margin-left: -1.5rem !important;
+  }
+  .m-xl-n5 {
+    margin: -3rem !important;
+  }
+  .mt-xl-n5,
+  .my-xl-n5 {
+    margin-top: -3rem !important;
+  }
+  .mr-xl-n5,
+  .mx-xl-n5 {
+    margin-right: -3rem !important;
+  }
+  .mb-xl-n5,
+  .my-xl-n5 {
+    margin-bottom: -3rem !important;
+  }
+  .ml-xl-n5,
+  .mx-xl-n5 {
+    margin-left: -3rem !important;
+  }
+  .m-xl-auto {
+    margin: auto !important;
+  }
+  .mt-xl-auto,
+  .my-xl-auto {
+    margin-top: auto !important;
+  }
+  .mr-xl-auto,
+  .mx-xl-auto {
+    margin-right: auto !important;
+  }
+  .mb-xl-auto,
+  .my-xl-auto {
+    margin-bottom: auto !important;
+  }
+  .ml-xl-auto,
+  .mx-xl-auto {
+    margin-left: auto !important;
+  }
+}
+
+.text-monospace {
+  font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important;
+}
+
+.text-justify {
+  text-align: justify !important;
+}
+
+.text-wrap {
+  white-space: normal !important;
+}
+
+.text-nowrap {
+  white-space: nowrap !important;
+}
+
+.text-truncate {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.text-left {
+  text-align: left !important;
+}
+
+.text-right {
+  text-align: right !important;
+}
+
+.text-center {
+  text-align: center !important;
+}
+
+@media (min-width: 576px) {
+  .text-sm-left {
+    text-align: left !important;
+  }
+  .text-sm-right {
+    text-align: right !important;
+  }
+  .text-sm-center {
+    text-align: center !important;
+  }
+}
+
+@media (min-width: 768px) {
+  .text-md-left {
+    text-align: left !important;
+  }
+  .text-md-right {
+    text-align: right !important;
+  }
+  .text-md-center {
+    text-align: center !important;
+  }
+}
+
+@media (min-width: 992px) {
+  .text-lg-left {
+    text-align: left !important;
+  }
+  .text-lg-right {
+    text-align: right !important;
+  }
+  .text-lg-center {
+    text-align: center !important;
+  }
+}
+
+@media (min-width: 1200px) {
+  .text-xl-left {
+    text-align: left !important;
+  }
+  .text-xl-right {
+    text-align: right !important;
+  }
+  .text-xl-center {
+    text-align: center !important;
+  }
+}
+
+.text-lowercase {
+  text-transform: lowercase !important;
+}
+
+.text-uppercase {
+  text-transform: uppercase !important;
+}
+
+.text-capitalize {
+  text-transform: capitalize !important;
+}
+
+.font-weight-light {
+  font-weight: 300 !important;
+}
+
+.font-weight-lighter {
+  font-weight: lighter !important;
+}
+
+.font-weight-normal {
+  font-weight: 400 !important;
+}
+
+.font-weight-bold {
+  font-weight: 700 !important;
+}
+
+.font-weight-bolder {
+  font-weight: bolder !important;
+}
+
+.font-italic {
+  font-style: italic !important;
+}
+
+.text-white {
+  color: #fff !important;
+}
+
+.text-primary {
+  color: #007bff !important;
+}
+
+a.text-primary:hover, a.text-primary:focus {
+  color: #0056b3 !important;
+}
+
+.text-secondary {
+  color: #6c757d !important;
+}
+
+a.text-secondary:hover, a.text-secondary:focus {
+  color: #494f54 !important;
+}
+
+.text-success {
+  color: #28a745 !important;
+}
+
+a.text-success:hover, a.text-success:focus {
+  color: #19692c !important;
+}
+
+.text-info {
+  color: #17a2b8 !important;
+}
+
+a.text-info:hover, a.text-info:focus {
+  color: #0f6674 !important;
+}
+
+.text-warning {
+  color: #ffc107 !important;
+}
+
+a.text-warning:hover, a.text-warning:focus {
+  color: #ba8b00 !important;
+}
+
+.text-danger {
+  color: #dc3545 !important;
+}
+
+a.text-danger:hover, a.text-danger:focus {
+  color: #a71d2a !important;
+}
+
+.text-light {
+  color: #f8f9fa !important;
+}
+
+a.text-light:hover, a.text-light:focus {
+  color: #cbd3da !important;
+}
+
+.text-dark {
+  color: #343a40 !important;
+}
+
+a.text-dark:hover, a.text-dark:focus {
+  color: #121416 !important;
+}
+
+.text-body {
+  color: #212529 !important;
+}
+
+.text-muted {
+  color: #6c757d !important;
+}
+
+.text-black-50 {
+  color: rgba(0, 0, 0, 0.5) !important;
+}
+
+.text-white-50 {
+  color: rgba(255, 255, 255, 0.5) !important;
+}
+
+.text-hide {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+
+.text-decoration-none {
+  text-decoration: none !important;
+}
+
+.text-break {
+  word-break: break-word !important;
+  overflow-wrap: break-word !important;
+}
+
+.text-reset {
+  color: inherit !important;
+}
+
+.visible {
+  visibility: visible !important;
+}
+
+.invisible {
+  visibility: hidden !important;
+}
+
+@media print {
+  *,
+  *::before,
+  *::after {
+    text-shadow: none !important;
+    box-shadow: none !important;
+  }
+  a:not(.btn) {
+    text-decoration: underline;
+  }
+  abbr[title]::after {
+    content: " (" attr(title) ")";
+  }
+  pre {
+    white-space: pre-wrap !important;
+  }
+  pre,
+  blockquote {
+    border: 1px solid #adb5bd;
+    page-break-inside: avoid;
+  }
+  thead {
+    display: table-header-group;
+  }
+  tr,
+  img {
+    page-break-inside: avoid;
+  }
+  p,
+  h2,
+  h3 {
+    orphans: 3;
+    widows: 3;
+  }
+  h2,
+  h3 {
+    page-break-after: avoid;
+  }
+  @page {
+    size: a3;
+  }
+  body {
+    min-width: 992px !important;
+  }
+  .container {
+    min-width: 992px !important;
+  }
+  .navbar {
+    display: none;
+  }
+  .badge {
+    border: 1px solid #000;
+  }
+  .table {
+    border-collapse: collapse !important;
+  }
+  .table td,
+  .table th {
+    background-color: #fff !important;
+  }
+  .table-bordered th,
+  .table-bordered td {
+    border: 1px solid #dee2e6 !important;
+  }
+  .table-dark {
+    color: inherit;
+  }
+  .table-dark th,
+  .table-dark td,
+  .table-dark thead th,
+  .table-dark tbody + tbody {
+    border-color: #dee2e6;
+  }
+  .table .thead-dark th {
+    color: inherit;
+    border-color: #dee2e6;
+  }
+}
+/*# sourceMappingURL=bootstrap.css.map */

File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/css/bootstrap/bootstrap.css.map


File diff suppressed because it is too large
+ 5 - 0
src/main/resources/static/css/bootstrap/bootstrap.min.css


File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/css/bootstrap/bootstrap.min.css.map


+ 208 - 0
src/main/resources/static/css/bootstrap/dataTables.bootstrap4.min.css

@@ -0,0 +1,208 @@
+table.dataTable {
+  clear: both;
+  margin-top: 6px !important;
+  margin-bottom: 6px !important;
+  max-width: none !important;
+  border-collapse: separate !important;
+  border-spacing: 0;
+  z-index:0;
+}
+table.dataTable td,
+table.dataTable th {
+  -webkit-box-sizing: content-box;
+  box-sizing: content-box;
+}
+table.dataTable td.dataTables_empty,
+table.dataTable th.dataTables_empty {
+  text-align: center;
+}
+table.dataTable.nowrap th,
+table.dataTable.nowrap td {
+  white-space: nowrap;
+}
+div.dataTables_wrapper div.dataTables_length label {
+  font-weight: normal;
+  text-align: left;
+  white-space: nowrap;
+}
+div.dataTables_wrapper div.dataTables_length select {
+  width: auto;
+  display: inline-block;
+}
+div.dataTables_wrapper div.dataTables_filter {
+  text-align: right;
+}
+div.dataTables_wrapper div.dataTables_filter label {
+  font-weight: normal;
+  white-space: nowrap;
+  text-align: left;
+}
+div.dataTables_wrapper div.dataTables_filter input {
+  margin-left: 0.5em;
+  display: inline-block;
+  width: auto;
+}
+div.dataTables_wrapper div.dataTables_info {
+  padding-top: 0.85em;
+  white-space: nowrap;
+}
+div.dataTables_wrapper div.dataTables_paginate {
+  margin: 0;
+  white-space: nowrap;
+  text-align: right;
+}
+div.dataTables_wrapper div.dataTables_paginate ul.pagination {
+  margin: 2px 0;
+  white-space: nowrap;
+  justify-content: flex-end;
+}
+div.dataTables_wrapper div.dataTables_processing {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 200px;
+  margin-left: -100px;
+  margin-top: -26px;
+  text-align: center;
+  padding: 1em 0;
+}
+table.dataTable thead > tr > th.sorting_asc,
+table.dataTable thead > tr > th.sorting_desc,
+table.dataTable thead > tr > th.sorting,
+table.dataTable thead > tr > td.sorting_asc,
+table.dataTable thead > tr > td.sorting_desc,
+table.dataTable thead > tr > td.sorting {
+  padding-right: 30px;
+}
+table.dataTable thead > tr > th:active,
+table.dataTable thead > tr > td:active {
+  outline: none;
+}
+table.dataTable thead .sorting,
+table.dataTable thead .sorting_asc,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting_asc_disabled,
+table.dataTable thead .sorting_desc_disabled {
+  cursor: pointer;
+  position: relative;
+}
+table.dataTable thead .sorting:before,
+table.dataTable thead .sorting:after,
+table.dataTable thead .sorting_asc:before,
+table.dataTable thead .sorting_asc:after,
+table.dataTable thead .sorting_desc:before,
+table.dataTable thead .sorting_desc:after,
+table.dataTable thead .sorting_asc_disabled:before,
+table.dataTable thead .sorting_asc_disabled:after,
+table.dataTable thead .sorting_desc_disabled:before,
+table.dataTable thead .sorting_desc_disabled:after {
+  position: absolute;
+  bottom: 0.9em;
+  display: block;
+  opacity: 0.3;
+}
+table.dataTable thead .sorting:before,
+table.dataTable thead .sorting_asc:before,
+table.dataTable thead .sorting_desc:before,
+table.dataTable thead .sorting_asc_disabled:before,
+table.dataTable thead .sorting_desc_disabled:before {
+  right: 1em;
+  content: "\2191";
+}
+table.dataTable thead .sorting:after,
+table.dataTable thead .sorting_asc:after,
+table.dataTable thead .sorting_desc:after,
+table.dataTable thead .sorting_asc_disabled:after,
+table.dataTable thead .sorting_desc_disabled:after {
+  right: 0.5em;
+  content: "\2193";
+}
+table.dataTable thead .sorting_asc:before,
+table.dataTable thead .sorting_desc:after {
+  opacity: 1;
+}
+table.dataTable thead .sorting_asc_disabled:before,
+table.dataTable thead .sorting_desc_disabled:after {
+  opacity: 0;
+}
+div.dataTables_scrollHead table.dataTable {
+  margin-bottom: 0 !important;
+}
+div.dataTables_scrollBody table {
+  border-top: none;
+  margin-top: 0 !important;
+  margin-bottom: 0 !important;
+}
+div.dataTables_scrollBody table thead .sorting:before,
+div.dataTables_scrollBody table thead .sorting_asc:before,
+div.dataTables_scrollBody table thead .sorting_desc:before,
+div.dataTables_scrollBody table thead .sorting:after,
+div.dataTables_scrollBody table thead .sorting_asc:after,
+div.dataTables_scrollBody table thead .sorting_desc:after {
+  display: none;
+}
+div.dataTables_scrollBody table tbody tr:first-child th,
+div.dataTables_scrollBody table tbody tr:first-child td {
+  border-top: none;
+}
+div.dataTables_scrollFoot > .dataTables_scrollFootInner {
+  box-sizing: content-box;
+}
+div.dataTables_scrollFoot > .dataTables_scrollFootInner > table {
+  margin-top: 0 !important;
+  border-top: none;
+}
+@media screen and (max-width: 767px) {
+  div.dataTables_wrapper div.dataTables_length,
+  div.dataTables_wrapper div.dataTables_filter,
+  div.dataTables_wrapper div.dataTables_info,
+  div.dataTables_wrapper div.dataTables_paginate {
+    text-align: center;
+  }
+}
+table.dataTable.table-sm > thead > tr > th {
+  padding-right: 20px;
+}
+table.dataTable.table-sm .sorting:before,
+table.dataTable.table-sm .sorting_asc:before,
+table.dataTable.table-sm .sorting_desc:before {
+  top: 5px;
+  right: 0.85em;
+}
+table.dataTable.table-sm .sorting:after,
+table.dataTable.table-sm .sorting_asc:after,
+table.dataTable.table-sm .sorting_desc:after {
+  top: 5px;
+}
+table.table-bordered.dataTable th,
+table.table-bordered.dataTable td {
+  border-left-width: 0;
+}
+table.table-bordered.dataTable th:last-child,
+table.table-bordered.dataTable th:last-child,
+table.table-bordered.dataTable td:last-child,
+table.table-bordered.dataTable td:last-child {
+  border-right-width: 0;
+}
+table.table-bordered.dataTable tbody th,
+table.table-bordered.dataTable tbody td {
+  border-bottom-width: 0;
+}
+div.dataTables_scrollHead table.table-bordered {
+  border-bottom-width: 0;
+}
+div.table-responsive > div.dataTables_wrapper > div.row {
+  margin: 0;
+}
+div.table-responsive
+  > div.dataTables_wrapper
+  > div.row
+  > div[class^="col-"]:first-child {
+  padding-left: 0;
+}
+div.table-responsive
+  > div.dataTables_wrapper
+  > div.row
+  > div[class^="col-"]:last-child {
+  padding-right: 0;
+}

File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/css/bootstrap/responsive.dataTables.min.css


+ 1 - 0
src/main/resources/static/css/bootstrap/rowReorder.dataTables.min.css

@@ -0,0 +1 @@
+table.dt-rowReorder-float{position:absolute !important;opacity:0.8;table-layout:fixed;outline:2px solid #888;outline-offset:-2px;z-index:2001}tr.dt-rowReorder-moving{outline:2px solid #555;outline-offset:-2px}body.dt-rowReorder-noOverflow{overflow-x:hidden}table.dataTable td.reorder{text-align:center;cursor:move}

+ 477 - 0
src/main/resources/static/css/datepicker/bootstrap-datepicker.css

@@ -0,0 +1,477 @@
+/*!
+ * Datepicker for Bootstrap v1.9.0 (https://github.com/uxsolutions/bootstrap-datepicker)
+ *
+ * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ */
+
+.datepicker {
+  padding: 4px;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  direction: ltr;
+}
+.datepicker-inline {
+  width: 220px;
+}
+.datepicker-rtl {
+  direction: rtl;
+}
+.datepicker-rtl.dropdown-menu {
+  left: auto;
+}
+.datepicker-rtl table tr td span {
+  float: right;
+}
+.datepicker-dropdown {
+  top: 0;
+  left: 0;
+}
+.datepicker-dropdown:before {
+  content: '';
+  display: inline-block;
+  border-left: 7px solid transparent;
+  border-right: 7px solid transparent;
+  border-bottom: 7px solid #999;
+  border-top: 0;
+  border-bottom-color: rgba(0, 0, 0, 0.2);
+  position: absolute;
+}
+.datepicker-dropdown:after {
+  content: '';
+  display: inline-block;
+  border-left: 6px solid transparent;
+  border-right: 6px solid transparent;
+  border-bottom: 6px solid #fff;
+  border-top: 0;
+  position: absolute;
+}
+.datepicker-dropdown.datepicker-orient-left:before {
+  left: 6px;
+}
+.datepicker-dropdown.datepicker-orient-left:after {
+  left: 7px;
+}
+.datepicker-dropdown.datepicker-orient-right:before {
+  right: 6px;
+}
+.datepicker-dropdown.datepicker-orient-right:after {
+  right: 7px;
+}
+.datepicker-dropdown.datepicker-orient-bottom:before {
+  top: -7px;
+}
+.datepicker-dropdown.datepicker-orient-bottom:after {
+  top: -6px;
+}
+.datepicker-dropdown.datepicker-orient-top:before {
+  bottom: -7px;
+  border-bottom: 0;
+  border-top: 7px solid #999;
+}
+.datepicker-dropdown.datepicker-orient-top:after {
+  bottom: -6px;
+  border-bottom: 0;
+  border-top: 6px solid #fff;
+}
+.datepicker table {
+  margin: 0;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -khtml-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.datepicker td,
+.datepicker th {
+  text-align: center;
+  width: 20px;
+  height: 20px;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  border: none;
+}
+.table-striped .datepicker table tr td,
+.table-striped .datepicker table tr th {
+  background-color: transparent;
+}
+.datepicker table tr td.day:hover,
+.datepicker table tr td.day.focused {
+  background: #eee;
+  cursor: pointer;
+}
+.datepicker table tr td.old,
+.datepicker table tr td.new {
+  color: #999;
+}
+.datepicker table tr td.disabled,
+.datepicker table tr td.disabled:hover {
+  background: none;
+  color: #999;
+  cursor: default;
+}
+.datepicker table tr td.highlighted {
+  background: #d9edf7;
+  border-radius: 0;
+}
+.datepicker table tr td.today,
+.datepicker table tr td.today:hover,
+.datepicker table tr td.today.disabled,
+.datepicker table tr td.today.disabled:hover {
+  background-color: #fde19a;
+  background-image: -moz-linear-gradient(to bottom, #fdd49a, #fdf59a);
+  background-image: -ms-linear-gradient(to bottom, #fdd49a, #fdf59a);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a));
+  background-image: -webkit-linear-gradient(to bottom, #fdd49a, #fdf59a);
+  background-image: -o-linear-gradient(to bottom, #fdd49a, #fdf59a);
+  background-image: linear-gradient(to bottom, #fdd49a, #fdf59a);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);
+  border-color: #fdf59a #fdf59a #fbed50;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  color: #000;
+}
+.datepicker table tr td.today:hover,
+.datepicker table tr td.today:hover:hover,
+.datepicker table tr td.today.disabled:hover,
+.datepicker table tr td.today.disabled:hover:hover,
+.datepicker table tr td.today:active,
+.datepicker table tr td.today:hover:active,
+.datepicker table tr td.today.disabled:active,
+.datepicker table tr td.today.disabled:hover:active,
+.datepicker table tr td.today.active,
+.datepicker table tr td.today:hover.active,
+.datepicker table tr td.today.disabled.active,
+.datepicker table tr td.today.disabled:hover.active,
+.datepicker table tr td.today.disabled,
+.datepicker table tr td.today:hover.disabled,
+.datepicker table tr td.today.disabled.disabled,
+.datepicker table tr td.today.disabled:hover.disabled,
+.datepicker table tr td.today[disabled],
+.datepicker table tr td.today:hover[disabled],
+.datepicker table tr td.today.disabled[disabled],
+.datepicker table tr td.today.disabled:hover[disabled] {
+  background-color: #fdf59a;
+}
+.datepicker table tr td.today:active,
+.datepicker table tr td.today:hover:active,
+.datepicker table tr td.today.disabled:active,
+.datepicker table tr td.today.disabled:hover:active,
+.datepicker table tr td.today.active,
+.datepicker table tr td.today:hover.active,
+.datepicker table tr td.today.disabled.active,
+.datepicker table tr td.today.disabled:hover.active {
+  background-color: #fbf069 \9;
+}
+.datepicker table tr td.today:hover:hover {
+  color: #000;
+}
+.datepicker table tr td.today.active:hover {
+  color: #fff;
+}
+.datepicker table tr td.range,
+.datepicker table tr td.range:hover,
+.datepicker table tr td.range.disabled,
+.datepicker table tr td.range.disabled:hover {
+  background: #eee;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.datepicker table tr td.range.today,
+.datepicker table tr td.range.today:hover,
+.datepicker table tr td.range.today.disabled,
+.datepicker table tr td.range.today.disabled:hover {
+  background-color: #f3d17a;
+  background-image: -moz-linear-gradient(to bottom, #f3c17a, #f3e97a);
+  background-image: -ms-linear-gradient(to bottom, #f3c17a, #f3e97a);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a));
+  background-image: -webkit-linear-gradient(to bottom, #f3c17a, #f3e97a);
+  background-image: -o-linear-gradient(to bottom, #f3c17a, #f3e97a);
+  background-image: linear-gradient(to bottom, #f3c17a, #f3e97a);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0);
+  border-color: #f3e97a #f3e97a #edde34;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.datepicker table tr td.range.today:hover,
+.datepicker table tr td.range.today:hover:hover,
+.datepicker table tr td.range.today.disabled:hover,
+.datepicker table tr td.range.today.disabled:hover:hover,
+.datepicker table tr td.range.today:active,
+.datepicker table tr td.range.today:hover:active,
+.datepicker table tr td.range.today.disabled:active,
+.datepicker table tr td.range.today.disabled:hover:active,
+.datepicker table tr td.range.today.active,
+.datepicker table tr td.range.today:hover.active,
+.datepicker table tr td.range.today.disabled.active,
+.datepicker table tr td.range.today.disabled:hover.active,
+.datepicker table tr td.range.today.disabled,
+.datepicker table tr td.range.today:hover.disabled,
+.datepicker table tr td.range.today.disabled.disabled,
+.datepicker table tr td.range.today.disabled:hover.disabled,
+.datepicker table tr td.range.today[disabled],
+.datepicker table tr td.range.today:hover[disabled],
+.datepicker table tr td.range.today.disabled[disabled],
+.datepicker table tr td.range.today.disabled:hover[disabled] {
+  background-color: #f3e97a;
+}
+.datepicker table tr td.range.today:active,
+.datepicker table tr td.range.today:hover:active,
+.datepicker table tr td.range.today.disabled:active,
+.datepicker table tr td.range.today.disabled:hover:active,
+.datepicker table tr td.range.today.active,
+.datepicker table tr td.range.today:hover.active,
+.datepicker table tr td.range.today.disabled.active,
+.datepicker table tr td.range.today.disabled:hover.active {
+  background-color: #efe24b \9;
+}
+.datepicker table tr td.selected,
+.datepicker table tr td.selected:hover,
+.datepicker table tr td.selected.disabled,
+.datepicker table tr td.selected.disabled:hover {
+  background-color: #9e9e9e;
+  background-image: -moz-linear-gradient(to bottom, #b3b3b3, #808080);
+  background-image: -ms-linear-gradient(to bottom, #b3b3b3, #808080);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(#808080));
+  background-image: -webkit-linear-gradient(to bottom, #b3b3b3, #808080);
+  background-image: -o-linear-gradient(to bottom, #b3b3b3, #808080);
+  background-image: linear-gradient(to bottom, #b3b3b3, #808080);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0);
+  border-color: #808080 #808080 #595959;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  color: #fff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker table tr td.selected:hover,
+.datepicker table tr td.selected:hover:hover,
+.datepicker table tr td.selected.disabled:hover,
+.datepicker table tr td.selected.disabled:hover:hover,
+.datepicker table tr td.selected:active,
+.datepicker table tr td.selected:hover:active,
+.datepicker table tr td.selected.disabled:active,
+.datepicker table tr td.selected.disabled:hover:active,
+.datepicker table tr td.selected.active,
+.datepicker table tr td.selected:hover.active,
+.datepicker table tr td.selected.disabled.active,
+.datepicker table tr td.selected.disabled:hover.active,
+.datepicker table tr td.selected.disabled,
+.datepicker table tr td.selected:hover.disabled,
+.datepicker table tr td.selected.disabled.disabled,
+.datepicker table tr td.selected.disabled:hover.disabled,
+.datepicker table tr td.selected[disabled],
+.datepicker table tr td.selected:hover[disabled],
+.datepicker table tr td.selected.disabled[disabled],
+.datepicker table tr td.selected.disabled:hover[disabled] {
+  background-color: #808080;
+}
+.datepicker table tr td.selected:active,
+.datepicker table tr td.selected:hover:active,
+.datepicker table tr td.selected.disabled:active,
+.datepicker table tr td.selected.disabled:hover:active,
+.datepicker table tr td.selected.active,
+.datepicker table tr td.selected:hover.active,
+.datepicker table tr td.selected.disabled.active,
+.datepicker table tr td.selected.disabled:hover.active {
+  background-color: #666666 \9;
+}
+.datepicker table tr td.active,
+.datepicker table tr td.active:hover,
+.datepicker table tr td.active.disabled,
+.datepicker table tr td.active.disabled:hover {
+  background-color: #006dcc;
+  background-image: -moz-linear-gradient(to bottom, #08c, #0044cc);
+  background-image: -ms-linear-gradient(to bottom, #08c, #0044cc);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#0044cc));
+  background-image: -webkit-linear-gradient(to bottom, #08c, #0044cc);
+  background-image: -o-linear-gradient(to bottom, #08c, #0044cc);
+  background-image: linear-gradient(to bottom, #08c, #0044cc);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#08c', endColorstr='#0044cc', GradientType=0);
+  border-color: #0044cc #0044cc #002a80;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  color: #fff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker table tr td.active:hover,
+.datepicker table tr td.active:hover:hover,
+.datepicker table tr td.active.disabled:hover,
+.datepicker table tr td.active.disabled:hover:hover,
+.datepicker table tr td.active:active,
+.datepicker table tr td.active:hover:active,
+.datepicker table tr td.active.disabled:active,
+.datepicker table tr td.active.disabled:hover:active,
+.datepicker table tr td.active.active,
+.datepicker table tr td.active:hover.active,
+.datepicker table tr td.active.disabled.active,
+.datepicker table tr td.active.disabled:hover.active,
+.datepicker table tr td.active.disabled,
+.datepicker table tr td.active:hover.disabled,
+.datepicker table tr td.active.disabled.disabled,
+.datepicker table tr td.active.disabled:hover.disabled,
+.datepicker table tr td.active[disabled],
+.datepicker table tr td.active:hover[disabled],
+.datepicker table tr td.active.disabled[disabled],
+.datepicker table tr td.active.disabled:hover[disabled] {
+  background-color: #0044cc;
+}
+.datepicker table tr td.active:active,
+.datepicker table tr td.active:hover:active,
+.datepicker table tr td.active.disabled:active,
+.datepicker table tr td.active.disabled:hover:active,
+.datepicker table tr td.active.active,
+.datepicker table tr td.active:hover.active,
+.datepicker table tr td.active.disabled.active,
+.datepicker table tr td.active.disabled:hover.active {
+  background-color: #003399 \9;
+}
+.datepicker table tr td span {
+  display: block;
+  width: 23%;
+  height: 54px;
+  line-height: 54px;
+  float: left;
+  margin: 1%;
+  cursor: pointer;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.datepicker table tr td span:hover,
+.datepicker table tr td span.focused {
+  background: #eee;
+}
+.datepicker table tr td span.disabled,
+.datepicker table tr td span.disabled:hover {
+  background: none;
+  color: #999;
+  cursor: default;
+}
+.datepicker table tr td span.active,
+.datepicker table tr td span.active:hover,
+.datepicker table tr td span.active.disabled,
+.datepicker table tr td span.active.disabled:hover {
+  background-color: #006dcc;
+  background-image: -moz-linear-gradient(to bottom, #08c, #0044cc);
+  background-image: -ms-linear-gradient(to bottom, #08c, #0044cc);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#0044cc));
+  background-image: -webkit-linear-gradient(to bottom, #08c, #0044cc);
+  background-image: -o-linear-gradient(to bottom, #08c, #0044cc);
+  background-image: linear-gradient(to bottom, #08c, #0044cc);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#08c', endColorstr='#0044cc', GradientType=0);
+  border-color: #0044cc #0044cc #002a80;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  color: #fff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker table tr td span.active:hover,
+.datepicker table tr td span.active:hover:hover,
+.datepicker table tr td span.active.disabled:hover,
+.datepicker table tr td span.active.disabled:hover:hover,
+.datepicker table tr td span.active:active,
+.datepicker table tr td span.active:hover:active,
+.datepicker table tr td span.active.disabled:active,
+.datepicker table tr td span.active.disabled:hover:active,
+.datepicker table tr td span.active.active,
+.datepicker table tr td span.active:hover.active,
+.datepicker table tr td span.active.disabled.active,
+.datepicker table tr td span.active.disabled:hover.active,
+.datepicker table tr td span.active.disabled,
+.datepicker table tr td span.active:hover.disabled,
+.datepicker table tr td span.active.disabled.disabled,
+.datepicker table tr td span.active.disabled:hover.disabled,
+.datepicker table tr td span.active[disabled],
+.datepicker table tr td span.active:hover[disabled],
+.datepicker table tr td span.active.disabled[disabled],
+.datepicker table tr td span.active.disabled:hover[disabled] {
+  background-color: #0044cc;
+}
+.datepicker table tr td span.active:active,
+.datepicker table tr td span.active:hover:active,
+.datepicker table tr td span.active.disabled:active,
+.datepicker table tr td span.active.disabled:hover:active,
+.datepicker table tr td span.active.active,
+.datepicker table tr td span.active:hover.active,
+.datepicker table tr td span.active.disabled.active,
+.datepicker table tr td span.active.disabled:hover.active {
+  background-color: #003399 \9;
+}
+.datepicker table tr td span.old,
+.datepicker table tr td span.new {
+  color: #999;
+}
+.datepicker .datepicker-switch {
+  width: 145px;
+}
+.datepicker .datepicker-switch,
+.datepicker .prev,
+.datepicker .next,
+.datepicker tfoot tr th {
+  cursor: pointer;
+}
+.datepicker .datepicker-switch:hover,
+.datepicker .prev:hover,
+.datepicker .next:hover,
+.datepicker tfoot tr th:hover {
+  background: #eee;
+}
+.datepicker .prev.disabled,
+.datepicker .next.disabled {
+  visibility: hidden;
+}
+.datepicker .cw {
+  font-size: 10px;
+  width: 12px;
+  padding: 0 2px 0 5px;
+  vertical-align: middle;
+}
+.input-append.date .add-on,
+.input-prepend.date .add-on {
+  cursor: pointer;
+}
+.input-append.date .add-on i,
+.input-prepend.date .add-on i {
+  margin-top: 3px;
+}
+.input-daterange input {
+  text-align: center;
+}
+.input-daterange input:first-child {
+  -webkit-border-radius: 3px 0 0 3px;
+  -moz-border-radius: 3px 0 0 3px;
+  border-radius: 3px 0 0 3px;
+}
+.input-daterange input:last-child {
+  -webkit-border-radius: 0 3px 3px 0;
+  -moz-border-radius: 0 3px 3px 0;
+  border-radius: 0 3px 3px 0;
+}
+.input-daterange .add-on {
+  display: inline-block;
+  width: auto;
+  min-width: 16px;
+  height: 18px;
+  padding: 4px 5px;
+  font-weight: normal;
+  line-height: 18px;
+  text-align: center;
+  text-shadow: 0 1px 0 #fff;
+  vertical-align: middle;
+  background-color: #eee;
+  border: 1px solid #ccc;
+  margin-left: -5px;
+  margin-right: -5px;
+}
+/*# sourceMappingURL=bootstrap-datepicker.css.map */

File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/css/datepicker/bootstrap-datepicker.css.map


File diff suppressed because it is too large
+ 6 - 0
src/main/resources/static/css/datepicker/bootstrap-datepicker.min.css


+ 510 - 0
src/main/resources/static/css/datepicker/bootstrap-datepicker.standalone.css

@@ -0,0 +1,510 @@
+/*!
+ * Datepicker for Bootstrap v1.9.0 (https://github.com/uxsolutions/bootstrap-datepicker)
+ *
+ * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ */
+
+.datepicker {
+  padding: 4px;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  direction: ltr;
+}
+.datepicker-inline {
+  width: 220px;
+}
+.datepicker-rtl {
+  direction: rtl;
+}
+.datepicker-rtl.dropdown-menu {
+  left: auto;
+}
+.datepicker-rtl table tr td span {
+  float: right;
+}
+.datepicker-dropdown {
+  top: 0;
+  left: 0;
+}
+.datepicker-dropdown:before {
+  content: '';
+  display: inline-block;
+  border-left: 7px solid transparent;
+  border-right: 7px solid transparent;
+  border-bottom: 7px solid #999;
+  border-top: 0;
+  border-bottom-color: rgba(0, 0, 0, 0.2);
+  position: absolute;
+}
+.datepicker-dropdown:after {
+  content: '';
+  display: inline-block;
+  border-left: 6px solid transparent;
+  border-right: 6px solid transparent;
+  border-bottom: 6px solid #fff;
+  border-top: 0;
+  position: absolute;
+}
+.datepicker-dropdown.datepicker-orient-left:before {
+  left: 6px;
+}
+.datepicker-dropdown.datepicker-orient-left:after {
+  left: 7px;
+}
+.datepicker-dropdown.datepicker-orient-right:before {
+  right: 6px;
+}
+.datepicker-dropdown.datepicker-orient-right:after {
+  right: 7px;
+}
+.datepicker-dropdown.datepicker-orient-bottom:before {
+  top: -7px;
+}
+.datepicker-dropdown.datepicker-orient-bottom:after {
+  top: -6px;
+}
+.datepicker-dropdown.datepicker-orient-top:before {
+  bottom: -7px;
+  border-bottom: 0;
+  border-top: 7px solid #999;
+}
+.datepicker-dropdown.datepicker-orient-top:after {
+  bottom: -6px;
+  border-bottom: 0;
+  border-top: 6px solid #fff;
+}
+.datepicker table {
+  margin: 0;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -khtml-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.datepicker td,
+.datepicker th {
+  text-align: center;
+  width: 20px;
+  height: 20px;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  border: none;
+}
+.table-striped .datepicker table tr td,
+.table-striped .datepicker table tr th {
+  background-color: transparent;
+}
+.datepicker table tr td.day:hover,
+.datepicker table tr td.day.focused {
+  background: #eee;
+  cursor: pointer;
+}
+.datepicker table tr td.old,
+.datepicker table tr td.new {
+  color: #999;
+}
+.datepicker table tr td.disabled,
+.datepicker table tr td.disabled:hover {
+  background: none;
+  color: #999;
+  cursor: default;
+}
+.datepicker table tr td.highlighted {
+  background: #d9edf7;
+  border-radius: 0;
+}
+.datepicker table tr td.today,
+.datepicker table tr td.today:hover,
+.datepicker table tr td.today.disabled,
+.datepicker table tr td.today.disabled:hover {
+  background-color: #fde19a;
+  background-image: -moz-linear-gradient(to bottom, #fdd49a, #fdf59a);
+  background-image: -ms-linear-gradient(to bottom, #fdd49a, #fdf59a);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a));
+  background-image: -webkit-linear-gradient(to bottom, #fdd49a, #fdf59a);
+  background-image: -o-linear-gradient(to bottom, #fdd49a, #fdf59a);
+  background-image: linear-gradient(to bottom, #fdd49a, #fdf59a);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);
+  border-color: #fdf59a #fdf59a #fbed50;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  color: #000;
+}
+.datepicker table tr td.today:hover,
+.datepicker table tr td.today:hover:hover,
+.datepicker table tr td.today.disabled:hover,
+.datepicker table tr td.today.disabled:hover:hover,
+.datepicker table tr td.today:active,
+.datepicker table tr td.today:hover:active,
+.datepicker table tr td.today.disabled:active,
+.datepicker table tr td.today.disabled:hover:active,
+.datepicker table tr td.today.active,
+.datepicker table tr td.today:hover.active,
+.datepicker table tr td.today.disabled.active,
+.datepicker table tr td.today.disabled:hover.active,
+.datepicker table tr td.today.disabled,
+.datepicker table tr td.today:hover.disabled,
+.datepicker table tr td.today.disabled.disabled,
+.datepicker table tr td.today.disabled:hover.disabled,
+.datepicker table tr td.today[disabled],
+.datepicker table tr td.today:hover[disabled],
+.datepicker table tr td.today.disabled[disabled],
+.datepicker table tr td.today.disabled:hover[disabled] {
+  background-color: #fdf59a;
+}
+.datepicker table tr td.today:active,
+.datepicker table tr td.today:hover:active,
+.datepicker table tr td.today.disabled:active,
+.datepicker table tr td.today.disabled:hover:active,
+.datepicker table tr td.today.active,
+.datepicker table tr td.today:hover.active,
+.datepicker table tr td.today.disabled.active,
+.datepicker table tr td.today.disabled:hover.active {
+  background-color: #fbf069 \9;
+}
+.datepicker table tr td.today:hover:hover {
+  color: #000;
+}
+.datepicker table tr td.today.active:hover {
+  color: #fff;
+}
+.datepicker table tr td.range,
+.datepicker table tr td.range:hover,
+.datepicker table tr td.range.disabled,
+.datepicker table tr td.range.disabled:hover {
+  background: #eee;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.datepicker table tr td.range.today,
+.datepicker table tr td.range.today:hover,
+.datepicker table tr td.range.today.disabled,
+.datepicker table tr td.range.today.disabled:hover {
+  background-color: #f3d17a;
+  background-image: -moz-linear-gradient(to bottom, #f3c17a, #f3e97a);
+  background-image: -ms-linear-gradient(to bottom, #f3c17a, #f3e97a);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a));
+  background-image: -webkit-linear-gradient(to bottom, #f3c17a, #f3e97a);
+  background-image: -o-linear-gradient(to bottom, #f3c17a, #f3e97a);
+  background-image: linear-gradient(to bottom, #f3c17a, #f3e97a);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0);
+  border-color: #f3e97a #f3e97a #edde34;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.datepicker table tr td.range.today:hover,
+.datepicker table tr td.range.today:hover:hover,
+.datepicker table tr td.range.today.disabled:hover,
+.datepicker table tr td.range.today.disabled:hover:hover,
+.datepicker table tr td.range.today:active,
+.datepicker table tr td.range.today:hover:active,
+.datepicker table tr td.range.today.disabled:active,
+.datepicker table tr td.range.today.disabled:hover:active,
+.datepicker table tr td.range.today.active,
+.datepicker table tr td.range.today:hover.active,
+.datepicker table tr td.range.today.disabled.active,
+.datepicker table tr td.range.today.disabled:hover.active,
+.datepicker table tr td.range.today.disabled,
+.datepicker table tr td.range.today:hover.disabled,
+.datepicker table tr td.range.today.disabled.disabled,
+.datepicker table tr td.range.today.disabled:hover.disabled,
+.datepicker table tr td.range.today[disabled],
+.datepicker table tr td.range.today:hover[disabled],
+.datepicker table tr td.range.today.disabled[disabled],
+.datepicker table tr td.range.today.disabled:hover[disabled] {
+  background-color: #f3e97a;
+}
+.datepicker table tr td.range.today:active,
+.datepicker table tr td.range.today:hover:active,
+.datepicker table tr td.range.today.disabled:active,
+.datepicker table tr td.range.today.disabled:hover:active,
+.datepicker table tr td.range.today.active,
+.datepicker table tr td.range.today:hover.active,
+.datepicker table tr td.range.today.disabled.active,
+.datepicker table tr td.range.today.disabled:hover.active {
+  background-color: #efe24b \9;
+}
+.datepicker table tr td.selected,
+.datepicker table tr td.selected:hover,
+.datepicker table tr td.selected.disabled,
+.datepicker table tr td.selected.disabled:hover {
+  background-color: #9e9e9e;
+  background-image: -moz-linear-gradient(to bottom, #b3b3b3, #808080);
+  background-image: -ms-linear-gradient(to bottom, #b3b3b3, #808080);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(#808080));
+  background-image: -webkit-linear-gradient(to bottom, #b3b3b3, #808080);
+  background-image: -o-linear-gradient(to bottom, #b3b3b3, #808080);
+  background-image: linear-gradient(to bottom, #b3b3b3, #808080);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0);
+  border-color: #808080 #808080 #595959;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  color: #fff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker table tr td.selected:hover,
+.datepicker table tr td.selected:hover:hover,
+.datepicker table tr td.selected.disabled:hover,
+.datepicker table tr td.selected.disabled:hover:hover,
+.datepicker table tr td.selected:active,
+.datepicker table tr td.selected:hover:active,
+.datepicker table tr td.selected.disabled:active,
+.datepicker table tr td.selected.disabled:hover:active,
+.datepicker table tr td.selected.active,
+.datepicker table tr td.selected:hover.active,
+.datepicker table tr td.selected.disabled.active,
+.datepicker table tr td.selected.disabled:hover.active,
+.datepicker table tr td.selected.disabled,
+.datepicker table tr td.selected:hover.disabled,
+.datepicker table tr td.selected.disabled.disabled,
+.datepicker table tr td.selected.disabled:hover.disabled,
+.datepicker table tr td.selected[disabled],
+.datepicker table tr td.selected:hover[disabled],
+.datepicker table tr td.selected.disabled[disabled],
+.datepicker table tr td.selected.disabled:hover[disabled] {
+  background-color: #808080;
+}
+.datepicker table tr td.selected:active,
+.datepicker table tr td.selected:hover:active,
+.datepicker table tr td.selected.disabled:active,
+.datepicker table tr td.selected.disabled:hover:active,
+.datepicker table tr td.selected.active,
+.datepicker table tr td.selected:hover.active,
+.datepicker table tr td.selected.disabled.active,
+.datepicker table tr td.selected.disabled:hover.active {
+  background-color: #666666 \9;
+}
+.datepicker table tr td.active,
+.datepicker table tr td.active:hover,
+.datepicker table tr td.active.disabled,
+.datepicker table tr td.active.disabled:hover {
+  background-color: #006dcc;
+  background-image: -moz-linear-gradient(to bottom, #08c, #0044cc);
+  background-image: -ms-linear-gradient(to bottom, #08c, #0044cc);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#0044cc));
+  background-image: -webkit-linear-gradient(to bottom, #08c, #0044cc);
+  background-image: -o-linear-gradient(to bottom, #08c, #0044cc);
+  background-image: linear-gradient(to bottom, #08c, #0044cc);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#08c', endColorstr='#0044cc', GradientType=0);
+  border-color: #0044cc #0044cc #002a80;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  color: #fff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker table tr td.active:hover,
+.datepicker table tr td.active:hover:hover,
+.datepicker table tr td.active.disabled:hover,
+.datepicker table tr td.active.disabled:hover:hover,
+.datepicker table tr td.active:active,
+.datepicker table tr td.active:hover:active,
+.datepicker table tr td.active.disabled:active,
+.datepicker table tr td.active.disabled:hover:active,
+.datepicker table tr td.active.active,
+.datepicker table tr td.active:hover.active,
+.datepicker table tr td.active.disabled.active,
+.datepicker table tr td.active.disabled:hover.active,
+.datepicker table tr td.active.disabled,
+.datepicker table tr td.active:hover.disabled,
+.datepicker table tr td.active.disabled.disabled,
+.datepicker table tr td.active.disabled:hover.disabled,
+.datepicker table tr td.active[disabled],
+.datepicker table tr td.active:hover[disabled],
+.datepicker table tr td.active.disabled[disabled],
+.datepicker table tr td.active.disabled:hover[disabled] {
+  background-color: #0044cc;
+}
+.datepicker table tr td.active:active,
+.datepicker table tr td.active:hover:active,
+.datepicker table tr td.active.disabled:active,
+.datepicker table tr td.active.disabled:hover:active,
+.datepicker table tr td.active.active,
+.datepicker table tr td.active:hover.active,
+.datepicker table tr td.active.disabled.active,
+.datepicker table tr td.active.disabled:hover.active {
+  background-color: #003399 \9;
+}
+.datepicker table tr td span {
+  display: block;
+  width: 23%;
+  height: 54px;
+  line-height: 54px;
+  float: left;
+  margin: 1%;
+  cursor: pointer;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.datepicker table tr td span:hover,
+.datepicker table tr td span.focused {
+  background: #eee;
+}
+.datepicker table tr td span.disabled,
+.datepicker table tr td span.disabled:hover {
+  background: none;
+  color: #999;
+  cursor: default;
+}
+.datepicker table tr td span.active,
+.datepicker table tr td span.active:hover,
+.datepicker table tr td span.active.disabled,
+.datepicker table tr td span.active.disabled:hover {
+  background-color: #006dcc;
+  background-image: -moz-linear-gradient(to bottom, #08c, #0044cc);
+  background-image: -ms-linear-gradient(to bottom, #08c, #0044cc);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#0044cc));
+  background-image: -webkit-linear-gradient(to bottom, #08c, #0044cc);
+  background-image: -o-linear-gradient(to bottom, #08c, #0044cc);
+  background-image: linear-gradient(to bottom, #08c, #0044cc);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#08c', endColorstr='#0044cc', GradientType=0);
+  border-color: #0044cc #0044cc #002a80;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  color: #fff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker table tr td span.active:hover,
+.datepicker table tr td span.active:hover:hover,
+.datepicker table tr td span.active.disabled:hover,
+.datepicker table tr td span.active.disabled:hover:hover,
+.datepicker table tr td span.active:active,
+.datepicker table tr td span.active:hover:active,
+.datepicker table tr td span.active.disabled:active,
+.datepicker table tr td span.active.disabled:hover:active,
+.datepicker table tr td span.active.active,
+.datepicker table tr td span.active:hover.active,
+.datepicker table tr td span.active.disabled.active,
+.datepicker table tr td span.active.disabled:hover.active,
+.datepicker table tr td span.active.disabled,
+.datepicker table tr td span.active:hover.disabled,
+.datepicker table tr td span.active.disabled.disabled,
+.datepicker table tr td span.active.disabled:hover.disabled,
+.datepicker table tr td span.active[disabled],
+.datepicker table tr td span.active:hover[disabled],
+.datepicker table tr td span.active.disabled[disabled],
+.datepicker table tr td span.active.disabled:hover[disabled] {
+  background-color: #0044cc;
+}
+.datepicker table tr td span.active:active,
+.datepicker table tr td span.active:hover:active,
+.datepicker table tr td span.active.disabled:active,
+.datepicker table tr td span.active.disabled:hover:active,
+.datepicker table tr td span.active.active,
+.datepicker table tr td span.active:hover.active,
+.datepicker table tr td span.active.disabled.active,
+.datepicker table tr td span.active.disabled:hover.active {
+  background-color: #003399 \9;
+}
+.datepicker table tr td span.old,
+.datepicker table tr td span.new {
+  color: #999;
+}
+.datepicker .datepicker-switch {
+  width: 145px;
+}
+.datepicker .datepicker-switch,
+.datepicker .prev,
+.datepicker .next,
+.datepicker tfoot tr th {
+  cursor: pointer;
+}
+.datepicker .datepicker-switch:hover,
+.datepicker .prev:hover,
+.datepicker .next:hover,
+.datepicker tfoot tr th:hover {
+  background: #eee;
+}
+.datepicker .prev.disabled,
+.datepicker .next.disabled {
+  visibility: hidden;
+}
+.datepicker .cw {
+  font-size: 10px;
+  width: 12px;
+  padding: 0 2px 0 5px;
+  vertical-align: middle;
+}
+.input-append.date .add-on,
+.input-prepend.date .add-on {
+  cursor: pointer;
+}
+.input-append.date .add-on i,
+.input-prepend.date .add-on i {
+  margin-top: 3px;
+}
+.input-daterange input {
+  text-align: center;
+}
+.input-daterange input:first-child {
+  -webkit-border-radius: 3px 0 0 3px;
+  -moz-border-radius: 3px 0 0 3px;
+  border-radius: 3px 0 0 3px;
+}
+.input-daterange input:last-child {
+  -webkit-border-radius: 0 3px 3px 0;
+  -moz-border-radius: 0 3px 3px 0;
+  border-radius: 0 3px 3px 0;
+}
+.input-daterange .add-on {
+  display: inline-block;
+  width: auto;
+  min-width: 16px;
+  height: 20px;
+  padding: 4px 5px;
+  font-weight: normal;
+  line-height: 20px;
+  text-align: center;
+  text-shadow: 0 1px 0 #fff;
+  vertical-align: middle;
+  background-color: #eee;
+  border: 1px solid #ccc;
+  margin-left: -5px;
+  margin-right: -5px;
+}
+.datepicker.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: 1000;
+  float: left;
+  display: none;
+  min-width: 160px;
+  list-style: none;
+  background-color: #fff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -webkit-background-clip: padding-box;
+  -moz-background-clip: padding;
+  background-clip: padding-box;
+  *border-right-width: 2px;
+  *border-bottom-width: 2px;
+  color: #333333;
+  font-size: 13px;
+  line-height: 20px;
+}
+.datepicker.dropdown-menu th,
+.datepicker.datepicker-inline th,
+.datepicker.dropdown-menu td,
+.datepicker.datepicker-inline td {
+  padding: 4px 5px;
+}
+/*# sourceMappingURL=bootstrap-datepicker.standalone.css.map */

File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/css/datepicker/bootstrap-datepicker.standalone.css.map


File diff suppressed because it is too large
+ 6 - 0
src/main/resources/static/css/datepicker/bootstrap-datepicker.standalone.min.css


+ 683 - 0
src/main/resources/static/css/datepicker/bootstrap-datepicker3.css

@@ -0,0 +1,683 @@
+/*!
+ * Datepicker for Bootstrap v1.9.0 (https://github.com/uxsolutions/bootstrap-datepicker)
+ *
+ * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ */
+
+.datepicker {
+  border-radius: 4px;
+  direction: ltr;
+}
+.datepicker-inline {
+  width: 220px;
+}
+.datepicker-rtl {
+  direction: rtl;
+}
+.datepicker-rtl.dropdown-menu {
+  left: auto;
+}
+.datepicker-rtl table tr td span {
+  float: right;
+}
+.datepicker-dropdown {
+  top: 0;
+  left: 0;
+  padding: 4px;
+}
+.datepicker-dropdown:before {
+  content: '';
+  display: inline-block;
+  border-left: 7px solid transparent;
+  border-right: 7px solid transparent;
+  border-bottom: 7px solid rgba(0, 0, 0, 0.15);
+  border-top: 0;
+  border-bottom-color: rgba(0, 0, 0, 0.2);
+  position: absolute;
+}
+.datepicker-dropdown:after {
+  content: '';
+  display: inline-block;
+  border-left: 6px solid transparent;
+  border-right: 6px solid transparent;
+  border-bottom: 6px solid #fff;
+  border-top: 0;
+  position: absolute;
+}
+.datepicker-dropdown.datepicker-orient-left:before {
+  left: 6px;
+}
+.datepicker-dropdown.datepicker-orient-left:after {
+  left: 7px;
+}
+.datepicker-dropdown.datepicker-orient-right:before {
+  right: 6px;
+}
+.datepicker-dropdown.datepicker-orient-right:after {
+  right: 7px;
+}
+.datepicker-dropdown.datepicker-orient-bottom:before {
+  top: -7px;
+}
+.datepicker-dropdown.datepicker-orient-bottom:after {
+  top: -6px;
+}
+.datepicker-dropdown.datepicker-orient-top:before {
+  bottom: -7px;
+  border-bottom: 0;
+  border-top: 7px solid rgba(0, 0, 0, 0.15);
+}
+.datepicker-dropdown.datepicker-orient-top:after {
+  bottom: -6px;
+  border-bottom: 0;
+  border-top: 6px solid #fff;
+}
+.datepicker table {
+  margin: 0;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -khtml-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.datepicker table tr td,
+.datepicker table tr th {
+  text-align: center;
+  width: 30px;
+  height: 30px;
+  border-radius: 4px;
+  border: none;
+}
+.table-striped .datepicker table tr td,
+.table-striped .datepicker table tr th {
+  background-color: transparent;
+}
+.datepicker table tr td.old,
+.datepicker table tr td.new {
+  color: #777777;
+}
+.datepicker table tr td.day:hover,
+.datepicker table tr td.focused {
+  background: #eeeeee;
+  cursor: pointer;
+}
+.datepicker table tr td.disabled,
+.datepicker table tr td.disabled:hover {
+  background: none;
+  color: #777777;
+  cursor: default;
+}
+.datepicker table tr td.highlighted {
+  color: #000;
+  background-color: #d9edf7;
+  border-color: #85c5e5;
+  border-radius: 0;
+}
+.datepicker table tr td.highlighted:focus,
+.datepicker table tr td.highlighted.focus {
+  color: #000;
+  background-color: #afd9ee;
+  border-color: #298fc2;
+}
+.datepicker table tr td.highlighted:hover {
+  color: #000;
+  background-color: #afd9ee;
+  border-color: #52addb;
+}
+.datepicker table tr td.highlighted:active,
+.datepicker table tr td.highlighted.active {
+  color: #000;
+  background-color: #afd9ee;
+  border-color: #52addb;
+}
+.datepicker table tr td.highlighted:active:hover,
+.datepicker table tr td.highlighted.active:hover,
+.datepicker table tr td.highlighted:active:focus,
+.datepicker table tr td.highlighted.active:focus,
+.datepicker table tr td.highlighted:active.focus,
+.datepicker table tr td.highlighted.active.focus {
+  color: #000;
+  background-color: #91cbe8;
+  border-color: #298fc2;
+}
+.datepicker table tr td.highlighted.disabled:hover,
+.datepicker table tr td.highlighted[disabled]:hover,
+fieldset[disabled] .datepicker table tr td.highlighted:hover,
+.datepicker table tr td.highlighted.disabled:focus,
+.datepicker table tr td.highlighted[disabled]:focus,
+fieldset[disabled] .datepicker table tr td.highlighted:focus,
+.datepicker table tr td.highlighted.disabled.focus,
+.datepicker table tr td.highlighted[disabled].focus,
+fieldset[disabled] .datepicker table tr td.highlighted.focus {
+  background-color: #d9edf7;
+  border-color: #85c5e5;
+}
+.datepicker table tr td.highlighted.focused {
+  background: #afd9ee;
+}
+.datepicker table tr td.highlighted.disabled,
+.datepicker table tr td.highlighted.disabled:active {
+  background: #d9edf7;
+  color: #777777;
+}
+.datepicker table tr td.today {
+  color: #000;
+  background-color: #ffdb99;
+  border-color: #ffb733;
+}
+.datepicker table tr td.today:focus,
+.datepicker table tr td.today.focus {
+  color: #000;
+  background-color: #ffc966;
+  border-color: #b37400;
+}
+.datepicker table tr td.today:hover {
+  color: #000;
+  background-color: #ffc966;
+  border-color: #f59e00;
+}
+.datepicker table tr td.today:active,
+.datepicker table tr td.today.active {
+  color: #000;
+  background-color: #ffc966;
+  border-color: #f59e00;
+}
+.datepicker table tr td.today:active:hover,
+.datepicker table tr td.today.active:hover,
+.datepicker table tr td.today:active:focus,
+.datepicker table tr td.today.active:focus,
+.datepicker table tr td.today:active.focus,
+.datepicker table tr td.today.active.focus {
+  color: #000;
+  background-color: #ffbc42;
+  border-color: #b37400;
+}
+.datepicker table tr td.today.disabled:hover,
+.datepicker table tr td.today[disabled]:hover,
+fieldset[disabled] .datepicker table tr td.today:hover,
+.datepicker table tr td.today.disabled:focus,
+.datepicker table tr td.today[disabled]:focus,
+fieldset[disabled] .datepicker table tr td.today:focus,
+.datepicker table tr td.today.disabled.focus,
+.datepicker table tr td.today[disabled].focus,
+fieldset[disabled] .datepicker table tr td.today.focus {
+  background-color: #ffdb99;
+  border-color: #ffb733;
+}
+.datepicker table tr td.today.focused {
+  background: #ffc966;
+}
+.datepicker table tr td.today.disabled,
+.datepicker table tr td.today.disabled:active {
+  background: #ffdb99;
+  color: #777777;
+}
+.datepicker table tr td.range {
+  color: #000;
+  background-color: #eeeeee;
+  border-color: #bbbbbb;
+  border-radius: 0;
+}
+.datepicker table tr td.range:focus,
+.datepicker table tr td.range.focus {
+  color: #000;
+  background-color: #d5d5d5;
+  border-color: #7c7c7c;
+}
+.datepicker table tr td.range:hover {
+  color: #000;
+  background-color: #d5d5d5;
+  border-color: #9d9d9d;
+}
+.datepicker table tr td.range:active,
+.datepicker table tr td.range.active {
+  color: #000;
+  background-color: #d5d5d5;
+  border-color: #9d9d9d;
+}
+.datepicker table tr td.range:active:hover,
+.datepicker table tr td.range.active:hover,
+.datepicker table tr td.range:active:focus,
+.datepicker table tr td.range.active:focus,
+.datepicker table tr td.range:active.focus,
+.datepicker table tr td.range.active.focus {
+  color: #000;
+  background-color: #c3c3c3;
+  border-color: #7c7c7c;
+}
+.datepicker table tr td.range.disabled:hover,
+.datepicker table tr td.range[disabled]:hover,
+fieldset[disabled] .datepicker table tr td.range:hover,
+.datepicker table tr td.range.disabled:focus,
+.datepicker table tr td.range[disabled]:focus,
+fieldset[disabled] .datepicker table tr td.range:focus,
+.datepicker table tr td.range.disabled.focus,
+.datepicker table tr td.range[disabled].focus,
+fieldset[disabled] .datepicker table tr td.range.focus {
+  background-color: #eeeeee;
+  border-color: #bbbbbb;
+}
+.datepicker table tr td.range.focused {
+  background: #d5d5d5;
+}
+.datepicker table tr td.range.disabled,
+.datepicker table tr td.range.disabled:active {
+  background: #eeeeee;
+  color: #777777;
+}
+.datepicker table tr td.range.highlighted {
+  color: #000;
+  background-color: #e4eef3;
+  border-color: #9dc1d3;
+}
+.datepicker table tr td.range.highlighted:focus,
+.datepicker table tr td.range.highlighted.focus {
+  color: #000;
+  background-color: #c1d7e3;
+  border-color: #4b88a6;
+}
+.datepicker table tr td.range.highlighted:hover {
+  color: #000;
+  background-color: #c1d7e3;
+  border-color: #73a6c0;
+}
+.datepicker table tr td.range.highlighted:active,
+.datepicker table tr td.range.highlighted.active {
+  color: #000;
+  background-color: #c1d7e3;
+  border-color: #73a6c0;
+}
+.datepicker table tr td.range.highlighted:active:hover,
+.datepicker table tr td.range.highlighted.active:hover,
+.datepicker table tr td.range.highlighted:active:focus,
+.datepicker table tr td.range.highlighted.active:focus,
+.datepicker table tr td.range.highlighted:active.focus,
+.datepicker table tr td.range.highlighted.active.focus {
+  color: #000;
+  background-color: #a8c8d8;
+  border-color: #4b88a6;
+}
+.datepicker table tr td.range.highlighted.disabled:hover,
+.datepicker table tr td.range.highlighted[disabled]:hover,
+fieldset[disabled] .datepicker table tr td.range.highlighted:hover,
+.datepicker table tr td.range.highlighted.disabled:focus,
+.datepicker table tr td.range.highlighted[disabled]:focus,
+fieldset[disabled] .datepicker table tr td.range.highlighted:focus,
+.datepicker table tr td.range.highlighted.disabled.focus,
+.datepicker table tr td.range.highlighted[disabled].focus,
+fieldset[disabled] .datepicker table tr td.range.highlighted.focus {
+  background-color: #e4eef3;
+  border-color: #9dc1d3;
+}
+.datepicker table tr td.range.highlighted.focused {
+  background: #c1d7e3;
+}
+.datepicker table tr td.range.highlighted.disabled,
+.datepicker table tr td.range.highlighted.disabled:active {
+  background: #e4eef3;
+  color: #777777;
+}
+.datepicker table tr td.range.today {
+  color: #000;
+  background-color: #f7ca77;
+  border-color: #f1a417;
+}
+.datepicker table tr td.range.today:focus,
+.datepicker table tr td.range.today.focus {
+  color: #000;
+  background-color: #f4b747;
+  border-color: #815608;
+}
+.datepicker table tr td.range.today:hover {
+  color: #000;
+  background-color: #f4b747;
+  border-color: #bf800c;
+}
+.datepicker table tr td.range.today:active,
+.datepicker table tr td.range.today.active {
+  color: #000;
+  background-color: #f4b747;
+  border-color: #bf800c;
+}
+.datepicker table tr td.range.today:active:hover,
+.datepicker table tr td.range.today.active:hover,
+.datepicker table tr td.range.today:active:focus,
+.datepicker table tr td.range.today.active:focus,
+.datepicker table tr td.range.today:active.focus,
+.datepicker table tr td.range.today.active.focus {
+  color: #000;
+  background-color: #f2aa25;
+  border-color: #815608;
+}
+.datepicker table tr td.range.today.disabled:hover,
+.datepicker table tr td.range.today[disabled]:hover,
+fieldset[disabled] .datepicker table tr td.range.today:hover,
+.datepicker table tr td.range.today.disabled:focus,
+.datepicker table tr td.range.today[disabled]:focus,
+fieldset[disabled] .datepicker table tr td.range.today:focus,
+.datepicker table tr td.range.today.disabled.focus,
+.datepicker table tr td.range.today[disabled].focus,
+fieldset[disabled] .datepicker table tr td.range.today.focus {
+  background-color: #f7ca77;
+  border-color: #f1a417;
+}
+.datepicker table tr td.range.today.disabled,
+.datepicker table tr td.range.today.disabled:active {
+  background: #f7ca77;
+  color: #777777;
+}
+.datepicker table tr td.selected,
+.datepicker table tr td.selected.highlighted {
+  color: #fff;
+  background-color: #777777;
+  border-color: #555555;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker table tr td.selected:focus,
+.datepicker table tr td.selected.highlighted:focus,
+.datepicker table tr td.selected.focus,
+.datepicker table tr td.selected.highlighted.focus {
+  color: #fff;
+  background-color: #5e5e5e;
+  border-color: #161616;
+}
+.datepicker table tr td.selected:hover,
+.datepicker table tr td.selected.highlighted:hover {
+  color: #fff;
+  background-color: #5e5e5e;
+  border-color: #373737;
+}
+.datepicker table tr td.selected:active,
+.datepicker table tr td.selected.highlighted:active,
+.datepicker table tr td.selected.active,
+.datepicker table tr td.selected.highlighted.active {
+  color: #fff;
+  background-color: #5e5e5e;
+  border-color: #373737;
+}
+.datepicker table tr td.selected:active:hover,
+.datepicker table tr td.selected.highlighted:active:hover,
+.datepicker table tr td.selected.active:hover,
+.datepicker table tr td.selected.highlighted.active:hover,
+.datepicker table tr td.selected:active:focus,
+.datepicker table tr td.selected.highlighted:active:focus,
+.datepicker table tr td.selected.active:focus,
+.datepicker table tr td.selected.highlighted.active:focus,
+.datepicker table tr td.selected:active.focus,
+.datepicker table tr td.selected.highlighted:active.focus,
+.datepicker table tr td.selected.active.focus,
+.datepicker table tr td.selected.highlighted.active.focus {
+  color: #fff;
+  background-color: #4c4c4c;
+  border-color: #161616;
+}
+.datepicker table tr td.selected.disabled:hover,
+.datepicker table tr td.selected.highlighted.disabled:hover,
+.datepicker table tr td.selected[disabled]:hover,
+.datepicker table tr td.selected.highlighted[disabled]:hover,
+fieldset[disabled] .datepicker table tr td.selected:hover,
+fieldset[disabled] .datepicker table tr td.selected.highlighted:hover,
+.datepicker table tr td.selected.disabled:focus,
+.datepicker table tr td.selected.highlighted.disabled:focus,
+.datepicker table tr td.selected[disabled]:focus,
+.datepicker table tr td.selected.highlighted[disabled]:focus,
+fieldset[disabled] .datepicker table tr td.selected:focus,
+fieldset[disabled] .datepicker table tr td.selected.highlighted:focus,
+.datepicker table tr td.selected.disabled.focus,
+.datepicker table tr td.selected.highlighted.disabled.focus,
+.datepicker table tr td.selected[disabled].focus,
+.datepicker table tr td.selected.highlighted[disabled].focus,
+fieldset[disabled] .datepicker table tr td.selected.focus,
+fieldset[disabled] .datepicker table tr td.selected.highlighted.focus {
+  background-color: #777777;
+  border-color: #555555;
+}
+.datepicker table tr td.active,
+.datepicker table tr td.active.highlighted {
+  color: #fff;
+  background-color: #337ab7;
+  border-color: #2e6da4;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker table tr td.active:focus,
+.datepicker table tr td.active.highlighted:focus,
+.datepicker table tr td.active.focus,
+.datepicker table tr td.active.highlighted.focus {
+  color: #fff;
+  background-color: #286090;
+  border-color: #122b40;
+}
+.datepicker table tr td.active:hover,
+.datepicker table tr td.active.highlighted:hover {
+  color: #fff;
+  background-color: #286090;
+  border-color: #204d74;
+}
+.datepicker table tr td.active:active,
+.datepicker table tr td.active.highlighted:active,
+.datepicker table tr td.active.active,
+.datepicker table tr td.active.highlighted.active {
+  color: #fff;
+  background-color: #286090;
+  border-color: #204d74;
+}
+.datepicker table tr td.active:active:hover,
+.datepicker table tr td.active.highlighted:active:hover,
+.datepicker table tr td.active.active:hover,
+.datepicker table tr td.active.highlighted.active:hover,
+.datepicker table tr td.active:active:focus,
+.datepicker table tr td.active.highlighted:active:focus,
+.datepicker table tr td.active.active:focus,
+.datepicker table tr td.active.highlighted.active:focus,
+.datepicker table tr td.active:active.focus,
+.datepicker table tr td.active.highlighted:active.focus,
+.datepicker table tr td.active.active.focus,
+.datepicker table tr td.active.highlighted.active.focus {
+  color: #fff;
+  background-color: #204d74;
+  border-color: #122b40;
+}
+.datepicker table tr td.active.disabled:hover,
+.datepicker table tr td.active.highlighted.disabled:hover,
+.datepicker table tr td.active[disabled]:hover,
+.datepicker table tr td.active.highlighted[disabled]:hover,
+fieldset[disabled] .datepicker table tr td.active:hover,
+fieldset[disabled] .datepicker table tr td.active.highlighted:hover,
+.datepicker table tr td.active.disabled:focus,
+.datepicker table tr td.active.highlighted.disabled:focus,
+.datepicker table tr td.active[disabled]:focus,
+.datepicker table tr td.active.highlighted[disabled]:focus,
+fieldset[disabled] .datepicker table tr td.active:focus,
+fieldset[disabled] .datepicker table tr td.active.highlighted:focus,
+.datepicker table tr td.active.disabled.focus,
+.datepicker table tr td.active.highlighted.disabled.focus,
+.datepicker table tr td.active[disabled].focus,
+.datepicker table tr td.active.highlighted[disabled].focus,
+fieldset[disabled] .datepicker table tr td.active.focus,
+fieldset[disabled] .datepicker table tr td.active.highlighted.focus {
+  background-color: #337ab7;
+  border-color: #2e6da4;
+}
+.datepicker table tr td span {
+  display: block;
+  width: 23%;
+  height: 54px;
+  line-height: 54px;
+  float: left;
+  margin: 1%;
+  cursor: pointer;
+  border-radius: 4px;
+}
+.datepicker table tr td span:hover,
+.datepicker table tr td span.focused {
+  background: #eeeeee;
+}
+.datepicker table tr td span.disabled,
+.datepicker table tr td span.disabled:hover {
+  background: none;
+  color: #777777;
+  cursor: default;
+}
+.datepicker table tr td span.active,
+.datepicker table tr td span.active:hover,
+.datepicker table tr td span.active.disabled,
+.datepicker table tr td span.active.disabled:hover {
+  color: #fff;
+  background-color: #337ab7;
+  border-color: #2e6da4;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker table tr td span.active:focus,
+.datepicker table tr td span.active:hover:focus,
+.datepicker table tr td span.active.disabled:focus,
+.datepicker table tr td span.active.disabled:hover:focus,
+.datepicker table tr td span.active.focus,
+.datepicker table tr td span.active:hover.focus,
+.datepicker table tr td span.active.disabled.focus,
+.datepicker table tr td span.active.disabled:hover.focus {
+  color: #fff;
+  background-color: #286090;
+  border-color: #122b40;
+}
+.datepicker table tr td span.active:hover,
+.datepicker table tr td span.active:hover:hover,
+.datepicker table tr td span.active.disabled:hover,
+.datepicker table tr td span.active.disabled:hover:hover {
+  color: #fff;
+  background-color: #286090;
+  border-color: #204d74;
+}
+.datepicker table tr td span.active:active,
+.datepicker table tr td span.active:hover:active,
+.datepicker table tr td span.active.disabled:active,
+.datepicker table tr td span.active.disabled:hover:active,
+.datepicker table tr td span.active.active,
+.datepicker table tr td span.active:hover.active,
+.datepicker table tr td span.active.disabled.active,
+.datepicker table tr td span.active.disabled:hover.active {
+  color: #fff;
+  background-color: #286090;
+  border-color: #204d74;
+}
+.datepicker table tr td span.active:active:hover,
+.datepicker table tr td span.active:hover:active:hover,
+.datepicker table tr td span.active.disabled:active:hover,
+.datepicker table tr td span.active.disabled:hover:active:hover,
+.datepicker table tr td span.active.active:hover,
+.datepicker table tr td span.active:hover.active:hover,
+.datepicker table tr td span.active.disabled.active:hover,
+.datepicker table tr td span.active.disabled:hover.active:hover,
+.datepicker table tr td span.active:active:focus,
+.datepicker table tr td span.active:hover:active:focus,
+.datepicker table tr td span.active.disabled:active:focus,
+.datepicker table tr td span.active.disabled:hover:active:focus,
+.datepicker table tr td span.active.active:focus,
+.datepicker table tr td span.active:hover.active:focus,
+.datepicker table tr td span.active.disabled.active:focus,
+.datepicker table tr td span.active.disabled:hover.active:focus,
+.datepicker table tr td span.active:active.focus,
+.datepicker table tr td span.active:hover:active.focus,
+.datepicker table tr td span.active.disabled:active.focus,
+.datepicker table tr td span.active.disabled:hover:active.focus,
+.datepicker table tr td span.active.active.focus,
+.datepicker table tr td span.active:hover.active.focus,
+.datepicker table tr td span.active.disabled.active.focus,
+.datepicker table tr td span.active.disabled:hover.active.focus {
+  color: #fff;
+  background-color: #204d74;
+  border-color: #122b40;
+}
+.datepicker table tr td span.active.disabled:hover,
+.datepicker table tr td span.active:hover.disabled:hover,
+.datepicker table tr td span.active.disabled.disabled:hover,
+.datepicker table tr td span.active.disabled:hover.disabled:hover,
+.datepicker table tr td span.active[disabled]:hover,
+.datepicker table tr td span.active:hover[disabled]:hover,
+.datepicker table tr td span.active.disabled[disabled]:hover,
+.datepicker table tr td span.active.disabled:hover[disabled]:hover,
+fieldset[disabled] .datepicker table tr td span.active:hover,
+fieldset[disabled] .datepicker table tr td span.active:hover:hover,
+fieldset[disabled] .datepicker table tr td span.active.disabled:hover,
+fieldset[disabled] .datepicker table tr td span.active.disabled:hover:hover,
+.datepicker table tr td span.active.disabled:focus,
+.datepicker table tr td span.active:hover.disabled:focus,
+.datepicker table tr td span.active.disabled.disabled:focus,
+.datepicker table tr td span.active.disabled:hover.disabled:focus,
+.datepicker table tr td span.active[disabled]:focus,
+.datepicker table tr td span.active:hover[disabled]:focus,
+.datepicker table tr td span.active.disabled[disabled]:focus,
+.datepicker table tr td span.active.disabled:hover[disabled]:focus,
+fieldset[disabled] .datepicker table tr td span.active:focus,
+fieldset[disabled] .datepicker table tr td span.active:hover:focus,
+fieldset[disabled] .datepicker table tr td span.active.disabled:focus,
+fieldset[disabled] .datepicker table tr td span.active.disabled:hover:focus,
+.datepicker table tr td span.active.disabled.focus,
+.datepicker table tr td span.active:hover.disabled.focus,
+.datepicker table tr td span.active.disabled.disabled.focus,
+.datepicker table tr td span.active.disabled:hover.disabled.focus,
+.datepicker table tr td span.active[disabled].focus,
+.datepicker table tr td span.active:hover[disabled].focus,
+.datepicker table tr td span.active.disabled[disabled].focus,
+.datepicker table tr td span.active.disabled:hover[disabled].focus,
+fieldset[disabled] .datepicker table tr td span.active.focus,
+fieldset[disabled] .datepicker table tr td span.active:hover.focus,
+fieldset[disabled] .datepicker table tr td span.active.disabled.focus,
+fieldset[disabled] .datepicker table tr td span.active.disabled:hover.focus {
+  background-color: #337ab7;
+  border-color: #2e6da4;
+}
+.datepicker table tr td span.old,
+.datepicker table tr td span.new {
+  color: #777777;
+}
+.datepicker .datepicker-switch {
+  width: 145px;
+}
+.datepicker .datepicker-switch,
+.datepicker .prev,
+.datepicker .next,
+.datepicker tfoot tr th {
+  cursor: pointer;
+}
+.datepicker .datepicker-switch:hover,
+.datepicker .prev:hover,
+.datepicker .next:hover,
+.datepicker tfoot tr th:hover {
+  background: #eeeeee;
+}
+.datepicker .prev.disabled,
+.datepicker .next.disabled {
+  visibility: hidden;
+}
+.datepicker .cw {
+  font-size: 10px;
+  width: 12px;
+  padding: 0 2px 0 5px;
+  vertical-align: middle;
+}
+.input-group.date .input-group-addon {
+  cursor: pointer;
+}
+.input-daterange {
+  width: 100%;
+}
+.input-daterange input {
+  text-align: center;
+}
+.input-daterange input:first-child {
+  border-radius: 3px 0 0 3px;
+}
+.input-daterange input:last-child {
+  border-radius: 0 3px 3px 0;
+}
+.input-daterange .input-group-addon {
+  width: auto;
+  min-width: 16px;
+  padding: 4px 5px;
+  line-height: 1.42857143;
+  border-width: 1px 0;
+  margin-left: -5px;
+  margin-right: -5px;
+}
+/*# sourceMappingURL=bootstrap-datepicker3.css.map */

File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/css/datepicker/bootstrap-datepicker3.css.map


File diff suppressed because it is too large
+ 6 - 0
src/main/resources/static/css/datepicker/bootstrap-datepicker3.min.css


+ 712 - 0
src/main/resources/static/css/datepicker/bootstrap-datepicker3.standalone.css

@@ -0,0 +1,712 @@
+/*!
+ * Datepicker for Bootstrap v1.9.0 (https://github.com/uxsolutions/bootstrap-datepicker)
+ *
+ * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ */
+
+.datepicker {
+  border-radius: 4px;
+  direction: ltr;
+}
+.datepicker-inline {
+  width: 220px;
+}
+.datepicker-rtl {
+  direction: rtl;
+}
+.datepicker-rtl.dropdown-menu {
+  left: auto;
+}
+.datepicker-rtl table tr td span {
+  float: right;
+}
+.datepicker-dropdown {
+  top: 0;
+  left: 0;
+  padding: 4px;
+}
+.datepicker-dropdown:before {
+  content: '';
+  display: inline-block;
+  border-left: 7px solid transparent;
+  border-right: 7px solid transparent;
+  border-bottom: 7px solid rgba(0, 0, 0, 0.15);
+  border-top: 0;
+  border-bottom-color: rgba(0, 0, 0, 0.2);
+  position: absolute;
+}
+.datepicker-dropdown:after {
+  content: '';
+  display: inline-block;
+  border-left: 6px solid transparent;
+  border-right: 6px solid transparent;
+  border-bottom: 6px solid #fff;
+  border-top: 0;
+  position: absolute;
+}
+.datepicker-dropdown.datepicker-orient-left:before {
+  left: 6px;
+}
+.datepicker-dropdown.datepicker-orient-left:after {
+  left: 7px;
+}
+.datepicker-dropdown.datepicker-orient-right:before {
+  right: 6px;
+}
+.datepicker-dropdown.datepicker-orient-right:after {
+  right: 7px;
+}
+.datepicker-dropdown.datepicker-orient-bottom:before {
+  top: -7px;
+}
+.datepicker-dropdown.datepicker-orient-bottom:after {
+  top: -6px;
+}
+.datepicker-dropdown.datepicker-orient-top:before {
+  bottom: -7px;
+  border-bottom: 0;
+  border-top: 7px solid rgba(0, 0, 0, 0.15);
+}
+.datepicker-dropdown.datepicker-orient-top:after {
+  bottom: -6px;
+  border-bottom: 0;
+  border-top: 6px solid #fff;
+}
+.datepicker table {
+  margin: 0;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -khtml-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.datepicker table tr td,
+.datepicker table tr th {
+  text-align: center;
+  width: 30px;
+  height: 30px;
+  border-radius: 4px;
+  border: none;
+}
+.table-striped .datepicker table tr td,
+.table-striped .datepicker table tr th {
+  background-color: transparent;
+}
+.datepicker table tr td.old,
+.datepicker table tr td.new {
+  color: #777777;
+}
+.datepicker table tr td.day:hover,
+.datepicker table tr td.focused {
+  background: #eeeeee;
+  cursor: pointer;
+}
+.datepicker table tr td.disabled,
+.datepicker table tr td.disabled:hover {
+  background: none;
+  color: #777777;
+  cursor: default;
+}
+.datepicker table tr td.highlighted {
+  color: #000;
+  background-color: #d9edf7;
+  border-color: #85c5e5;
+  border-radius: 0;
+}
+.datepicker table tr td.highlighted:focus,
+.datepicker table tr td.highlighted.focus {
+  color: #000;
+  background-color: #afd9ee;
+  border-color: #298fc2;
+}
+.datepicker table tr td.highlighted:hover {
+  color: #000;
+  background-color: #afd9ee;
+  border-color: #52addb;
+}
+.datepicker table tr td.highlighted:active,
+.datepicker table tr td.highlighted.active {
+  color: #000;
+  background-color: #afd9ee;
+  border-color: #52addb;
+}
+.datepicker table tr td.highlighted:active:hover,
+.datepicker table tr td.highlighted.active:hover,
+.datepicker table tr td.highlighted:active:focus,
+.datepicker table tr td.highlighted.active:focus,
+.datepicker table tr td.highlighted:active.focus,
+.datepicker table tr td.highlighted.active.focus {
+  color: #000;
+  background-color: #91cbe8;
+  border-color: #298fc2;
+}
+.datepicker table tr td.highlighted.disabled:hover,
+.datepicker table tr td.highlighted[disabled]:hover,
+fieldset[disabled] .datepicker table tr td.highlighted:hover,
+.datepicker table tr td.highlighted.disabled:focus,
+.datepicker table tr td.highlighted[disabled]:focus,
+fieldset[disabled] .datepicker table tr td.highlighted:focus,
+.datepicker table tr td.highlighted.disabled.focus,
+.datepicker table tr td.highlighted[disabled].focus,
+fieldset[disabled] .datepicker table tr td.highlighted.focus {
+  background-color: #d9edf7;
+  border-color: #85c5e5;
+}
+.datepicker table tr td.highlighted.focused {
+  background: #afd9ee;
+}
+.datepicker table tr td.highlighted.disabled,
+.datepicker table tr td.highlighted.disabled:active {
+  background: #d9edf7;
+  color: #777777;
+}
+.datepicker table tr td.today {
+  color: #000;
+  background-color: #ffdb99;
+  border-color: #ffb733;
+}
+.datepicker table tr td.today:focus,
+.datepicker table tr td.today.focus {
+  color: #000;
+  background-color: #ffc966;
+  border-color: #b37400;
+}
+.datepicker table tr td.today:hover {
+  color: #000;
+  background-color: #ffc966;
+  border-color: #f59e00;
+}
+.datepicker table tr td.today:active,
+.datepicker table tr td.today.active {
+  color: #000;
+  background-color: #ffc966;
+  border-color: #f59e00;
+}
+.datepicker table tr td.today:active:hover,
+.datepicker table tr td.today.active:hover,
+.datepicker table tr td.today:active:focus,
+.datepicker table tr td.today.active:focus,
+.datepicker table tr td.today:active.focus,
+.datepicker table tr td.today.active.focus {
+  color: #000;
+  background-color: #ffbc42;
+  border-color: #b37400;
+}
+.datepicker table tr td.today.disabled:hover,
+.datepicker table tr td.today[disabled]:hover,
+fieldset[disabled] .datepicker table tr td.today:hover,
+.datepicker table tr td.today.disabled:focus,
+.datepicker table tr td.today[disabled]:focus,
+fieldset[disabled] .datepicker table tr td.today:focus,
+.datepicker table tr td.today.disabled.focus,
+.datepicker table tr td.today[disabled].focus,
+fieldset[disabled] .datepicker table tr td.today.focus {
+  background-color: #ffdb99;
+  border-color: #ffb733;
+}
+.datepicker table tr td.today.focused {
+  background: #ffc966;
+}
+.datepicker table tr td.today.disabled,
+.datepicker table tr td.today.disabled:active {
+  background: #ffdb99;
+  color: #777777;
+}
+.datepicker table tr td.range {
+  color: #000;
+  background-color: #eeeeee;
+  border-color: #bbbbbb;
+  border-radius: 0;
+}
+.datepicker table tr td.range:focus,
+.datepicker table tr td.range.focus {
+  color: #000;
+  background-color: #d5d5d5;
+  border-color: #7c7c7c;
+}
+.datepicker table tr td.range:hover {
+  color: #000;
+  background-color: #d5d5d5;
+  border-color: #9d9d9d;
+}
+.datepicker table tr td.range:active,
+.datepicker table tr td.range.active {
+  color: #000;
+  background-color: #d5d5d5;
+  border-color: #9d9d9d;
+}
+.datepicker table tr td.range:active:hover,
+.datepicker table tr td.range.active:hover,
+.datepicker table tr td.range:active:focus,
+.datepicker table tr td.range.active:focus,
+.datepicker table tr td.range:active.focus,
+.datepicker table tr td.range.active.focus {
+  color: #000;
+  background-color: #c3c3c3;
+  border-color: #7c7c7c;
+}
+.datepicker table tr td.range.disabled:hover,
+.datepicker table tr td.range[disabled]:hover,
+fieldset[disabled] .datepicker table tr td.range:hover,
+.datepicker table tr td.range.disabled:focus,
+.datepicker table tr td.range[disabled]:focus,
+fieldset[disabled] .datepicker table tr td.range:focus,
+.datepicker table tr td.range.disabled.focus,
+.datepicker table tr td.range[disabled].focus,
+fieldset[disabled] .datepicker table tr td.range.focus {
+  background-color: #eeeeee;
+  border-color: #bbbbbb;
+}
+.datepicker table tr td.range.focused {
+  background: #d5d5d5;
+}
+.datepicker table tr td.range.disabled,
+.datepicker table tr td.range.disabled:active {
+  background: #eeeeee;
+  color: #777777;
+}
+.datepicker table tr td.range.highlighted {
+  color: #000;
+  background-color: #e4eef3;
+  border-color: #9dc1d3;
+}
+.datepicker table tr td.range.highlighted:focus,
+.datepicker table tr td.range.highlighted.focus {
+  color: #000;
+  background-color: #c1d7e3;
+  border-color: #4b88a6;
+}
+.datepicker table tr td.range.highlighted:hover {
+  color: #000;
+  background-color: #c1d7e3;
+  border-color: #73a6c0;
+}
+.datepicker table tr td.range.highlighted:active,
+.datepicker table tr td.range.highlighted.active {
+  color: #000;
+  background-color: #c1d7e3;
+  border-color: #73a6c0;
+}
+.datepicker table tr td.range.highlighted:active:hover,
+.datepicker table tr td.range.highlighted.active:hover,
+.datepicker table tr td.range.highlighted:active:focus,
+.datepicker table tr td.range.highlighted.active:focus,
+.datepicker table tr td.range.highlighted:active.focus,
+.datepicker table tr td.range.highlighted.active.focus {
+  color: #000;
+  background-color: #a8c8d8;
+  border-color: #4b88a6;
+}
+.datepicker table tr td.range.highlighted.disabled:hover,
+.datepicker table tr td.range.highlighted[disabled]:hover,
+fieldset[disabled] .datepicker table tr td.range.highlighted:hover,
+.datepicker table tr td.range.highlighted.disabled:focus,
+.datepicker table tr td.range.highlighted[disabled]:focus,
+fieldset[disabled] .datepicker table tr td.range.highlighted:focus,
+.datepicker table tr td.range.highlighted.disabled.focus,
+.datepicker table tr td.range.highlighted[disabled].focus,
+fieldset[disabled] .datepicker table tr td.range.highlighted.focus {
+  background-color: #e4eef3;
+  border-color: #9dc1d3;
+}
+.datepicker table tr td.range.highlighted.focused {
+  background: #c1d7e3;
+}
+.datepicker table tr td.range.highlighted.disabled,
+.datepicker table tr td.range.highlighted.disabled:active {
+  background: #e4eef3;
+  color: #777777;
+}
+.datepicker table tr td.range.today {
+  color: #000;
+  background-color: #f7ca77;
+  border-color: #f1a417;
+}
+.datepicker table tr td.range.today:focus,
+.datepicker table tr td.range.today.focus {
+  color: #000;
+  background-color: #f4b747;
+  border-color: #815608;
+}
+.datepicker table tr td.range.today:hover {
+  color: #000;
+  background-color: #f4b747;
+  border-color: #bf800c;
+}
+.datepicker table tr td.range.today:active,
+.datepicker table tr td.range.today.active {
+  color: #000;
+  background-color: #f4b747;
+  border-color: #bf800c;
+}
+.datepicker table tr td.range.today:active:hover,
+.datepicker table tr td.range.today.active:hover,
+.datepicker table tr td.range.today:active:focus,
+.datepicker table tr td.range.today.active:focus,
+.datepicker table tr td.range.today:active.focus,
+.datepicker table tr td.range.today.active.focus {
+  color: #000;
+  background-color: #f2aa25;
+  border-color: #815608;
+}
+.datepicker table tr td.range.today.disabled:hover,
+.datepicker table tr td.range.today[disabled]:hover,
+fieldset[disabled] .datepicker table tr td.range.today:hover,
+.datepicker table tr td.range.today.disabled:focus,
+.datepicker table tr td.range.today[disabled]:focus,
+fieldset[disabled] .datepicker table tr td.range.today:focus,
+.datepicker table tr td.range.today.disabled.focus,
+.datepicker table tr td.range.today[disabled].focus,
+fieldset[disabled] .datepicker table tr td.range.today.focus {
+  background-color: #f7ca77;
+  border-color: #f1a417;
+}
+.datepicker table tr td.range.today.disabled,
+.datepicker table tr td.range.today.disabled:active {
+  background: #f7ca77;
+  color: #777777;
+}
+.datepicker table tr td.selected,
+.datepicker table tr td.selected.highlighted {
+  color: #fff;
+  background-color: #777777;
+  border-color: #555555;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker table tr td.selected:focus,
+.datepicker table tr td.selected.highlighted:focus,
+.datepicker table tr td.selected.focus,
+.datepicker table tr td.selected.highlighted.focus {
+  color: #fff;
+  background-color: #5e5e5e;
+  border-color: #161616;
+}
+.datepicker table tr td.selected:hover,
+.datepicker table tr td.selected.highlighted:hover {
+  color: #fff;
+  background-color: #5e5e5e;
+  border-color: #373737;
+}
+.datepicker table tr td.selected:active,
+.datepicker table tr td.selected.highlighted:active,
+.datepicker table tr td.selected.active,
+.datepicker table tr td.selected.highlighted.active {
+  color: #fff;
+  background-color: #5e5e5e;
+  border-color: #373737;
+}
+.datepicker table tr td.selected:active:hover,
+.datepicker table tr td.selected.highlighted:active:hover,
+.datepicker table tr td.selected.active:hover,
+.datepicker table tr td.selected.highlighted.active:hover,
+.datepicker table tr td.selected:active:focus,
+.datepicker table tr td.selected.highlighted:active:focus,
+.datepicker table tr td.selected.active:focus,
+.datepicker table tr td.selected.highlighted.active:focus,
+.datepicker table tr td.selected:active.focus,
+.datepicker table tr td.selected.highlighted:active.focus,
+.datepicker table tr td.selected.active.focus,
+.datepicker table tr td.selected.highlighted.active.focus {
+  color: #fff;
+  background-color: #4c4c4c;
+  border-color: #161616;
+}
+.datepicker table tr td.selected.disabled:hover,
+.datepicker table tr td.selected.highlighted.disabled:hover,
+.datepicker table tr td.selected[disabled]:hover,
+.datepicker table tr td.selected.highlighted[disabled]:hover,
+fieldset[disabled] .datepicker table tr td.selected:hover,
+fieldset[disabled] .datepicker table tr td.selected.highlighted:hover,
+.datepicker table tr td.selected.disabled:focus,
+.datepicker table tr td.selected.highlighted.disabled:focus,
+.datepicker table tr td.selected[disabled]:focus,
+.datepicker table tr td.selected.highlighted[disabled]:focus,
+fieldset[disabled] .datepicker table tr td.selected:focus,
+fieldset[disabled] .datepicker table tr td.selected.highlighted:focus,
+.datepicker table tr td.selected.disabled.focus,
+.datepicker table tr td.selected.highlighted.disabled.focus,
+.datepicker table tr td.selected[disabled].focus,
+.datepicker table tr td.selected.highlighted[disabled].focus,
+fieldset[disabled] .datepicker table tr td.selected.focus,
+fieldset[disabled] .datepicker table tr td.selected.highlighted.focus {
+  background-color: #777777;
+  border-color: #555555;
+}
+.datepicker table tr td.active,
+.datepicker table tr td.active.highlighted {
+  color: #fff;
+  background-color: #337ab7;
+  border-color: #2e6da4;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker table tr td.active:focus,
+.datepicker table tr td.active.highlighted:focus,
+.datepicker table tr td.active.focus,
+.datepicker table tr td.active.highlighted.focus {
+  color: #fff;
+  background-color: #286090;
+  border-color: #122b40;
+}
+.datepicker table tr td.active:hover,
+.datepicker table tr td.active.highlighted:hover {
+  color: #fff;
+  background-color: #286090;
+  border-color: #204d74;
+}
+.datepicker table tr td.active:active,
+.datepicker table tr td.active.highlighted:active,
+.datepicker table tr td.active.active,
+.datepicker table tr td.active.highlighted.active {
+  color: #fff;
+  background-color: #286090;
+  border-color: #204d74;
+}
+.datepicker table tr td.active:active:hover,
+.datepicker table tr td.active.highlighted:active:hover,
+.datepicker table tr td.active.active:hover,
+.datepicker table tr td.active.highlighted.active:hover,
+.datepicker table tr td.active:active:focus,
+.datepicker table tr td.active.highlighted:active:focus,
+.datepicker table tr td.active.active:focus,
+.datepicker table tr td.active.highlighted.active:focus,
+.datepicker table tr td.active:active.focus,
+.datepicker table tr td.active.highlighted:active.focus,
+.datepicker table tr td.active.active.focus,
+.datepicker table tr td.active.highlighted.active.focus {
+  color: #fff;
+  background-color: #204d74;
+  border-color: #122b40;
+}
+.datepicker table tr td.active.disabled:hover,
+.datepicker table tr td.active.highlighted.disabled:hover,
+.datepicker table tr td.active[disabled]:hover,
+.datepicker table tr td.active.highlighted[disabled]:hover,
+fieldset[disabled] .datepicker table tr td.active:hover,
+fieldset[disabled] .datepicker table tr td.active.highlighted:hover,
+.datepicker table tr td.active.disabled:focus,
+.datepicker table tr td.active.highlighted.disabled:focus,
+.datepicker table tr td.active[disabled]:focus,
+.datepicker table tr td.active.highlighted[disabled]:focus,
+fieldset[disabled] .datepicker table tr td.active:focus,
+fieldset[disabled] .datepicker table tr td.active.highlighted:focus,
+.datepicker table tr td.active.disabled.focus,
+.datepicker table tr td.active.highlighted.disabled.focus,
+.datepicker table tr td.active[disabled].focus,
+.datepicker table tr td.active.highlighted[disabled].focus,
+fieldset[disabled] .datepicker table tr td.active.focus,
+fieldset[disabled] .datepicker table tr td.active.highlighted.focus {
+  background-color: #337ab7;
+  border-color: #2e6da4;
+}
+.datepicker table tr td span {
+  display: block;
+  width: 23%;
+  height: 54px;
+  line-height: 54px;
+  float: left;
+  margin: 1%;
+  cursor: pointer;
+  border-radius: 4px;
+}
+.datepicker table tr td span:hover,
+.datepicker table tr td span.focused {
+  background: #eeeeee;
+}
+.datepicker table tr td span.disabled,
+.datepicker table tr td span.disabled:hover {
+  background: none;
+  color: #777777;
+  cursor: default;
+}
+.datepicker table tr td span.active,
+.datepicker table tr td span.active:hover,
+.datepicker table tr td span.active.disabled,
+.datepicker table tr td span.active.disabled:hover {
+  color: #fff;
+  background-color: #337ab7;
+  border-color: #2e6da4;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker table tr td span.active:focus,
+.datepicker table tr td span.active:hover:focus,
+.datepicker table tr td span.active.disabled:focus,
+.datepicker table tr td span.active.disabled:hover:focus,
+.datepicker table tr td span.active.focus,
+.datepicker table tr td span.active:hover.focus,
+.datepicker table tr td span.active.disabled.focus,
+.datepicker table tr td span.active.disabled:hover.focus {
+  color: #fff;
+  background-color: #286090;
+  border-color: #122b40;
+}
+.datepicker table tr td span.active:hover,
+.datepicker table tr td span.active:hover:hover,
+.datepicker table tr td span.active.disabled:hover,
+.datepicker table tr td span.active.disabled:hover:hover {
+  color: #fff;
+  background-color: #286090;
+  border-color: #204d74;
+}
+.datepicker table tr td span.active:active,
+.datepicker table tr td span.active:hover:active,
+.datepicker table tr td span.active.disabled:active,
+.datepicker table tr td span.active.disabled:hover:active,
+.datepicker table tr td span.active.active,
+.datepicker table tr td span.active:hover.active,
+.datepicker table tr td span.active.disabled.active,
+.datepicker table tr td span.active.disabled:hover.active {
+  color: #fff;
+  background-color: #286090;
+  border-color: #204d74;
+}
+.datepicker table tr td span.active:active:hover,
+.datepicker table tr td span.active:hover:active:hover,
+.datepicker table tr td span.active.disabled:active:hover,
+.datepicker table tr td span.active.disabled:hover:active:hover,
+.datepicker table tr td span.active.active:hover,
+.datepicker table tr td span.active:hover.active:hover,
+.datepicker table tr td span.active.disabled.active:hover,
+.datepicker table tr td span.active.disabled:hover.active:hover,
+.datepicker table tr td span.active:active:focus,
+.datepicker table tr td span.active:hover:active:focus,
+.datepicker table tr td span.active.disabled:active:focus,
+.datepicker table tr td span.active.disabled:hover:active:focus,
+.datepicker table tr td span.active.active:focus,
+.datepicker table tr td span.active:hover.active:focus,
+.datepicker table tr td span.active.disabled.active:focus,
+.datepicker table tr td span.active.disabled:hover.active:focus,
+.datepicker table tr td span.active:active.focus,
+.datepicker table tr td span.active:hover:active.focus,
+.datepicker table tr td span.active.disabled:active.focus,
+.datepicker table tr td span.active.disabled:hover:active.focus,
+.datepicker table tr td span.active.active.focus,
+.datepicker table tr td span.active:hover.active.focus,
+.datepicker table tr td span.active.disabled.active.focus,
+.datepicker table tr td span.active.disabled:hover.active.focus {
+  color: #fff;
+  background-color: #204d74;
+  border-color: #122b40;
+}
+.datepicker table tr td span.active.disabled:hover,
+.datepicker table tr td span.active:hover.disabled:hover,
+.datepicker table tr td span.active.disabled.disabled:hover,
+.datepicker table tr td span.active.disabled:hover.disabled:hover,
+.datepicker table tr td span.active[disabled]:hover,
+.datepicker table tr td span.active:hover[disabled]:hover,
+.datepicker table tr td span.active.disabled[disabled]:hover,
+.datepicker table tr td span.active.disabled:hover[disabled]:hover,
+fieldset[disabled] .datepicker table tr td span.active:hover,
+fieldset[disabled] .datepicker table tr td span.active:hover:hover,
+fieldset[disabled] .datepicker table tr td span.active.disabled:hover,
+fieldset[disabled] .datepicker table tr td span.active.disabled:hover:hover,
+.datepicker table tr td span.active.disabled:focus,
+.datepicker table tr td span.active:hover.disabled:focus,
+.datepicker table tr td span.active.disabled.disabled:focus,
+.datepicker table tr td span.active.disabled:hover.disabled:focus,
+.datepicker table tr td span.active[disabled]:focus,
+.datepicker table tr td span.active:hover[disabled]:focus,
+.datepicker table tr td span.active.disabled[disabled]:focus,
+.datepicker table tr td span.active.disabled:hover[disabled]:focus,
+fieldset[disabled] .datepicker table tr td span.active:focus,
+fieldset[disabled] .datepicker table tr td span.active:hover:focus,
+fieldset[disabled] .datepicker table tr td span.active.disabled:focus,
+fieldset[disabled] .datepicker table tr td span.active.disabled:hover:focus,
+.datepicker table tr td span.active.disabled.focus,
+.datepicker table tr td span.active:hover.disabled.focus,
+.datepicker table tr td span.active.disabled.disabled.focus,
+.datepicker table tr td span.active.disabled:hover.disabled.focus,
+.datepicker table tr td span.active[disabled].focus,
+.datepicker table tr td span.active:hover[disabled].focus,
+.datepicker table tr td span.active.disabled[disabled].focus,
+.datepicker table tr td span.active.disabled:hover[disabled].focus,
+fieldset[disabled] .datepicker table tr td span.active.focus,
+fieldset[disabled] .datepicker table tr td span.active:hover.focus,
+fieldset[disabled] .datepicker table tr td span.active.disabled.focus,
+fieldset[disabled] .datepicker table tr td span.active.disabled:hover.focus {
+  background-color: #337ab7;
+  border-color: #2e6da4;
+}
+.datepicker table tr td span.old,
+.datepicker table tr td span.new {
+  color: #777777;
+}
+.datepicker .datepicker-switch {
+  width: 145px;
+}
+.datepicker .datepicker-switch,
+.datepicker .prev,
+.datepicker .next,
+.datepicker tfoot tr th {
+  cursor: pointer;
+}
+.datepicker .datepicker-switch:hover,
+.datepicker .prev:hover,
+.datepicker .next:hover,
+.datepicker tfoot tr th:hover {
+  background: #eeeeee;
+}
+.datepicker .prev.disabled,
+.datepicker .next.disabled {
+  visibility: hidden;
+}
+.datepicker .cw {
+  font-size: 10px;
+  width: 12px;
+  padding: 0 2px 0 5px;
+  vertical-align: middle;
+}
+.input-group.date .input-group-addon {
+  cursor: pointer;
+}
+.input-daterange {
+  width: 100%;
+}
+.input-daterange input {
+  text-align: center;
+}
+.input-daterange input:first-child {
+  border-radius: 3px 0 0 3px;
+}
+.input-daterange input:last-child {
+  border-radius: 0 3px 3px 0;
+}
+.input-daterange .input-group-addon {
+  width: auto;
+  min-width: 16px;
+  padding: 4px 5px;
+  line-height: 1.42857143;
+  border-width: 1px 0;
+  margin-left: -5px;
+  margin-right: -5px;
+}
+.datepicker.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: 1000;
+  display: none;
+  float: left;
+  min-width: 160px;
+  list-style: none;
+  background-color: #fff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.15);
+  border-radius: 4px;
+  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+  -moz-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+  -webkit-background-clip: padding-box;
+  -moz-background-clip: padding;
+  background-clip: padding-box;
+  color: #333333;
+  font-size: 13px;
+  line-height: 1.42857143;
+}
+.datepicker.dropdown-menu th,
+.datepicker.datepicker-inline th,
+.datepicker.dropdown-menu td,
+.datepicker.datepicker-inline td {
+  padding: 0px 5px;
+}
+/*# sourceMappingURL=bootstrap-datepicker3.standalone.css.map */

File diff suppressed because it is too large
+ 0 - 0
src/main/resources/static/css/datepicker/bootstrap-datepicker3.standalone.css.map


Some files were not shown because too many files changed in this diff