浏览代码

caraga inicial

Ale Monti 1 年之前
当前提交
d085710367
共有 100 个文件被更改,包括 14582 次插入0 次删除
  1. 163 0
      action/empleos_action.php
  2. 290 0
      action/eventos_action.php
  3. 130 0
      action/habilidad_action.php
  4. 188 0
      action/historial_action.php
  5. 377 0
      action/home_action.php
  6. 327 0
      action/horarios_action.php
  7. 130 0
      action/idioma_action.php
  8. 129 0
      action/index_action.php
  9. 180 0
      action/tit_insert.php
  10. 二进制
      archivos/alumnos/1446/Certificado_ServicioSocial_1446.pdf
  11. 57 0
      base.php
  12. 57 0
      classes/Archivos.php
  13. 90 0
      classes/Evento.php
  14. 269 0
      classes/EventoInsignia.php
  15. 148 0
      classes/Fechas.php
  16. 177 0
      classes/MainMenu.php
  17. 501 0
      classes/SGI.php
  18. 202 0
      classes/Template.php
  19. 163 0
      classes/ValidaSesion.php
  20. 32 0
      construccion.php
  21. 0 0
      css/bootstrap-ing.min.css
  22. 61 0
      css/custominputfile.css
  23. 84 0
      css/elementos.css
  24. 7955 0
      css/fa_all.css
  25. 104 0
      css/general.css
  26. 40 0
      css/index.css
  27. 67 0
      css/indivisa.css
  28. 258 0
      css/ingfont.css
  29. 938 0
      css/jquery-ui.css
  30. 167 0
      css/month-picker.css
  31. 209 0
      css/richtext.css
  32. 25 0
      css/secciones/empleo.css
  33. 21 0
      css/secciones/eventos.css
  34. 15 0
      css/secciones/formacion.css
  35. 92 0
      css/secciones/home.css
  36. 49 0
      css/secciones/horarios.css
  37. 6 0
      css/secciones/index_bypass.css
  38. 19 0
      css/secciones/insignias.css
  39. 188 0
      css/template.css
  40. 12 0
      docs/generales.json
  41. 4 0
      docs/redes.txt
  42. 168 0
      ejemplo.php
  43. 136 0
      empleo.php
  44. 41 0
      error.php
  45. 146 0
      eventos.php
  46. 二进制
      fonts/fa/fa-brands-400.ttf
  47. 二进制
      fonts/fa/fa-brands-400.woff2
  48. 二进制
      fonts/fa/fa-regular-400.ttf
  49. 二进制
      fonts/fa/fa-regular-400.woff2
  50. 二进制
      fonts/fa/fa-solid-900.ttf
  51. 二进制
      fonts/fa/fa-solid-900.woff2
  52. 二进制
      fonts/fa/fa-v4compatibility.ttf
  53. 二进制
      fonts/fa/fa-v4compatibility.woff2
  54. 4 0
      fonts/fa/fa_all.css
  55. 二进制
      fonts/facIng/ingfont.eot
  56. 15 0
      fonts/facIng/ingfont.svg
  57. 二进制
      fonts/facIng/ingfont.ttf
  58. 二进制
      fonts/facIng/ingfont.woff
  59. 二进制
      fonts/indivisaFont/eot/IndivisaDisplaySans-Heavy.eot
  60. 二进制
      fonts/indivisaFont/eot/IndivisaDisplaySans-HeavyItalic.eot
  61. 二进制
      fonts/indivisaFont/eot/IndivisaDisplaySans-Regular.eot
  62. 二进制
      fonts/indivisaFont/eot/IndivisaDisplaySans-RegularItalic.eot
  63. 二进制
      fonts/indivisaFont/eot/IndivisaDisplaySans-Thin.eot
  64. 二进制
      fonts/indivisaFont/eot/IndivisaDisplaySans-ThinItalic.eot
  65. 二进制
      fonts/indivisaFont/eot/IndivisaTextSans-Black.eot
  66. 二进制
      fonts/indivisaFont/eot/IndivisaTextSans-BlackItalic.eot
  67. 二进制
      fonts/indivisaFont/eot/IndivisaTextSans-Bold.eot
  68. 二进制
      fonts/indivisaFont/eot/IndivisaTextSans-BoldItalic.eot
  69. 二进制
      fonts/indivisaFont/eot/IndivisaTextSans-Light.eot
  70. 二进制
      fonts/indivisaFont/eot/IndivisaTextSans-LightItalic.eot
  71. 二进制
      fonts/indivisaFont/eot/IndivisaTextSans-Regular.eot
  72. 二进制
      fonts/indivisaFont/eot/IndivisaTextSans-RegularItalic.eot
  73. 二进制
      fonts/indivisaFont/otf/IndivisaDisplaySans-Heavy.otf
  74. 二进制
      fonts/indivisaFont/otf/IndivisaDisplaySans-HeavyItalic.otf
  75. 二进制
      fonts/indivisaFont/otf/IndivisaDisplaySans-Regular.otf
  76. 二进制
      fonts/indivisaFont/otf/IndivisaDisplaySans-RegularItalic.otf
  77. 二进制
      fonts/indivisaFont/otf/IndivisaDisplaySans-Thin.otf
  78. 二进制
      fonts/indivisaFont/otf/IndivisaDisplaySans-ThinItalic.otf
  79. 二进制
      fonts/indivisaFont/otf/IndivisaTextSans-Black.otf
  80. 二进制
      fonts/indivisaFont/otf/IndivisaTextSans-BlackItalic.otf
  81. 二进制
      fonts/indivisaFont/otf/IndivisaTextSans-Bold.otf
  82. 二进制
      fonts/indivisaFont/otf/IndivisaTextSans-BoldItalic.otf
  83. 二进制
      fonts/indivisaFont/otf/IndivisaTextSans-Light.otf
  84. 二进制
      fonts/indivisaFont/otf/IndivisaTextSans-LightItalic.otf
  85. 二进制
      fonts/indivisaFont/otf/IndivisaTextSans-Regular.otf
  86. 二进制
      fonts/indivisaFont/otf/IndivisaTextSans-RegularItalic.otf
  87. 10 0
      fonts/indivisaFont/svg/IndivisaDisplaySans-Heavy.svg
  88. 10 0
      fonts/indivisaFont/svg/IndivisaDisplaySans-HeavyItalic.svg
  89. 10 0
      fonts/indivisaFont/svg/IndivisaDisplaySans-Regular.svg
  90. 10 0
      fonts/indivisaFont/svg/IndivisaDisplaySans-RegularItalic.svg
  91. 10 0
      fonts/indivisaFont/svg/IndivisaDisplaySans-Thin.svg
  92. 10 0
      fonts/indivisaFont/svg/IndivisaDisplaySans-ThinItalic.svg
  93. 11 0
      fonts/indivisaFont/svg/IndivisaTextSans-Black.svg
  94. 11 0
      fonts/indivisaFont/svg/IndivisaTextSans-BlackItalic.svg
  95. 11 0
      fonts/indivisaFont/svg/IndivisaTextSans-Bold.svg
  96. 11 0
      fonts/indivisaFont/svg/IndivisaTextSans-BoldItalic.svg
  97. 11 0
      fonts/indivisaFont/svg/IndivisaTextSans-Light.svg
  98. 11 0
      fonts/indivisaFont/svg/IndivisaTextSans-LightItalic.svg
  99. 11 0
      fonts/indivisaFont/svg/IndivisaTextSans-Regular.svg
  100. 11 0
      fonts/indivisaFont/svg/IndivisaTextSans-RegularItalic.svg

+ 163 - 0
action/empleos_action.php

@@ -0,0 +1,163 @@
+<?php
+session_start();
+require_once '../include/bd_pdo.php';
+require_once '../classes/Fechas.php';
+
+if(!isset($_POST['tipo'])){
+    $return['error'] = 'Error! No se recibieron los datos.';
+} else {
+    date_default_timezone_set('America/Mexico_City');
+    switch ($_POST['tipo']) {
+        case 1: //Select All
+            $error = false;
+            $trabajos = array();
+            $stmt = $pdo->prepare('SELECT * FROM alu_fs_trabajo(:Usuario_id, null)');
+            $stmt->bindParam(':Usuario_id', $_SESSION['usuario_id']);
+            if(!$stmt->execute()){
+                $error = true;
+                print_r($stmt->errorInfo());
+            } else
+                $trabajos = $stmt->fetchAll();
+            $stmt->closeCursor();
+            $stmt = null;
+            if (count($trabajos) > 0){
+                $html = '<div class="timeline">';
+                foreach ($trabajos as $trabajo){
+                    $html.= '<div class="trabajo">
+                        <div class="d-flex flex-column justify-content-start align-items-start">
+                            <div class="fecha indivisa-text-bold text-white mb-2">' . Fechas::fechaRango($trabajo['Trabajo_fechaInicio'], $trabajo['Trabajo_fechaFin'], '/') . '</div>
+                            <div class="indivisa-text-bold">' . $trabajo['Trabajo_empresa'] . '</div>
+                            <div class="indivisa-text-italic">' . $trabajo['Trabajo_nombre'] . '</div>
+                            <div>' . $trabajo['Trabajo_descripcion'] . '</div>
+                            <div class="d-flex flex-row justify-content-end align-items-center w-100">
+                                <span class="ing-editar iconAcciones text-azul2" data-tipo="3" data-id="' . $trabajo['Trabajo_id'] . '"></span>
+                                <span class="ing-basura iconAcciones text-danger" data-id="' . $trabajo['Trabajo_id'] . '"></span>
+                            </div>
+                        </div>
+                        
+                    </div>';
+                }
+                $html .= '</div>';
+                $return['html'] = $html;
+            } else {
+                $return['html'] = '<div class="d-flex flex-row justify-content-center align-items-center">
+                <div class="msgBox d-flex flex-row justify-content-center align-items-center">
+                    <img src="img/triangulos.svg" class="imgBoxIzq" />
+                    <img src="img/triangulos.svg" class="imgBoxDer" />
+                    <hr class="hrArriba">
+                    <hr class="hrAbajo">
+                    <div class="d-flex flex-column justify-content-center align-items-center display-5 text-center">
+                        <div>¡Lo sentimos!</div>
+                        <div>Aún no tienes <span class="text-azul1 mx-1">ningún</span>empleo registrado</div>
+                    </div>
+                </div>
+            </div>';
+            }
+            if ($error)
+                $return['html'] = 'ERROR';
+            break;
+        case 2: //Add Empleo
+            $_POST['puesto'] = filter_var($_POST['puesto'], FILTER_SANITIZE_STRING);
+            $_POST['empresa'] = filter_var($_POST['empresa'], FILTER_SANITIZE_STRING);
+            $_POST['inicio'] = filter_var($_POST['inicio'], FILTER_SANITIZE_STRING);
+            $_POST['fin'] = filter_var($_POST['fin'], FILTER_SANITIZE_STRING);            
+            if($_POST['fin'] == '')
+                $stmt = $pdo->prepare('SELECT * FROM alu_fi_trabajo(:Trabajo_nombre, :Trabajo_empresa, :Trabajo_fechaInicio, :Trabajo_descripcion, :Usuario_id)');
+            else{
+                $stmt = $pdo->prepare('SELECT * FROM alu_fi_trabajo(:Trabajo_nombre, :Trabajo_empresa, :Trabajo_fechaInicio, :Trabajo_descripcion, :Usuario_id, :Trabajo_fechaFin)');
+                $temp = explode('/',$_POST['fin']);
+                $fecha_fin = $temp[1] . '-' . $temp[0] . '-01';
+                $stmt->bindParam(':Trabajo_fechaFin', $fecha_fin, PDO::PARAM_STR);
+            }
+            $stmt->bindParam(':Trabajo_nombre', $_POST['puesto'], PDO::PARAM_STR);
+            $stmt->bindParam(':Trabajo_empresa', $_POST['empresa'], PDO::PARAM_STR);
+            $temp = explode('/',$_POST['inicio']);
+            $fecha_inicio = $temp[1] . '-' . $temp[0] . '-01';
+            $stmt->bindParam(':Trabajo_fechaInicio', $fecha_inicio, PDO::PARAM_STR);
+            $stmt->bindParam(':Trabajo_fechaInicio', $fecha_inicio, PDO::PARAM_STR);
+            $stmt->bindParam(':Trabajo_descripcion', $_POST['descripcion'], PDO::PARAM_STR);
+            $stmt->bindParam(':Usuario_id', $_SESSION['usuario_id']);
+            if(!$stmt->execute()){
+                print_r($stmt->errorInfo());
+                $return['error'] = 'No fue posible agregar el empleo de <span class="text-azul1">' . $_POST['puesto'] . '</span>';
+            }
+            else
+                $return['ok'] = 'Se agregó correctamente el empleo de <span class="text-azul1">' . $_POST['puesto'] . '</span>';
+            $stmt->closeCursor();
+            $stmt = null;
+            break;
+        case 3: //Update Empleo
+            $_POST['puesto'] = filter_var($_POST['puesto'], FILTER_SANITIZE_STRING);
+            $_POST['empresa'] = filter_var($_POST['empresa'], FILTER_SANITIZE_STRING);
+            $_POST['inicio'] = filter_var($_POST['inicio'], FILTER_SANITIZE_STRING);
+            $_POST['fin'] = filter_var($_POST['fin'], FILTER_SANITIZE_STRING);            
+            if($_POST['fin'] == '')
+                    $stmt = $pdo->prepare('SELECT * FROM alu_fu_trabajo(:Trabajo_id, :Trabajo_nombre, :Trabajo_empresa, :Trabajo_fechaInicio, :Trabajo_descripcion, :Usuario_id)');
+            else{
+                $stmt = $pdo->prepare('SELECT * FROM alu_fu_trabajo(:Trabajo_id, :Trabajo_nombre, :Trabajo_empresa, :Trabajo_fechaInicio, :Trabajo_descripcion, :Usuario_id, :Trabajo_fechaFin)');
+                $temp = explode('/',$_POST['fin']);
+                $fecha_fin = $temp[1] . '-' . $temp[0] . '-01';
+                $stmt->bindParam(':Trabajo_fechaFin', $fecha_fin, PDO::PARAM_STR);
+            }
+            $stmt->bindParam(':Trabajo_id', $_POST['id']);
+            $stmt->bindParam(':Trabajo_nombre', $_POST['puesto'], PDO::PARAM_STR);
+            $stmt->bindParam(':Trabajo_empresa', $_POST['empresa'], PDO::PARAM_STR);
+            $temp = explode('/',$_POST['inicio']);
+            $fecha_inicio = $temp[1] . '-' . $temp[0] . '-01';
+            $stmt->bindParam(':Trabajo_fechaInicio', $fecha_inicio, PDO::PARAM_STR);
+            $stmt->bindParam(':Trabajo_descripcion', $_POST['descripcion'], PDO::PARAM_STR);
+            $stmt->bindParam(':Usuario_id', $_SESSION['usuario_id']);
+            if(!$stmt->execute()) {
+                print_r($stmt->errorInfo());
+                $return['error'] = 'No fue posible editar el empleo de <span class="text-azul1">' . $_POST['puesto'] . '</span>';
+            }
+            else
+                $return['ok'] = 'Se editó correctamente el empleo de <span class="text-azul1">' . $_POST['puesto'] . '</span>';
+            $stmt->closeCursor();
+            $stmt = null;
+            break;
+        case 4: //Delete Empleo
+            $_POST['id'] = intval(filter_var($_POST['id'], FILTER_SANITIZE_NUMBER_INT));
+            $stmt = $pdo->prepare('SELECT * FROM alu_fd_trabajo(:Trabajo_id, :Usuario_id)');
+            $stmt->bindParam(':Trabajo_id', $_POST['id']);
+            $stmt->bindParam(':Usuario_id', $_SESSION['usuario_id']);
+            if(!$stmt->execute()){
+                print_r($stmt->errorInfo());
+                $return['error'] = 'No fue posible eliminar el empleo ';
+            }
+            else
+                $return['ok'] = 'Se eliminó de manera exitosa el empleo ';
+            $stmt->closeCursor();
+            $stmt = null;
+            break;
+        case 5://Select One
+            $_POST['id'] = intval(filter_var($_POST['id'], FILTER_SANITIZE_NUMBER_INT));
+            $stmt = $pdo->prepare('SELECT * FROM alu_fs_trabajo(:Usuario_id, :Trabajo_id)');
+            $stmt->bindParam(':Usuario_id', $_SESSION['usuario_id']);
+            $stmt->bindParam(':Trabajo_id', $_POST['id']);
+            if(!$stmt->execute()){
+                $return['error'] = 'No fue posible obtener los datos del empleo ';
+                print_r($stmt->errorInfo());
+            } else {
+                $trabajo = $stmt->fetch();
+                $return['puesto'] = $trabajo['Trabajo_nombre'];
+                $return['empresa'] = $trabajo['Trabajo_empresa'];
+                $temp = explode('/', $trabajo['Trabajo_fechaInicio']);
+                $return['inicio'] = $temp[1] . '/' . $temp[0];
+                if (!is_null($trabajo['Trabajo_fechaFin'])) {
+                    $temp = explode('/', $trabajo['Trabajo_fechaFin']);
+                    $return['fin'] = $temp[1] . '/' . $temp[0];
+                } else
+                    $return['fin'] = '';
+                if (!is_null($trabajo['Trabajo_descripcion']))
+                    $return['descripcion'] = $trabajo['Trabajo_descripcion'];
+                else
+                    $return['descripcion'] = '';
+            }
+            $stmt->closeCursor();
+            $stmt = null;
+            break;
+    }
+}
+$return['json'] = json_encode($return);
+echo json_encode($return);

+ 290 - 0
action/eventos_action.php

@@ -0,0 +1,290 @@
+<?php
+session_start();
+require_once '../include/bd_pdo.php';
+require_once '../classes/Archivos.php';
+require_once '../classes/EventoInsignia.php';
+require_once '../classes/Fechas.php';
+
+if(!isset($_POST['tipo'])){
+    $return['error'] = 'Error! No se recibieron los datos.';
+} else{
+    date_default_timezone_set('America/Mexico_City');
+    switch($_POST['tipo']){
+        case 1: //SELECT ALL
+            $_POST['year'] = intval(filter_var($_POST['year'], FILTER_SANITIZE_NUMBER_INT));
+            $_POST['month'] = intval(filter_var($_POST['month'], FILTER_SANITIZE_NUMBER_INT));
+            //if (($_POST['year'] . '-' . Fechas::dosDigitos($_POST['month'])) < '2023-04'){
+            if (($_POST['year'] . '-' . Fechas::dosDigitos($_POST['month'])) < date('Y-m')){
+               $eventos = array();
+               $fechaIni = $_POST['year'] . '-' . Fechas::dosDigitos($_POST['month']) . '-01';
+               $fechaFin = $_POST['year'] . '-' . Fechas::dosDigitos($_POST['month']) . '-' .cal_days_in_month(CAL_GREGORIAN, Fechas::dosDigitos($_POST['month']), $_POST['year']);
+               $registros = EventoInsignia::getRegistroEvento($pdo, $_SESSION['usuario_id'], null, $fechaIni, $fechaFin);
+               if (count($registros) > 0){
+                   $insignias = array_column($registros, 'insignia_id');
+                   $eventos = EventoInsignia::getDatosEventos($pdo, $_POST['month'], $_POST['year']);
+                   $eventos = depuraEventosAnteriores($eventos, $insignias);
+               }
+                if (count($eventos) == 0) {
+                    $return['html'] = '<div class="msgBox d-flex flex-row justify-content-center align-items-center mt-5">
+                        <img src="img/triangulos.svg" class="imgBoxIzq" />
+                        <img src="img/triangulos.svg" class="imgBoxDer" />
+                        <hr class="hrArriba">
+                        <hr class="hrAbajo">
+                        <div class="d-flex flex-column justify-content-center align-items-center display-5 text-center p-4">
+                            <div><span class="text-azul1 mx-1">NO</span>participaste en ningún evento de éste mes</div>
+                        </div>
+                    </div>';
+                } else {
+                    $html = '';
+                    if (count($eventos) > 1) {
+                        reset($eventos);
+                        while ($evento = current($eventos)) {
+                            $index = key($eventos);
+                            $fechas = EventoInsignia::getFechasRomanizadas($evento['fechas'], $evento['periodicidad'], $_POST['year'] . '-' . Fechas::dosDigitos($_POST['month']), true);
+                            $eventos[$index]['texto'] = $fechas['texto'];
+                            $eventos[$index]['horario'] = $fechas['horario'];
+                            $eventos[$index]['horarioTemp'] = $fechas['horarioTemp'];
+                            next($eventos);
+                        }
+                        usort($eventos, function($a, $b) {
+                            $retval = $a['dia'] <=> $b['dia'];
+                            if ($retval == 0) {
+                                $retval = $a['horarioTemp'] <=> $b['horarioTemp'];
+                            }
+                            return $retval;
+                        });
+                    } else {
+                        $fechas = EventoInsignia::getFechasRomanizadas($eventos[0]['fechas'], $eventos[0]['periodicidad'], $_POST['year'] . '-' . Fechas::dosDigitos($_POST['month']), true);
+                        $eventos[0]['texto'] = $fechas['texto'];
+                        $eventos[0]['horario'] = $fechas['horario'];
+                        $eventos[0]['horarioTemp'] = $fechas['horarioTemp'];
+                    }
+                    foreach($eventos as $evento){
+                        $insignia = EventoInsignia::getDatosInsignia($pdo, $evento['evento_id']);
+                        $registro = EventoInsignia::getRegistroEvento($pdo, $_SESSION['usuario_id'], $evento['insignia_id']);
+                        if (count($registro) == 1) {
+                            $registro = $registro[0];
+                            $botones = getEstatus($registro);
+                            $html .= generaEvento($evento['insignia_id'], $evento['titulo'], $insignia['InsigniaTipo_desc'], $insignia['InsigniaTipo_color'], $evento['texto'], $evento['dia'], $fechas['horario'], $botones);
+                        }
+                    }
+                    if (!empty($html))
+                        $return['html'] = '<div class="mt-4">' . $html . '</div>';
+                    else
+                        $return['error'] = 'No fue posible generar los eventos';
+                }
+            } else {
+                $eventos = EventoInsignia::getDatosEventos($pdo, $_POST['month'], $_POST['year']);
+                if (count($eventos) == 0){
+                    $return['html'] = '<div class="msgBox d-flex flex-row justify-content-center align-items-center mt-5">
+                        <img src="img/triangulos.svg" class="imgBoxIzq" />
+                        <img src="img/triangulos.svg" class="imgBoxDer" />
+                        <hr class="hrArriba">
+                        <hr class="hrAbajo">
+                        <div class="d-flex flex-column justify-content-center align-items-center display-5 text-center p-4">
+                            <div>Aún<span class="text-azul1 mx-1">NO</span>hay eventos programados</div>
+                        </div>
+                    </div>';
+                } else {
+                    $html = '';
+                    if (count($eventos) > 1) {
+                        while ($evento = current($eventos)) {
+                            $index = key($eventos);
+                            $fechas = EventoInsignia::getFechasRomanizadas($evento['fechas'], $evento['periodicidad'], $_POST['year'] . '-' . Fechas::dosDigitos($_POST['month']), true);
+                            $eventos[$index]['texto'] = $fechas['texto'];
+                            $eventos[$index]['horario'] = $fechas['horario'];
+                            $eventos[$index]['horarioTemp'] = $fechas['horarioTemp'];
+                            next($eventos);
+                        }
+                        usort($eventos, function($a, $b) {
+                            $retval = $a['dia'] <=> $b['dia'];
+                            if ($retval == 0) {
+                                $retval = $a['horarioTemp'] <=> $b['horarioTemp'];
+                            }
+                            return $retval;
+                        });
+                    } else {
+                        $fechas = EventoInsignia::getFechasRomanizadas($eventos[0]['fechas'], $eventos[0]['periodicidad'], $_POST['year'] . '-' . Fechas::dosDigitos($_POST['month']), true);
+                        $eventos[0]['texto'] = $fechas['texto'];
+                        $eventos[0]['horario'] = $fechas['horario'];
+                        $eventos[0]['horarioTemp'] = $fechas['horarioTemp'];
+                    }
+                    foreach($eventos as $evento){
+                        $insignia = EventoInsignia::getDatosInsignia($pdo, $evento['evento_id']);
+                        $registro = EventoInsignia::getRegistroEvento($pdo, $_SESSION['usuario_id'], $evento['insignia_id']);
+                        if (count($registro) == 1)
+                            $registro = $registro[0];
+                        $botones = getBotones($insignia, $evento, $registro);
+                        $html .= generaEvento($evento['insignia_id'], $evento['titulo'], $insignia['InsigniaTipo_desc'], $insignia['InsigniaTipo_color'], $evento['texto'], $evento['dia'], $evento['horario'], $botones, $evento['detalle']);
+                    }
+                    if (!empty($html))
+                        $return['html'] = '<div class="mt-4">' . $html . '</div>';
+                    else
+                        $return['error'] = 'No fue posible generar los eventos';
+                }
+            }
+            break;
+        case 2://Inscripcion a evento
+            $_POST['insignia'] = filter_var($_POST['insignia'], FILTER_SANITIZE_NUMBER_INT);
+            $stmt = $pdo->prepare('SELECT * FROM alu_fi_inscripcionevento(:Insignia, :Usuario)');
+            $stmt->bindParam(':Insignia', $_POST['insignia']);
+            $stmt->bindParam(':Usuario',$_SESSION['usuario_id']);
+            if(!$stmt->execute()){
+                $return['error'] = 'No fue posible inscribirte al evento ';
+                print_r($stmt->errorInfo());
+            }else{
+                $return['msg'] = '¡Felicidades!';
+                $return['ok'] = 'Te has inscrio a ';
+            }
+            $stmt->closeCursor();
+            $stmt = null;
+            break;
+        case 3://Desinscripcion de evento
+            $_POST['insignia'] = filter_var($_POST['insignia'], FILTER_SANITIZE_NUMBER_INT);
+            $registro = EventoInsignia::getRegistroEvento($pdo, $_SESSION['usuario_id'], $_POST['insignia']);
+            if(isset($registro[0]['evidencia']) && !is_null($registro[0]['evidencia']))
+                $ejecuta = Archivos::eliminaArchivo('archivos/eventos/' . $_POST['shortname'] . '/' . $_POST['insignia'], $registro[0]['evidencia']);
+            else
+                $ejecuta = true;
+            if ($ejecuta){                            
+                $stmt = $pdo->prepare('SELECT * FROM alu_fd_inscripcionevento(:Insignia, :Usuario)');
+                $stmt->bindParam(':Insignia', $_POST['insignia']);
+                $stmt->bindParam(':Usuario', $_SESSION['usuario_id']);
+                if(!$stmt->execute()){
+                    $return['error'] = 'No fue posible desinscribirte del evento ';
+                    print_r($stmt->errorInfo());
+                }else{
+                    $evidencia = $stmt->fetch();              
+                    $return['msg'] = '¡Que triste!';
+                    $return['ok'] = 'Te has desinscrio de ';
+                }
+                $stmt->closeCursor();
+                $stmt = null;
+            } else 
+                $return['error'] = 'No fue posible eliminar tu evidencia para desinscribirte del evento ';
+            break;
+        case 4://subir archivos
+            $ruta = 'archivos/eventos/'.$_POST['shortname'];
+            $carpeta = Archivos::existeCapeta($ruta);
+            if(!$carpeta)//busca carpeta y la crea si no existe
+                $carpeta = Archivos::creaCarpeta($ruta);
+            if($carpeta) {
+                $ruta .= '/'.$_POST['insignia'];
+                $carpeta = Archivos::existeCapeta($ruta);//busca carpeta y la crea si no existe
+                if(!$carpeta) //busca carpeta y la crea si no existe
+                    $carpeta = Archivos::creaCarpeta($ruta);
+                if($carpeta) {//si existe o se creo la carpeta
+                    $nombre = "evidencia_" . $_SESSION['usuario_id'] . "_" . uniqid() . substr($_FILES['archivo']['name'][0], strrpos($_FILES['archivo']['name'][0], '.'));
+                    if(Archivos::agregaArchivo($_FILES['archivo']['tmp_name'][0], $ruta, $nombre)) {                    
+                        $stmt = $pdo->prepare('SELECT * FROM alu_fu_insigniaevidencia(:Insignia, :Usuario, :Evidencia)');
+                        $stmt->bindParam(':Insignia', $_POST['insignia']);
+                        $stmt->bindParam(':Usuario', $_SESSION['usuario_id']);
+                        $stmt->bindParam(':Evidencia', $nombre);
+                        if(!$stmt->execute()){
+                            $return['error'] = 'No fue posible subir el archivo';
+                            print_r($stmt->errorInfo());
+                            Archivos::eliminaArchivo($ruta, $nombre);
+                        }else{
+                            $return['ok'] = 'El archivo se subió correctamente';
+                        }
+                        $stmt->closeCursor();
+                        $stmt = null;
+                    } else
+                        $return['error'] = 'No fue posible cargar el archivo';
+                } else
+                    $return['error'] = 'No fue posible acceder a la carpeta del evento';
+            } else
+                $return['error'] = 'No fue posible acceder a la carpeta principal';
+            break;
+    }
+}
+$return['json'] = json_encode($return);
+echo json_encode($return);
+
+function depuraEventosAnteriores($eventos, $insignias){
+    //$eliminar = array();
+    while ($evento = current($eventos)) {
+       if (!in_array($evento['insignia_id'],$insignias)) {
+           $index = key($eventos);
+           unset($eventos[$index]);
+        }
+        next($eventos);
+    }
+    return $eventos;
+}
+
+function generaEvento($insignia_id, $titulo, $tipo, $color, $fechas, $dia, $horario, $botones, $detalle = null){
+    $html = '<div>
+        <div class="d-flex flex-row justify-content-start align-items-stretch evento">
+            <div class="calendario d-flex flex-column justify-content-between align-items-center" style="border-top-color:' . $color . ';">
+                <h1>' . $dia . '</h1>
+                <span>' . $horario . '</span>
+            </div>
+            <div id="evento_' . $insignia_id . '" class="ml-0 ml-sm-4 flex-grow-1 d-flex flex-column justify-content-start align-items-start">
+                <div class="tituloEvento"><span class="mr-1 indivisa-text-bold">' . $tipo . ':</span><span>' . $titulo . '<span>';
+    if (!is_null($detalle))
+        $html .= '<span class="fa-solid fa-circle-info ml-1"  data-toggle="collapse" data-target="#detalle_' . $insignia_id . '" aria-expanded="true" aria-controls="detalle_' . $insignia_id . '"></span>';
+    $html .= '</div>
+                <div class="indivisa-text-italic">' . $fechas. '</div>
+            </div>
+            <div class="botones d-flex flex-column justify-content-around align-items-center">' . $botones . '</div>
+        </div>';
+    if (!is_null($detalle))
+        $html .= '<div class="collapse" id="detalle_' . $insignia_id . '" data-parent="#eventos"><div class="p-3"><h6>Detalles del Evento</h6>' . $detalle . '</div></div>';
+    $html .= '</div>';
+    return $html;
+}
+
+function getEstatus($registro){
+    $html = '';
+    switch (strtoupper($registro['estado'])){
+        case 'INSCRITO': $html .= '<div class="text-azul2 btn p-1"><i class="fa-regular fa-pen-to-square mr-1"></i>Inscrito al evento</div>'; break;
+        case 'RECHAZADO': $html .= '<div class="text-danger btn p-1"><i class="ing-cancelar mr-1"></i>Insignia/Inscripción Rechazada</div>'; break;
+        case 'AUTORIZADO': $html .= '<div class="text-success btn p-1"><i class="ing-aceptar mr-1"></i>Insignia/Inscripción Autorizada</div>'; break;
+        case 'COMPLETADO': $html .= '<div class="text-azul1 btn p-1"><i class="ing-insignia4 mr-1"></i>Insignia Asignada</div>'; break;
+    }
+    if (!is_null($registro['comentario']))
+        $html .= '<div class="text-secondary">' . $registro['comentarios'] . '</div>';
+    return $html;
+}
+
+function getBotones($insignia, $evento, $registro){
+    $html = '';
+    $hoy = strtotime(date('Y-m-d h:i:s'));
+    if(!isset($registro['estado'])) {//si el alumno no esta inscrito
+        if (!is_null($insignia['InsigniaGeneral_inscripciones_inicial'])){
+            if ($hoy >= strtotime($insignia['InsigniaGeneral_inscripciones_inicial']) && $hoy <= strtotime($insignia['InsigniaGeneral_inscripciones_final'])){
+                $html .= '<button class="btn btn-verde btn-inscribir p-1" data-insignia="' . $insignia['Insignia_id'] . '" data-tipo="1" data-toggle="modal" data-target="#modalConfirmar">
+                        <span class="ing-reporte-resultados mr-1"></span>Inscribirme
+                    </button>';
+            } else {
+                if ($hoy < strtotime($insignia['InsigniaGeneral_inscripciones_inicial'])) {
+                    $html .= '<label class="txtLabel text-azul1 btn p-1"><span class="fa-regular fa-face-grin-beam-sweat text-azul1 mr-1"></span><span>El período de registro aún no se ha abierto</span></label>';
+                } else {
+                    $html .= '<label class="txtLabel btn p-1"><span class="fa-regular fa-face-frown text-danger mr-1"></span><span>El período de registro ha terminado</span></label></div>';
+                }
+            }
+        } else {
+            $html .= '<label class="txtLabel btn p-1"><span class="ing-importante text-warning mr-1"></span><span class="text-primary">Ver detalle para registro</span></label>';
+        }
+    } else {//si esta inscrito
+        $html .= '<button class="btn btn-rojo btn-desinscribir p-1" data-insignia="' . $insignia['Insignia_id'] . '" data-shortname="'. $evento['shortname'] .'" data-tipo="2" data-toggle="modal" data-target="#modalConfirmar">
+                <span class="ing-cancelar mr-1"></span>Desinscribirme
+            </button>';
+    }
+    if(isset($registro['estado']) && $insignia['Insignia_hasEvidencia']) {
+        if (!$registro['evidencia']) {//si el evento necesita evidencia y no se ha subido
+            if (is_null($insignia['Insignia_evidencia_desc']))
+                $insignia['Insignia_evidencia_desc'] = '';
+            $html .= '<button class="btn btn-azul1 addEvidencia p-1" data-insignia="' . $insignia['Insignia_id'] . '" data-shortname="' . $evento['shortname'] .'" data-toggle="modal" data-target="#modalSubirArchivo">
+                    <input type="hidden" value="' . $insignia['Insignia_evidencia_desc'] . '">
+                    <span class="ing-carga-archivo"></span> Subir Evidencia
+                </button>';
+        } else {
+            $html .= '<a class="btn btn-azul2 p-1" href="./archivos/eventos/'. $evento['shortname']. '/' .$evento['insignia_id']. '/' . $registro['evidencia'] .'" target="_blank">
+                    <span class="ing-ver"></span> Ver Evidencia Cargada
+                </a>';
+        }
+    }
+    return $html;
+}

+ 130 - 0
action/habilidad_action.php

@@ -0,0 +1,130 @@
+<?php
+session_start();
+require_once '../include/bd_pdo.php';
+
+if(!isset($_POST['tipo'])){
+    $return['error'] = 'Error! No se recibieron los datos.';
+} else {
+    switch ($_POST['tipo']) {        
+        case 1: //Select All
+            $error = '';
+            $habilidades = array();
+            $stmt = $pdo->prepare('SELECT * FROM alu_fs_habilidad(:Usuario_id, null)');
+            $stmt->bindParam(':Usuario_id', $_SESSION['usuario_id']);
+            if(!$stmt->execute()){
+                $error = 'No fue posible obtener las habilidades';
+                print_r($stmt->errorInfo());
+
+            } else
+                $habilidades = $stmt->fetchAll();
+            $stmt->closeCursor();
+            $stmt = null;
+            if(count($habilidades) > 0 && empty($error)){
+                $return['html'] = generaHabilidades($habilidades);
+            } else {
+                if (!empty($error))
+                    $return['error'] = $error;
+                else{
+                    $return['html'] = '<div class="msgBox d-flex flex-row justify-content-center align-items-center mt-5">
+                        <img src="img/triangulos.svg" class="imgBoxIzq" />
+                        <img src="img/triangulos.svg" class="imgBoxDer" />
+                        <hr class="hrArriba">
+                        <hr class="hrAbajo">
+                        <div class="d-flex flex-column justify-content-center align-items-center display-5 text-center p-4">
+                            <div>Aún no tienes<span class="text-azul1 mx-1">ninguna</span>habilidad capturada</div>
+                        </div>
+                    </div>';
+                }
+            }
+            break;
+        case 2: //Add
+            $_POST['habilidad'] = filter_var($_POST['habilidad'], FILTER_SANITIZE_STRING);
+            $_POST['nivel'] = filter_var($_POST['nivel'], FILTER_SANITIZE_NUMBER_INT);
+            $stmt = $pdo->prepare('SELECT * FROM alu_fi_habilidad(:Usuario_id, :Habilidad_nombre, :Habilidad_nivel)');
+            $stmt->bindParam(':Habilidad_nombre', $_POST['habilidad']);
+            $stmt->bindParam(':Habilidad_nivel', $_POST['nivel']);
+            $stmt->bindParam(':Usuario_id', $_SESSION['usuario_id']);
+            if(!$stmt->execute()){
+                print_r($stmt->errorInfo());
+                $return['error'] = 'No fue posible agregar la habilidad <span class="text-azul1">' . $_POST['habilidad'] . '</span>';
+            }
+            else
+                $return['ok'] = 'Se agregó correctamente la habilidad <span class="text-azul1">' . $_POST['habilidad'] . '</span>';
+            $stmt->closeCursor();
+            $stmt = null;
+            break;
+        case 3: //Update
+            $_POST['habilidad'] = filter_var($_POST['habilidad'], FILTER_SANITIZE_STRING);
+            $_POST['nivel'] = filter_var($_POST['nivel'], FILTER_SANITIZE_NUMBER_INT);
+            $stmt = $pdo->prepare('SELECT * FROM alu_fu_habilidad(:Usuario_id, :Habilidad_id, :Habilidad_nombre, :Habilidad_nivel)');
+            $stmt->bindParam(':Habilidad_nombre', $_POST['habilidad']);
+            $stmt->bindParam(':Habilidad_nivel', $_POST['nivel']);
+            $stmt->bindParam(':Habilidad_id', $_POST['id']);
+            $stmt->bindParam(':Usuario_id', $_SESSION['usuario_id']);
+            if(!$stmt->execute()){
+                print_r($stmt->errorInfo());
+                $return['error'] = 'No fue posible editar la habilidad <span class="text-azul1">' . $_POST['habilidad'] . '</span>';
+            }
+            else
+                $return['ok'] = 'Se editó correctamente la habilidad <span class="text-azul1">' . $_POST['habilidad'] . '</span>';
+            $stmt->closeCursor();
+            $stmt = null;
+            break;
+        case 4: //Delete
+            $stmt = $pdo->prepare('SELECT * FROM alu_fd_habilidad(:Habilidad_id, :Usuario_id)');
+            $stmt->bindParam(':Habilidad_id', $_POST['id']);
+            $stmt->bindParam(':Usuario_id', $_SESSION['usuario_id']);
+            if(!$stmt->execute()){
+                print_r($stmt->errorInfo());
+                $return['error'] = 'No fue posible eliminar la habilidad';
+            }
+            else
+                $return['ok'] = 'Se eliminó de manera exitosa la habilidad';
+            $stmt->closeCursor();
+            $stmt = null;
+            break;
+        case 5: //Select One
+            $habilidad = array();
+            $stmt = $pdo->prepare('SELECT * FROM alu_fs_habilidad(:Usuario_id, :Habilidad_id)');
+            $stmt->bindParam(':Usuario_id', $_SESSION['usuario_id']);
+            $stmt->bindParam(':Habilidad_id', $_POST['id']);
+            if(!$stmt->execute()){
+                $return['error'] = 'No fue posible obtener los datos de la habilidad';
+                print_r($stmt->errorInfo());
+
+            } else {
+                $habilidad = $stmt->fetch();
+                $return['habilidad'] = $habilidad['HabilidadTecnica_nombre'];
+                $return['nivel'] = $habilidad['HabilidadTecnica_nivel'];
+            }
+            $stmt->closeCursor();
+            $stmt = null;
+            break;
+    }
+}
+$return['json'] = json_encode($return);
+echo json_encode($return);
+
+function generaHabilidades($habilidades){
+    $html = '';
+    $texto = '';
+    $tipo = '';
+    foreach ($habilidades as $habilidad){
+        switch ($habilidad['HabilidadTecnica_nivel']){
+            case 1: $texto = 'Básico'; $tipo = 'empty'; break;
+            case 2: $texto= 'Intermedio'; $tipo = 'half'; break;
+            case 3: $texto= 'Avanzado'; $tipo = 'full'; break;
+            default: $texto = ''; $tipo = ''; break;
+        }
+        $html .= '<div class="tarjeta p-3 d-flex flex-column justify-content-start align-items-center">
+                                <div class="align-self-end">
+                                    <span class="ing-editar iconAcciones text-azul2" data-id="' . $habilidad['HabilidadTecnica_id'] . '"></span>
+                                    <span class="ing-basura iconAcciones text-danger" data-id="' . $habilidad['HabilidadTecnica_id'] . '"></span>
+                                </div>
+                                <i class="display-3 ing-insignia3 ' . $tipo . ' mb-2"></i>
+                                <label>' . $texto . '</label>
+                                <div class="display-6 text-center text-primary flex-grow-1 d-flex flex-row justify-content-center align-items-center">' . $habilidad['HabilidadTecnica_nombre'] . '</div>
+                            </div>';
+    }
+    return $html;
+}

+ 188 - 0
action/historial_action.php

@@ -0,0 +1,188 @@
+<?php
+session_start();
+require_once '../include/bd_pdo.php';
+require_once '../classes/Fechas.php';
+
+if(!isset($_POST['tipo'])){
+    $return['error'] = 'Error! No se recibieron los datos.';
+} else {
+    switch ($_POST['tipo']) {        
+        case 1: //Select All
+            $error = '';
+            $estudios = array();
+            $stmt = $pdo->prepare('SELECT * FROM alu_fs_estudioadicional(:Usuario_id, null)');
+            $stmt->bindParam(':Usuario_id', $_SESSION['usuario_id']);
+            if(!$stmt->execute()){
+                $error = 'No fue posible obtener los registros del historial académico';
+                print_r($stmt->errorInfo());
+
+            } else
+                $estudios = $stmt->fetchAll();
+            $stmt->closeCursor();
+            $stmt = null;
+            if(count($estudios) > 0 && empty($error)){
+                $return['html'] = generaHistorico($estudios);
+            } else {
+                if (!empty($error))
+                    $return['error'] = $error;
+                else{
+                    $return['html'] = '<div class="msgBox d-flex flex-row justify-content-center align-items-center mt-5">
+                        <img src="img/triangulos.svg" class="imgBoxIzq" />
+                        <img src="img/triangulos.svg" class="imgBoxDer" />
+                        <hr class="hrArriba">
+                        <hr class="hrAbajo">
+                        <div class="d-flex flex-column justify-content-center align-items-center display-5 text-center p-4">
+                            <div>Aún no tienes<span class="text-azul1 mx-1">ningún</span>registro en el historial</div>
+                        </div>
+                    </div>';
+                }
+            }
+            break;
+        case 2: //Add
+            $_POST['tipo_estudio'] = filter_var($_POST['tipo_estudio'], FILTER_SANITIZE_NUMBER_INT);
+            $_POST['estudio'] = filter_var($_POST['estudio'], FILTER_SANITIZE_STRING);
+            $_POST['institucion'] = filter_var($_POST['institucion'], FILTER_SANITIZE_STRING);
+            $_POST['estatus'] = filter_var($_POST['estatus'], FILTER_SANITIZE_STRING);
+            if($_POST['fecha_ini'] == '')
+                $_POST['fecha_ini'] = null;
+            else{
+                $temp = explode('/',$_POST['fecha_ini']);
+                $_POST['fecha_ini'] = $temp[1] . '-' . $temp[0] . '-01';
+            }
+            if($_POST['fecha_fin'] == '')
+                $_POST['fecha_fin'] = null;
+            else{
+                $temp = explode('/',$_POST['fecha_fin']);
+                $_POST['fecha_fin'] = $temp[1] . '-' . $temp[0] . '-01';
+            }
+            $_POST['cedula'] == '' ?  $_POST['cedula'] = null : $_POST['cedula'] = filter_var($_POST['cedula'], FILTER_SANITIZE_STRING);
+            $stmt = $pdo->prepare('SELECT * FROM alu_fi_estudioadicional(:Usuario_id, :Estudio_nombre, :TipoEstudio_id, :Estudio_fechaInicio, :Estudio_estado, :Estudio_institucion, :Estudio_fechaFin, :Estudio_cedula)');
+            $stmt->bindParam(':Estudio_nombre', $_POST['estudio']);
+            $stmt->bindParam(':TipoEstudio_id', $_POST['tipo_estudio']);
+            $stmt->bindParam(':Estudio_fechaInicio', $_POST['fecha_ini']);
+            $stmt->bindParam(':Estudio_estado', $_POST['estatus']);
+            $stmt->bindParam(':Estudio_institucion', $_POST['institucion']);
+            $stmt->bindParam(':Estudio_fechaFin', $_POST['fecha_fin']);
+            $stmt->bindParam(':Estudio_cedula', $_POST['cedula']);
+            $stmt->bindParam(':Usuario_id', $_SESSION['usuario_id']);
+            if(!$stmt->execute()){
+                print_r($stmt->errorInfo());
+                $return['error'] = 'No fue posible agregar <span class="text-azul1">' . $_POST['estudio'] . '</span> al historial';
+            }
+            else
+                $return['ok'] = 'Se agregó correctamente <span class="text-azul1">' . $_POST['estudio'] . '</span> al historial';
+            $stmt->closeCursor();
+            $stmt = null;
+            break;
+        case 3: //Update
+            $_POST['tipo_estudio'] = filter_var($_POST['tipo_estudio'], FILTER_SANITIZE_NUMBER_INT);
+            $_POST['estudio'] = filter_var($_POST['estudio'], FILTER_SANITIZE_STRING);
+            $_POST['institucion'] = filter_var($_POST['institucion'], FILTER_SANITIZE_STRING);
+            $_POST['estatus'] = filter_var($_POST['estatus'], FILTER_SANITIZE_STRING);
+            if($_POST['fecha_ini'] == '')
+                $_POST['fecha_ini'] = null;
+            else{
+                $temp = explode('/',$_POST['fecha_ini']);
+                $_POST['fecha_ini'] = $temp[1] . '-' . $temp[0] . '-01';
+            }
+            if($_POST['fecha_fin'] == '')
+                $_POST['fecha_fin'] = null;
+            else{
+                $temp = explode('/',$_POST['fecha_fin']);
+                $_POST['fecha_fin'] = $temp[1] . '-' . $temp[0] . '-01';
+            }
+            $_POST['cedula'] == '' ?  $_POST['cedula'] = null : $_POST['cedula'] = filter_var($_POST['cedula'], FILTER_SANITIZE_STRING);
+            $stmt = $pdo->prepare('SELECT * FROM alu_fu_estudioadicional(:Usuario_id, :Estudio_id, :Estudio_nombre, :TipoEstudio_id, :Estudio_fechaInicio, :Estudio_fechaFin, :Estudio_estado, :Estudio_institucion, :Estudio_cedula)');
+            $stmt->bindParam(':Estudio_nombre', $_POST['estudio']);
+            $stmt->bindParam(':TipoEstudio_id', $_POST['tipo_estudio']);
+            $stmt->bindParam(':Estudio_fechaInicio', $_POST['fecha_ini']);
+            $stmt->bindParam(':Estudio_estado', $_POST['estatus']);
+            $stmt->bindParam(':Estudio_institucion', $_POST['institucion']);
+            $stmt->bindParam(':Estudio_fechaFin', $_POST['fecha_fin']);
+            $stmt->bindParam(':Estudio_cedula', $_POST['cedula']);
+            $stmt->bindParam(':Estudio_id', $_POST['id']);
+            $stmt->bindParam(':Usuario_id', $_SESSION['usuario_id']);
+            if(!$stmt->execute()){
+                print_r($stmt->errorInfo());
+                $return['error'] = 'No fue posible editar <span class="text-azul1">' . $_POST['estudio'] . '</span> del historial';
+            }
+            else
+                $return['ok'] = 'Se editó correctamente <span class="text-azul1">' . $_POST['estudio'] . '</span> del historial';
+            $stmt->closeCursor();
+            $stmt = null;
+            break;
+        case 4: //Delete
+            $stmt = $pdo->prepare('SELECT * FROM alu_fd_estudioadicional(:Estudio_id, :Usuario_id)');
+            $stmt->bindParam(':Estudio_id', $_POST['id']);
+            $stmt->bindParam(':Usuario_id', $_SESSION['usuario_id']);
+            if(!$stmt->execute()){
+                print_r($stmt->errorInfo());
+                $return['error'] = 'No fue posible eliminar el idioma';
+            }
+            else
+                $return['ok'] = 'Se eliminó de manera exitosa el idioma';
+            $stmt->closeCursor();
+            $stmt = null;
+            break;
+        case 5: //Select One
+            $estudio = array();
+            $stmt = $pdo->prepare('SELECT * FROM alu_fs_estudioadicional(:Usuario_id, :Estudio_id)');
+            $stmt->bindParam(':Usuario_id', $_SESSION['usuario_id']);
+            $stmt->bindParam(':Estudio_id', $_POST['id']);
+            if(!$stmt->execute()){
+                $return['error'] = 'No fue posible obtener los datos del registro';
+                print_r($stmt->errorInfo());
+
+            } else {
+                $estudio = $stmt->fetch();
+                $return['tipo_estudio'] = $estudio['TipoEstudio_id'];
+                $return['estudio'] = $estudio['EstudioAdicional_nombre'];
+                $temp = explode('-', $estudio['EstudioAdicional_fechaInicio']);
+                $return['fecha_inicio'] = $temp[1] . '/' . $temp[0];
+                if (is_null($estudio['EstudioAdicional_fechaFin']))
+                     $return['fecha_fin'] = '';
+                else {
+                    $temp = explode('-', $estudio['EstudioAdicional_fechaFin']);
+                    $return['fecha_fin'] = $temp[1] . '/' . $temp[0];
+                }
+                $return['estatus'] = $estudio['EstudioAdicional_estado'];
+                $return['institucion'] = $estudio['EstudioAdicional_institucion'];
+                is_null($estudio['EstudioAdicional_cedula']) ? $return['cedula'] = '' : $return['cedula'] = $estudio['EstudioAdicional_cedula'];
+            }
+            $stmt->closeCursor();
+            $stmt = null;
+            break;
+    }
+}
+$return['json'] = json_encode($return);
+echo json_encode($return);
+
+function generaHistorico($estudios){
+    $html = '';
+    $texto = '';
+    $desc_tipo = '';
+    foreach ($estudios as $estudio){
+        switch($estudio["TipoEstudio_id"]){
+            case '1': $desc_tipo="Certificación"; break;
+            case '2': $desc_tipo="Curso";			break;
+            case '3': $desc_tipo="Licenciatura";	break;
+            case '4': $desc_tipo="Especialidad";  break;
+            case '5': $desc_tipo="Maestría";		break;
+            case '6': $desc_tipo="Doctorado";		break;
+            case '7': $desc_tipo="Postdoctorado"; break;
+        }
+        $html .= '<div class="timeline-item">
+                                <div class="bullet position-absolute"><div class="figura"></div></div>
+                                <div class="d-flex justify-content-start align-items-center mb-2">
+                                    <div class="fecha d-flex justify-content-center align-items-center indivisa-text-italic">' . Fechas::fechaRango($estudio['EstudioAdicional_fechaInicio'], $estudio['EstudioAdicional_fechaFin'],'-') . '</div>
+                                    <div class="elementos d-flex justify-content-center align-items-center">
+                                        <span class="ing-editar iconAcciones text-azul2" data-id="' . $estudio['EstudioAdicional_id'] . '"></span>
+                                        <span class="ing-basura iconAcciones text-danger" data-id="' . $estudio['EstudioAdicional_id'] . '"></span>
+                                    </div>
+                                </div>
+                                <div class="display-6"><span class="text-azul2">' . $desc_tipo . ':</span><span class="ml-1 indivisa-text-bold-italic text-primary">' . $estudio["EstudioAdicional_nombre"] . '</span></div>
+                                <div>' . $estudio["EstudioAdicional_institucion"] . '</div>                                
+                            </div>';
+    }
+    return $html;
+}

+ 377 - 0
action/home_action.php

@@ -0,0 +1,377 @@
+<?php
+session_start();
+require_once '../classes/Archivos.php';
+require_once '../classes/SGI.php';
+require_once '../include/bd_pdo.php';
+
+if(!isset($_POST['tipo'])){
+    $return['error'] = 'Error! No se recibieron los datos.';
+} else {
+    switch ($_POST['tipo']) {
+        case 1: //Datos Principales
+            switch ($_POST['accion']) {
+                case 1: //Select
+                    $users = SGI::clavesAlumno($pdo, $_SESSION['usuario_id']);
+                    if(count($users) == 0)
+                        $return['error'] = 'No se obtuvo acceso a los datos del usuario';
+                    else {
+                        $return['nombre'] = $users[0]['Usuario_nombre'];
+                        $return['apellidos'] = $users[0]['Usuario_apellidos'];
+                        $return['curp'] = $users[0]['Usuario_curp'];
+                        switch($users[0]['EstadoAlumno_id']){
+                            case 1: $return['estatus'] = 'Alumno'; break;
+                            case 2: $return['estatus'] = 'Exalumno'; break;
+                            case 4: $return['estatus'] = 'Egresado'; break;
+                        }
+                        $carreras = '';
+                        foreach ($users as $user){
+                            $carreras .= '<div class="d-flex justify-content-start align-items-start align-items-sm-center"><div class="num">' . $user['Usuario_claveULSA'] . '</div><div>' . $user['Carrera_desc'] . '</div></div>';
+                        }
+                        $return['carreras'] = $carreras;
+                        $validando = SGI::validacionDatosAlumno($pdo, $_SESSION['usuario_id']);
+                        $return['validacion'] = $validando;
+                        if ($validando){
+                            $datos = SGI::checkDatosAlumno($pdo, $_SESSION['usuario_id']);
+                            if(count($datos) == 0)
+                                $return['msg'] = '';
+                            else {
+                                $return['msg'] = '<div class="d-flex flex-column">
+                                    <div>La actualización se encuentra en proceso de autorización con los siguientes datos:</div>
+                                    <div class="indivisa-text-bold-italic">' . $datos['Usuario_nombre_new'] . ' ' . $datos['Usuario_apellidos_new'] . '</div>
+                                    <div><span>CURP: </span><span class="indivisa-text-bold-italic">' . $datos['Usuario_curp_new'] . '</span></div>
+                                </div>';                                
+                            }
+                        }
+                    }
+                    break;
+                case 2: //Update
+                    if(!SGI::actualizaDatosAlumno($pdo, filter_var($_POST['nombre'], FILTER_SANITIZE_STRING), filter_var($_POST['apellidos'], FILTER_SANITIZE_STRING), filter_var($_POST['curp'], FILTER_SANITIZE_STRING), $_SESSION['usuario_id']))
+                        $return['error'] = 'No fue posible modificar tu información';
+                    else
+                        $return['ok'] = 'Tus datos han sido envíados a <span class="text-azul1">validación</span><br />Aparecerá un signo <i class="ing-importante2 text-azul1"></i>, el cual desaparecerá una vez validada la información';
+                    break;
+            }
+            break;
+        case 2: //Semblanza
+            switch ($_POST['accion']) {
+                case 1: //Select
+                    $return['acerca'] = SGI::semblanzaAlumno($pdo, $_SESSION['usuario_id']);
+                    break;
+                case 2: //Update
+                    if(SGI::actualizaSemblanzaAlumno($pdo, filter_var($_POST['acerca'], FILTER_SANITIZE_STRING), $_SESSION['usuario_id']))
+                        $return['error'] = 'No fue posible actualizar tu semblanza';
+                    else
+                        $return['ok'] = 'Se actualizó correctamente tu semblanza';
+                    break;
+            }
+            break;
+        case 3: //Redes
+            switch ($_POST['accion']) {
+                case 1: //Select
+                    $contactos = SGI::contactosAlumno($pdo, $_SESSION['usuario_id']);
+                    $emergencia = SGI::emergenciaAlumno($pdo, $_SESSION['usuario_id']);
+                    if(count($contactos) == 0 && count($emergencia) == 0){
+                        $return['html'] = '';
+                    } else {
+                        $redes = getRedes($pdo);
+                        $html = '';
+                        foreach ($redes as $red){
+                            $datos = '';
+                            if ($red['TipoContacto_id'] == 0){
+                                if (count($emergencia) > 0){
+                                    foreach ($emergencia as $emer){
+                                        $datos .= '<li><div><label>' . $emer['ContactoEmergencia_tel'] . '</label><span>' . $emer['ContactoEmergencia_nombre'] . '</span></div></li>';
+                                    }
+                                    $html .= '<button type="button" class="iconRedes" data-toggle="popover" data-trigger="focus" data-html="true" title="' . $red['TipoContacto_desc'] . '" data-placement="auto" 
+                                            data-content="<ul>' . $datos . '</ul>"><i class="' . $red['TipoContacto_icono'] . '"></i></button>';
+                                }
+                            } else {
+                                if (!is_bool(array_search($red['TipoContacto_id'], array_column($contactos, 'TipoContacto_id')))) {
+                                    $keys = array_keys(array_column($contactos, 'TipoContacto_id'), $red['TipoContacto_id']);
+                                    $datos = '';
+                                    foreach ($keys as $key){
+                                        if ($red['TipoContacto_id'] == 2) { //Sólo Código Postal
+                                            $datos .= '<li><div><label>' . $contactos[$key]['Contacto_valor'] . ', ' . $contactos[$key]['SubtipoContacto_desc'] . '</label></div></li>';
+                                        } else {
+                                            $datos .= '<li><div><label>' . $contactos[$key]['Contacto_valor'] . '</label><span>';
+                                            if (!is_null($contactos[$key]['SubtipoContacto_desc']))
+                                                $datos .= $contactos[$key]['SubtipoContacto_desc'] . ' - ';
+                                            $datos .= $contactos[$key]['PerfilContacto_desc'] . '</span></div></li>';
+                                        }
+                                    }
+                                    $html .= '<button type="button" class="iconRedes" data-toggle="popover" data-trigger="focus" data-html="true" title="' . $red['TipoContacto_desc'] . '" data-placement="auto" 
+                                        data-content="<ul>' . $datos . '</ul>"><i class="' . $red['TipoContacto_icono'] . '"></i></button>';
+                                }
+                            }
+                        }
+                        $return['html'] = $html;
+                    }
+                    break;
+                case 2: //Add
+                    $agregado = false;
+                    $msg = '';
+                    if ($_POST['red'] != 0)
+                        $agregado = SGI::agregaContacto($pdo, $_POST['red'], $_POST['dato'], $_POST['uso'], $_SESSION['usuario_id'], $_POST['subtipostatus'], $_POST['subtipo']);
+                    else {
+                        $existe = SGI::emergenciaAlumno($pdo, $_SESSION['usuario_id']);
+                        if (count($existe) == 0)
+                            $agregado = SGI::agregaContactoEmergencia($pdo, $_POST['dato'], filter_var($_POST['nombre'], FILTER_SANITIZE_STRING), $_SESSION['usuario_id']);
+                        else
+                            $msg = 'Únicamente puedes agregar un contacto de emergencia';
+                    }
+                    if(!$agregado){
+                        if (!empty ($msg))
+                            $return['error'] = $msg;
+                        else
+                            $return['error'] = 'No fue posible agregar <span class="text-azul1">' . $_POST['dato'] . '</span>';
+                    } else
+                        $return['ok'] = 'Se agregó correctamente <span class="text-azul1">' . $_POST['dato'] . '</span>';
+                    break;
+                case 3: //Sup
+                    $error = 0;
+                    foreach ($_POST['ids_redes'] as $red){
+                        $red = filter_var($red, FILTER_SANITIZE_NUMBER_INT);
+                        if (intval($red) == 0){
+                            if(!SGI::eliminaContactoEmergencia($pdo, $_SESSION['usuario_id']))
+                                $error++;
+                        } else {
+                            if(!SGI::eliminaContacto($pdo, $_SESSION['usuario_id'], $red))
+                                $error++;
+                        }
+                    }
+                    $total = count($_POST['ids_redes']);
+                    if ($error == 0) {
+                        if ($total == 1)
+                            $return['ok'] = 'Se eliminó de manera exitosa el dato o red';
+                        else
+                            $return['ok'] = 'Se eliminaron de manera exitosa los ' . $total . ' datos y/o redes';
+                    } else {
+                        if ($error == $total){
+                            if ($error == 1)
+                                $return['error'] = 'No fue posible eliminar el dato o red';
+                            else
+                                $return['error'] = 'No fue posible eliminar ningún dato o red';
+                        } else {
+                            if ($error == 1)
+                                $return['error'] = 'No fue posible eliminar un dato o red';
+                            else
+                                $return['error'] = 'No fue posible elimnar ' . $error . ' datos y/o redes';
+                        }
+                    }
+                    break;
+                case 4: //SubtiposContacto
+                    $_POST['tipo_contacto'] = filter_var($_POST['tipo_contacto'], FILTER_SANITIZE_NUMBER_INT);
+                    $subtipos = SGI::getSubTipoContacto($pdo, $_POST['tipo_contacto']);
+                    if(count($subtipos) == 0)
+                        $return['error'] = 'No fue posible obtener los subtipos de contacto';
+                    else {
+                        $html = '';
+                        foreach($subtipos as $subtipo){
+                            $html .= '<li data-id="' . $subtipo['SubtipoContacto_id'] . '">' . $subtipo['SubtipoContacto_desc'] . '</li>';
+                        }
+                        $return['lista'] = $html;
+                        switch ($_POST['tipo_contacto']){
+                            case 1: $return['titulo'] = 'Tipo de teléfono'; $return['msg'] = 'Elige el tipo de teléfono'; break;
+                            case 2: $return['titulo'] = 'País'; $return['msg'] = 'Elige el país del código postal'; break;
+                            default : $return['titulo'] = ''; $return['msg'] = ''; break;
+                        }
+                    }
+                    break;
+                case 5: //Lista para eliminar
+                    $contactos = SGI::contactosAlumno($pdo, $_SESSION['usuario_id']);
+                    $emergencia = SGI::emergenciaAlumno($pdo, $_SESSION['usuario_id']);
+                    if(count($contactos) == 0 && count($emergencia) == 0){
+                        $return['error'] = '<div class="text-white indivisa-text-bold">No fue posible obtener los datos de contacto</div>';
+                    } else {
+                        $redes = getRedes($pdo);
+                        $html = '';
+                        foreach ($redes as $red){
+                            if ($red['TipoContacto_id'] == 0){
+                                $datos = '';                                
+                                foreach ($emergencia as $emer){
+                                    $datos .= '<li data-id="0" data-tel="' . $emer['ContactoEmergencia_tel'] . '" data-desc="' . $emer['ContactoEmergencia_nombre'] . '" class="d-flex flex-row justify-content-start align-items-start red"></span><span class="ing-cancelar"></span><div class="flex-grow-1">' . $emer['ContactoEmergencia_tel'] . '</label><span> (' . $emer['ContactoEmergencia_nombre'] . ')</div><span class="ing-basura"></span></li>';
+                                }
+                                if (!empty($datos)){
+                                    $html .= '<div class="titRed d-flex flex-row justify-content-start align-items-center mb-2"><span class="iconRed ' . $red['TipoContacto_icono'] . '"></span><label>' . $red['TipoContacto_desc'] . '</label></div><ul>' . $datos . '</ul>';
+                                }
+                            } else {
+                                if (!is_bool(array_search($red['TipoContacto_id'], array_column($contactos, 'TipoContacto_id')))) {
+                                    $keys = array_keys(array_column($contactos, 'TipoContacto_id'), $red['TipoContacto_id']);
+                                    $datos = '';                                
+                                    foreach ($keys as $key){
+                                        if ($red['TipoContacto_id'] == 2) { //Sólo Código Postal
+                                            $datos .= '<li data-id="' . $contactos[$key]['Contacto_id'] . '" class="d-flex flex-row justify-content-start align-items-start red"></span><span class="ing-cancelar"></span><div class="flex-grow-1">' . $contactos[$key]['Contacto_valor'] . ', ' . $contactos[$key]['SubtipoContacto_desc'] . '</div><span class="ing-basura"></span></li>';
+                                        } else {
+                                            $datos .= '<li data-id="' . $contactos[$key]['Contacto_id'] . '" class="d-flex flex-row justify-content-start align-items-start red"></span><span class="ing-cancelar"></span><div class="flex-grow-1">' . $contactos[$key]['Contacto_valor'] . '</label><span> (';
+                                            if (!is_null($contactos[$key]['SubtipoContacto_desc']))
+                                                $datos .= $contactos[$key]['SubtipoContacto_desc'] . ' - ';
+                                            $datos .= $contactos[$key]['PerfilContacto_desc'] . ')</div><span class="ing-basura"></span></li>';
+                                        }
+                                    }
+                                    if (!empty($datos)){
+                                        $html .= '<div class="titRed d-flex flex-row justify-content-start align-items-center mb-2"><span class="iconRed ' . $red['TipoContacto_icono'] . '"></span><label>' . $red['TipoContacto_desc'] . '</label></div><ul>' . $datos . '</ul>';
+                                    }                                
+                                }
+                            }
+                        }
+                        if (!empty($html))
+                            $html = '<div class="d-flex flex-column redes">' . $html . '</div>';
+                        $return['html'] = $html;
+                    }
+                    break;
+            }
+            break;            
+        case 4: //Intereses
+            switch ($_POST['accion']) {
+                case 1: //Select
+                    $stmt = $pdo->prepare('SELECT * FROM alu_fs_interes(:Usuario_id) ORDER BY "Interes_nombre"');
+                    $stmt->bindParam(':Usuario_id', $_SESSION['usuario_id']);
+                    if(!$stmt->execute()){
+                        print_r($stmt->errorInfo());
+                        $return['error'] = 'No fue posible obtener la descripción del usuario';
+                    } else {
+                        $intereses = $stmt->fetchAll();
+                        $profesionales = '';
+                        $personales = '';
+                        foreach ($intereses as $interes){
+                            if($interes['Interes_tipo'])
+                                $profesionales .= '<li data-id="' . $interes['Interes_id'] . '" class="d-flex flex-row justify-content-start align-items-start interes col-sm-6"><span class="ing-cuadrado text-azul2"></span><span class="ing-cancelar"></span><div class="flex-grow-1">' . $interes['Interes_nombre'] . '</div><span class="ing-basura"></span></li>';
+                            else
+                                $personales .= '<li data-id="' . $interes['Interes_id'] . '" class="d-flex flex-row justify-content-start align-items-start interes col-sm-6"><span class="ing-cuadrado text-azul2"></span><span class="ing-cancelar"></span><div class="flex-grow-1">' . $interes['Interes_nombre'] . '</div><span class="ing-basura"></span></li>';
+                        }
+                        $return['profesionales'] = $profesionales;
+                        $return['personales'] = $personales;
+                    }
+                    $stmt->closeCursor();
+                    $stmt = null;
+                    break;
+                case 2: //Add
+                    $_POST['interes'] = filter_var($_POST['interes'], FILTER_SANITIZE_STRING);
+                    $_POST['tipo_interes'] = filter_var($_POST['tipo_interes'], FILTER_SANITIZE_NUMBER_INT);
+                    $stmt = $pdo->prepare('SELECT * FROM alu_fi_interes(:Interes_tipo,:Interes,:Usuario_id)');
+                    $stmt->bindParam(':Interes', $_POST['interes']);
+                    $stmt->bindParam(':Interes_tipo', $_POST['tipo_interes']);
+                    $stmt->bindParam(':Usuario_id', $_SESSION['usuario_id']);
+                    if(!$stmt->execute()){
+                        print_r($stmt->errorInfo());
+                        $return['error'] = 'No fue posible agregar el interés <span class="text-azul1">' . $_POST['interes'] . '</span>';
+                    }
+                    else
+                        $return['ok'] = 'Se agregó correctamente el interés <span class="text-azul1">' . $_POST['interes'] . '</span>';
+                    $stmt->closeCursor();
+                    $stmt = null;
+                    break;
+                case 3: //Sup
+                    $error = 0;
+                    foreach ($_POST['ids_intereses'] as $interes){
+                        $interes = filter_var($interes, FILTER_SANITIZE_NUMBER_INT);
+                        $stmt = $pdo->prepare('SELECT * FROM alu_fd_interes(:Interes_id, :Usuario_id)');
+                        $stmt->bindParam(':Interes_id', $interes);
+                        $stmt->bindParam(':Usuario_id', $_SESSION['usuario_id']);
+                        if(!$stmt->execute()){
+                            print_r($stmt->errorInfo());
+                            $error++;
+                        }
+                        $stmt->closeCursor();
+                        $stmt = null;
+                    }
+                    $total = count($_POST['ids_intereses']);
+                    if ($error == 0) {
+                        if ($total == 1)
+                            $return['ok'] = 'Se eliminó de manera exitosa el interes';
+                        else
+                            $return['ok'] = 'Se eliminaron de manera exitosa los ' . $total . ' intereses';
+                    } else {
+                        if ($error == $total){
+                            if ($error == 1)
+                                $return['error'] = 'No fue posible eliminar el interés';
+                            else
+                                $return['error'] = 'No fue posible eliminar ningún interés';
+                        } else {
+                            if ($error == 1)
+                                $return['error'] = 'No fue posible eliminar un interés';
+                            else
+                                $return['error'] = 'No fue posible elimnar ' . $error . ' intereses';
+                        }
+                    }
+                    break;
+            }
+            break;
+        case 5: //Foto
+            switch ($_POST['accion']) {
+                case 1: //Select
+                    $foto = SGI::fotoAlumno($pdo, $_SESSION['usuario_id']);
+                    $es_admin = SGI::esAdministrativo($pdo, $_SESSION['usuario_id']);
+                    if (count($es_admin) == 0 || (isset($es_admin['estatus']) && $es_admin['estatus'] == 'BAJA')){
+                        if (str_contains($foto, 'nico'))
+                            $return['foto'] = 'img/' . $foto;
+                        else
+                            $return['foto'] = 'archivos/alumnos/' . $idalumno . '/' . $foto;
+                    } else {
+                        if (str_contains($foto, 'nico'))
+                            $return['foto'] = 'img/' . $foto;
+                        else
+                            $return['foto'] = 'http://atenea.lci.ulsa.mx/img/fotos/'. $foto;
+                    }
+                    break;
+                case 2: //Actualiza Foto
+                    $es_admin = SGI::esAdministrativo($pdo, $_SESSION['usuario_id']);
+                    if (count($es_admin) == 0 || (isset($es_admin['estatus']) && $es_admin['estatus'] == 'BAJA')){
+                        $anterior = SGI::fotoAlumno($pdo, $_SESSION['usuario_id']);
+                        $cargada = true;
+                        $nombre = '';
+                        if(!boolval($_POST['limpia'])) {
+                            $extension = substr($_FILES['archivo']['name'][0], strrpos($_FILES['archivo']['name'][0], '.'));
+                            $nombre = 'foto_' . $_SESSION['usuario_id'] . '_' . uniqid() . $extension;
+                            if (!Archivos::existeCapeta('archivos/alumnos/' . $_SESSION['usuario_id']))
+                                Archivos::creaCarpeta('archivos/alumnos/' . $_SESSION['usuario_id']);
+                            if (!Archivos::agregaArchivo($_FILES['archivo']['tmp_name'][0], 'archivos/alumnos/' . $_SESSION['usuario_id'], $nombre))
+                                $cargada = false;
+                        }
+                        if($cargada) {
+                            if ($anterior != SGI::$foto_pefil)
+                                Archivos::eliminaArchivo('', $anterior);
+                            if(boolval($_POST['limpia']))
+                                $cargada = SGI::actualizaFotoAlumno($pdo, $_SESSION['usuario_id']);
+                            else
+                                $cargada = SGI::actualizaFotoAlumno($pdo, $_SESSION['usuario_id'], $nombre);
+                            if (!$cargada)
+                                $return['error'] = 'No fue posible actualizar la foto';
+                            else
+                                $return['ok'] = 'Se cambió correctamente la foto';
+                        } else 
+                        $return['error'] = 'No fue posible subir la foto';
+                    } else
+                        $return['error'] = 'Al ser colaborador de la facultad, tu foto deberás cambiarla en APSA';
+                    break;
+            }
+            break;
+    }
+}
+$return['json'] = json_encode($return);
+echo json_encode($return);
+
+function getRedes($pdo){
+    $redes = SGI::getRedes($pdo);
+    if (count($redes) > 0){
+        array_push($redes, array('TipoContacto_id' => 0, 'TipoContacto_desc' => 'Contacto de Emergencia', 'TipoContacto_icono' => 'fa-solid fa-book-medical', 'SubtipoContacto' => false));
+        $temp = array();
+        $key = array_search(2, array_column($redes, 'TipoContacto_id'));
+        $temp = $redes[$key];
+        unset($redes[$key]);
+        array_unshift($redes, $temp);
+        $key = array_search(3, array_column($redes, 'TipoContacto_id'));
+        $temp = $redes[$key];
+        unset($redes[$key]);
+        array_unshift($redes, $temp);
+        $key = array_search(1, array_column($redes, 'TipoContacto_id'));
+        $temp = $redes[$key];
+        unset($redes[$key]);
+        array_unshift($redes, $temp);
+        $key = array_search(0, array_column($redes, 'TipoContacto_id'));
+        $temp = $redes[$key];
+        unset($redes[$key]);
+        array_unshift($redes, $temp);
+    }
+    return $redes;
+}

+ 327 - 0
action/horarios_action.php

@@ -0,0 +1,327 @@
+<?php
+session_start();
+require_once '../include/bd_pdo.php';
+require_once '../include/xtemplate.class.php';
+require_once '../classes/SGI.php';
+
+if(!isset($_POST['id'])){
+    $return['error'] = 'Error! No se recibieron los datos.';
+} else {
+    define('HORA_INICIO', 6);//hora inicial de horario
+    define('HORA_FINAL', 22);//hora final de horario
+    define('FRACCION_HORA', 4);//fracciones en una hora
+
+    define('DURACION_MIN', 60);//hora inicial de horario
+    define('DURACION_MAX', 360);//hora final de horario
+    define('DURACION_STEP', 15);//fracciones en una hora
+    
+    define('ALTO_RENGLON', 30);//alto del renglón
+    
+    $error = '';
+    switch($_POST['tipo']){
+        case 1: //Grupos
+            $horario_rs = SGI::getHorarioGrupo($pdo, filter_input(INPUT_POST, 'id', FILTER_SANITIZE_NUMBER_INT));
+            $horaMin = horaMin($horario_rs, 'Horario_hora');
+            $horaMax = horaMax($horario_rs, 'Horario_hora_final');
+            $dias_rs = SGI::getDias($pdo);
+            if (empty($error)) {
+                $xtpl = new XTemplate('../templates/horario_grupo.tpl.html');
+                foreach($dias_rs as $dia){
+                    $xtpl->assign('DIA', $dia['Dia_desc']);
+                    $xtpl->assign('ID_DIA', $dia['Dia_id']);
+                    $xtpl->parse('main.header');
+                }
+
+                $rs_i = 0;
+                $spacerArr = array(1=>0,0,0,0,0,0);
+                $pendiente = '<li class="pendiente">Pendiente</em>';
+                $horas_dif = intval(date('H', strtotime($horaMax))) - intval(date('H', strtotime($horaMin)));
+
+                $sub_prof_num = 0;
+                $sub_num = 0;
+                $tiene_submaterias = false;
+
+                for($h = date('H', strtotime($horaMin)); $h <= date('H', strtotime($horaMax)); $h++){
+                    $xtpl->assign('HORA', date('H', strtotime($h.':00')));
+                    $xtpl->assign('FRACCIONES', FRACCION_HORA);
+                    $xtpl->parse('main.hora_row.hora');
+                    for($f = 0; $f < FRACCION_HORA; $f++){
+                        foreach($dias_rs as $dia){
+                            if($rs_i < count($horario_rs) && date('H:i', strtotime($horario_rs[$rs_i]['Horario_hora'])) == date('H:i', strtotime($h.':'.($f * (60/FRACCION_HORA)))) && $horario_rs[$rs_i]['Dia_id'] == $dia['Dia_id']){
+                                if((isset($filter_fecha) && strtotime($filter_fecha) >= strtotime($horario_rs[$rs_i]['fecha_inicial']) && strtotime($filter_fecha) <= strtotime($horario_rs[$rs_i]['fecha_final'])  ) || !isset($filter_fecha)){
+                                    $size = $horario_rs[$rs_i]['Horario_duracion']/(60/FRACCION_HORA);
+                                    $spacerArr[$dia['Dia_id']] = $size -1;
+                                    $xtpl->assign('ID_DIA', $dia['Dia_id']);
+                                    $xtpl->assign('DURACION_SIZE', $size);
+                                    $xtpl->assign('ALTO_DIV', $size * ALTO_RENGLON);
+                                    $xtpl->assign('MATERIA', $horario_rs[$rs_i]['Materia_desc']);
+
+                                    $xtpl->assign('HORA_I', substr($horario_rs[$rs_i]['Horario_hora'], 0, 5));
+                                    $xtpl->assign('HORA_F', substr($horario_rs[$rs_i]['Horario_hora_final'], 0, 5));
+
+                                    if($horario_rs[$rs_i]['Salon_desc'] != '')
+                                        if($horario_rs[$rs_i]['Salon_desc_larga'] != '')
+                                            $xtpl->assign('SALON', $horario_rs[$rs_i]['Salon_desc'].' ['.$horario_rs[$rs_i]['Salon_desc_larga'].']');
+                                        else
+                                            $xtpl->assign('SALON', $horario_rs[$rs_i]['Salon_desc']);
+                                    else{
+                                        if(!isset($horario_rs[$rs_i]['TipoSubmateria_id']) || $horario_rs[$rs_i]['TipoSubmateria_id'] == 0)
+                                            $xtpl->assign('SALON', '<em>Pendinte</em>');
+                                        else
+                                            $xtpl->assign('SALON', '*');
+                                    }
+
+                                    //----- Carga profesores ----
+                                    if($horario_rs[$rs_i]['TipoSubmateria_id'] == 0)
+                                        $profesores_rs = SGI::getProfesorHorarioGrupo($pdo, $horario_rs[$rs_i]['HorarioGrupo_id']);
+                                    else { //Con submaterias
+                                        //----- Carga submaterias ----
+                                        $submaterias_rs = SGI::getSubMateriaHorarioGrupo($pdo, $horario_rs[$rs_i]['HorarioGrupo_id']);
+                                        $sub_prof_num = 0;
+                                        $nombre_impreso = false;
+
+                                        if(count($submaterias_rs) > 0){
+                                            $tiene_submaterias = true;
+                                            foreach($submaterias_rs as $submateria){
+                                                $xtpl->assign('SUBMATERIA', $submateria['Submateria_desc']);
+                                                $xtpl->assign('DIA', diaNombre($horario_rs[$rs_i]['Dia_id']));
+                                                //---
+                                                $profesores_rs = SGI::getSubMateriaHorarioGrupoProfesor($pdo, $horario_rs[$rs_i]['HorarioGrupo_id'], $submateria['Submateria_id']);
+
+                                                $sub_prof_num += count($profesores_rs);
+
+                                                if(isset($profesores_rs) && count($profesores_rs) > 0){
+                                                    $profesores_all = '';
+                                                    foreach($profesores_rs as $profesor){
+                                                        $prof_nombre = '<li class="profesor">' . $profesor['Usuario_apellidos'] . ' ' . $profesor['Usuario_nombre'] . '</li>';
+                                                        $profesores_all .= $prof_nombre;
+                                                    }
+                                                    $xtpl->assign('PROFESOR_SUB', $profesores_all);
+                                                $xtpl->assign('SALON_SUB', $submateria['Salon_desc']);
+                                                $xtpl->parse('main.submaterias_block.row.submateria');
+
+                                                if(!$nombre_impreso){
+                                                    $nombre_impreso = true;
+                                                    $xtpl->assign('MAT_ROWSPAN', count($submaterias_rs));
+                                                    $xtpl->parse('main.submaterias_block.row.materia');
+                                                }
+
+                                                $xtpl->parse('main.submaterias_block.row');
+                                                }//solo si hay profesor
+                                            }
+                                        }
+                                        unset($profesores_rs);
+                                    }//fin con submaterias
+
+                                    if(isset($profesores_rs) && count($profesores_rs) > 0){
+                                        foreach($profesores_rs as $profesor){
+                                            $prof_nombre = '<li class="profesor">' . $profesor['Usuario_apellidos'] . ' ' . $profesor['Usuario_nombre'] . '</li>';
+                                            $xtpl->assign('PROFESOR', $prof_nombre);
+                                            $xtpl->parse('main.hora_row.td.td_horario.profesor');
+                                        }
+                                    }else{
+                                        if($horario_rs[$rs_i]['TipoSubmateria_id'] == 0){//no pinta maestros electivas o secuenciales
+                                            $prof_nombre = $pendiente;
+                                            $xtpl->assign('PROFESOR', $prof_nombre);
+                                            $xtpl->parse('main.hora_row.td.td_horario.profesor');
+                                        }
+                                    }
+
+                                    $xtpl->parse('main.hora_row.td.td_horario.hora');
+                                    $xtpl->parse('main.hora_row.td.td_horario.texto');
+                                    $xtpl->parse('main.hora_row.td.td_horario.spacer');
+                                    $xtpl->parse('main.hora_row.td.td_horario');
+                                }else
+                                    $xtpl->parse('main.hora_row.td.td_vacio');
+                                $rs_i++;
+                            }else{
+                                if(!isset($spacerArr[$dia['Dia_id']]) || $spacerArr[$dia['Dia_id']] == 0){
+                                    $xtpl->assign('ID_DIA', $dia['Dia_id']);
+                                    $xtpl->parse('main.hora_row.td.td_vacio');
+                                }else
+                                    $spacerArr[$dia['Dia_id']]--;
+                            }
+                            $xtpl->parse('main.hora_row.td');
+                        }
+                        $xtpl->parse('main.hora_row');
+                    }
+                }
+
+                if($tiene_submaterias){
+                    $xtpl->parse('main.submaterias_block.materia');
+                    $xtpl->parse('main.submaterias_block');
+                }
+                $xtpl->parse('main');
+                $return['html'] = $xtpl->text('main');
+                $return['tabla'] = true;
+            } else {
+                $return['html'] = '<div class="marco">
+                        <div class="msgAviso d-flex flex-row justify-content-between align-items-stretch mt-4">
+                            <div class="iconAviso bg-danger d-flex justify-content-center align-items-center"><i class="display-3 ing-cancelar"></i></div>
+                            <div class="txtAviso flex-grow-1 d-flex flex-column justify-content-center align-items-center">
+                                <div class="display-5 indivisa-text-black mb-3">¡Error!</div>
+                                <div class="text-center">' . $error . '</div>
+                            </div>
+                        </div>
+                    </div>';
+                $return['tabla'] = false;
+            }
+            break;
+        case 2: //Docente
+            date_default_timezone_set('America/Mexico_City');
+            $horario_rs = SGI::getHorarioProfesor($pdo, filter_input(INPUT_POST, 'id', FILTER_SANITIZE_NUMBER_INT), date('Y-m-d'));
+            $horaMin = horaMin($horario_rs, 'Hora_inicio');
+            $horaMax = horaMax($horario_rs, 'Hora_final');
+            $dias_rs = SGI::getDias($pdo);
+            if (empty($error)) {
+                $xtpl = new XTemplate('../templates/horario_profesor.tpl.html');
+                foreach($dias_rs as $dia){
+                    $xtpl->assign('DIA', $dia['Dia_desc']);
+                    $xtpl->assign('ID_DIA', $dia['Dia_id']);
+                    $xtpl->parse('main.header');
+                }
+
+                $rs_i = 0;
+                $spacerArr = array(1=>0,0,0,0,0,0);
+                $horas_dif = intval(date('H', strtotime($horaMax))) - intval(date('H', strtotime($horaMin)));
+
+
+                for($h = date('H', strtotime($horaMin)); $h <= date('H', strtotime($horaMax)); $h++){
+                    $xtpl->assign('HORA', date('H', strtotime($h.':00')));
+                    $xtpl->assign('FRACCIONES', FRACCION_HORA);
+                    $xtpl->parse('main.hora_row.hora');
+                    for($f = 0; $f < FRACCION_HORA; $f++){
+                        foreach($dias_rs as $dia){
+                            if($rs_i < count($horario_rs) && date('H:i', strtotime($horario_rs[$rs_i]['Hora_inicio'])) == date('H:i', strtotime($h.':'.($f * (60/FRACCION_HORA)))) && $horario_rs[$rs_i]['Dia_id'] == $dia['Dia_id']){
+                                if((isset($filter_fecha) && strtotime($filter_fecha) >= strtotime($horario_rs[$rs_i]['fecha_inicial']) && strtotime($filter_fecha) <= strtotime($horario_rs[$rs_i]['fecha_final'])  ) || !isset($filter_fecha)){
+                                    $size = $horario_rs[$rs_i]['Duracion']/(60/FRACCION_HORA);
+                                    $spacerArr[$dia['Dia_id']] = $size -1;
+                                    $xtpl->assign('ID_DIA', $dia['Dia_id']);
+                                    $xtpl->assign('DURACION_SIZE', $size);
+                                    $xtpl->assign('ALTO_DIV', $size * ALTO_RENGLON);                                    
+
+                                    if ($horario_rs[$rs_i]['TipoHorario_desc'] == 'Docencia'){
+                                        $xtpl->assign('HORA_I', substr($horario_rs[$rs_i]['Hora_inicio'], 0, 5));
+                                        $xtpl->assign('HORA_F', substr($horario_rs[$rs_i]['Hora_final'], 0, 5));
+
+                                        $xtpl->assign('MATERIA', $horario_rs[$rs_i]['Materia_desc']);
+                                        $xtpl->assign('GRUPO', $horario_rs[$rs_i]['Grupo_desc'].' '.$horario_rs[$rs_i]['Carrera_prefijo']);
+
+                                        if($horario_rs[$rs_i]['Salon_desc'] != '') {
+                                            if($horario_rs[$rs_i]['Salon_desc_larga'] != '')
+                                                $xtpl->assign('SALON', $horario_rs[$rs_i]['Salon_desc'].' ['.$horario_rs[$rs_i]['Salon_desc_larga'].']');
+                                            else
+                                                $xtpl->assign('SALON', $horario_rs[$rs_i]['Salon_desc']);
+                                        } else{
+                                            if(!isset($horario_rs[$rs_i]['TipoSubmateria_id']) || $horario_rs[$rs_i]['TipoSubmateria_id'] == 0)
+                                                $xtpl->assign('SALON', '<em>Pendinte</em>');
+                                            else
+                                                $xtpl->assign('SALON', '*');
+                                        }
+
+                                        $xtpl->parse('main.hora_row.td.td_horario.hora');
+                                        $xtpl->parse('main.hora_row.td.td_horario.texto');
+                                        $xtpl->parse('main.hora_row.td.td_horario.grupo');
+                                        $xtpl->parse('main.hora_row.td.td_horario.spacer');
+                                        $xtpl->parse('main.hora_row.td.td_horario');
+                                    } else {
+                                        switch ($horario_rs[$rs_i]['TipoHorario_id']){
+                                            case 1: $xtpl->assign('CLASE', 'atencion'); break;
+                                            case 2: $xtpl->assign('CLASE', 'gestion'); break;
+                                        }
+                                        $xtpl->assign('HORA_I', substr($horario_rs[$rs_i]['Hora_inicio'], 0, 5));
+                                        $xtpl->assign('HORA_F', substr($horario_rs[$rs_i]['Hora_final'], 0, 5));
+
+                                        $xtpl->parse('main.hora_row.td.td_bloque.hora');
+                                        $xtpl->parse('main.hora_row.td.td_bloque.spacer');
+                                        $xtpl->parse('main.hora_row.td.td_bloque');
+                                    }
+                                }else
+                                    $xtpl->parse('main.hora_row.td.td_vacio');
+                                $rs_i++;
+                            }else{
+                                if(!isset($spacerArr[$dia['Dia_id']]) || $spacerArr[$dia['Dia_id']] == 0){
+                                    $xtpl->assign('ID_DIA', $dia['Dia_id']);
+                                    $xtpl->parse('main.hora_row.td.td_vacio');
+                                }else
+                                    $spacerArr[$dia['Dia_id']]--;
+                            }
+                            $xtpl->parse('main.hora_row.td');
+                        }
+                        $xtpl->parse('main.hora_row');
+                    }
+                }
+
+                $xtpl->parse('main');
+                $return['html'] = $xtpl->text('main');
+                $return['tabla'] = true;
+            } else {
+                $return['html'] = '<div class="marco">
+                        <div class="msgAviso d-flex flex-row justify-content-between align-items-stretch mt-4">
+                            <div class="iconAviso bg-danger d-flex justify-content-center align-items-center"><i class="display-3 ing-cancelar"></i></div>
+                            <div class="txtAviso flex-grow-1 d-flex flex-column justify-content-center align-items-center">
+                                <div class="display-5 indivisa-text-black mb-3">¡Error!</div>
+                                <div class="text-center">' . $error . '</div>
+                            </div>
+                        </div>
+                    </div>';
+                $return['tabla'] = false;
+            }
+            break;
+        case 3: //Extraordinario
+            if (isset($_POST['plan']) && isset($_POST['semestre']) && isset($_POST['periodo'])) {
+                $xtpl = new XTemplate('../templates/horario_extras.tpl.html');
+                //$examenes_extraordinarios = SGI::getExtraordinarios($pdo, filter_input(INPUT_POST, 'periodo', FILTER_SANITIZE_NUMBER_INT), filter_input(INPUT_POST, 'semestre', FILTER_SANITIZE_NUMBER_INT), filter_input(INPUT_POST, 'plan', FILTER_SANITIZE_NUMBER_INT));
+                //Tiene el id del periodo fijo porque aú no existe un indicador de extraordinarios activos
+                $examenes_extraordinarios = SGI::getExtraordinarios($pdo, 38, filter_input(INPUT_POST, 'semestre', FILTER_SANITIZE_NUMBER_INT), filter_input(INPUT_POST, 'plan', FILTER_SANITIZE_NUMBER_INT));
+                if (count($examenes_extraordinarios) == 0){
+                    $xtpl->parse('main.sin_extras');                                        
+                } else {
+                    foreach ($examenes_extraordinarios as $examen) {
+                        $xtpl->assign('MATERIA', $examen['Materia_desc']);
+                        $salon = $examen["Salon_desc"];
+                        if(!empty($examen["Salon_desc_larga"]))
+                            $salon .= "-".$examen["Salon_desc_larga"];
+                        if (empty($salon))
+                            $xtpl->assign('SALON', '<i>Pendiente</i>');
+                        else
+                            $xtpl->assign('SALON', $salon);
+                        $xtpl->assign('PROFESOR', $examen["Profesor_nombre"] . " " . $examen["Profesor_apellidos"]);
+                        $xtpl->assign('FECHA', substr($examen["Examen_fechahora_inicial"], 0, 10));
+                        $xtpl->assign('HORA', substr($examen["Examen_fechahora_inicial"], 10, 6) . ' - ' . substr($examen["Examen_fechahora_final"], 10, 6));
+                        $xtpl->parse('main.extras.row');                        
+                    }
+                    $xtpl->parse('main.extras'); 
+                }
+                $xtpl->parse('main');
+                $return['html'] = $xtpl->text('main');
+            } else
+                $return['html'] = '<h3 class="text-danger text-center mt-4">No fue posible obtener los horarios de los extraordinarios</h3>';
+            break;
+    }
+}
+$return['json'] = json_encode($return);
+echo json_encode($return);
+
+function horaMin($arr, $campo){
+    $min = '';
+    foreach($arr as $horario){
+        if($min == '' || date('H:i', strtotime($horario[$campo])) < date('H:i', strtotime($min))){
+            $min = $horario[$campo];
+        }
+    }
+    return date('H:i', strtotime($min));
+}
+function horaMax($arr, $campo){
+    $max = '';
+    foreach($arr as $horario){
+        if($max == '' || date('H:i', strtotime($horario[$campo])) > date('H:i', strtotime($max))){
+            $max = $horario[$campo];
+        }
+    }
+    return date('H:i', strtotime($max));
+}
+function diaNombre($num){
+    $dias = array('Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado');
+    return $dias[intval($num)];
+}

+ 130 - 0
action/idioma_action.php

@@ -0,0 +1,130 @@
+<?php
+session_start();
+require_once '../include/bd_pdo.php';
+
+if(!isset($_POST['tipo'])){
+    $return['error'] = 'Error! No se recibieron los datos.';
+} else {
+    switch ($_POST['tipo']) {        
+        case 1: //Select All
+            $error = '';
+            $idiomas = array();
+            $stmt = $pdo->prepare('SELECT * FROM alu_fs_idioma(:Usuario_id, null)');
+            $stmt->bindParam(':Usuario_id', $_SESSION['usuario_id']);
+            if(!$stmt->execute()){
+                $error = 'No fue posible obtener los idiomas';
+                print_r($stmt->errorInfo());
+
+            } else
+                $idiomas = $stmt->fetchAll();
+            $stmt->closeCursor();
+            $stmt = null;
+            if(count($idiomas) > 0 && empty($error)){
+                $return['html'] = generaIdiomas($idiomas);
+            } else {
+                if (!empty($error))
+                    $return['error'] = $error;
+                else{
+                    $return['html'] = '<div class="msgBox d-flex flex-row justify-content-center align-items-center mt-5">
+                        <img src="img/triangulos.svg" class="imgBoxIzq" />
+                        <img src="img/triangulos.svg" class="imgBoxDer" />
+                        <hr class="hrArriba">
+                        <hr class="hrAbajo">
+                        <div class="d-flex flex-column justify-content-center align-items-center display-5 text-center p-4">
+                            <div>Aún no tienes<span class="text-azul1 mx-1">ningún</span>idioma capturado</div>
+                        </div>
+                    </div>';
+                }
+            }
+            break;
+        case 2: //Add
+            $_POST['idioma'] = filter_var($_POST['idioma'], FILTER_SANITIZE_STRING);
+            $_POST['nivel'] = filter_var($_POST['nivel'], FILTER_SANITIZE_NUMBER_INT);
+            $stmt = $pdo->prepare('SELECT * FROM alu_fi_idioma(:Usuario_id, :Idioma_nombre, :Idioma_nivel)');
+            $stmt->bindParam(':Idioma_nombre', $_POST['idioma']);
+            $stmt->bindParam(':Idioma_nivel', $_POST['nivel']);
+            $stmt->bindParam(':Usuario_id', $_SESSION['usuario_id']);
+            if(!$stmt->execute()){
+                print_r($stmt->errorInfo());
+                $return['error'] = 'No fue posible agregar el idioma <span class="text-azul1">' . $_POST['idioma'] . '</span>';
+            }
+            else
+                $return['ok'] = 'Se agregó correctamente el idioma <span class="text-azul1">' . $_POST['idioma'] . '</span>';
+            $stmt->closeCursor();
+            $stmt = null;
+            break;
+        case 3: //Update
+            $_POST['idioma'] = filter_var($_POST['idioma'], FILTER_SANITIZE_STRING);
+            $_POST['nivel'] = filter_var($_POST['nivel'], FILTER_SANITIZE_NUMBER_INT);
+            $stmt = $pdo->prepare('SELECT * FROM alu_fu_idioma(:Usuario_id, :Idioma_id, :Idioma_nombre, :Idioma_nivel)');
+            $stmt->bindParam(':Idioma_nombre', $_POST['idioma']);
+            $stmt->bindParam(':Idioma_nivel', $_POST['nivel']);
+            $stmt->bindParam(':Idioma_id', $_POST['id']);
+            $stmt->bindParam(':Usuario_id', $_SESSION['usuario_id']);
+            if(!$stmt->execute()){
+                print_r($stmt->errorInfo());
+                $return['error'] = 'No fue posible editar el idioma <span class="text-azul1">' . $_POST['idioma'] . '</span>';
+            }
+            else
+                $return['ok'] = 'Se editó correctamente el idioma <span class="text-azul1">' . $_POST['idioma'] . '</span>';
+            $stmt->closeCursor();
+            $stmt = null;
+            break;
+        case 4: //Delete
+            $stmt = $pdo->prepare('SELECT * FROM alu_fd_idioma(:Idioma_id, :Usuario_id)');
+            $stmt->bindParam(':Idioma_id', $_POST['id']);
+            $stmt->bindParam(':Usuario_id', $_SESSION['usuario_id']);
+            if(!$stmt->execute()){
+                print_r($stmt->errorInfo());
+                $return['error'] = 'No fue posible eliminar el idioma';
+            }
+            else
+                $return['ok'] = 'Se eliminó de manera exitosa el idioma';
+            $stmt->closeCursor();
+            $stmt = null;
+            break;
+        case 5: //Select One
+            $idioma = array();
+            $stmt = $pdo->prepare('SELECT * FROM alu_fs_idioma(:Usuario_id, :Idioma_id)');
+            $stmt->bindParam(':Usuario_id', $_SESSION['usuario_id']);
+            $stmt->bindParam(':Idioma_id', $_POST['id']);
+            if(!$stmt->execute()){
+                $return['error'] = 'No fue posible obtener los datos del idioma ';
+                print_r($stmt->errorInfo());
+
+            } else {
+                $idioma = $stmt->fetch();
+                $return['idioma'] = $idioma['Idioma_nombre'];
+                $return['nivel'] = $idioma['Idioma_nivel'];
+            }
+            $stmt->closeCursor();
+            $stmt = null;
+            break;
+    }
+}
+$return['json'] = json_encode($return);
+echo json_encode($return);
+
+function generaIdiomas($idiomas){
+    $html = '';
+    $texto = '';
+    $tipo = '';
+    foreach ($idiomas as $idioma){
+        switch ($idioma['Idioma_nivel']){
+            case 1: $texto = 'Básico'; $tipo = 'empty'; break;
+            case 2: $texto= 'Intermedio'; $tipo = 'half'; break;
+            case 3: $texto= 'Avanzado'; $tipo = 'full'; break;
+            default: $texto = ''; $tipo = ''; break;
+        }
+        $html .= '<div class="tarjeta p-3 d-flex flex-column justify-content-start align-items-center">
+                                <div class="align-self-end">
+                                    <span class="ing-editar iconAcciones text-azul2" data-id="' . $idioma['Idioma_id'] . '"></span>
+                                    <span class="ing-basura iconAcciones text-danger" data-id="' . $idioma['Idioma_id'] . '"></span>
+                                </div>
+                                <i class="display-3 ing-estrella1 ' . $tipo . ' mb-2"></i>
+                                <label>' . $texto . '</label>
+                                <div class="display-6 text-center text-primary flex-grow-1 d-flex flex-row justify-content-center align-items-center">' . $idioma['Idioma_nombre'] . '</div>
+                            </div>';
+    }
+    return $html;
+}

+ 129 - 0
action/index_action.php

@@ -0,0 +1,129 @@
+<?php
+session_start();
+
+require_once '../include/bd_pdo.php';//die on error
+require_once '../classes/SGI.php';
+require_once '../include/nusoap/nusoap.php';
+
+$_SESSION = array();
+
+$pag = explode('?', $_SERVER["HTTP_REFERER"]);
+$pag = explode('/', $pag[0]);
+$pag = $pag[count($pag)-1];
+
+if(!isset($_POST['username']) || !isset($_POST['passwd'])){
+    header('Location: ../' . $pag . '?error=0');
+    exit;
+} else {
+    $user = trim(filter_input(INPUT_POST, 'username'));
+    $pass = trim(filter_input(INPUT_POST, 'passwd'));    
+    $client = new nusoap_client('http://200.13.89.8/webservice/valida_cidit.php?wsdl', 'wsdl');//dirección del webservice
+        if ($client->getError()) {
+            header('Location: ../' . $pag . '?error=1');
+            exit;
+        } else {
+            $result = $client->call('valida_user', array($user, $pass));//función en el webservice. user necesita ad, do, al
+            if (!$result){
+                header('Location: ../' . $pag . '?error=1');
+                exit;
+            } else {
+                if (boolval($result['error'])){
+                    header('Location: ../' . $pag . '?error=2');
+                    exit;
+                } else {
+                    if ($pag == 'index_bypass.php'){
+                        $esSuperAdmin = SGI::claveEsSuperAdmin($pdo, $result['usuario_clave']);
+                        if ($esSuperAdmin){
+                            if ($_POST['alumno'] != 0){
+                                $userId = intval(filter_var($_POST['alumno'], FILTER_SANITIZE_NUMBER_INT));
+                                $_SESSION['es_alumno'] = true;
+                                $_SESSION['RolUsuario_id'] = SGI::getRol($pdo, 'ALUMNO');
+                                if (!empty($_SESSION['RolUsuario_id']))
+                                    $_SESSION['RolUsuario_desc'] = 'ALUMNO';
+                            } else {
+                                $esAlumno = SGI::buscaAlumno($pdo, 0, intval(filter_var($_POST['clave'], FILTER_SANITIZE_NUMBER_INT)));
+                                if (!is_bool($esAlumno)){
+                                    $_SESSION['es_alumno'] = false;
+                                    if (isset($esAlumno['Usuario_id'])) {
+                                        $userId = $esAlumno['Usuario_id'];
+                                        $_SESSION['es_alumno'] = true;
+                                        $_SESSION['RolUsuario_id'] = SGI::getRol($pdo, 'ALUMNO');
+                                    if (!empty($_SESSION['RolUsuario_id']))
+                                        $_SESSION['RolUsuario_desc'] = 'ALUMNO';
+                                    } else {
+                                        header('Location: ../' . $pag . '?error=5');
+                                        exit;
+                                    }
+                                } else {
+                                    header('Location: ../' . $pag . '?error=3');
+                                    exit;
+                                }
+                            }
+                        } else {
+                            header('Location: ../' . $pag . '?error=4');
+                            exit;
+                        }
+                    } else {
+                        $esAlumno = SGI::buscaAlumno($pdo, 0, $result['usuario_clave']);
+                        if (!is_bool($esAlumno)){
+                            $_SESSION['es_alumno'] = false;
+                            if (isset($esAlumno['Usuario_id'])) {
+                                $userId = $esAlumno['Usuario_id'];
+                                $_SESSION['es_alumno'] = true;
+                                $_SESSION['RolUsuario_id'] = SGI::getRol($pdo, 'ALUMNO');
+                                if (!empty($_SESSION['RolUsuario_id']))
+                                    $_SESSION['RolUsuario_desc'] = 'ALUMNO';
+                            } else {
+                                $_SESSION['es_alumno'] = false;
+                                header('Location: ../' . $pag . '?error=5');
+                                exit;
+                            }
+                        } else {
+                            $esAdmin = SGI::usuarioTieneAcceso($pdo, $result['usuario_id']);
+                            if($esAdmin) {
+                                $_SESSION['RolUsuario_id'] = SGI::getRol($pdo, 'ADMINISTRADOR');
+                                if (!empty($_SESSION['RolUsuario_id']))
+                                    $_SESSION['RolUsuario_desc'] = 'ADMINISTRADOR';
+                                $userId = $result['usuario_id'];
+                                $_SESSION['es_alumno'] = false;
+                            } else {
+                                header('Location: ../' . $pag . '?error=3');
+                                exit;
+                            }
+                        }
+                    }
+                    if (obtenerDatos($pdo, $userId)){
+                        if ($_SESSION['es_alumno'])
+                            header('Location: ../home.php');
+                        else
+                            header('Location: ../home_admin.php');
+                        exit;
+                    } else {
+                        header('Location: ../' . $pag . '?error=5');
+                        exit;
+                    }
+                }
+            }            
+        }
+}
+
+function obtenerDatos($pdo, $id_user) {
+    $datos = false;
+    $_SESSION['timeout'] = time();
+    $_SESSION['usuario_id'] = $id_user;
+    if ($_SESSION['es_alumno']) {
+        $nivel = SGI::nivelAlumno($pdo, $id_user);
+        if (count($nivel) > 0){
+            $_SESSION['estado'] = $nivel['EstadoAlumno_id'];
+            $_SESSION['nivel'] = $nivel['Nivel_id'];
+            $periodo = SGI::periodoValido($pdo, $nivel['Nivel_id']);
+            if (count($periodo) > 0){
+                $_SESSION['periodo'] = $periodo['Periodo_id'];
+                $_SESSION['periodo_desc'] = $periodo['Periodo_desc'];
+                $datos = true;
+            }
+        }
+    } else
+        $datos = true;
+    return $datos;
+}

+ 180 - 0
action/tit_insert.php

@@ -0,0 +1,180 @@
+<?php
+    require_once '../include/bd_pdo.php';
+    require_once '../include/mpdf/autoload.php';
+    require_once '../classes/Archivos.php';
+    session_start();
+
+    $tipo = $_POST["tipo"];
+    $u_id = $_SESSION['usuario_id'];
+    // print_r($u_id);
+    switch($tipo) {
+        case 1:
+            // $p1_servicio = $_POST["cert-ss"];
+            $p1_estudios = $_POST["fecha_estudios"];
+            $p1_titulacion = $_POST["opc_titulacion"];
+            try{                
+                if (!Archivos::existeCapeta('archivos/alumnos/' . $u_id)) {
+                    Archivos::creaCarpeta('archivos/alumnos/' . $u_id);                 
+                }
+                $nombre = '';
+                $nombre .= "Certificado_ServicioSocial.pdf";                
+                Archivos::agregaArchivo($_FILES['cert-ss']['tmp_name'][0],'archivos/alumnos/'.$u_id, $nombre);
+
+                $p1_rutaservicio = Archivos::rutaArchivo('archivos/alumnos/'.$u_id,$nombre);
+                $p1_rutaservicio = substr($p1_rutaservicio,22);
+                
+                $stmt = $pdo -> prepare('select * from tit_fi_alta(:u_id,:p1_rutaservicio,:p1_estudios,:p1_titulacion)');
+                $stmt -> bindParam(":u_id",$u_id);
+                $stmt -> bindParam(":p1_rutaservicio",$p1_rutaservicio);
+                $stmt -> bindParam(":p1_estudios",$p1_estudios);
+                $stmt -> bindParam(":p1_titulacion",$p1_titulacion);
+
+                if(!$stmt->execute()){
+                    $return["error"]="Error en la inserción de datos...";
+                    // header("Location:../titulacion.php?error=0");
+                    // exit();
+                    }
+                else
+                {
+                    $stmt -> closeCursor();
+                    $return["exito"]="Insercion de datos correcta!";
+                    // header("Location:../titulacion.php?ok=0");                    
+                }    
+            }
+            catch(Exception $E){
+                print_r($E);
+            }
+            break;
+        case 2:
+            // $p2_formgeneral = $_POST["fg_titulo"];
+            // $p2_idoficial = $_POST["id_oficial"];
+            try{
+                $nombre1 = '';
+                $nombre1 .= "Formato_NombreTitulo.pdf";                
+                $nombre2 = '';
+                $nombre2 .= "ID_Oficial.pdf";                
+
+                Archivos::agregaArchivo($_FILES['form-ge']['tmp_name'][0],'archivos/alumnos/'.$u_id, $nombre1);
+                Archivos::agregaArchivo($_FILES['id-oficial']['tmp_name'][0],'archivos/alumnos/'.$u_id, $nombre2);
+                
+                $p2_rutaformato = Archivos::rutaArchivo('archivos/alumnos/'.$u_id,$nombre1);
+                $p2_rutaoficial = Archivos::rutaArchivo('archivos/alumnos/'.$u_id,$nombre2);
+                $p2_rutaformato = substr($p2_rutaformato,22);
+                $p2_rutaoficial = substr($p2_rutaoficial,22);
+
+                $stmt = $pdo -> prepare('select * from tit_fu_fgyid(:u_id,:p2_formgeneral,:p2_idoficial)');
+                $stmt -> bindParam(":u_id",$u_id);
+                $stmt -> bindParam(":p2_formgeneral",$p2_rutaformato);
+                $stmt -> bindParam(":p2_idoficial",$p2_rutaoficial);                
+
+                if(!$stmt->execute()){
+                    $return["error"]="Error en la inserción de datos...";
+                    // header("Location:../titulacion.php?error=0");
+                    // exit();
+                    }
+                else
+                {
+                    $stmt -> closeCursor();
+                    $return["exito"]="Insercion de datos correcta!";
+                    // header("Location:../titulacion.php?ok=0");                    
+                }    
+            }
+            catch(Exception $E){
+                print_r($E);
+            }
+            break;
+        case 3:
+            // $p3_pago = $_POST["comp_pago"];
+            try{
+                $nombre = '';
+                $nombre .= "Comprobante_Pago.pdf";                
+                Archivos::agregaArchivo($_FILES['pago']['tmp_name'][0],'archivos/alumnos/'.$u_id, $nombre);
+
+                $p3_rutapago = Archivos::rutaArchivo('archivos/alumnos/'.$u_id,$nombre);
+                $p3_rutapago = substr($p3_rutapago,22);
+
+                $stmt = $pdo -> prepare('select * from tit_fu_pago(:u_id,:p3_pago)');
+                $stmt -> bindParam(":u_id",$u_id);
+                $stmt -> bindParam(":p3_pago",$p3_rutapago);                
+
+                if(!$stmt->execute()){
+                    $return["error"]="Error en la inserción de datos...";
+                    // header("Location:../titulacion.php?error=0");
+                    // exit();
+                    }
+                else
+                {
+                    $stmt -> closeCursor();
+                    $return["exito"]="Insercion de datos correcta!";
+                    // header("Location:../titulacion.php?ok=0");                    
+                }    
+            }
+            catch(Exception $E){
+                print_r($E);
+            }
+            break;        
+        case 4:
+            try{
+                $stmt = $pdo -> prepare('select * from tit_fs_admin(:u_id)');
+                $stmt -> bindParam(":u_id",$u_id);
+
+                if(!$stmt->execute()){
+                    $return["error"]="Error en la seleccion de datos...";
+                    
+                    //header("Location:../proceso_titulacion.php?error=0");
+                    // exit();
+                    }
+                else
+                {
+                    $return = $stmt -> fetch();
+                    // print_r($datosprueba);
+                    $stmt -> closeCursor();
+                    $return["exito"]="Se logro!";
+                    // header("Location:../proceso_titulacion.php?ok=0");
+                    
+                }
+            }
+            catch(Exception $E){
+                print_r($E);
+            }
+            break;
+        case 5:
+            try{                 
+                $defaultConfig = (new Mpdf\Config\ConfigVariables())->getDefaults();
+                
+                /********* FONTS **********/
+                $fontDirs = $defaultConfig['fontDir'];
+                $defaultFontConfig = (new Mpdf\Config\FontVariables())->getDefaults();
+                $fontData = $defaultFontConfig['fontdata'] + 
+                    [ 'tipo' => [
+                        'R' => '../fonts/indivisaFont/ttf/IndivisaDisplaySans-Thin.ttf',
+                    ]] +
+                    [ 'texto-a' => [
+                        'R' => '../fonts/indivisaFont/ttf/IndivisaTextSans-Light.ttf',
+                    ]] +
+                    ['indivisa-text' => [
+                        'R' => '../fonts/indivisaFont/ttf/IndivisaTextSans-Regular.ttf',
+                        'B' => '../fonts/indivisaFont/ttf/IndivisaTextSans-Bold.ttf',
+                        'BI' => '../fonts/indivisaFont/ttf/IndivisaTextSans-BoldItalic.ttf',
+                    ]];    
+
+                /********* CONFIGURACIÓN INICIAL **********/
+                $config = [
+                    'mode'=>'utf-8', 'format'=>'Letter',
+                    'margin_header'=> 21, 'margin_top'=>52, 'margin_left'=> 35, 'margin_right'=> 30, 'margin_footer'=>10,
+                    'fontDir' => array_merge($fontDirs, [__DIR__]), 'fontdata' => $fontData, 'default_font' => 'indivisa-text'                    
+                ];
+
+                $mpdf = new Mpdf\Mpdf($config);
+                $mpdf->WriteHTML('<h1>Hello world!</h1>');
+                $mpdf->Output('../prueba.pdf', 'F');
+                $return["exito"]="Se logro!";                
+            }
+            catch(Exception $E){
+                $return["error"] = $E;
+            }
+            break;
+    }
+    $return['json'] = json_encode($return);
+    echo json_encode($return);
+?>

二进制
archivos/alumnos/1446/Certificado_ServicioSocial_1446.pdf


+ 57 - 0
base.php

@@ -0,0 +1,57 @@
+<?php
+require_once 'classes/Template.php';
+require_once 'classes/ValidaSesion.php';
+
+$menu = 0;
+$submenu = 0;
+$titulo = '';
+
+if (!isset($_SESSION['usuario_id']))
+    ValidaSesion::salirPagina();
+else {
+    if(isset($_SESSION['usuario_id']))
+        $objSesion = new ValidaSesion($pdo, $submenu);
+    else 
+        ValidaSesion::salirPagina();
+}
+if (isset($objSesion))
+    $titulo = $objSesion->nombrePagina();
+?>
+
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>Alumnos - <?php echo $titulo; ?></title>
+        <?php if ($objSesion->tieneAcceso())
+            Template::getCSS();
+        else
+            Template::getCSS(); ?>
+        <style>
+
+            
+        </style>
+    </head>
+    <body>
+        <?php $menuObj = new MainMenu($_SESSION["RolUsuario_id"], $menu, $submenu, $pdo);
+        $menuObj->printMenu($titulo);
+        if ($objSesion->tieneAcceso()) { ?>
+        <main class="container-fluid content marco">
+
+        </main>
+        <?php } else { ?>
+        <main class="container-fluid content marco">
+            <div class="row justify-content-center" style="min-height: 600px;">
+                <img id="errorImg" class="col-sm-3" src="img/nico_error.svg" />
+                <div class="col-sm-9 display-4 d-flex flex-row justify-content-center align-items-center text-center">No tienes acceso a ésta página</div>
+            </div>
+        </main>
+        <?php } ?>
+        <div style="isolation: isolate;">
+        <?php Template::footer(); ?>
+        </div>
+        <?php if ($objSesion->tieneAcceso())
+            Template::getJS();
+        else
+            Template::getJS(); ?>
+    </body>
+</html>

+ 57 - 0
classes/Archivos.php

@@ -0,0 +1,57 @@
+<?php
+class Archivos {
+    /********** ARCHIVOS **********/
+    public static function getRuta(){
+        return $_SERVER['DOCUMENT_ROOT'] . '/alumnos/';
+    }
+    
+    public static function existeArchivo($carpeta, $archivo){
+        return file_exists(self::getRuta() . $carpeta . '/' . $archivo);
+    }
+    
+    public static function rutaArchivo($carpeta, $archivo){
+        return self::getRuta() . $carpeta . '/' . $archivo;
+    }
+    
+    public static function eliminaArchivo($carpeta, $archivo){
+        return unlink(self::getRuta() . $carpeta . '/' . $archivo);
+    }
+    
+    public static function agregaArchivo ($archivo, $carpeta, $nombre){
+        return move_uploaded_file($archivo, self::getRuta() . $carpeta . '/' . $nombre);
+    }
+    
+    public static function getContenido($carpeta, $archivo){
+        return @file_get_contents(self::rutaArchivo($carpeta, $archivo));
+    }
+    
+    public static function guardaArchivo($carpeta, $archivo, $contenido){
+        return file_put_contents(self::rutaArchivo($carpeta, $archivo), $contenido);
+    }
+    
+    public static function cargaArchivo($carpeta,$archivo){
+        $file = $carpeta . '/' . $archivo;                
+        if (self::existeArchivo($carpeta, $archivo))
+            $t = filemtime(self::rutaArchivo($carpeta, $archivo));
+        if ($t)
+            $file .= '?t=' . $t;
+        return $file;
+    }
+    
+    /********** CARPETAS **********/
+    public static function rutaCarpeta($carpeta){
+        return self::getRuta() . $carpeta . '/';
+    }
+    
+    public static function abrirCarpeta($carpeta){
+        return opendir(self::getRuta() . $carpeta . '/');
+    }
+    
+    public static function existeCapeta($carpeta){
+        return file_exists(self::getRuta() . $carpeta);
+    }
+    
+    public static function creaCarpeta($carpeta) {
+        return mkdir(self::getRuta() . $carpeta, 0755, true);
+    }
+}

+ 90 - 0
classes/Evento.php

@@ -0,0 +1,90 @@
+<?php
+require_once 'Fechas.php';
+
+class Evento {
+    public $evento_id, $periodo_id, $insignia_id, $titulo, $detalle, $shortname, $dia, $fecha, $hora_ini, $hora_fin, $inscripciones, $periodicidad;
+    public $fechasArr;
+    function __construct($evento_id, $periodo_id, $insignia_id, $titulo, $detalle, $shortname, $fecha, $hora_ini, $hora_fin, $inscripciones){
+        $this->evento_id = $evento_id;
+        $this->periodo_id = $periodo_id;
+        $this->insignia_id = $insignia_id;
+        $this->titulo = $titulo;
+        $this->detalle = $detalle;
+        $this->shortname = $shortname;
+        $this->fecha = Fechas::validaFormatoFecha($fecha);
+        $this->hora_ini = $hora_ini;
+        $this->hora_fin = $hora_fin;        
+        $this->inscripciones = $inscripciones;
+        $this->fechasArr = array();
+    }
+    
+    //Fecha normal
+    function addFecha($fecha){
+        $fecha = Fechas::validaFormatoFecha($fecha);
+        if(strtotime($fecha)>= strtotime($this->fecha))//solo si la fecha es mayor a la fecha inicial
+            $this->fechasArr[] = array('fecha_orig' => $fecha, 'fecha' => $fecha, 'hora_ini' => $this->hora_ini, 'hora_fin' => $this->hora_fin);
+    }
+    
+    //Fechas modificadas
+    function replaceFecha($fecha_orig, $fecha_new, $hora_ini, $hora_fin){//fecha_orig en formato yyyy-mm-dd hh:mm:ss
+        $fecha_busca = explode(" ", $fecha_orig);//quita horas
+        $fecha_busca[0] = Fechas::validaFormatoFecha($fecha_busca[0]);
+        $fecha_new = Fechas::validaFormatoFecha($fecha_new);
+        
+        for($i=0; $i< count($this->fechasArr); $i++){
+            if($this->fechasArr[$i]['fecha_orig'] == $fecha_busca[0]){
+                $this->fechasArr[$i]['fecha'] = $fecha_new;
+                $this->fechasArr[$i]['hora_ini'] = $hora_ini;
+                $this->fechasArr[$i]['hora_fin'] = $hora_fin;
+                break;//solo 1 por fecha
+            }
+        }
+    }
+    
+    //Excepciones
+    function removeFecha($fecha_busca){
+        $tmp = explode(' ', $fecha_busca);//quita horas
+        $fecha_busca = Fechas::validaFormatoFecha($tmp[0]);
+        for($i=0; $i< count($this->fechasArr); $i++){
+            if($this->fechasArr[$i]['fecha_orig'] == $fecha_busca){
+                array_splice($this->fechasArr, $i, 1);
+                break;
+            }
+        }
+    }
+    
+    function hasFecha($fecha){
+        $fecha = Fechas::validaFormatoFecha($fecha);
+        foreach($this->fechasArr as $fechaArr){
+            if($fechaArr['fecha'] == $fecha)
+                return true;
+        }
+        return false;
+    }
+    
+    //Obtiene listado de fechas y cada una con la descripicón del evento.
+    //Filtra las fechas generadas por el mes y el año
+    function getEventList($mes, $anho){
+        $arr = array(
+            'evento_id' => $this->evento_id,
+            'titulo' => $this->titulo,
+            'detalle' => $this->detalle,
+            'periodo_id' => $this->periodo_id,
+            'shortname' => $this->shortname,
+            'dia' => $this->dia,
+            'inscripciones' => $this->inscripciones,
+            'insignia_id' => $this->insignia_id,
+            'periodicidad' => $this->periodicidad,
+            'fechas' => array()
+        );
+        $key_values = array_column($this->fechasArr, 'fecha'); 
+        array_multisort($key_values, SORT_ASC, $this->fechasArr);
+        foreach($this->fechasArr as $fecha){
+            //if(intval(date("n", strtotime($fecha["fecha"]))) ==  intval($mes) && intval(date("Y", strtotime($fecha["fecha"]))) == intval($anho) ){
+                array_push($arr['fechas'], array('fecha_orig' => $fecha['fecha_orig'],'fecha' => $fecha['fecha'], 'dia' => intval(date("j", strtotime($fecha['fecha']))),
+                    'hora_ini_orig' => substr($fecha['hora_ini'],0,5), 'hora_ini' => substr($fecha['hora_ini'],0,5),'hora_fin' => substr($fecha['hora_fin'],0,5)));
+            //}
+        }
+        return $arr;
+    }
+}

+ 269 - 0
classes/EventoInsignia.php

@@ -0,0 +1,269 @@
+<?php
+require_once 'Evento.php';
+require_once 'Fechas.php';
+
+class EventoInsignia {    
+    private static function getEventos ($pdo, $mes, $anio, $insignia_id = null, $evento_id = null) {
+        $eventos = array();
+        if (!is_null($mes)){
+            $fecha_min = $anio. '-' . $mes . '-1';
+            $fecha_max = $anio. '-' . $mes . '-' . cal_days_in_month(CAL_GREGORIAN, $mes, $anio);
+            if (is_null($insignia_id) && is_null($evento_id))
+                $stmt = $pdo->prepare('Select * from alu_fs_calendarioevento(null, null, :Fecha_inicio, :Fecha_fin)');
+            else {
+                if (is_null($insignia_id)){
+                    $stmt = $pdo->prepare('Select * from alu_fs_calendarioevento(null, :Evento, :Fecha_inicio, :Fecha_fin)');
+                    $stmt->bindParam(':Evento', $evento_id);
+                } else {
+                    if (is_null($evento_id)) {
+                        $stmt = $pdo->prepare('Select * from alu_fs_calendarioevento(:Insignia, null, :Fecha_inicio, :Fecha_fin)');
+                        $stmt->bindParam(':Insignia', $insignia_id);
+                    } else {
+                        $stmt = $pdo->prepare('Select * from alu_fs_calendarioevento(:Insignia, :Evento, :Fecha_inicio, :Fecha_fin)');
+                        $stmt->bindParam(':Insignia', $insignia_id);
+                        $stmt->bindParam(':Evento', $evento_id);
+                    }
+                }
+            }    
+            $stmt->bindParam(":Fecha_inicio", $fecha_min);
+            $stmt->bindParam(":Fecha_fin", $fecha_max);
+        } else {
+            if (is_null($insignia_id) && is_null($evento_id))
+                $stmt = $pdo->prepare('Select * from alu_fs_calendarioevento(null, null, null, null)');
+            else {
+                if (is_null($insignia_id)){
+                    $stmt = $pdo->prepare('Select * from alu_fs_calendarioevento(null, :Evento, null, null)');
+                    $stmt->bindParam(':Evento', $evento_id);
+                } else {
+                    if (is_null($evento_id)) {
+                        $stmt = $pdo->prepare('Select * from alu_fs_calendarioevento(:Insignia, null,  null, null)');
+                        $stmt->bindParam(':Insignia', $insignia_id);
+                    } else {
+                        $stmt = $pdo->prepare('Select * from alu_fs_calendarioevento(:Insignia, :Evento, null, null)');
+                        $stmt->bindParam(':Insignia', $insignia_id);
+                        $stmt->bindParam(':Evento', $evento_id);
+                    }
+                }
+            } 
+        }
+        if(!$stmt->execute())
+            print_r($stmt->errorInfo());
+        else {
+            $eventos = $stmt->fetchAll();
+            $stmt->closeCursor();
+            $stmt = null;
+        }
+        return $eventos;
+    }
+    public static function getDatosEventos($pdo, $mes, $anio, $insignia_id = null, $evento_id = null) {
+        $eventos_display = array();//eventos con todas las fechas para pintarse. Arreglo de Objeto evento
+        $eventos = self::getEventos($pdo, $mes, $anio, $insignia_id, $evento_id);
+            foreach($eventos as $evento){
+                $eventoObj = new Evento($evento['evento_id'], $evento['periodo_id'],$evento['insignia_id'], $evento['titulo'], $evento['detalle'], $evento['shortname'], $evento['fecha_inicio'], $evento['hora_inicio'], $evento['hora_fin'] ,$evento['inscripciones']);
+                //-- Calcular posibles fechas e insertar fechas en objeto --
+                $fecha = Fechas::validaFormatoFecha($evento['fecha_inicio']);
+                switch($evento['repeticion_id']){
+                    case 1: //diario
+                        $cont = 0;
+                        while (strtotime($fecha) <= strtotime($evento['reglas_fecha_final'])) {
+                            $eventoObj->addFecha($fecha);
+                            $fecha = date ("Y-m-d", strtotime("+1 day", strtotime($fecha)));
+                            $cont++;
+                        }
+                        if ($cont == 2)
+                            $eventoObj->periodicidad = 'ULTIMOS';
+                        else
+                            $eventoObj->periodicidad = 'RANGO';
+                    break;
+                    case 2: //semanal
+                        $diasArr = explode(",", $evento['reglas_dias']);
+                        while (strtotime($fecha) <= strtotime($evento['reglas_fecha_final'])) {
+                            if(in_array(date("w", strtotime($fecha)), $diasArr) ){//si es el día que quiero
+                                $eventoObj->addFecha($fecha);
+                            }
+                            $fecha = date ("Y-m-d", strtotime("+1 day", strtotime($fecha)));
+                        }
+                        $eventoObj->periodicidad = 'ALTERNADOS';
+                    break;
+                    case 3://mensual
+                        $diasArr = explode(",", $evento['reglas_dias']);
+                        //reglas
+                        $weekTxt = array(1=>"first", 2=>"second", 3=>"third", 4=>"fourth", -1=>"last");
+                        $dayname = array("sun", "mon", "tue", "wed", "thu", "fri", "sat");
+                        $fecha = date ("Y-m-01", strtotime($fecha));//empieza a revisar en el primer día del mes
+                        $semana = $evento['reglas_semana'];
+                        while (strtotime($fecha) <= strtotime($evento['reglas_fecha_final'])) {
+                            foreach($diasArr as $d){
+                                //echo "-->". intval(date("w", strtotime($fecha)))." == ". intval($d)."[".$fecha."]";
+                                if($semana == 1 && intval(date("w", strtotime($fecha))) ==  intval($d) ){//si el día actual es el que quiero lo guarda
+                                    $eventoObj->addFecha($fecha);
+                                }else{//si no calcula siguiente día
+                                    if(intval(date("w", strtotime($fecha))) ==  intval($d)){
+                                        $fechaTmp = date ("Y-m-d", strtotime($weekTxt[$semana-1]." ".$dayname[$d], strtotime($fecha))); 
+                                    }else{
+                                        $fechaTmp = date ("Y-m-d", strtotime($weekTxt[$semana]." ".$dayname[$d], strtotime($fecha))); 
+                                    }
+                                    $eventoObj->addFecha($fechaTmp);
+                                }
+                            }
+                            $fecha = date ("Y-m-01", strtotime("+1 month", strtotime($fecha)));//siguiente mes primer día
+                        }
+                        $eventoObj->periodicidad = 'ALTERNADOS';
+                    break;
+                    default: //no se repite
+                        $eventoObj->addFecha($fecha);
+                        $eventoObj->periodicidad = 'UNICO';
+                        break;
+                }
+                $stmt = $pdo->prepare('Select * from fs_calendarioeventoeditado(:Evento)');
+                $stmt->bindParam(":Evento", $eventoObj->evento_id);
+                if(!$stmt->execute())
+                    print_r($stmt->errorInfo());
+                else {
+                    //modifica fechas
+                    $eventosEditados_rs = $stmt->fetchAll();
+                    foreach($eventosEditados_rs as $modif){
+                        $eventoObj->replaceFecha($modif["CalendarioEventoEditado_fecha_origen"], $modif["CalendarioEventoEditado_fecha_nueva"], $modif["CalendarioEventoEditado_hora_inicial"], $modif["CalendarioEventoEditado_hora_final"]);
+                    }
+                    //Quitar fechas de excepción
+                    if (!empty($evento['excepcion'])){
+                        foreach(explode(",", $evento['excepcion']) as $ex){
+                            $eventoObj->removeFecha($ex);
+                        }
+                        $eventoObj->periodicidad = 'ALTERNADOS';
+                    }
+                    //Descompone el objeto en un arreglo con todas las fechas y agrega a lista al total del calendario
+                    $alta = false;
+                    if (!is_null($mes)){
+                        $cont = 0;
+                        $fechas = array_column($eventoObj->fechasArr, 'fecha');
+                        while (!$alta && $cont < count($fechas)) {
+                            if (($anio . '-' . Fechas::dosDigitos($mes)) == substr($fechas[$cont], 0,-3))
+                                $alta = true;
+                            $cont++;
+                        }                    
+                    } else
+                        $alta = true;
+                    if ($alta) {
+                        $eventoObj->dia = self::primerDiaMes(array_column($eventoObj->fechasArr,'fecha'), $anio . '-' . Fechas::dosDigitos($mes));
+                        array_push($eventos_display, $eventoObj->getEventList($mes, $anio));
+                    }
+                }
+                $stmt->closeCursor();
+                $stmt = null;
+            }
+        return $eventos_display;
+    }
+    public static function getDatosInsignia($pdo, $evento){
+        $insignia = array();
+        $stmt = $pdo->prepare('SELECT * FROM fs_insigniageneral(:Evento_id)');
+        $stmt->bindParam(':Evento_id', $evento);
+        if(!$stmt->execute())
+            print_r($stmt->errorInfo());
+        else
+            $insignia = $stmt->fetch();
+        $stmt->closeCursor();
+        $stmt = null;
+        return $insignia;
+    }
+    public static function getFechasRomanizadas($fechasArr, $tipo, $fecha, $horas = false, $anio = false){
+        $fechas = array('texto' => '', 'horario' => '', 'horarioTemp' => '');
+        if (count($fechas) > 0){            
+            switch ($tipo){
+                case 'UNICO':
+                    if ($horas)
+                        $fechas['horario'] = Fechas::horas($fechasArr[0]['hora_ini'], $fechasArr[0]['hora_fin'], '-');
+                    else
+                        $fechas['horario'] = '';
+                    $fechas['horarioTemp'] = $fechas['horario'];
+                    break;
+                case 'RANGO':
+                case 'ALTERNADOS':
+                case 'ULTIMOS':
+                    $hora_ini = array_unique(array_column($fechasArr, 'hora_ini'));
+                    $hora_fin = array_unique(array_column($fechasArr, 'hora_fin'));
+                    if(count($hora_ini) == 1 && count($hora_fin) == 1 || !$horas) {
+                        if ($horas)
+                            $fechas['horario'] = Fechas::horas($fechasArr[0]['hora_ini'], $fechasArr[0]['hora_fin'], '-');
+                        else
+                            $fechas['horario'] = '';
+                        switch ($tipo){
+                            case 'ULTIMOS':
+                                $fechas['texto'] = Fechas::estandarizaDia($fechasArr[0]['fecha'], $fechasArr[count($fechasArr) - 1]['fecha'], $tipo, $anio);
+                                break;
+                            case 'ALTERNADOS':
+                                $temp = array_column($fechasArr, 'fecha');
+                                $fechas['texto'] = '';
+                                for ($cont = 0; $cont < (count($temp) - 1); $cont++) {
+                                    if ($cont < count($temp) - 2)
+                                        $fechas['texto'] .= Fechas::estandarizaDia($temp[$cont], $temp[$cont + 1], 'ALTERNADOS', $anio);
+                                    else
+                                        $fechas['texto'] .= Fechas::estandarizaDia($temp[$cont], $temp[$cont + 1], 'ULTIMOS', $anio);
+                                }                                
+                                break;
+                            case 'RANGO':
+                                $fechas['texto'] = Fechas::estandarizaDia($fechasArr[0]['fecha'], $fechasArr[count($fechasArr) - 1]['fecha'], $tipo, $anio);
+                                break;
+                        }
+                        $fechas['horarioTemp'] = $fechas['horario'];
+                    } else {
+                        $encontrado = false;
+                        $fechas['texto'] = '';
+                        for ($cont = 0; $cont < count($fechasArr); $cont++) {
+                            $horario = Fechas::horas($fechasArr[$cont]['hora_ini'], $fechasArr[$cont]['hora_fin'], '-');
+                            $fechas['texto'] .= Fechas::romanizaFecha($fechasArr[$cont]['fecha'], $anio) . ' | ' . $horario;
+                            if ($cont < (count($fechasArr) - 1))
+                                $fechas['texto'] .=  '<br />';
+                            if (!is_null($fecha)){
+                                if ($fecha == substr($fechasArr[$cont]['fecha'],0, -3) && !$encontrado)
+                                    $fechas['horarioTemp'] = $horario;
+                            }
+                        }
+                    }
+                    break;
+            }
+        }
+        return $fechas;
+    }
+    public static function getRegistroEvento($pdo, $usuario, $insignia = null, $fechaIni = null, $fechaFin = null){
+        $registro = array();
+        if (is_null($fechaIni))
+            $fechas = ', null, null)';
+        else
+            $fechas = ',:Inicio, :Fin)';
+        if (!is_null($insignia)){
+            $stmt = $pdo->prepare('SELECT * FROM alu_fs_registroevento(:Insignia_id, :Usuario_id' . $fechas);
+            $stmt->bindParam(':Insignia_id', $insignia);
+            if (!is_null($fechaIni)){
+                $stmt->bindParam(':Inicio', $fechaIni);
+                $stmt->bindParam(':Fin', $fechaFin);
+            }
+        } else {
+            $stmt = $pdo->prepare('SELECT * FROM alu_fs_registroevento(null, :Usuario_id' . $fechas);
+            if (!is_null($fechaIni)){
+                $stmt->bindParam(':Inicio', $fechaIni);
+                $stmt->bindParam(':Fin', $fechaFin);
+            }
+        }
+        $stmt->bindParam(':Usuario_id', $usuario);
+        if(!$stmt->execute())
+            print_r($stmt->errorInfo());
+        else 
+            $registro = $stmt->fetchAll();
+        $stmt->closeCursor();
+        $stmt = null;
+        return $registro;
+    }
+    private static function primerDiaMes($fechas, $fecha) {
+        $encontrado = false;
+        $dia = '';
+        while (($temp = current($fechas)) && !$encontrado) {
+           if ($fecha == substr($temp, 0,-3)) {
+               $dia = substr($temp, -2);
+               $encontrado = true;
+            }
+            next($fechas);
+        }
+        return $dia;
+    }
+}

+ 148 - 0
classes/Fechas.php

@@ -0,0 +1,148 @@
+<?php
+class Fechas {
+    private static $meses = ['', 'enero','febrero','marzo','abril','mayo','junio','julio','agosto','septiembre','octubre','noviembre','diciembre' ];
+    private static $mesesShort = ['', 'ene','feb','mar','abr','may','jun','jul','ago','sep','oct','nov','dic' ];
+
+    public static function obtenerDias($dias){
+        $temp = '';
+        for($cont = 0; $cont < count($dias); $cont++){
+            if($dias[$cont])
+                $temp .= ($cont + 1) . '-';
+        }
+        $dias = [];
+        $temp = substr($temp, 0, strlen($temp)-1);
+        $temp = explode('-', $temp);
+        foreach ($temp as $t){
+            if (intval($t) == 7)
+                array_push ($dias, 0);
+            else
+                array_push ($dias, intval($t));
+        }
+        sort($dias, SORT_NUMERIC);
+        return $dias;
+    }
+
+    public static function obtenerDiasRepetidos($dDia, $dias){    
+        while (!in_array(intval(date('w', $dDia->getTimestamp())), $dias)){
+            $dDia->modify('+1 day');
+        }
+        return $dDia;
+    }
+
+    public static function horas($hrInicio, $hrFin, $tipo){
+        if (empty($hrInicio))
+            $hrs = 'Todo el día';
+        else {
+            if (strlen($hrInicio) > 5)
+                $hrs = substr ($hrInicio, 0, 5);
+            else
+                $hrs = $hrInicio;
+            if (!empty($hrFin)) {
+                if (strlen($hrFin) > 5)
+                    $hrFin = substr ($hrFin, 0, 5);
+                switch ($tipo) {
+                    case '|': $hrs .= '|' . $hrFin; break;
+                    case 'a': $hrs .= ' a ' .$hrFin; break;
+                    case '-': default: $hrs .= ' - ' . $hrFin; break;
+                }
+            }
+            $hrs .= ' h.';
+        }
+        return $hrs;
+    }
+
+    public static function romanizaMes($mes){        
+        return self::$meses[$mes];
+    }
+    
+    public static function abreviaturaMes($mes){        
+        return self::$mesesShort[$mes];
+    }
+
+    public static function romanizaFecha($fecha, $anio = false){
+        if (is_string($fecha))
+            $fecha = new DateTimeImmutable($fecha);
+        if ($anio)
+            return $fecha->format('j') . ' de ' . self::romanizaMes(intval($fecha->format('n'))) . ' de ' . $fecha->format('Y');
+        else
+            return $fecha->format('j') . ' de ' . self::romanizaMes(intval($fecha->format('n')));
+    }
+
+    public static function estandarizaDia($dia1, $dia2, $tipo, $anio = false) {
+        if (is_string($dia1))
+            $dia1 = new DateTimeImmutable($dia1);
+        if (is_string($dia2))
+            $dia2 = new DateTimeImmutable($dia2);
+        $pre = "";
+        $conjuncion = ', ';
+        $tipo = strtoupper($tipo);
+        switch ($tipo){
+            case 'ULTIMOS':
+                $pre = '';
+                $conjuncion = ' y ';
+                break;
+            case 'RANGO':
+                $pre = 'Del ';
+                $conjuncion = ' al ';
+                break;
+            case 'ALTERNADOS':
+                $pre = ''    ;
+                $conjuncion = ', ';
+                break;
+        }
+        $rango = '';
+        if ($dia1->format('Y') === $dia2->format('Y')){
+            if ($dia1->format('n') === $dia2->format('n')){
+                $rango .= $pre . $dia1->format('j') . $conjuncion;
+                if ($tipo != 'ALTERNADOS')
+                    $rango .= self::romanizaFecha($dia2, $anio);
+            }
+            else {
+                $rango .= $pre . $dia1->format('j') . ' de ' . self::romanizaMes(intval($dia1->format('n'))) . $conjuncion;
+                if ($tipo != 'ALTERNADOS')
+                    $rango .= self::romanizaFecha($dia2, $anio);
+            }
+        } else {
+            $rango .= $pre . self::romanizaFecha($dia1, $anio) . $conjuncion;
+            if ($tipo != 'ALTERNADOS')
+                $rango .= self::romanizaFecha($dia2, $anio);
+        }
+        return $rango;
+    }
+    
+    public static function dosDigitos($num) {
+        // if is of type string parse int
+        if (is_string($num))
+            $num = intval($num);
+        
+        if ($num < 10)
+            return '0' . $num;
+        else
+            return $num;
+    }
+    
+    public static function fechaRango($fecha1, $fecha2, $separador = '/') {
+        $fecha = '';
+        if (!empty($fecha1)){
+            $fecha1 = explode($separador, $fecha1);
+            if (count($fecha1) > 1 && (intval($fecha1[1]) > 0 && intval($fecha1[1]) < 13))
+                $fecha = ucfirst(self::abreviaturaMes(intval($fecha1[1]))) . ' ' . $fecha1[0];
+            if ($fecha2 == null)
+                $fecha .= ' - Actualidad';
+            else {
+                if (!empty($fecha2)) {
+                    $fecha2 = explode($separador, $fecha2);
+                    if (count($fecha2) > 1 && (intval($fecha2[1]) > 0 && intval($fecha2[1]) < 13))
+                       $fecha .= ' - ' . ucfirst(self::abreviaturaMes(intval($fecha2[1]))) . ' ' . $fecha2[0];
+                }
+            }
+        }
+        return $fecha;
+    }
+    
+    public static function validaFormatoFecha($fecha){
+        if (str_contains('/', $fecha))
+            $fecha = DateTime::createFromFormat('d/m/Y', $fecha)->format('Y-m-d');
+        return $fecha;
+    }
+}

+ 177 - 0
classes/MainMenu.php

@@ -0,0 +1,177 @@
+<?php
+class MainMenu {
+    //put your code here
+    private $rol, $menu, $submenu, $pdo, $xtpl;
+    private $menuEstatico = array();
+    
+    /**
+     * @param int $usr_id Id del usuario actual
+     * @param int $menu_selected Id del menú seleccionado
+     * @param PDO $this->pdo  Conexión de base de datos
+     */
+    function __construct($rol_id, $menu_selected, $submenu_selected, $pdo){
+        $this->menu = $menu_selected;
+        $this->submenu = $submenu_selected;
+        $this->rol = $rol_id;
+        $this->pdo = $pdo;
+        //$this->agregaMenu('Galeria de carteles', 'galeria.php', 'ing-galeria');
+    }
+    
+    //Agrega menú estático
+    public function agregaMenu($texto, $link, $icono =''){
+        $this->menuEstatico[] = array('nombre'=>$texto, 'link'=>$link, 'icono'=>$icono);
+    }
+    
+    private function creaMenu($id, $nombre, $icono){
+        $this->xtpl->assign('MENU_ID', $id);
+        $this->xtpl->assign('MENU_NOMBRE', $nombre);
+        if($icono != ''){
+            $this->xtpl->assign('MENU_ICONO', $icono);
+            $this->xtpl->parse('main.sidebar.menus.menu.icono');
+        }
+        if($this->menu == $id){
+            $this->xtpl->parse('main.sidebar.menus.menu.activo');
+            $this->xtpl->parse('main.sidebar.menus.menu.show');
+        }else{
+            $this->xtpl->parse('main.sidebar.menus.menu.inactivo');
+            $this->xtpl->parse('main.sidebar.menus.menu.collapsed');
+        }
+        
+    }
+    
+    public function printMenu($titulo = '', $index = false){
+        require_once('include/xtemplate.class.php');
+        $this->xtpl = new XTemplate('templates/main_menu.tpl.html');        
+        $rutaLogo = 'img/lasalle-logo.svg';
+        $this->xtpl->assign('LOGO_IMG', $rutaLogo);
+        $links = array();
+        array_push($links,array('nombre' => 'Facultad de Ingeniería', 'pag' => 'https://ingenieria.lasalle.mx/'));
+        array_push($links,array('nombre' => 'La Salle', 'pag' => 'https://lasalle.mx'));
+        array_push($links,array('nombre' => 'Moodle', 'pag' => 'https://moodle.ingenierialasalle.mx/'));
+        foreach($links as $link){
+            $this->xtpl->assign('SISTEMA_LINK', $link['pag']);
+            $this->xtpl->assign('SISTEMA_NOMBRE', $link['nombre']);
+            $this->xtpl->parse('main.sidebar.sistemas.sistema');
+            $this->xtpl->parse('main.sistemas.list.sistema');
+        }
+        if ($this->rol == 0){
+            $this->xtpl->assign('MODAL', 'modalInicia');
+            $this->xtpl->parse('main.sidebar.modal');
+        } else{
+            $this->xtpl->assign('SALIR', 'salir.php');
+            $this->xtpl->parse('main.sidebar.salir');
+        }       
+        $this->xtpl->parse('main.sistemas.list');
+
+        $this->xtpl->parse('main.sistemas');
+        $this->xtpl->parse('main.sidebar.sistemas');
+        
+        $menuArr = array();
+        if ($this->rol != 0 && !is_null($this->pdo)) {
+            try {
+                $stmt = $this->pdo->prepare('SELECT * FROM alu_fs_menuspagina(:rol)');
+                $stmt->bindParam(':rol', $this->rol);
+                if($stmt->execute())
+                    $menuArr = $stmt->fetchAll();
+            } catch (\PDOException $ex) {
+                echo 'Error al imprimir el submenú';
+                print_r($stmt->errorInfo());
+                exit();
+            }            
+            $stmt->closeCursor();
+            $stmt = null;
+        }
+        if(!$index){
+            //Inicio por default           
+            $this->xtpl->assign('MENU_ID', 0);
+            if ($_SESSION['RolUsuario_desc'] == 'ALUMNO')
+                $this->xtpl->assign('MENU_LINK', 'home.php');            
+            else
+                $this->xtpl->assign('MENU_LINK', 'home_admin.php');
+            $this->xtpl->assign('MENU_NOMBRE', 'Home');
+            $this->xtpl->assign('MENU_ICONO', 'ing-home');
+            $this->xtpl->parse('main.sidebar.menus.menu_link.icono');
+            if($this->menu == 0){
+                $this->xtpl->parse('main.sidebar.menus.menu_link.activo');
+            }
+            $this->xtpl->parse('main.sidebar.menus.menu_link');
+            if(count($this->menuEstatico)>0){
+                foreach($this->menuEstatico as $menu){
+                    $this->xtpl->assign('MENU_LINK', $menu['link']);
+                    $this->xtpl->assign('MENU_NOMBRE', $menu['nombre']);
+                    if($menu['icono'] != ''){
+                        if (str_starts_with($menu['icono'], 'fa-'))
+                            $prefijo = 'fa-fw ';
+                        else
+                            $prefijo = 'ing-fw ';
+                        $this->xtpl->assign('MENU_ICONO', $prefijo . $menu['icono']);
+                        $this->xtpl->parse('main.sidebar.menus.menu_link.icono');
+                    }
+                    $this->xtpl->parse('main.sidebar.menus.menu_link');
+                }            
+            }
+
+            //Recorre menus
+            $lastMenu = -1;
+            $numMenus = 0;
+            foreach($menuArr as $menu){
+                if($lastMenu == -1){//Sin menú anterior
+                    $lastMenu = $menu['Menu_id'];
+                    $numMenus++;
+                    $this->creaMenu($menu['Menu_id'], $menu['Menu_desc'], $menu['Menu_icono']);
+                }else if($lastMenu != $menu['Menu_id']){//Cambio de menú
+                    $this->xtpl->parse('main.sidebar.menus.menu');//guarda menu anterior
+
+                    $lastMenu = $menu['Menu_id'];
+                    $numMenus++;
+                    $this->creaMenu($menu['Menu_id'], $menu['Menu_desc'], $menu['Menu_icono']);
+                }
+                $this->xtpl->assign('MENU_ID', $menu['Menu_id']);
+                $this->xtpl->assign('SUBMENU_LINK', $menu['Submenu_pag_base']);
+                $this->xtpl->assign('SUBMENU_NOMBRE', $menu['Submenu_desc']);
+                if (str_starts_with($menu['Submenu_icono'], 'fa-'))
+                            $prefijo = 'fa-fw ';
+                        else
+                            $prefijo = 'ing-fw ';
+                $this->xtpl->assign('SUBMENU_ICONO', $prefijo . $menu['Submenu_icono']);
+                if ($this->submenu == $menu['Submenu_id'])
+                    $this->xtpl->parse('main.sidebar.menus.menu.submenu.activo');
+                $this->xtpl->parse('main.sidebar.menus.menu.submenu');
+            }
+            if(count($menuArr)>0){
+                $this->xtpl->parse('main.sidebar.menus.menu');
+            }
+            //'Compilar' resultados
+            $this->xtpl->parse('main.sidebar.menus');
+            $this->xtpl->parse('main.sidebar');
+            if ($this->rol == 0){
+                $this->xtpl->assign('MODAL', 'modalInicia');
+                $this->xtpl->parse('main.menu_index.modal');
+                $this->xtpl->parse('main.menu_index');
+            } else{
+                $this->xtpl->assign('SALIR', 'salir.php');
+                $this->xtpl->parse('main.menu_sidebar.salir');
+                $this->xtpl->parse('main.menu_sidebar');
+            }
+        } 
+        if ($this->menu != 0) {
+            $this->xtpl->assign('TITULO', $titulo);
+            $this->xtpl->parse('main.barra');
+        }
+        $this->xtpl->parse('main');
+        $this->xtpl->out('main');
+    }    
+    /* 
+     * @return string Texto con el código HTML del menú
+     */
+    public function textMenu(){
+        return $this->xtpl->text('main');
+    }
+    
+    private function getFirstDirectory($pag){
+        if(dirname($pag) == '/'){
+            return $pag;
+        }
+        return $this->getFirstDirectory(dirname($pag));
+    }
+}

+ 501 - 0
classes/SGI.php

@@ -0,0 +1,501 @@
+<?php
+class SGI {
+    private static $sistema = 8;
+    public static $foto_pefil = 'nico.jpg';
+/********* GENERALES **********/
+    public static function periodoValido($pdo, $idnivel){
+        $periodo = array();
+        try {
+            $stmt = $pdo->prepare('SELECT "Periodo_id", "Periodo_desc" from fs_periodo(null, 1, :nivel,null) WHERE "Periodo_calendario_activo" IS TRUE');
+            $stmt->bindParam(':nivel', $idnivel);
+            if(!$stmt->execute())
+                print_r($stmt->errorInfo());
+            else 
+                $periodo = $stmt->fetch();
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $periodo;
+    }
+    public static function claveEsSuperAdmin($pdo, $clave){
+        $admin = false;
+        try {
+            $stmt = $pdo->prepare('SELECT * FROM fs_usuario_administradorxclave(:clave)');
+            $stmt->bindParam(':clave', $clave);
+            if($stmt->execute()){
+                $temp = $stmt->fetch();
+                if (is_bool($temp))
+                    $admin = $temp;
+                else
+                    $admin = boolval($temp['SGI_administrador']);
+            }
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $admin;
+    }
+    public static function esAdministrativo($pdo, $id){
+        $admin = array();
+        try {
+            $stmt = $pdo->prepare('SELECT UPPER("UsuarioEstado_desc") AS "estatus" FROM fs_usuario(:id)');
+            $stmt->bindParam(':id', $id);
+            if($stmt->execute()){
+                $temp = $stmt->fetch();
+                if (!is_bool($temp))
+                    $admin = $temp;
+            }
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $admin;
+    }
+    public static function usuarioTieneAcceso($pdo, $id){        
+        $admin = false;
+        try {
+            $stmt = $pdo->prepare('SELECT * FROM fs_validasistema(:id, :sistema)');
+            $stmt->bindParam(':id', $id);
+            $stmt->bindParam(':sistema', self::$sistema);
+            if($stmt->execute()){
+                $temp = $stmt->fetch();
+                if (is_bool($temp))
+                    $admin = $temp;
+                else
+                    $admin = boolval($temp['permiso']);
+            }
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $admin;
+    }
+    public static function getRol($pdo, $nom_rol){
+        $rol = '';
+        try {
+            $stmt = $pdo->prepare('SELECT "RolUsuario_id" FROM fs_rolusuario(:sistema,null) WHERE UPPER("RolUsuario_desc") = \'' . $nom_rol . '\'');
+            $stmt->bindParam(':sistema', self::$sistema);
+            if($stmt->execute()){
+                $temp = $stmt->fetch();
+                $rol = $temp['RolUsuario_id'];
+            }
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $rol;
+    }
+    public static function getValidacion($pdo, $nom_rol){
+        $rol = '';
+        try {
+            $stmt = $pdo->prepare('SELECT "RolUsuario_id" FROM fs_rolusuario(:sistema,null) WHERE UPPER("RolUsuario_desc") = \'' . $nom_rol . '\'');
+            $stmt->bindParam(':sistema', self::$sistema);
+            if($stmt->execute()){
+                $temp = $stmt->fetch();
+                $rol = $temp['RolUsuario_id'];
+            }
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $rol;
+    }
+    
+/********* ALUMNOS **********/
+    public static function getAlumnos($pdo){
+        $alumnos = array();
+        try {
+            $stmt = $pdo->prepare('SELECT DISTINCT "Usuario_id" AS id, "Usuario_nombre" AS nombre, "Usuario_apellidos" AS apellidos FROM fs_alumno(null, null) ORDER BY apellidos, nombre');
+            if($stmt->execute())
+                $alumnos = $stmt->fetchAll();
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $alumnos;
+    }
+    public static function buscaAlumno($pdo, $idalumno, $clave){
+        $alumno = array();
+        try {
+            if ($idalumno == 0){
+                $stmt = $pdo->prepare('SELECT * FROM fs_alumno(NULL,:clave)');
+                $stmt->bindParam(':clave', $clave);
+            } else {
+                $stmt = $pdo->prepare('SELECT * FROM fs_alumno(:id,null)');
+                $stmt->bindParam(':id', $idalumno);
+            }
+            if($stmt->execute())
+                $alumno = $stmt->fetch();
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $alumno;
+    }    
+    public static function validacionDatosAlumno($pdo, $idalumno) {
+        $validando = false;
+        try {
+            $stmt = $pdo->prepare('SELECT * FROM fs_checkusuario_estado(:Usuario_id)');
+            $stmt->bindParam(':Usuario_id', $idalumno);
+            if($stmt->execute()){
+                $temp = $stmt->fetch();
+                if (isset($temp['CheckUsuario_Estado_id']) && $temp['CheckUsuario_Estado_id'] == 1)
+                    $validando = true;
+
+            }
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $validando;
+    }
+    public static function checkDatosAlumno($pdo, $idalumno) {
+        $datos = array();
+        try {
+            $stmt = $pdo->prepare('SELECT "Usuario_nombre_new", "Usuario_apellidos_new", "Usuario_curp_new" FROM fs_checkusuario(1,null,null) WHERE "Usuario_id" = ' . $idalumno);
+            if($stmt->execute())
+                $datos = $stmt->fetch();
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $datos;
+    }
+
+/*** Datos Personales ***/
+    public static function nivelAlumno($pdo, $idalumno) {
+        $nivel = array();
+        try {
+            $stmt = $pdo->prepare('SELECT "Nivel_id", "EstadoAlumno_id" from fs_alumno(:Usuario_id, NULL) ORDER BY "Usuario_claveULSA" DESC');
+            $stmt->bindParam(':Usuario_id', $idalumno);
+            if($stmt->execute())
+                $nivel = $stmt->fetch();
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $nivel;
+    }
+    public static function clavesAlumno($pdo, $idalumno){
+        $claves = array();
+        try {
+            $stmt = $pdo->prepare('SELECT "Usuario_nombre", "Usuario_apellidos", "Usuario_curp", "Usuario_claveULSA", "Carrera_desc", "EstadoAlumno_id" FROM fs_alumno(:Usuario_id, NULL) ORDER BY "Usuario_claveULSA" DESC');
+            $stmt->bindParam(':Usuario_id', $idalumno);
+            if($stmt->execute())
+                $claves = $stmt->fetchAll();
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $claves;
+    }
+    public static function fotoAlumno($pdo, $idalumno) {
+        $foto = self::$foto_pefil;
+        try {
+            $stmt = $pdo->prepare('SELECT "Usuario_foto" FROM fs_alumno(:Usuario_id, NULL) ORDER BY "Usuario_claveULSA" LIMIT 1');
+            $stmt->bindParam(':Usuario_id', $idalumno);
+            if($stmt->execute()){
+                $temp = $stmt->fetch();
+                if(isset($temp['Usuario_foto']) && !is_null($temp['Usuario_foto']))
+                    $foto = $temp['Usuario_foto'];
+            }
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $foto;
+    }
+    public static function semblanzaAlumno($pdo, $idalumno) {
+        $semblanza = '';
+        try {
+            $stmt = $pdo->prepare('SELECT * FROM fs_usuariosemblanza(:Usuario_id)');
+            $stmt->bindParam(':Usuario_id', $idalumno);
+            if($stmt->execute()){
+                $temp = $stmt->fetch();
+                if(isset($temp['Usuario_semblanza']))
+                    $semblanza = $temp['Usuario_semblanza'];
+            }
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $semblanza;
+    }
+    public static function actualizaDatosAlumno($pdo, $nombre, $apellidos, $curp, $idalumno){
+        $exito = false;
+        try {
+            $stmt = $pdo->prepare('SELECT * FROM fi_checkusuario(:Usuario_id,\'t\',null,:Nombre,:Apellidos,:CURP,null,null)');
+            $stmt->bindParam(':Nombre', $nombre);
+            $stmt->bindParam(':Apellidos', $apellidos);
+            $stmt->bindParam(':CURP', $curp);
+            $stmt->bindParam(':Usuario_id', $idalumno);
+            if($stmt->execute())
+                $exito = true;
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $exito;
+    }
+    public static function actualizaFotoAlumno($pdo, $idalumno, $foto=null){
+        $exito = false;
+        try {
+            if (is_null($foto))
+                $stmt = $pdo->prepare('SELECT * FROM fu_usuariofoto(:Usuario_id, NULL)');
+            else {
+                $stmt = $pdo->prepare('SELECT * FROM fu_usuariofoto(:Usuario_id, :foto)');
+                $stmt->bindParam(':foto', $foto);
+            }
+            $stmt->bindParam(':Usuario_id', $idalumno);
+            if($stmt->execute())
+                $exito = true;
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $exito;
+    }
+    public static function actualizaSemblanzaAlumno($pdo, $acerca, $idalumno){
+        $exito = false;
+        try {
+            $stmt = $pdo->prepare('SELECT * FROM fu_usuariosemblanza(:Usuario_id,:Acerca)');
+            $stmt->bindParam(':Acerca', $acerca);
+            $stmt->bindParam(':Usuario_id', $idalumno);
+            if($stmt->execute())
+                $exito = true;
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $exito;
+    }
+    
+/********* REDES **********/
+    public static function contactosAlumno($pdo, $idalumno){
+        $contactos = array();
+        try {
+            $stmt = $pdo->prepare('SELECT "Contacto_id", "Contacto_valor", "TipoContacto_id", "PerfilContacto_desc", "SubtipoContacto_desc" from fs_contacto(:Usuario_id, null, null) WHERE "Contacto_activo" IS TRUE ORDER BY "TipoContacto_id"');
+            $stmt->bindParam(':Usuario_id', $idalumno);
+            if($stmt->execute())
+                $contactos = $stmt->fetchAll();
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $contactos;
+    }
+    public static function getSubTipoContacto($pdo, $idtipocontacto){
+        $subtipo = array();
+        try {
+            $stmt = $pdo->prepare('SELECT * FROM fs_subtipocontacto(:TipoContacto,null) ORDER BY "SubtipoContacto_desc"');
+            $stmt->bindParam(':TipoContacto', $idtipocontacto);
+            if($stmt->execute())
+                $subtipo = $stmt->fetchAll();
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $subtipo;
+    }
+    public static function emergenciaAlumno($pdo, $idalumno){
+        $contactos = array();
+        try {
+            $stmt = $pdo->prepare('SELECT * from fs_contactoemergencia(:Usuario_id) ORDER BY "ContactoEmergencia_nombre"');
+            $stmt->bindParam(':Usuario_id', $idalumno);
+            if($stmt->execute())
+                $contactos = $stmt->fetchAll();
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $contactos;
+    }
+    public static function getRedes($pdo){
+        $redes = array();
+        try {
+            $stmt = $pdo->prepare('SELECT * FROM fs_tipocontacto(null) ORDER BY "TipoContacto_desc"');
+            if($stmt->execute())
+                $redes = $stmt->fetchAll();
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $redes;
+    }    
+    public static function eliminaContacto($pdo, $idalumno, $idcontacto){
+        $status = false;
+        try {
+            $stmt = $pdo->prepare('SELECT * FROM fd_contacto(:Usuario_id, :Red_id)');
+            $stmt->bindParam(':Red_id', $idcontacto);
+            $stmt->bindParam(':Usuario_id', $idalumno);
+            if($stmt->execute())
+                $status = true;
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $status;
+    }
+    public static function eliminaContactoEmergencia($pdo, $idalumno){
+        $status = false;
+        try {
+            $stmt = $pdo->prepare('SELECT * FROM fd_contactoemergencia(:Usuario_id)');
+            $stmt->bindParam(':Usuario_id', $idalumno);
+            if($stmt->execute())
+                $status = true;
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $status;
+    }
+    public static function agregaContacto($pdo, $red, $dato, $uso, $idalumno, $subtipostatus, $subtipo){
+        $exito = false;
+        try {
+            if ($_POST['subtipostatus']) {
+                $stmt = $pdo->prepare('SELECT * FROM fi_contacto(:Dato,:Red,:Usuario_id,:Uso,:Subtipo)');
+                $stmt->bindParam(':Subtipo', $_POST['subtipo']);
+            } else
+                $stmt = $pdo->prepare('SELECT * FROM fi_contacto(:Dato,:Red,:Usuario_id,:Uso,null)');
+            $stmt->bindParam(':Red', $_POST['red']);
+            $stmt->bindParam(':Dato', $_POST['dato']);
+            $stmt->bindParam(':Uso', $_POST['uso']);
+            $stmt->bindParam(':Usuario_id', $idalumno);
+            if($stmt->execute())
+                $exito = true;
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $exito;
+    }
+    public static function agregaContactoEmergencia($pdo, $nombre, $dato, $idalumno){
+        $exito = false;
+        try {
+            $stmt = $pdo->prepare('SELECT * FROM fi_contactoemergencia(:Usuario_id,:Nombre,:Dato)');
+            $stmt->bindParam(':Dato', $dato);
+            $stmt->bindParam(':Nombre', $nombre);
+            $stmt->bindParam(':Usuario_id', $idalumno);
+            if($stmt->execute())
+                $exito = true;
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $exito;
+    }
+
+/********* HORARIOS **********/
+    public static function getDias($pdo){
+        $dias = array();
+        try {
+            $stmt = $pdo->prepare('SELECT * from fs_dia(NULL)');
+            if($stmt->execute())
+                $dias = $stmt->fetchAll();
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $dias;
+    }
+    public static function getHorarioGrupo($pdo, $grupo){
+        $horario = array();
+        try {
+            $stmt = $pdo->prepare('SELECT * from fs_horariogrupo(:gpo, NULL, false)');
+            $stmt->bindParam(':gpo', $grupo);
+            if($stmt->execute())
+                $horario = $stmt->fetchAll();
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $horario;
+    }    
+    public static function getProfesorHorarioGrupo($pdo, $grupo){
+        $horario = array();
+        try {
+            $stmt = $pdo->prepare('SELECT * from fs_profesorhorariogrupo(:gpo)');
+            $stmt->bindParam(':gpo', $grupo);
+            if($stmt->execute())
+                $horario = $stmt->fetchAll();
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $horario;
+    }
+    public static function getSubMateriaHorarioGrupo($pdo, $grupo){
+        $horario = array();
+        try {
+            $stmt = $pdo->prepare('SELECT * from fs_submateriahorariogrupo(:gpo)');
+            $stmt->bindParam(':gpo', $grupo);
+            if($stmt->execute())
+                $horario = $stmt->fetchAll();
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $horario;
+    }
+    public static function getSubMateriaHorarioGrupoProfesor($pdo, $grupo, $sub){
+        $horario = array();
+        try {
+            $stmt = $pdo->prepare('SELECT * from fs_submateriahorariogrupoprofesor(:gpo,:sub)');
+            $stmt->bindParam(':gpo', $grupo);
+            $stmt->bindParam(':sub', $sub);
+            if($stmt->execute())
+                $horario = $stmt->fetchAll();
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $horario;
+    }
+    public static function getHorarioProfesor($pdo, $usr, $fecha){
+        $horario = array();
+        try {
+            $stmt = $pdo->prepare('SELECT * from fs_mihorariofull(:user, :fecha, 3)');
+            $stmt->bindParam(':user', $usr);
+            $stmt->bindParam(':fecha', $fecha);
+            if($stmt->execute())
+                $horario = $stmt->fetchAll();
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $horario;
+    }
+    public static function getExtraordinarios($pdo, $periodo, $semestre, $plan){
+        $horario = array();
+        try {
+            $stmt = $pdo->prepare('SELECT * FROM fs_examenextraordinario( NULL, :per, :semestre, :plan_estudio)');
+            $stmt->bindParam(":per", $periodo);
+            $stmt->bindParam(":semestre", $semestre);
+            $stmt->bindParam(":plan_estudio", $plan);
+            if($stmt->execute())
+                $horario = $stmt->fetchAll();
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $horario;
+    }
+    public static function getGrupos($pdo, $periodo){
+        $grupos = array();
+        try {
+            $stmt = $pdo->prepare('SELECT * from fs_grupo(NULL, :periodo)');
+            $stmt->bindParam(':periodo', $periodo);
+            if($stmt->execute())
+                $grupos = $stmt->fetchAll();
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $grupos;
+    }
+    public static function getDocentes($pdo, $periodo){
+        $docentes = array();
+        try {
+            $stmt = $pdo->prepare('SELECT * FROM fs_profesoresperiodo_busca(:periodo, null, null, 0, null)');
+            $stmt->bindParam(':periodo', $periodo);
+            if($stmt->execute())
+                $docentes = $stmt->fetchAll();
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $docentes;
+    }
+    public static function getPlanes($pdo){
+        $planes = array();
+        try {
+            $stmt = $pdo->prepare('SELECT * FROM fs_planestudio(1, NULL, NULL, true, 0, NULL)');
+            if($stmt->execute())
+                $planes = $stmt->fetchAll();
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $planes;
+    }
+
+/********* INSIGNIAS **********/
+    public static function getInsignias($pdo, $user){
+        $insigias = array();
+        try {
+            $stmt = $pdo->prepare('SELECT * FROM fs_insigniareportealumno(:Usuario_id)');
+            $stmt->bindParam(':Usuario_id', $user);
+            if($stmt->execute())
+                $insigias = $stmt->fetchAll();
+        } catch (\PDOException $ex) {}
+        $stmt->closeCursor();
+        $stmt = null;
+        return $insigias;
+    }
+}

+ 202 - 0
classes/Template.php

@@ -0,0 +1,202 @@
+<?php
+require_once 'Archivos.php';
+
+class Template {
+    public static function footer() { ?>
+<div class="container-fluid">
+    <footer class="footer" >
+        <div class="footerTop">
+        <div class="container">
+                <div class="logotipo">
+                    <img src="img/lasalle-logo-blanco.png" alt="Universidad La Salle" width="15%">
+                    <h3> <span>Profesionales</span>con <strong>Valor</strong></h3>
+                </div>
+                <div class="ubicacion">
+                    <div class="address">
+                        <div class="tabs">
+                            <ul class="nav list-inline" id="tabsFooter" role="tablist">
+                                <li class="list-inline-item">
+                                    <a class="nav-link  active" id="unidad1-tab" data-toggle="tab" href="#unidad1" role="tab" aria-controls="calendario" aria-selected="true">Unidad Condesa</a>
+                                </li>
+                                <li class="list-inline-item">
+                                    <a class="nav-link " id="unidad2-tab" data-toggle="tab" href="#unidad2" role="tab" aria-controls="lista" aria-selected="false">Unidad Santa Teresa</a>
+                                </li>
+                                <li class="list-inline-item">
+                                    <a class="nav-link " id="unidad3-tab" data-toggle="tab" href="#unidad3" role="tab" aria-controls="lista" aria-selected="false">Unidad San Fernando</a>
+                                </li>
+                                <li class="list-inline-item">
+                                    <a class="nav-link" id="unidad4-tab" data-toggle="tab" href="#unidad4" role="tab" aria-controls="lista" aria-selected="false">Unidad Santa Lucía</a>
+                                </li>
+                            </ul>
+                            <div class="tab-content" id="tabsCont">
+                                <div class="tab-pane fade show active" id="unidad1" role="tabpanel" aria-labelledby="unidad1-tab">
+                                    <p>Benjamín Franklin No 45, Col. Condesa, Alc. Cuauhtémoc, CDMX, CP 06140 <span class="tel">Tel. <a href="tel:+525552789500">55 5278-9500</a> / <a href="tel:+8005272553">800 LASALLE</a></span><br>
+                                    <a class="btnMap " href="https://www.google.com/maps/place/Universidad+La+Salle/@19.4085702,-99.1810039,15z/data=!4m5!3m4!1s0x0:0x3108b5797f9c9ecd!8m2!3d19.4085702!4d-99.1810039" target="_blank"> <span class="fas fa-map-marker-alt mr-1"></span>¿Cómo llegar?</a></p>
+                                </div>
+                                <div class="tab-pane fade" id="unidad2" role="tabpanel" aria-labelledby="unidad2-tab">
+                                    <p>Camino a Santa Teresa 811, Col. Rinconada del Pedregal, Alc. Tlalpan, CDMX, CP 14010 <span class="tel">Tel. <a href="tel:5552789500">55 5278-9500</a> / <a href="tel:+8005272553">800 LASALLE</a></span><br>
+                                    <a class="btnMap " href="https://www.google.com/maps/place/Universidad+La+Salle+Unidad+Santa+Teresa/@19.299013,-99.196093,15z/data=!4m5!3m4!1s0x0:0xdfc2b61c9b67aac2!8m2!3d19.299013!4d-99.196093" target="_blank"> <span class="fas fa-map-marker-alt mr-1"></span>¿Cómo llegar?</a></p>
+                                </div>
+                                <div class="tab-pane fade" id="unidad3" role="tabpanel" aria-labelledby="unidad3-tab">
+                                    <p>Av. De Las Fuentes 17, Col. Tlalpan, Alc. Tlalpan, CDMX, CP 14000 <span class="tel">Tel. <a href="tel:+525552789500">55 5278-9500</a> / <a href="tel:+8005272553">800 LASALLE</a></span><br>
+                                    <a class="btnMap " href="https://www.google.com/maps/place/Universidad+La+Salle+Facultad+de+Medicina/@19.2930318,-99.1720808,15z/data=!4m5!3m4!1s0x0:0x29b7725e5a004277!8m2!3d19.2930318!4d-99.1720808" target="_blank"> <span class="fas fa-map-marker-alt mr-1"></span>¿Cómo llegar?</a></p>
+                                </div>
+                                <div class="tab-pane fade" id="unidad4" role="tabpanel" aria-labelledby="unidad4-tab">
+                                    <p>Av. Tamaulipas 3, Col. Zona Federal, Alc. Álvaro Obregón, CDMX, CP 01357 <span class="tel">Tel. <a href="tel:5556021130">55 5602-1130</a> </span><br>
+                                    <a class="btnMap " href="https://www.google.com/maps/place/Unidad+Deportiva+La+Salle/@19.3662852,-99.2421597,15z/data=!4m5!3m4!1s0x0:0x88e0334f044bc518!8m2!3d19.3662852!4d-99.2421597" target="_blank"> <span class="fas fa-map-marker-alt mr-1"></span>¿Cómo llegar?</a></p>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="redes">
+                        <h4>Compartir :</h4>
+                        <ul>
+                            <li><a href="https://www.facebook.com/LaSalleMXIngenieria" target="_blank"><i class="ing-fb2 ing-fw"></i></a></li>
+                            <!--<li><a href="https://twitter.com/lasalle_mx" target="_blank"><i class="fab fa-twitter fa-fw"></i></a></li>-->
+                            <li><a href="https://www.youtube.com/user/IngenieriaLaSalle/" target="_blank"><i class="ing-youtube ing-fw"></i></a></li>
+                            <!--<li><a href="https://www.instagram.com/lasalle_mx/" target="_blank"><i class="fab fa-instagram fa-fw"></i></a></li>-->
+                            <!--<li><a href="https://www.linkedin.com/school/universidad-la-salle?pathWildcard=24227" target="_blank"><i class="fab fa-linkedin-in fa-fw"></i></a></li>-->
+                        </ul>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="footerMiddle">
+            <div class="container">
+                <div class="row justify-content-md-center">
+                    <nav class="col-12 col-md-10">
+                        <a class="footerMore menuMore" href="#">Sistema y Red La Salle</a>
+                        <ul>
+                            <li><a href="http://bajio.delasalle.edu.mx/" target="_blank">Bajío</a></li>
+                            <li><a href="http://www.lasalle.mx/" target="_blank">Ciudad de México</a></li>
+                            <li><a href="http://lasallecancun.edu.mx/" target="_blank">Cancún</a></li>
+                            <li><a href="http://www.ulsapuebla.mx/" target="_blank">Puebla</a></li>
+                            <li><a href="http://www.ulsapuebla.mx/" target="_blank">Chihuahua</a></li>
+                            <li><a href="http://www.lasallecuernavaca.edu.mx/wp/" target="_blank">Cuernavaca</a></li>
+                            <li><a href="http://www.ulsalaguna.edu.mx/" target="_blank">Laguna</a></li>
+                            <li><a href="http://www.lasallemorelia.edu.mx/" target="_blank">Morelia</a></li>
+                            <li><a href="http://www.ulsaneza.edu.mx/" target="_blank">Nezahualcóyotl</a></li>
+                            <li><a href="http://www.ulsa-noroeste.edu.mx/n2015/" target="_blank">Noroeste</a></li>
+                            <li><a href="http://www.ulsaoaxaca.edu.mx/" target="_blank">Oaxaca</a></li>
+                            <li><a href="http://www.lasallep.edu.mx/" target="_blank">Pachuca</a></li>
+                            <li><a href="https://www.ulsasaltillo.edu.mx/" target="_blank">Saltillo</a></li>
+                            <li><a href="https://www.lasallevictoria.edu.mx/" target="_blank">Victoria</a></li>
+                        </ul>
+                    </nav>
+                </div>
+            </div>
+        </div>
+        <div class="footerBottom">
+            <div class="container">
+                <div class="logotipos">
+                    <ul>
+                        <li><a href="http://redlasalle.mx/" target="_blank"><img src="img/la-salle-logo-red-universidades.png" alt="La Salle - logotipo" class="img-responsive" width="80"></a></li>
+                    <li><a href="http://ialu.org/english/" target="_blank"><img src="img/la-salle-logo-international-ia.png" alt="La Salle - logotipo" class="img-responsive" width="80"></a></li>
+                    </ul>
+                </div>
+                <div class="legales">
+                    <a class="footerMore menuMore" href="#">Legales</a>
+                    <ul>
+                        <li><a href="https://lasalle.mx/globales/contacto.html" target="_blank">Contacto</a></li>
+                        <li><a href="https://lasalle.mx/globales/terminos-y-condiciones.html" target="_blank">Términos y condiciones</a></li>
+                        <li><a href="https://lasalle.mx/globales/aviso-de-privacidad.html" target="_blank">Aviso de Privacidad</a></li>
+                        <!--<li><a href="https://lasalle.mx/globales/mapa-de-sitio.html" target="_blank">Mapa de sitio</a></li>
+                        <li><a href="https://lasalle.mx/globales/preguntas-frecuentes/" target="_blank">Preguntas frecuentes</a></li>-->
+                    </ul>
+                </div>
+            </div>
+        </div>
+    </footer>
+</div>        
+    <?php }
+    
+    public static function getCSS($extras = array(), $subcarpeta = false){ 
+        $sube = '';
+        if ($subcarpeta)
+            $sube = '../'; ?>
+        <meta charset="utf-8">
+        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+        <meta http-equiv="Last-Modified" content="0">
+        <meta http-equiv="Cache-Control" content="no-cache, mustrevalidate">
+        <meta http-equiv="Pragma" content="no-cache">
+        <link rel="icon" href="<?php echo $sube; ?>img/favicon.ico" />
+        <link rel="stylesheet" href="<?php echo $sube . self::load_css('bootstrap-ing.min.css'); ?>">
+        <link rel="stylesheet" href="<?php echo $sube . self::load_css('indivisa.css'); ?>">
+        <link rel="stylesheet" href="<?php echo $sube . self::load_css('fa_all.css'); ?>">
+        <link rel="stylesheet" href="<?php echo $sube . self::load_css('ingfont.css'); ?>">
+        <link rel="stylesheet" href="<?php echo $sube . self::load_css('template.css'); ?>">
+        <link rel="stylesheet" href="<?php echo $sube . self::load_css('general.css'); ?>">
+        <?php foreach($extras as $extra){ ?>
+        <link rel="stylesheet" href="<?php echo $sube . self::load_css($extra); ?>">    
+        <?php }
+    }
+    
+    private static function load_css($file){
+        $adds = false;
+        $tempFile = Archivos::getRuta();
+        if (substr( $file, 0, 1 ) === '-') {
+            $adds = true;
+            $file = substr($file, 1);
+        }        
+        if (file_exists($tempFile)){
+            if ($adds)
+                $tempFile .= $file;
+            else                
+                $tempFile .= 'css/' .$file;
+        } else {
+            if ($adds)
+                $tempFile .= $_SERVER['DOCUMENT_ROOT'] . '/' .$file;
+            else
+                $tempFile = $_SERVER['DOCUMENT_ROOT'] . '/css/' .$file;
+        }
+        if (file_exists($tempFile))
+            $t = filemtime($tempFile);
+        if ($t)
+            $file .= '?t=' . $t;
+        if ($adds)
+            return $file;
+        else
+            return 'css/' .$file;
+    }
+    
+    public static function getJS($extras = array(), $subcarpeta = false){ 
+        $sube = '';
+        if ($subcarpeta)
+            $sube = '../'; ?>
+        <script src="<?php echo $sube . self::load_js('jquery.min.js'); ?>"></script>
+        <script src="<?php echo $sube . self::load_js('popper.min.js'); ?>"></script>
+        <script src="<?php echo $sube . self::load_js('bootstrap.min.js'); ?>"></script>
+        <script src="<?php echo $sube . self::load_js('template.js'); ?>"></script>
+        <?php foreach($extras as $extra){ ?>
+        <script src="<?php echo $sube . self::load_js($extra); ?>"></script>    
+        <?php }
+    }
+
+    private static function load_js($file){
+        $adds = false;
+        $tempFile = Archivos::getRuta ();
+        if (substr( $file, 0, 1 ) === '-') {
+            $adds = true;
+            $file = substr($file, 1);
+        }        
+        if (file_exists($tempFile)){
+            if ($adds)
+                $tempFile .= $file;
+            else                
+                $tempFile .= 'js/' .$file;
+        } else {
+            if ($adds)
+                $tempFile .= $_SERVER['DOCUMENT_ROOT'] . '/' .$file;
+            else
+                $tempFile = $_SERVER['DOCUMENT_ROOT'] . '/js/' .$file;
+        }
+        if (file_exists($tempFile))
+            $t = filemtime($tempFile);
+        if ($t)
+            $file .= '?t=' . $t;
+        if ($adds)
+            return $file;
+        else
+            return 'js/' .$file;
+    }
+}

+ 163 - 0
classes/ValidaSesion.php

@@ -0,0 +1,163 @@
+<?php
+/**
+ * Clase para validar la sesión del usuario y que el usuario esté activo.
+ *
+ * @author Alejandro
+ */
+class ValidaSesion {
+    private $acceso, $edicion, $pagina, $sistema = 8;//guarda si el usuario puede acceder y/o editar
+    private $error, $hasError = false;
+    
+    /**
+     * Constructor
+     * @return boolean
+     */
+    function __construct($pdo, $submenu) {
+        if (session_status() == PHP_SESSION_NONE) {
+            session_start();
+        }
+        $session_life = 1*60*60;//1 hora convertido a segundos
+        // check to see if $_SESSION["timeout"] is set
+        if (isset($_SESSION['timeout'])) {
+        // calculate the session's "time to live"
+            $sessionTTL = time() - $_SESSION['timeout'];
+            if ($sessionTTL > $session_life) {
+                $this->terminaSesion();
+            }
+        }else
+            $this->terminaSesion();
+        $_SESSION['timeout'] = time();
+        
+        if(!isset($_SESSION['usuario_id']) || $_SESSION['usuario_id'] == '') $this->terminaSesion();
+        
+        //existe id en sesión?
+        if(array_key_exists("usuario_id", $_SESSION) && is_numeric($_SESSION["usuario_id"]) && $_SESSION["usuario_id"] > 0){
+            if(is_int($submenu)){
+                $this->obtenerNombrePagina($pdo, $submenu);
+                //valida permisos
+                $stmt = $pdo->prepare('Select * from alu_fs_validapermisos(:rol, :sub)');//devuelve: permiso, edicion
+                $stmt->bindParam(":rol", $_SESSION["RolUsuario_id"]);
+                $stmt->bindParam(":sub", $submenu);
+                if(!$stmt->execute()){
+                    $this->hasError = true;
+                    $this->error = $stmt->errorInfo();
+                }else{
+                    $rs = $stmt->fetch();
+                    $stmt->closeCursor(); // cierra conexion de resultado
+                    $stmt = null; // cierra conexion
+
+                    //si es administrador de sistema, siempre es true
+                    $this->acceso = (bool) $rs["permiso"];
+                    $this->edicion = (bool) $rs["edicion"];
+                    $rs = null;
+                }
+            }else if(is_array($submenu)){
+                $stmt = $pdo->prepare('Select * from alu_fs_validapermisos(:sub, :sist)');//devuelve: permiso, edicion
+                $stmt->bindParam(":sist", $this->sistema);
+                foreach($submenu as $subItem){
+                    if(!$this->hasError){
+                        //valida permisos
+                        $stmt->bindParam(":sub", $subItem);
+                        if(!$stmt->execute()){
+                            $this->hasError = true;
+                            $this->error = $stmt->errorInfo();
+                        }else{
+                            $rs = $stmt->fetch();
+
+                            //si es administrador de sistema, siempre es true
+                            $this->acceso = $this->acceso || (bool) $rs["permiso"];
+                            $this->edicion = $this->edicion || (bool) $rs["edicion"];
+                            $rs = null;
+                        }
+                    }
+                }
+                $stmt->closeCursor(); // cierra conexion de resultado
+                $stmt = null; // cierra conexion
+            }else if(is_null($submenu)){
+                //Valida permisos de acceso sistema
+                $stmt = $pdo->prepare('Select * from fs_validasistema(:usr, :sist)');//devuelve: permiso, edicion
+                $stmt->bindParam(":usr", $_SESSION["usuario_id"]);
+                $stmt->bindParam(":sist", $this->sistema);
+                if(!$stmt->execute()){
+                    $this->hasError = true;
+                    $this->error = $stmt->errorInfo();
+                }else{
+                    $rs = $stmt->fetch();
+                    $stmt->closeCursor(); // cierra conexion de resultado
+                    $stmt = null; // cierra conexion
+
+                    $this->acceso = (bool) $rs["permiso"];
+                    $this->edicion = false;//acceso a sistema no tiene edición
+                    $rs = null;
+                }
+            }else{
+                $this->hasError = true;
+                $this->error = "Dato no válido en validación de permisos";
+            }
+        }else{
+            $this->error = "No existe la llave en sesión";
+            $this->hasError = true;
+            $this->acceso = false;
+            $this->edicion = false;
+        }
+        if($this->hasError){
+            $this->acceso = false;
+            $this->edicion = false;
+        }
+    }
+    private function obtenerNombrePagina($pdo, $submenu){
+        $this->pagina = '';
+        try {
+            $stmt = $pdo->prepare('SELECT "Submenu_desc" FROM fs_menusubmenus(:sist) WHERE "Submenu_id" = ' . $submenu );
+            $stmt->bindParam(":sist", $this->sistema);
+            if($stmt->execute()){
+                $temp = $stmt->fetch();
+                if (isset($temp['Submenu_desc']))
+                    $this->pagina = $temp['Submenu_desc'];
+            }
+        } catch (\PDOException $ex) {}            
+        $stmt->closeCursor();
+        $stmt = null;
+    }
+    function nombrePagina(){
+        return $this->pagina;
+    }
+
+
+    function tieneAcceso(){
+        return $this->acceso;
+    }
+    
+    function puedeEditar(){
+        return $this->acceso && $this->edicion;
+    }
+    
+    function tieneError(){
+        return $this->hasError;
+    }
+    
+    function getError(){
+        return $this->error;
+    }
+    
+    function terminaSesion(){
+        $_SESSION = array();
+        session_destroy();
+        header('Location: salir.php?expired=1');
+        exit();
+    }
+    
+    public static function salirPagina(){
+        $_SESSION = array();
+        session_destroy();
+        header('Location: salir.php');
+        exit();
+    }
+    
+    public static function errorBD(){
+        $_SESSION = array();
+        session_destroy();
+        header('Location: error.php');
+        exit();
+    }
+}

+ 32 - 0
construccion.php

@@ -0,0 +1,32 @@
+<?php
+require_once 'classes/Template.php';
+$titulo = 'En construcción';
+?>
+
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>Alumnos - <?php echo $titulo; ?></title>
+        <?php Template::getCSS(); ?>
+        <style>
+
+            
+        </style>
+    </head>
+    <body>
+        <?php Template::header($titulo); ?>
+        <main class="container-fluid marco">            
+            <div class="row justify-content-center">
+                <img id="errorImg" class="col-sm-3" src="img/nico_ing.svg" />
+                <div class="col-sm-9 d-flex flex-column">                    
+                    <div class="display-4 text-center p-2 mb-3">Página en Construcción</div>
+                </div>
+            </div>
+            <div id="error" class="d-none"><?php print_r($_SESSION['error']); ?></div>
+        </main>
+        <div style="isolation: isolate;">
+        <?php Template::footer(); ?>
+        </div>
+        <?php Template::getJS(); ?>
+    </body>
+</html>

文件差异内容过多而无法显示
+ 0 - 0
css/bootstrap-ing.min.css


+ 61 - 0
css/custominputfile.css

@@ -0,0 +1,61 @@
+/*
+    jQuery Custom Input File Plugin - version 1.0
+	Copyright 2014, Ángel Espro, www.aesolucionesweb.com.ar,
+	Licence : GNU General Public License
+
+	Site: www.aesolucionesweb.com.ar/plugins/custom-input-file
+	
+	You must not remove these lines. Read gpl.txt for further legal information.
+*/
+
+/*File Picker*/
+.cif-file-picker { position:relative; width: 100%; height:180px; padding:0; border:4px dashed var(--mainColor-50); cursor: pointer; opacity: 0.5;
+   display:flex; flex-direction: column; justify-content: center; align-items: center; box-sizing:border-box; -moz-box-sizing:border-box; }
+.cif-icon-picker { background:url(cif-icons-20xy.png) 0 0 no-repeat; width:80px; height:60px; display:inline-block; }
+.cif-file-picker h3 { margin:0; font-size:20px; text-align:center; }
+.cif-file-picker p { margin:0 0 10px 0; font-size:16px; text-align:center; }
+.cif-file-picker:hover { opacity: 1; }
+.cif-file-picker.dragover:not(.inactive) { border-color: #46be5e; opacity: 1; box-shadow:0 0 50px rgba(0,0,0,.5); }
+.cif-file-picker.inactive { opacity: 0.2; }
+.cif-file-picker.inactive.dragover { cursor:pointer; }
+
+/*Container item File*/
+.cif-file-container { height: 165px; max-height: 165px; overflow-y: auto; margin: 0; padding: 0; }
+.cif-parent { cursor: pointer; position: relative; padding: 5px; margin: 0; transition: 0.2s; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; }
+.foto-file-row .field-wr-int { position: relative; }
+
+/*CIF Close*/
+.cif-close { background: var(--danger); color: var(--white); width: 22px; height: 22px; border-radius: 50%; display: flex; justify-content: center; align-items: center; }
+.cif-close:hover { border: 1px solid var(--danger); background: var(--white); color: var(--danger); }
+
+/*Container All type*/
+.cif-file-container.cif-container-all-type { display: none; }
+.cif-file-container.cif-container-all-type .cif-file-row { margin: 0; }
+.cif-file-container.cif-container-all-type .cif-file-row:nth-child(odd) { background: #EFEFEF; }
+.cif-file-container.cif-container-all-type .cif-parent { width:100%; box-sizing:border-box; -moz-box-sizing:border-box; padding:10px 30px 10px 10px; }
+.cif-file-container.cif-container-all-type .cif-all-type { font-size:0.65rem; line-height:1.25; }
+.cif-file-container.cif-container-all-type .cif-file-size { opacity: 0.8; }
+.cif-file-container.cif-container-all-type .cif-close { position: absolute; top: 50%; right: 5px; transform: translateY(-50%); }
+
+/*Container Image*/
+.cif-file-container.cif-container-image-type{display: none}
+.cif-file-container.cif-container-image-type .cif-file-row{border-bottom:1px solid #f2f2f2; padding: 20px 0}
+.cif-file-container.cif-container-image-type .cif-parent{padding-top:30px;}
+.cif-file-container.cif-container-image-type .cif-close { position: absolute; top: 10px; right: 10px; }
+.cif-img{max-height:300px; max-width:380px;}
+
+/*message*/
+#cif-msg-wr { position:fixed; z-index:10000; top: 100px; }
+#cif-msg-wr .cif-msg-close { opacity: 0.5; position: absolute; right: 0; top: 0; padding: 2px 5px; }
+#cif-msg-wr .cif-msg-close:hover { opacity: 1; }
+
+/*Progressbar*/
+.cf-progressbar-wr { position: fixed; top: 0; left: 0; background: rgba(0,0,0,.7); width: 100%; height: 100%; z-index: 50000; }
+.cf-progressbar { height: 12px; position: absolute; top: 50%; margin-top: -6px; left: 50%; margin-left:-125px; width:250px; background: #dadada; padding: 2px; box-sizing: border-box; border: 1px solid #000; }
+.cf-progressbar > span { display: block; height: 100%; background: rgb(43,194,83); background-image: url(bg-progress-bar.png); position: relative; transition: width 200ms; overflow: hidden; }
+
+/*Jcrop for Custom Inpur File plugin*/
+.jcrop-holder .preview-pane { display: block; position: absolute; z-index: 2000; top: 0px; left: 102%; padding: 6px; border: 1px rgba(0,0,0,.4) solid; background-color: white;
+    -webkit-border-radius: 6px; -moz-border-radius: 6px; border-radius: 6px; -webkit-box-shadow: 1px 1px 5px 2px rgba(0, 0, 0, 0.2); -moz-box-shadow: 1px 1px 5px 2px rgba(0, 0, 0, 0.2);
+    box-shadow: 1px 1px 5px 2px rgba(0, 0, 0, 0.2); }
+.preview-pane .preview-container { overflow: hidden;}

+ 84 - 0
css/elementos.css

@@ -0,0 +1,84 @@
+/***** IS-INVALID *****/
+.is-invalid, .dropdownlist.is-invalid > button, .datalist.is-invalid > input { border-color: var(--danger) !important; }
+.dropdownlist.is-invalid > button > span { background: var(--danger) !important; }
+.star-rating.is-invalid > div > label { border-bottom: 1px solid var(--danger); border-top: 1px solid var(--danger); border-right: 0; border-left: 0; }
+.star-rating.is-invalid > div > label:first-of-type { border-right: 1px solid var(--danger); border-radius: 0 10px 10px 0;  }
+.star-rating.is-invalid > div > label:last-of-type { border-left: 1px solid var(--danger); border-radius: 10px 0 0 10px; }
+
+/***** INPUTS *****/
+input { outline: none; }
+input[type=text], input[type=password], input[type=email], input[type=number],
+textarea { color: var(--mainColor); background: transparent; border: 1px solid var(--mainColor); border-radius: 5px; font-weight: 300; vertical-align: middle; padding: 0.5rem; width: 100%;
+    -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; }
+input[type=text]:focus, input[type=password]:focus, input[type=email]:focus, textarea:focus { color: var(--primary); border-color: var(--primary); }
+textarea{ resize: none; overflow-x: hidden; overflow-wrap: break-word; overflow-y: auto; }
+
+/***** DROPDOWNLIST *****/
+.dropdownlist { width: 100%; position: relative }
+.dropdownlist > button { background: transparent; border: 1px solid var(--mainColor); font-size: 1rem; line-height: 1.5; border-radius: 0.25rem; padding: 0; width: 100%; 
+    display: flex; justify-content: space-between; align-items: stretch; }
+.dropdownlist > button > *, .dropdownlist > ul > li { padding: 0.4rem; cursor: pointer; }
+.dropdownlist > button > label { text-align: left; color: var(--mainColor); flex-grow: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 0.9em; }
+.dropdownlist > button > span { display: flex; justify-content: center; align-items: center; padding-left: 1rem; background: var(--mainColor); color: var(--white) !important; clip-path: polygon(25% 0%, 100% 0%, 100% 100%, 0% 100%); }
+.dropdownlist > button:active, .dropdownlist > button:focus  { outline: 0; }
+.dropdownlist > ul { border: 1px solid var(--primary); display: none; border-radius: 0 0 0.25rem 0.25rem; background: var(--white); position: absolute; margin: 0; padding: 0; width: 100%; max-height: 200px; top: 100%; left: 0; 
+    list-style: none; overflow: hidden; overflow-y: auto; z-index: 100; }
+.dropdownlist > ul > li{ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
+.dropdownlist > ul > li.active { color: var(--white) !important; background: var(--danger); }
+.dropdownlist > ul > li:hover{ color: var(--white) !important; background: var(--danger-75); }
+.dropdownlist.show > ul { display: block; }
+.dropdownlist.show > button { border-color: var(--gray); border-radius: 0.25rem 0.25rem 0 0; }
+.dropdownlist.show > button > label { color: var(--gray); }
+.dropdownlist.show > button > span { background: var(--gray); }
+.dropdownlist.show > button > span:before { -webkit-transform: rotate(-180deg); -moz-transform:rotate(-180deg); -o-transform:rotate(-180deg); transform: rotate(-180deg); }
+/* Colores */
+.dropdownlist-azul1 > button { border-color: var(--azul1); }
+.dropdownlist-azul1 > button > label { color: var(--azul1); }
+.dropdownlist-azul1 > button > span { background: var(--azul1); }
+.dropdownlist-azul1 > ul { border: 1px solid var(--azul1); }
+.dropdownlist-azul1 > ul > li.active { background: var(--azul1); }
+.dropdownlist-azul1 > ul > li:hover{ background: var(--azul1-75); }
+.dropdownlist-azul2 > button { border-color: var(--azul2); }
+.dropdownlist-azul2 > button > label { color: var(--azul2); }
+.dropdownlist-azul2 > button > span { background: var(--azul2); }
+.dropdownlist-azul2 > ul { border: 1px solid var(--azul2); }
+.dropdownlist-azul2 > ul > li.active { background: var(--azul2); }
+.dropdownlist-azul2 > ul > li:hover { background: var(--azul2-75); }
+
+/***** DATALIST *****/
+.datalist { width: 100%; }
+datalist > .datalist-input { padding-right: 2rem; }
+.datalist > .input-buscar { font-size: 1.5em; position: absolute; top: 0.5rem; right: 0.5rem; }
+.datalist ul { position: absolute; margin: 0; padding: 0; width: 100%; max-height: 200px; top: 100%; left: 0; list-style: none;
+    border-radius: 2px; background: var(--white); border: 1px solid var(--mainColor); overflow: hidden; overflow-y: auto; z-index: 100; }
+.datalist ul li { display: flex; align-items: center; justify-content: start; padding: 0.8em 1em 0.8em 1em; cursor: pointer; }
+.datalist ul li:hover{ background: var(--danger); color: var(--white); }
+
+/***** BUSCADOR *****
+.input-buscar{ position: absolute; top: 15px; right: 12px; color: #DBDCDD; z-index: 10; }*/
+
+/********** RATING **********/
+.star-rating > .fieldset > input { display: none; }
+.star-rating > .fieldset > label { display: flex; flex-direction: column; align-items: center; padding-left: 1vw; padding-right: 1vw; cursor: pointer; }
+.star-rating > .fieldset > input:checked ~ label > div.ing-estrella1 { color: var(--yellow); }
+.star-rating > .fieldset > input:checked ~ label > div.ing-insignia3 { color: var(--gold); }
+.star-rating > .fieldset > input:checked ~ label > span{ color: var(--primary); }
+.star-rating > .fieldset > label > div:active { position: relative; top: 2px; }
+.star-rating > .fieldset:not(:checked) > label > div { color: var(--mainColor); }
+.star-rating > .fieldset:not(:checked) > label > span { color: var(--mainColor); }
+.star-rating > .fieldset:not(:checked) > label:hover{ cursor: pointer; }
+.star-rating > .fieldset:not(:checked) > label:hover > div.ing-estrella1,.star-rating > .fieldset:not(:checked) > label:hover ~ label > div.ing-estrella1 { color: var(--yellow); text-shadow: 0 0 5px var(--yellow); }
+.star-rating > .fieldset:not(:checked) > label:hover > div.ing-insignia3,.star-rating > .fieldset:not(:checked) > label:hover ~ label > div.ing-insignia3 { color: var(--gold); text-shadow: 0 0 5px var(--gold); }
+.star-rating > .fieldset:not(:checked) > label:hover > span,.star-rating > .fieldset:not(:checked) > label:hover  ~ label > span { color: var(--primary); text-shadow: 0 0 1px var(--primary); }
+
+/********** SWITCH **********/
+.switch > input { display: none; }
+.switch { height: 1.75em; width: 4em; background: var(--mainColor); color: var(--white); cursor: pointer; transform: skew(-30deg); border-radius: 3px;
+    transition: all 0.2s ease-out; text-indent: 2em; line-height: 1.75em; outline: 1px solid var(--white); }
+.switch > .span { transform: skew(30deg); transition: all 0.2s ease-out; font-size: 1em; z-index: -1; }
+.switch:before { transition: all 0.2s ease-out; position: absolute; content: ''; height: 1.25em; width: 1.25em; top: 0.25em; left: 0.25em; cursor: pointer; background: var(--light); }
+.switch.active { background: var(--azul1); }
+.switch.active .span { text-indent: 0.75em; }
+.switch.active:before { left: 2.5em; } /*Ajustar si varía el width principal width - (1.25+0.25)em */
+.switch.switch-SiNo { background: var(--danger); }
+.switch.switch-SiNo.active { background: var(--success); }

+ 7955 - 0
css/fa_all.css

@@ -0,0 +1,7955 @@
+/*!
+ * Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ * Copyright 2023 Fonticons, Inc.
+ */
+.fa {
+  font-family: var(--fa-style-family, "Font Awesome 6 Free");
+  font-weight: var(--fa-style, 900); }
+
+.fa,
+.fa-classic,
+.fa-sharp,
+.fas,
+.fa-solid,
+.far,
+.fa-regular,
+.fab,
+.fa-brands {
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  display: var(--fa-display, inline-block);
+  font-style: normal;
+  font-variant: normal;
+  line-height: 1;
+  text-rendering: auto; }
+
+.fas,
+.fa-classic,
+.fa-solid,
+.far,
+.fa-regular {
+  font-family: 'Font Awesome 6 Free'; }
+
+.fab,
+.fa-brands {
+  font-family: 'Font Awesome 6 Brands'; }
+
+.fa-1x {
+  font-size: 1em; }
+
+.fa-2x {
+  font-size: 2em; }
+
+.fa-3x {
+  font-size: 3em; }
+
+.fa-4x {
+  font-size: 4em; }
+
+.fa-5x {
+  font-size: 5em; }
+
+.fa-6x {
+  font-size: 6em; }
+
+.fa-7x {
+  font-size: 7em; }
+
+.fa-8x {
+  font-size: 8em; }
+
+.fa-9x {
+  font-size: 9em; }
+
+.fa-10x {
+  font-size: 10em; }
+
+.fa-2xs {
+  font-size: 0.625em;
+  line-height: 0.1em;
+  vertical-align: 0.225em; }
+
+.fa-xs {
+  font-size: 0.75em;
+  line-height: 0.08333em;
+  vertical-align: 0.125em; }
+
+.fa-sm {
+  font-size: 0.875em;
+  line-height: 0.07143em;
+  vertical-align: 0.05357em; }
+
+.fa-lg {
+  font-size: 1.25em;
+  line-height: 0.05em;
+  vertical-align: -0.075em; }
+
+.fa-xl {
+  font-size: 1.5em;
+  line-height: 0.04167em;
+  vertical-align: -0.125em; }
+
+.fa-2xl {
+  font-size: 2em;
+  line-height: 0.03125em;
+  vertical-align: -0.1875em; }
+
+.fa-fw {
+  text-align: center;
+  width: 1.25em; }
+
+.fa-ul {
+  list-style-type: none;
+  margin-left: var(--fa-li-margin, 2.5em);
+  padding-left: 0; }
+  .fa-ul > li {
+    position: relative; }
+
+.fa-li {
+  left: calc(var(--fa-li-width, 2em) * -1);
+  position: absolute;
+  text-align: center;
+  width: var(--fa-li-width, 2em);
+  line-height: inherit; }
+
+.fa-border {
+  border-color: var(--fa-border-color, #eee);
+  border-radius: var(--fa-border-radius, 0.1em);
+  border-style: var(--fa-border-style, solid);
+  border-width: var(--fa-border-width, 0.08em);
+  padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); }
+
+.fa-pull-left {
+  float: left;
+  margin-right: var(--fa-pull-margin, 0.3em); }
+
+.fa-pull-right {
+  float: right;
+  margin-left: var(--fa-pull-margin, 0.3em); }
+
+.fa-beat {
+  -webkit-animation-name: fa-beat;
+          animation-name: fa-beat;
+  -webkit-animation-delay: var(--fa-animation-delay, 0s);
+          animation-delay: var(--fa-animation-delay, 0s);
+  -webkit-animation-direction: var(--fa-animation-direction, normal);
+          animation-direction: var(--fa-animation-direction, normal);
+  -webkit-animation-duration: var(--fa-animation-duration, 1s);
+          animation-duration: var(--fa-animation-duration, 1s);
+  -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+          animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+  -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);
+          animation-timing-function: var(--fa-animation-timing, ease-in-out); }
+
+.fa-bounce {
+  -webkit-animation-name: fa-bounce;
+          animation-name: fa-bounce;
+  -webkit-animation-delay: var(--fa-animation-delay, 0s);
+          animation-delay: var(--fa-animation-delay, 0s);
+  -webkit-animation-direction: var(--fa-animation-direction, normal);
+          animation-direction: var(--fa-animation-direction, normal);
+  -webkit-animation-duration: var(--fa-animation-duration, 1s);
+          animation-duration: var(--fa-animation-duration, 1s);
+  -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+          animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+  -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1));
+          animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); }
+
+.fa-fade {
+  -webkit-animation-name: fa-fade;
+          animation-name: fa-fade;
+  -webkit-animation-delay: var(--fa-animation-delay, 0s);
+          animation-delay: var(--fa-animation-delay, 0s);
+  -webkit-animation-direction: var(--fa-animation-direction, normal);
+          animation-direction: var(--fa-animation-direction, normal);
+  -webkit-animation-duration: var(--fa-animation-duration, 1s);
+          animation-duration: var(--fa-animation-duration, 1s);
+  -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+          animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+  -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));
+          animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
+
+.fa-beat-fade {
+  -webkit-animation-name: fa-beat-fade;
+          animation-name: fa-beat-fade;
+  -webkit-animation-delay: var(--fa-animation-delay, 0s);
+          animation-delay: var(--fa-animation-delay, 0s);
+  -webkit-animation-direction: var(--fa-animation-direction, normal);
+          animation-direction: var(--fa-animation-direction, normal);
+  -webkit-animation-duration: var(--fa-animation-duration, 1s);
+          animation-duration: var(--fa-animation-duration, 1s);
+  -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+          animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+  -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));
+          animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
+
+.fa-flip {
+  -webkit-animation-name: fa-flip;
+          animation-name: fa-flip;
+  -webkit-animation-delay: var(--fa-animation-delay, 0s);
+          animation-delay: var(--fa-animation-delay, 0s);
+  -webkit-animation-direction: var(--fa-animation-direction, normal);
+          animation-direction: var(--fa-animation-direction, normal);
+  -webkit-animation-duration: var(--fa-animation-duration, 1s);
+          animation-duration: var(--fa-animation-duration, 1s);
+  -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+          animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+  -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);
+          animation-timing-function: var(--fa-animation-timing, ease-in-out); }
+
+.fa-shake {
+  -webkit-animation-name: fa-shake;
+          animation-name: fa-shake;
+  -webkit-animation-delay: var(--fa-animation-delay, 0s);
+          animation-delay: var(--fa-animation-delay, 0s);
+  -webkit-animation-direction: var(--fa-animation-direction, normal);
+          animation-direction: var(--fa-animation-direction, normal);
+  -webkit-animation-duration: var(--fa-animation-duration, 1s);
+          animation-duration: var(--fa-animation-duration, 1s);
+  -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+          animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+  -webkit-animation-timing-function: var(--fa-animation-timing, linear);
+          animation-timing-function: var(--fa-animation-timing, linear); }
+
+.fa-spin {
+  -webkit-animation-name: fa-spin;
+          animation-name: fa-spin;
+  -webkit-animation-delay: var(--fa-animation-delay, 0s);
+          animation-delay: var(--fa-animation-delay, 0s);
+  -webkit-animation-direction: var(--fa-animation-direction, normal);
+          animation-direction: var(--fa-animation-direction, normal);
+  -webkit-animation-duration: var(--fa-animation-duration, 2s);
+          animation-duration: var(--fa-animation-duration, 2s);
+  -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+          animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+  -webkit-animation-timing-function: var(--fa-animation-timing, linear);
+          animation-timing-function: var(--fa-animation-timing, linear); }
+
+.fa-spin-reverse {
+  --fa-animation-direction: reverse; }
+
+.fa-pulse,
+.fa-spin-pulse {
+  -webkit-animation-name: fa-spin;
+          animation-name: fa-spin;
+  -webkit-animation-direction: var(--fa-animation-direction, normal);
+          animation-direction: var(--fa-animation-direction, normal);
+  -webkit-animation-duration: var(--fa-animation-duration, 1s);
+          animation-duration: var(--fa-animation-duration, 1s);
+  -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+          animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+  -webkit-animation-timing-function: var(--fa-animation-timing, steps(8));
+          animation-timing-function: var(--fa-animation-timing, steps(8)); }
+
+@media (prefers-reduced-motion: reduce) {
+  .fa-beat,
+  .fa-bounce,
+  .fa-fade,
+  .fa-beat-fade,
+  .fa-flip,
+  .fa-pulse,
+  .fa-shake,
+  .fa-spin,
+  .fa-spin-pulse {
+    -webkit-animation-delay: -1ms;
+            animation-delay: -1ms;
+    -webkit-animation-duration: 1ms;
+            animation-duration: 1ms;
+    -webkit-animation-iteration-count: 1;
+            animation-iteration-count: 1;
+    -webkit-transition-delay: 0s;
+            transition-delay: 0s;
+    -webkit-transition-duration: 0s;
+            transition-duration: 0s; } }
+
+@-webkit-keyframes fa-beat {
+  0%, 90% {
+    -webkit-transform: scale(1);
+            transform: scale(1); }
+  45% {
+    -webkit-transform: scale(var(--fa-beat-scale, 1.25));
+            transform: scale(var(--fa-beat-scale, 1.25)); } }
+
+@keyframes fa-beat {
+  0%, 90% {
+    -webkit-transform: scale(1);
+            transform: scale(1); }
+  45% {
+    -webkit-transform: scale(var(--fa-beat-scale, 1.25));
+            transform: scale(var(--fa-beat-scale, 1.25)); } }
+
+@-webkit-keyframes fa-bounce {
+  0% {
+    -webkit-transform: scale(1, 1) translateY(0);
+            transform: scale(1, 1) translateY(0); }
+  10% {
+    -webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);
+            transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }
+  30% {
+    -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));
+            transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }
+  50% {
+    -webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);
+            transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }
+  57% {
+    -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));
+            transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }
+  64% {
+    -webkit-transform: scale(1, 1) translateY(0);
+            transform: scale(1, 1) translateY(0); }
+  100% {
+    -webkit-transform: scale(1, 1) translateY(0);
+            transform: scale(1, 1) translateY(0); } }
+
+@keyframes fa-bounce {
+  0% {
+    -webkit-transform: scale(1, 1) translateY(0);
+            transform: scale(1, 1) translateY(0); }
+  10% {
+    -webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);
+            transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }
+  30% {
+    -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));
+            transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }
+  50% {
+    -webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);
+            transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }
+  57% {
+    -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));
+            transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }
+  64% {
+    -webkit-transform: scale(1, 1) translateY(0);
+            transform: scale(1, 1) translateY(0); }
+  100% {
+    -webkit-transform: scale(1, 1) translateY(0);
+            transform: scale(1, 1) translateY(0); } }
+
+@-webkit-keyframes fa-fade {
+  50% {
+    opacity: var(--fa-fade-opacity, 0.4); } }
+
+@keyframes fa-fade {
+  50% {
+    opacity: var(--fa-fade-opacity, 0.4); } }
+
+@-webkit-keyframes fa-beat-fade {
+  0%, 100% {
+    opacity: var(--fa-beat-fade-opacity, 0.4);
+    -webkit-transform: scale(1);
+            transform: scale(1); }
+  50% {
+    opacity: 1;
+    -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));
+            transform: scale(var(--fa-beat-fade-scale, 1.125)); } }
+
+@keyframes fa-beat-fade {
+  0%, 100% {
+    opacity: var(--fa-beat-fade-opacity, 0.4);
+    -webkit-transform: scale(1);
+            transform: scale(1); }
+  50% {
+    opacity: 1;
+    -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));
+            transform: scale(var(--fa-beat-fade-scale, 1.125)); } }
+
+@-webkit-keyframes fa-flip {
+  50% {
+    -webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));
+            transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }
+
+@keyframes fa-flip {
+  50% {
+    -webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));
+            transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }
+
+@-webkit-keyframes fa-shake {
+  0% {
+    -webkit-transform: rotate(-15deg);
+            transform: rotate(-15deg); }
+  4% {
+    -webkit-transform: rotate(15deg);
+            transform: rotate(15deg); }
+  8%, 24% {
+    -webkit-transform: rotate(-18deg);
+            transform: rotate(-18deg); }
+  12%, 28% {
+    -webkit-transform: rotate(18deg);
+            transform: rotate(18deg); }
+  16% {
+    -webkit-transform: rotate(-22deg);
+            transform: rotate(-22deg); }
+  20% {
+    -webkit-transform: rotate(22deg);
+            transform: rotate(22deg); }
+  32% {
+    -webkit-transform: rotate(-12deg);
+            transform: rotate(-12deg); }
+  36% {
+    -webkit-transform: rotate(12deg);
+            transform: rotate(12deg); }
+  40%, 100% {
+    -webkit-transform: rotate(0deg);
+            transform: rotate(0deg); } }
+
+@keyframes fa-shake {
+  0% {
+    -webkit-transform: rotate(-15deg);
+            transform: rotate(-15deg); }
+  4% {
+    -webkit-transform: rotate(15deg);
+            transform: rotate(15deg); }
+  8%, 24% {
+    -webkit-transform: rotate(-18deg);
+            transform: rotate(-18deg); }
+  12%, 28% {
+    -webkit-transform: rotate(18deg);
+            transform: rotate(18deg); }
+  16% {
+    -webkit-transform: rotate(-22deg);
+            transform: rotate(-22deg); }
+  20% {
+    -webkit-transform: rotate(22deg);
+            transform: rotate(22deg); }
+  32% {
+    -webkit-transform: rotate(-12deg);
+            transform: rotate(-12deg); }
+  36% {
+    -webkit-transform: rotate(12deg);
+            transform: rotate(12deg); }
+  40%, 100% {
+    -webkit-transform: rotate(0deg);
+            transform: rotate(0deg); } }
+
+@-webkit-keyframes fa-spin {
+  0% {
+    -webkit-transform: rotate(0deg);
+            transform: rotate(0deg); }
+  100% {
+    -webkit-transform: rotate(360deg);
+            transform: rotate(360deg); } }
+
+@keyframes fa-spin {
+  0% {
+    -webkit-transform: rotate(0deg);
+            transform: rotate(0deg); }
+  100% {
+    -webkit-transform: rotate(360deg);
+            transform: rotate(360deg); } }
+
+.fa-rotate-90 {
+  -webkit-transform: rotate(90deg);
+          transform: rotate(90deg); }
+
+.fa-rotate-180 {
+  -webkit-transform: rotate(180deg);
+          transform: rotate(180deg); }
+
+.fa-rotate-270 {
+  -webkit-transform: rotate(270deg);
+          transform: rotate(270deg); }
+
+.fa-flip-horizontal {
+  -webkit-transform: scale(-1, 1);
+          transform: scale(-1, 1); }
+
+.fa-flip-vertical {
+  -webkit-transform: scale(1, -1);
+          transform: scale(1, -1); }
+
+.fa-flip-both,
+.fa-flip-horizontal.fa-flip-vertical {
+  -webkit-transform: scale(-1, -1);
+          transform: scale(-1, -1); }
+
+.fa-rotate-by {
+  -webkit-transform: rotate(var(--fa-rotate-angle, none));
+          transform: rotate(var(--fa-rotate-angle, none)); }
+
+.fa-stack {
+  display: inline-block;
+  height: 2em;
+  line-height: 2em;
+  position: relative;
+  vertical-align: middle;
+  width: 2.5em; }
+
+.fa-stack-1x,
+.fa-stack-2x {
+  left: 0;
+  position: absolute;
+  text-align: center;
+  width: 100%;
+  z-index: var(--fa-stack-z-index, auto); }
+
+.fa-stack-1x {
+  line-height: inherit; }
+
+.fa-stack-2x {
+  font-size: 2em; }
+
+.fa-inverse {
+  color: var(--fa-inverse, #fff); }
+
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+readers do not read off random characters that represent icons */
+
+.fa-0::before {
+  content: "\30"; }
+
+.fa-1::before {
+  content: "\31"; }
+
+.fa-2::before {
+  content: "\32"; }
+
+.fa-3::before {
+  content: "\33"; }
+
+.fa-4::before {
+  content: "\34"; }
+
+.fa-5::before {
+  content: "\35"; }
+
+.fa-6::before {
+  content: "\36"; }
+
+.fa-7::before {
+  content: "\37"; }
+
+.fa-8::before {
+  content: "\38"; }
+
+.fa-9::before {
+  content: "\39"; }
+
+.fa-fill-drip::before {
+  content: "\f576"; }
+
+.fa-arrows-to-circle::before {
+  content: "\e4bd"; }
+
+.fa-circle-chevron-right::before {
+  content: "\f138"; }
+
+.fa-chevron-circle-right::before {
+  content: "\f138"; }
+
+.fa-at::before {
+  content: "\40"; }
+
+.fa-trash-can::before {
+  content: "\f2ed"; }
+
+.fa-trash-alt::before {
+  content: "\f2ed"; }
+
+.fa-text-height::before {
+  content: "\f034"; }
+
+.fa-user-xmark::before {
+  content: "\f235"; }
+
+.fa-user-times::before {
+  content: "\f235"; }
+
+.fa-stethoscope::before {
+  content: "\f0f1"; }
+
+.fa-message::before {
+  content: "\f27a"; }
+
+.fa-comment-alt::before {
+  content: "\f27a"; }
+
+.fa-info::before {
+  content: "\f129"; }
+
+.fa-down-left-and-up-right-to-center::before {
+  content: "\f422"; }
+
+.fa-compress-alt::before {
+  content: "\f422"; }
+
+.fa-explosion::before {
+  content: "\e4e9"; }
+
+.fa-file-lines::before {
+  content: "\f15c"; }
+
+.fa-file-alt::before {
+  content: "\f15c"; }
+
+.fa-file-text::before {
+  content: "\f15c"; }
+
+.fa-wave-square::before {
+  content: "\f83e"; }
+
+.fa-ring::before {
+  content: "\f70b"; }
+
+.fa-building-un::before {
+  content: "\e4d9"; }
+
+.fa-dice-three::before {
+  content: "\f527"; }
+
+.fa-calendar-days::before {
+  content: "\f073"; }
+
+.fa-calendar-alt::before {
+  content: "\f073"; }
+
+.fa-anchor-circle-check::before {
+  content: "\e4aa"; }
+
+.fa-building-circle-arrow-right::before {
+  content: "\e4d1"; }
+
+.fa-volleyball::before {
+  content: "\f45f"; }
+
+.fa-volleyball-ball::before {
+  content: "\f45f"; }
+
+.fa-arrows-up-to-line::before {
+  content: "\e4c2"; }
+
+.fa-sort-down::before {
+  content: "\f0dd"; }
+
+.fa-sort-desc::before {
+  content: "\f0dd"; }
+
+.fa-circle-minus::before {
+  content: "\f056"; }
+
+.fa-minus-circle::before {
+  content: "\f056"; }
+
+.fa-door-open::before {
+  content: "\f52b"; }
+
+.fa-right-from-bracket::before {
+  content: "\f2f5"; }
+
+.fa-sign-out-alt::before {
+  content: "\f2f5"; }
+
+.fa-atom::before {
+  content: "\f5d2"; }
+
+.fa-soap::before {
+  content: "\e06e"; }
+
+.fa-icons::before {
+  content: "\f86d"; }
+
+.fa-heart-music-camera-bolt::before {
+  content: "\f86d"; }
+
+.fa-microphone-lines-slash::before {
+  content: "\f539"; }
+
+.fa-microphone-alt-slash::before {
+  content: "\f539"; }
+
+.fa-bridge-circle-check::before {
+  content: "\e4c9"; }
+
+.fa-pump-medical::before {
+  content: "\e06a"; }
+
+.fa-fingerprint::before {
+  content: "\f577"; }
+
+.fa-hand-point-right::before {
+  content: "\f0a4"; }
+
+.fa-magnifying-glass-location::before {
+  content: "\f689"; }
+
+.fa-search-location::before {
+  content: "\f689"; }
+
+.fa-forward-step::before {
+  content: "\f051"; }
+
+.fa-step-forward::before {
+  content: "\f051"; }
+
+.fa-face-smile-beam::before {
+  content: "\f5b8"; }
+
+.fa-smile-beam::before {
+  content: "\f5b8"; }
+
+.fa-flag-checkered::before {
+  content: "\f11e"; }
+
+.fa-football::before {
+  content: "\f44e"; }
+
+.fa-football-ball::before {
+  content: "\f44e"; }
+
+.fa-school-circle-exclamation::before {
+  content: "\e56c"; }
+
+.fa-crop::before {
+  content: "\f125"; }
+
+.fa-angles-down::before {
+  content: "\f103"; }
+
+.fa-angle-double-down::before {
+  content: "\f103"; }
+
+.fa-users-rectangle::before {
+  content: "\e594"; }
+
+.fa-people-roof::before {
+  content: "\e537"; }
+
+.fa-people-line::before {
+  content: "\e534"; }
+
+.fa-beer-mug-empty::before {
+  content: "\f0fc"; }
+
+.fa-beer::before {
+  content: "\f0fc"; }
+
+.fa-diagram-predecessor::before {
+  content: "\e477"; }
+
+.fa-arrow-up-long::before {
+  content: "\f176"; }
+
+.fa-long-arrow-up::before {
+  content: "\f176"; }
+
+.fa-fire-flame-simple::before {
+  content: "\f46a"; }
+
+.fa-burn::before {
+  content: "\f46a"; }
+
+.fa-person::before {
+  content: "\f183"; }
+
+.fa-male::before {
+  content: "\f183"; }
+
+.fa-laptop::before {
+  content: "\f109"; }
+
+.fa-file-csv::before {
+  content: "\f6dd"; }
+
+.fa-menorah::before {
+  content: "\f676"; }
+
+.fa-truck-plane::before {
+  content: "\e58f"; }
+
+.fa-record-vinyl::before {
+  content: "\f8d9"; }
+
+.fa-face-grin-stars::before {
+  content: "\f587"; }
+
+.fa-grin-stars::before {
+  content: "\f587"; }
+
+.fa-bong::before {
+  content: "\f55c"; }
+
+.fa-spaghetti-monster-flying::before {
+  content: "\f67b"; }
+
+.fa-pastafarianism::before {
+  content: "\f67b"; }
+
+.fa-arrow-down-up-across-line::before {
+  content: "\e4af"; }
+
+.fa-spoon::before {
+  content: "\f2e5"; }
+
+.fa-utensil-spoon::before {
+  content: "\f2e5"; }
+
+.fa-jar-wheat::before {
+  content: "\e517"; }
+
+.fa-envelopes-bulk::before {
+  content: "\f674"; }
+
+.fa-mail-bulk::before {
+  content: "\f674"; }
+
+.fa-file-circle-exclamation::before {
+  content: "\e4eb"; }
+
+.fa-circle-h::before {
+  content: "\f47e"; }
+
+.fa-hospital-symbol::before {
+  content: "\f47e"; }
+
+.fa-pager::before {
+  content: "\f815"; }
+
+.fa-address-book::before {
+  content: "\f2b9"; }
+
+.fa-contact-book::before {
+  content: "\f2b9"; }
+
+.fa-strikethrough::before {
+  content: "\f0cc"; }
+
+.fa-k::before {
+  content: "\4b"; }
+
+.fa-landmark-flag::before {
+  content: "\e51c"; }
+
+.fa-pencil::before {
+  content: "\f303"; }
+
+.fa-pencil-alt::before {
+  content: "\f303"; }
+
+.fa-backward::before {
+  content: "\f04a"; }
+
+.fa-caret-right::before {
+  content: "\f0da"; }
+
+.fa-comments::before {
+  content: "\f086"; }
+
+.fa-paste::before {
+  content: "\f0ea"; }
+
+.fa-file-clipboard::before {
+  content: "\f0ea"; }
+
+.fa-code-pull-request::before {
+  content: "\e13c"; }
+
+.fa-clipboard-list::before {
+  content: "\f46d"; }
+
+.fa-truck-ramp-box::before {
+  content: "\f4de"; }
+
+.fa-truck-loading::before {
+  content: "\f4de"; }
+
+.fa-user-check::before {
+  content: "\f4fc"; }
+
+.fa-vial-virus::before {
+  content: "\e597"; }
+
+.fa-sheet-plastic::before {
+  content: "\e571"; }
+
+.fa-blog::before {
+  content: "\f781"; }
+
+.fa-user-ninja::before {
+  content: "\f504"; }
+
+.fa-person-arrow-up-from-line::before {
+  content: "\e539"; }
+
+.fa-scroll-torah::before {
+  content: "\f6a0"; }
+
+.fa-torah::before {
+  content: "\f6a0"; }
+
+.fa-broom-ball::before {
+  content: "\f458"; }
+
+.fa-quidditch::before {
+  content: "\f458"; }
+
+.fa-quidditch-broom-ball::before {
+  content: "\f458"; }
+
+.fa-toggle-off::before {
+  content: "\f204"; }
+
+.fa-box-archive::before {
+  content: "\f187"; }
+
+.fa-archive::before {
+  content: "\f187"; }
+
+.fa-person-drowning::before {
+  content: "\e545"; }
+
+.fa-arrow-down-9-1::before {
+  content: "\f886"; }
+
+.fa-sort-numeric-desc::before {
+  content: "\f886"; }
+
+.fa-sort-numeric-down-alt::before {
+  content: "\f886"; }
+
+.fa-face-grin-tongue-squint::before {
+  content: "\f58a"; }
+
+.fa-grin-tongue-squint::before {
+  content: "\f58a"; }
+
+.fa-spray-can::before {
+  content: "\f5bd"; }
+
+.fa-truck-monster::before {
+  content: "\f63b"; }
+
+.fa-w::before {
+  content: "\57"; }
+
+.fa-earth-africa::before {
+  content: "\f57c"; }
+
+.fa-globe-africa::before {
+  content: "\f57c"; }
+
+.fa-rainbow::before {
+  content: "\f75b"; }
+
+.fa-circle-notch::before {
+  content: "\f1ce"; }
+
+.fa-tablet-screen-button::before {
+  content: "\f3fa"; }
+
+.fa-tablet-alt::before {
+  content: "\f3fa"; }
+
+.fa-paw::before {
+  content: "\f1b0"; }
+
+.fa-cloud::before {
+  content: "\f0c2"; }
+
+.fa-trowel-bricks::before {
+  content: "\e58a"; }
+
+.fa-face-flushed::before {
+  content: "\f579"; }
+
+.fa-flushed::before {
+  content: "\f579"; }
+
+.fa-hospital-user::before {
+  content: "\f80d"; }
+
+.fa-tent-arrow-left-right::before {
+  content: "\e57f"; }
+
+.fa-gavel::before {
+  content: "\f0e3"; }
+
+.fa-legal::before {
+  content: "\f0e3"; }
+
+.fa-binoculars::before {
+  content: "\f1e5"; }
+
+.fa-microphone-slash::before {
+  content: "\f131"; }
+
+.fa-box-tissue::before {
+  content: "\e05b"; }
+
+.fa-motorcycle::before {
+  content: "\f21c"; }
+
+.fa-bell-concierge::before {
+  content: "\f562"; }
+
+.fa-concierge-bell::before {
+  content: "\f562"; }
+
+.fa-pen-ruler::before {
+  content: "\f5ae"; }
+
+.fa-pencil-ruler::before {
+  content: "\f5ae"; }
+
+.fa-people-arrows::before {
+  content: "\e068"; }
+
+.fa-people-arrows-left-right::before {
+  content: "\e068"; }
+
+.fa-mars-and-venus-burst::before {
+  content: "\e523"; }
+
+.fa-square-caret-right::before {
+  content: "\f152"; }
+
+.fa-caret-square-right::before {
+  content: "\f152"; }
+
+.fa-scissors::before {
+  content: "\f0c4"; }
+
+.fa-cut::before {
+  content: "\f0c4"; }
+
+.fa-sun-plant-wilt::before {
+  content: "\e57a"; }
+
+.fa-toilets-portable::before {
+  content: "\e584"; }
+
+.fa-hockey-puck::before {
+  content: "\f453"; }
+
+.fa-table::before {
+  content: "\f0ce"; }
+
+.fa-magnifying-glass-arrow-right::before {
+  content: "\e521"; }
+
+.fa-tachograph-digital::before {
+  content: "\f566"; }
+
+.fa-digital-tachograph::before {
+  content: "\f566"; }
+
+.fa-users-slash::before {
+  content: "\e073"; }
+
+.fa-clover::before {
+  content: "\e139"; }
+
+.fa-reply::before {
+  content: "\f3e5"; }
+
+.fa-mail-reply::before {
+  content: "\f3e5"; }
+
+.fa-star-and-crescent::before {
+  content: "\f699"; }
+
+.fa-house-fire::before {
+  content: "\e50c"; }
+
+.fa-square-minus::before {
+  content: "\f146"; }
+
+.fa-minus-square::before {
+  content: "\f146"; }
+
+.fa-helicopter::before {
+  content: "\f533"; }
+
+.fa-compass::before {
+  content: "\f14e"; }
+
+.fa-square-caret-down::before {
+  content: "\f150"; }
+
+.fa-caret-square-down::before {
+  content: "\f150"; }
+
+.fa-file-circle-question::before {
+  content: "\e4ef"; }
+
+.fa-laptop-code::before {
+  content: "\f5fc"; }
+
+.fa-swatchbook::before {
+  content: "\f5c3"; }
+
+.fa-prescription-bottle::before {
+  content: "\f485"; }
+
+.fa-bars::before {
+  content: "\f0c9"; }
+
+.fa-navicon::before {
+  content: "\f0c9"; }
+
+.fa-people-group::before {
+  content: "\e533"; }
+
+.fa-hourglass-end::before {
+  content: "\f253"; }
+
+.fa-hourglass-3::before {
+  content: "\f253"; }
+
+.fa-heart-crack::before {
+  content: "\f7a9"; }
+
+.fa-heart-broken::before {
+  content: "\f7a9"; }
+
+.fa-square-up-right::before {
+  content: "\f360"; }
+
+.fa-external-link-square-alt::before {
+  content: "\f360"; }
+
+.fa-face-kiss-beam::before {
+  content: "\f597"; }
+
+.fa-kiss-beam::before {
+  content: "\f597"; }
+
+.fa-film::before {
+  content: "\f008"; }
+
+.fa-ruler-horizontal::before {
+  content: "\f547"; }
+
+.fa-people-robbery::before {
+  content: "\e536"; }
+
+.fa-lightbulb::before {
+  content: "\f0eb"; }
+
+.fa-caret-left::before {
+  content: "\f0d9"; }
+
+.fa-circle-exclamation::before {
+  content: "\f06a"; }
+
+.fa-exclamation-circle::before {
+  content: "\f06a"; }
+
+.fa-school-circle-xmark::before {
+  content: "\e56d"; }
+
+.fa-arrow-right-from-bracket::before {
+  content: "\f08b"; }
+
+.fa-sign-out::before {
+  content: "\f08b"; }
+
+.fa-circle-chevron-down::before {
+  content: "\f13a"; }
+
+.fa-chevron-circle-down::before {
+  content: "\f13a"; }
+
+.fa-unlock-keyhole::before {
+  content: "\f13e"; }
+
+.fa-unlock-alt::before {
+  content: "\f13e"; }
+
+.fa-cloud-showers-heavy::before {
+  content: "\f740"; }
+
+.fa-headphones-simple::before {
+  content: "\f58f"; }
+
+.fa-headphones-alt::before {
+  content: "\f58f"; }
+
+.fa-sitemap::before {
+  content: "\f0e8"; }
+
+.fa-circle-dollar-to-slot::before {
+  content: "\f4b9"; }
+
+.fa-donate::before {
+  content: "\f4b9"; }
+
+.fa-memory::before {
+  content: "\f538"; }
+
+.fa-road-spikes::before {
+  content: "\e568"; }
+
+.fa-fire-burner::before {
+  content: "\e4f1"; }
+
+.fa-flag::before {
+  content: "\f024"; }
+
+.fa-hanukiah::before {
+  content: "\f6e6"; }
+
+.fa-feather::before {
+  content: "\f52d"; }
+
+.fa-volume-low::before {
+  content: "\f027"; }
+
+.fa-volume-down::before {
+  content: "\f027"; }
+
+.fa-comment-slash::before {
+  content: "\f4b3"; }
+
+.fa-cloud-sun-rain::before {
+  content: "\f743"; }
+
+.fa-compress::before {
+  content: "\f066"; }
+
+.fa-wheat-awn::before {
+  content: "\e2cd"; }
+
+.fa-wheat-alt::before {
+  content: "\e2cd"; }
+
+.fa-ankh::before {
+  content: "\f644"; }
+
+.fa-hands-holding-child::before {
+  content: "\e4fa"; }
+
+.fa-asterisk::before {
+  content: "\2a"; }
+
+.fa-square-check::before {
+  content: "\f14a"; }
+
+.fa-check-square::before {
+  content: "\f14a"; }
+
+.fa-peseta-sign::before {
+  content: "\e221"; }
+
+.fa-heading::before {
+  content: "\f1dc"; }
+
+.fa-header::before {
+  content: "\f1dc"; }
+
+.fa-ghost::before {
+  content: "\f6e2"; }
+
+.fa-list::before {
+  content: "\f03a"; }
+
+.fa-list-squares::before {
+  content: "\f03a"; }
+
+.fa-square-phone-flip::before {
+  content: "\f87b"; }
+
+.fa-phone-square-alt::before {
+  content: "\f87b"; }
+
+.fa-cart-plus::before {
+  content: "\f217"; }
+
+.fa-gamepad::before {
+  content: "\f11b"; }
+
+.fa-circle-dot::before {
+  content: "\f192"; }
+
+.fa-dot-circle::before {
+  content: "\f192"; }
+
+.fa-face-dizzy::before {
+  content: "\f567"; }
+
+.fa-dizzy::before {
+  content: "\f567"; }
+
+.fa-egg::before {
+  content: "\f7fb"; }
+
+.fa-house-medical-circle-xmark::before {
+  content: "\e513"; }
+
+.fa-campground::before {
+  content: "\f6bb"; }
+
+.fa-folder-plus::before {
+  content: "\f65e"; }
+
+.fa-futbol::before {
+  content: "\f1e3"; }
+
+.fa-futbol-ball::before {
+  content: "\f1e3"; }
+
+.fa-soccer-ball::before {
+  content: "\f1e3"; }
+
+.fa-paintbrush::before {
+  content: "\f1fc"; }
+
+.fa-paint-brush::before {
+  content: "\f1fc"; }
+
+.fa-lock::before {
+  content: "\f023"; }
+
+.fa-gas-pump::before {
+  content: "\f52f"; }
+
+.fa-hot-tub-person::before {
+  content: "\f593"; }
+
+.fa-hot-tub::before {
+  content: "\f593"; }
+
+.fa-map-location::before {
+  content: "\f59f"; }
+
+.fa-map-marked::before {
+  content: "\f59f"; }
+
+.fa-house-flood-water::before {
+  content: "\e50e"; }
+
+.fa-tree::before {
+  content: "\f1bb"; }
+
+.fa-bridge-lock::before {
+  content: "\e4cc"; }
+
+.fa-sack-dollar::before {
+  content: "\f81d"; }
+
+.fa-pen-to-square::before {
+  content: "\f044"; }
+
+.fa-edit::before {
+  content: "\f044"; }
+
+.fa-car-side::before {
+  content: "\f5e4"; }
+
+.fa-share-nodes::before {
+  content: "\f1e0"; }
+
+.fa-share-alt::before {
+  content: "\f1e0"; }
+
+.fa-heart-circle-minus::before {
+  content: "\e4ff"; }
+
+.fa-hourglass-half::before {
+  content: "\f252"; }
+
+.fa-hourglass-2::before {
+  content: "\f252"; }
+
+.fa-microscope::before {
+  content: "\f610"; }
+
+.fa-sink::before {
+  content: "\e06d"; }
+
+.fa-bag-shopping::before {
+  content: "\f290"; }
+
+.fa-shopping-bag::before {
+  content: "\f290"; }
+
+.fa-arrow-down-z-a::before {
+  content: "\f881"; }
+
+.fa-sort-alpha-desc::before {
+  content: "\f881"; }
+
+.fa-sort-alpha-down-alt::before {
+  content: "\f881"; }
+
+.fa-mitten::before {
+  content: "\f7b5"; }
+
+.fa-person-rays::before {
+  content: "\e54d"; }
+
+.fa-users::before {
+  content: "\f0c0"; }
+
+.fa-eye-slash::before {
+  content: "\f070"; }
+
+.fa-flask-vial::before {
+  content: "\e4f3"; }
+
+.fa-hand::before {
+  content: "\f256"; }
+
+.fa-hand-paper::before {
+  content: "\f256"; }
+
+.fa-om::before {
+  content: "\f679"; }
+
+.fa-worm::before {
+  content: "\e599"; }
+
+.fa-house-circle-xmark::before {
+  content: "\e50b"; }
+
+.fa-plug::before {
+  content: "\f1e6"; }
+
+.fa-chevron-up::before {
+  content: "\f077"; }
+
+.fa-hand-spock::before {
+  content: "\f259"; }
+
+.fa-stopwatch::before {
+  content: "\f2f2"; }
+
+.fa-face-kiss::before {
+  content: "\f596"; }
+
+.fa-kiss::before {
+  content: "\f596"; }
+
+.fa-bridge-circle-xmark::before {
+  content: "\e4cb"; }
+
+.fa-face-grin-tongue::before {
+  content: "\f589"; }
+
+.fa-grin-tongue::before {
+  content: "\f589"; }
+
+.fa-chess-bishop::before {
+  content: "\f43a"; }
+
+.fa-face-grin-wink::before {
+  content: "\f58c"; }
+
+.fa-grin-wink::before {
+  content: "\f58c"; }
+
+.fa-ear-deaf::before {
+  content: "\f2a4"; }
+
+.fa-deaf::before {
+  content: "\f2a4"; }
+
+.fa-deafness::before {
+  content: "\f2a4"; }
+
+.fa-hard-of-hearing::before {
+  content: "\f2a4"; }
+
+.fa-road-circle-check::before {
+  content: "\e564"; }
+
+.fa-dice-five::before {
+  content: "\f523"; }
+
+.fa-square-rss::before {
+  content: "\f143"; }
+
+.fa-rss-square::before {
+  content: "\f143"; }
+
+.fa-land-mine-on::before {
+  content: "\e51b"; }
+
+.fa-i-cursor::before {
+  content: "\f246"; }
+
+.fa-stamp::before {
+  content: "\f5bf"; }
+
+.fa-stairs::before {
+  content: "\e289"; }
+
+.fa-i::before {
+  content: "\49"; }
+
+.fa-hryvnia-sign::before {
+  content: "\f6f2"; }
+
+.fa-hryvnia::before {
+  content: "\f6f2"; }
+
+.fa-pills::before {
+  content: "\f484"; }
+
+.fa-face-grin-wide::before {
+  content: "\f581"; }
+
+.fa-grin-alt::before {
+  content: "\f581"; }
+
+.fa-tooth::before {
+  content: "\f5c9"; }
+
+.fa-v::before {
+  content: "\56"; }
+
+.fa-bangladeshi-taka-sign::before {
+  content: "\e2e6"; }
+
+.fa-bicycle::before {
+  content: "\f206"; }
+
+.fa-staff-snake::before {
+  content: "\e579"; }
+
+.fa-rod-asclepius::before {
+  content: "\e579"; }
+
+.fa-rod-snake::before {
+  content: "\e579"; }
+
+.fa-staff-aesculapius::before {
+  content: "\e579"; }
+
+.fa-head-side-cough-slash::before {
+  content: "\e062"; }
+
+.fa-truck-medical::before {
+  content: "\f0f9"; }
+
+.fa-ambulance::before {
+  content: "\f0f9"; }
+
+.fa-wheat-awn-circle-exclamation::before {
+  content: "\e598"; }
+
+.fa-snowman::before {
+  content: "\f7d0"; }
+
+.fa-mortar-pestle::before {
+  content: "\f5a7"; }
+
+.fa-road-barrier::before {
+  content: "\e562"; }
+
+.fa-school::before {
+  content: "\f549"; }
+
+.fa-igloo::before {
+  content: "\f7ae"; }
+
+.fa-joint::before {
+  content: "\f595"; }
+
+.fa-angle-right::before {
+  content: "\f105"; }
+
+.fa-horse::before {
+  content: "\f6f0"; }
+
+.fa-q::before {
+  content: "\51"; }
+
+.fa-g::before {
+  content: "\47"; }
+
+.fa-notes-medical::before {
+  content: "\f481"; }
+
+.fa-temperature-half::before {
+  content: "\f2c9"; }
+
+.fa-temperature-2::before {
+  content: "\f2c9"; }
+
+.fa-thermometer-2::before {
+  content: "\f2c9"; }
+
+.fa-thermometer-half::before {
+  content: "\f2c9"; }
+
+.fa-dong-sign::before {
+  content: "\e169"; }
+
+.fa-capsules::before {
+  content: "\f46b"; }
+
+.fa-poo-storm::before {
+  content: "\f75a"; }
+
+.fa-poo-bolt::before {
+  content: "\f75a"; }
+
+.fa-face-frown-open::before {
+  content: "\f57a"; }
+
+.fa-frown-open::before {
+  content: "\f57a"; }
+
+.fa-hand-point-up::before {
+  content: "\f0a6"; }
+
+.fa-money-bill::before {
+  content: "\f0d6"; }
+
+.fa-bookmark::before {
+  content: "\f02e"; }
+
+.fa-align-justify::before {
+  content: "\f039"; }
+
+.fa-umbrella-beach::before {
+  content: "\f5ca"; }
+
+.fa-helmet-un::before {
+  content: "\e503"; }
+
+.fa-bullseye::before {
+  content: "\f140"; }
+
+.fa-bacon::before {
+  content: "\f7e5"; }
+
+.fa-hand-point-down::before {
+  content: "\f0a7"; }
+
+.fa-arrow-up-from-bracket::before {
+  content: "\e09a"; }
+
+.fa-folder::before {
+  content: "\f07b"; }
+
+.fa-folder-blank::before {
+  content: "\f07b"; }
+
+.fa-file-waveform::before {
+  content: "\f478"; }
+
+.fa-file-medical-alt::before {
+  content: "\f478"; }
+
+.fa-radiation::before {
+  content: "\f7b9"; }
+
+.fa-chart-simple::before {
+  content: "\e473"; }
+
+.fa-mars-stroke::before {
+  content: "\f229"; }
+
+.fa-vial::before {
+  content: "\f492"; }
+
+.fa-gauge::before {
+  content: "\f624"; }
+
+.fa-dashboard::before {
+  content: "\f624"; }
+
+.fa-gauge-med::before {
+  content: "\f624"; }
+
+.fa-tachometer-alt-average::before {
+  content: "\f624"; }
+
+.fa-wand-magic-sparkles::before {
+  content: "\e2ca"; }
+
+.fa-magic-wand-sparkles::before {
+  content: "\e2ca"; }
+
+.fa-e::before {
+  content: "\45"; }
+
+.fa-pen-clip::before {
+  content: "\f305"; }
+
+.fa-pen-alt::before {
+  content: "\f305"; }
+
+.fa-bridge-circle-exclamation::before {
+  content: "\e4ca"; }
+
+.fa-user::before {
+  content: "\f007"; }
+
+.fa-school-circle-check::before {
+  content: "\e56b"; }
+
+.fa-dumpster::before {
+  content: "\f793"; }
+
+.fa-van-shuttle::before {
+  content: "\f5b6"; }
+
+.fa-shuttle-van::before {
+  content: "\f5b6"; }
+
+.fa-building-user::before {
+  content: "\e4da"; }
+
+.fa-square-caret-left::before {
+  content: "\f191"; }
+
+.fa-caret-square-left::before {
+  content: "\f191"; }
+
+.fa-highlighter::before {
+  content: "\f591"; }
+
+.fa-key::before {
+  content: "\f084"; }
+
+.fa-bullhorn::before {
+  content: "\f0a1"; }
+
+.fa-globe::before {
+  content: "\f0ac"; }
+
+.fa-synagogue::before {
+  content: "\f69b"; }
+
+.fa-person-half-dress::before {
+  content: "\e548"; }
+
+.fa-road-bridge::before {
+  content: "\e563"; }
+
+.fa-location-arrow::before {
+  content: "\f124"; }
+
+.fa-c::before {
+  content: "\43"; }
+
+.fa-tablet-button::before {
+  content: "\f10a"; }
+
+.fa-building-lock::before {
+  content: "\e4d6"; }
+
+.fa-pizza-slice::before {
+  content: "\f818"; }
+
+.fa-money-bill-wave::before {
+  content: "\f53a"; }
+
+.fa-chart-area::before {
+  content: "\f1fe"; }
+
+.fa-area-chart::before {
+  content: "\f1fe"; }
+
+.fa-house-flag::before {
+  content: "\e50d"; }
+
+.fa-person-circle-minus::before {
+  content: "\e540"; }
+
+.fa-ban::before {
+  content: "\f05e"; }
+
+.fa-cancel::before {
+  content: "\f05e"; }
+
+.fa-camera-rotate::before {
+  content: "\e0d8"; }
+
+.fa-spray-can-sparkles::before {
+  content: "\f5d0"; }
+
+.fa-air-freshener::before {
+  content: "\f5d0"; }
+
+.fa-star::before {
+  content: "\f005"; }
+
+.fa-repeat::before {
+  content: "\f363"; }
+
+.fa-cross::before {
+  content: "\f654"; }
+
+.fa-box::before {
+  content: "\f466"; }
+
+.fa-venus-mars::before {
+  content: "\f228"; }
+
+.fa-arrow-pointer::before {
+  content: "\f245"; }
+
+.fa-mouse-pointer::before {
+  content: "\f245"; }
+
+.fa-maximize::before {
+  content: "\f31e"; }
+
+.fa-expand-arrows-alt::before {
+  content: "\f31e"; }
+
+.fa-charging-station::before {
+  content: "\f5e7"; }
+
+.fa-shapes::before {
+  content: "\f61f"; }
+
+.fa-triangle-circle-square::before {
+  content: "\f61f"; }
+
+.fa-shuffle::before {
+  content: "\f074"; }
+
+.fa-random::before {
+  content: "\f074"; }
+
+.fa-person-running::before {
+  content: "\f70c"; }
+
+.fa-running::before {
+  content: "\f70c"; }
+
+.fa-mobile-retro::before {
+  content: "\e527"; }
+
+.fa-grip-lines-vertical::before {
+  content: "\f7a5"; }
+
+.fa-spider::before {
+  content: "\f717"; }
+
+.fa-hands-bound::before {
+  content: "\e4f9"; }
+
+.fa-file-invoice-dollar::before {
+  content: "\f571"; }
+
+.fa-plane-circle-exclamation::before {
+  content: "\e556"; }
+
+.fa-x-ray::before {
+  content: "\f497"; }
+
+.fa-spell-check::before {
+  content: "\f891"; }
+
+.fa-slash::before {
+  content: "\f715"; }
+
+.fa-computer-mouse::before {
+  content: "\f8cc"; }
+
+.fa-mouse::before {
+  content: "\f8cc"; }
+
+.fa-arrow-right-to-bracket::before {
+  content: "\f090"; }
+
+.fa-sign-in::before {
+  content: "\f090"; }
+
+.fa-shop-slash::before {
+  content: "\e070"; }
+
+.fa-store-alt-slash::before {
+  content: "\e070"; }
+
+.fa-server::before {
+  content: "\f233"; }
+
+.fa-virus-covid-slash::before {
+  content: "\e4a9"; }
+
+.fa-shop-lock::before {
+  content: "\e4a5"; }
+
+.fa-hourglass-start::before {
+  content: "\f251"; }
+
+.fa-hourglass-1::before {
+  content: "\f251"; }
+
+.fa-blender-phone::before {
+  content: "\f6b6"; }
+
+.fa-building-wheat::before {
+  content: "\e4db"; }
+
+.fa-person-breastfeeding::before {
+  content: "\e53a"; }
+
+.fa-right-to-bracket::before {
+  content: "\f2f6"; }
+
+.fa-sign-in-alt::before {
+  content: "\f2f6"; }
+
+.fa-venus::before {
+  content: "\f221"; }
+
+.fa-passport::before {
+  content: "\f5ab"; }
+
+.fa-heart-pulse::before {
+  content: "\f21e"; }
+
+.fa-heartbeat::before {
+  content: "\f21e"; }
+
+.fa-people-carry-box::before {
+  content: "\f4ce"; }
+
+.fa-people-carry::before {
+  content: "\f4ce"; }
+
+.fa-temperature-high::before {
+  content: "\f769"; }
+
+.fa-microchip::before {
+  content: "\f2db"; }
+
+.fa-crown::before {
+  content: "\f521"; }
+
+.fa-weight-hanging::before {
+  content: "\f5cd"; }
+
+.fa-xmarks-lines::before {
+  content: "\e59a"; }
+
+.fa-file-prescription::before {
+  content: "\f572"; }
+
+.fa-weight-scale::before {
+  content: "\f496"; }
+
+.fa-weight::before {
+  content: "\f496"; }
+
+.fa-user-group::before {
+  content: "\f500"; }
+
+.fa-user-friends::before {
+  content: "\f500"; }
+
+.fa-arrow-up-a-z::before {
+  content: "\f15e"; }
+
+.fa-sort-alpha-up::before {
+  content: "\f15e"; }
+
+.fa-chess-knight::before {
+  content: "\f441"; }
+
+.fa-face-laugh-squint::before {
+  content: "\f59b"; }
+
+.fa-laugh-squint::before {
+  content: "\f59b"; }
+
+.fa-wheelchair::before {
+  content: "\f193"; }
+
+.fa-circle-arrow-up::before {
+  content: "\f0aa"; }
+
+.fa-arrow-circle-up::before {
+  content: "\f0aa"; }
+
+.fa-toggle-on::before {
+  content: "\f205"; }
+
+.fa-person-walking::before {
+  content: "\f554"; }
+
+.fa-walking::before {
+  content: "\f554"; }
+
+.fa-l::before {
+  content: "\4c"; }
+
+.fa-fire::before {
+  content: "\f06d"; }
+
+.fa-bed-pulse::before {
+  content: "\f487"; }
+
+.fa-procedures::before {
+  content: "\f487"; }
+
+.fa-shuttle-space::before {
+  content: "\f197"; }
+
+.fa-space-shuttle::before {
+  content: "\f197"; }
+
+.fa-face-laugh::before {
+  content: "\f599"; }
+
+.fa-laugh::before {
+  content: "\f599"; }
+
+.fa-folder-open::before {
+  content: "\f07c"; }
+
+.fa-heart-circle-plus::before {
+  content: "\e500"; }
+
+.fa-code-fork::before {
+  content: "\e13b"; }
+
+.fa-city::before {
+  content: "\f64f"; }
+
+.fa-microphone-lines::before {
+  content: "\f3c9"; }
+
+.fa-microphone-alt::before {
+  content: "\f3c9"; }
+
+.fa-pepper-hot::before {
+  content: "\f816"; }
+
+.fa-unlock::before {
+  content: "\f09c"; }
+
+.fa-colon-sign::before {
+  content: "\e140"; }
+
+.fa-headset::before {
+  content: "\f590"; }
+
+.fa-store-slash::before {
+  content: "\e071"; }
+
+.fa-road-circle-xmark::before {
+  content: "\e566"; }
+
+.fa-user-minus::before {
+  content: "\f503"; }
+
+.fa-mars-stroke-up::before {
+  content: "\f22a"; }
+
+.fa-mars-stroke-v::before {
+  content: "\f22a"; }
+
+.fa-champagne-glasses::before {
+  content: "\f79f"; }
+
+.fa-glass-cheers::before {
+  content: "\f79f"; }
+
+.fa-clipboard::before {
+  content: "\f328"; }
+
+.fa-house-circle-exclamation::before {
+  content: "\e50a"; }
+
+.fa-file-arrow-up::before {
+  content: "\f574"; }
+
+.fa-file-upload::before {
+  content: "\f574"; }
+
+.fa-wifi::before {
+  content: "\f1eb"; }
+
+.fa-wifi-3::before {
+  content: "\f1eb"; }
+
+.fa-wifi-strong::before {
+  content: "\f1eb"; }
+
+.fa-bath::before {
+  content: "\f2cd"; }
+
+.fa-bathtub::before {
+  content: "\f2cd"; }
+
+.fa-underline::before {
+  content: "\f0cd"; }
+
+.fa-user-pen::before {
+  content: "\f4ff"; }
+
+.fa-user-edit::before {
+  content: "\f4ff"; }
+
+.fa-signature::before {
+  content: "\f5b7"; }
+
+.fa-stroopwafel::before {
+  content: "\f551"; }
+
+.fa-bold::before {
+  content: "\f032"; }
+
+.fa-anchor-lock::before {
+  content: "\e4ad"; }
+
+.fa-building-ngo::before {
+  content: "\e4d7"; }
+
+.fa-manat-sign::before {
+  content: "\e1d5"; }
+
+.fa-not-equal::before {
+  content: "\f53e"; }
+
+.fa-border-top-left::before {
+  content: "\f853"; }
+
+.fa-border-style::before {
+  content: "\f853"; }
+
+.fa-map-location-dot::before {
+  content: "\f5a0"; }
+
+.fa-map-marked-alt::before {
+  content: "\f5a0"; }
+
+.fa-jedi::before {
+  content: "\f669"; }
+
+.fa-square-poll-vertical::before {
+  content: "\f681"; }
+
+.fa-poll::before {
+  content: "\f681"; }
+
+.fa-mug-hot::before {
+  content: "\f7b6"; }
+
+.fa-car-battery::before {
+  content: "\f5df"; }
+
+.fa-battery-car::before {
+  content: "\f5df"; }
+
+.fa-gift::before {
+  content: "\f06b"; }
+
+.fa-dice-two::before {
+  content: "\f528"; }
+
+.fa-chess-queen::before {
+  content: "\f445"; }
+
+.fa-glasses::before {
+  content: "\f530"; }
+
+.fa-chess-board::before {
+  content: "\f43c"; }
+
+.fa-building-circle-check::before {
+  content: "\e4d2"; }
+
+.fa-person-chalkboard::before {
+  content: "\e53d"; }
+
+.fa-mars-stroke-right::before {
+  content: "\f22b"; }
+
+.fa-mars-stroke-h::before {
+  content: "\f22b"; }
+
+.fa-hand-back-fist::before {
+  content: "\f255"; }
+
+.fa-hand-rock::before {
+  content: "\f255"; }
+
+.fa-square-caret-up::before {
+  content: "\f151"; }
+
+.fa-caret-square-up::before {
+  content: "\f151"; }
+
+.fa-cloud-showers-water::before {
+  content: "\e4e4"; }
+
+.fa-chart-bar::before {
+  content: "\f080"; }
+
+.fa-bar-chart::before {
+  content: "\f080"; }
+
+.fa-hands-bubbles::before {
+  content: "\e05e"; }
+
+.fa-hands-wash::before {
+  content: "\e05e"; }
+
+.fa-less-than-equal::before {
+  content: "\f537"; }
+
+.fa-train::before {
+  content: "\f238"; }
+
+.fa-eye-low-vision::before {
+  content: "\f2a8"; }
+
+.fa-low-vision::before {
+  content: "\f2a8"; }
+
+.fa-crow::before {
+  content: "\f520"; }
+
+.fa-sailboat::before {
+  content: "\e445"; }
+
+.fa-window-restore::before {
+  content: "\f2d2"; }
+
+.fa-square-plus::before {
+  content: "\f0fe"; }
+
+.fa-plus-square::before {
+  content: "\f0fe"; }
+
+.fa-torii-gate::before {
+  content: "\f6a1"; }
+
+.fa-frog::before {
+  content: "\f52e"; }
+
+.fa-bucket::before {
+  content: "\e4cf"; }
+
+.fa-image::before {
+  content: "\f03e"; }
+
+.fa-microphone::before {
+  content: "\f130"; }
+
+.fa-cow::before {
+  content: "\f6c8"; }
+
+.fa-caret-up::before {
+  content: "\f0d8"; }
+
+.fa-screwdriver::before {
+  content: "\f54a"; }
+
+.fa-folder-closed::before {
+  content: "\e185"; }
+
+.fa-house-tsunami::before {
+  content: "\e515"; }
+
+.fa-square-nfi::before {
+  content: "\e576"; }
+
+.fa-arrow-up-from-ground-water::before {
+  content: "\e4b5"; }
+
+.fa-martini-glass::before {
+  content: "\f57b"; }
+
+.fa-glass-martini-alt::before {
+  content: "\f57b"; }
+
+.fa-rotate-left::before {
+  content: "\f2ea"; }
+
+.fa-rotate-back::before {
+  content: "\f2ea"; }
+
+.fa-rotate-backward::before {
+  content: "\f2ea"; }
+
+.fa-undo-alt::before {
+  content: "\f2ea"; }
+
+.fa-table-columns::before {
+  content: "\f0db"; }
+
+.fa-columns::before {
+  content: "\f0db"; }
+
+.fa-lemon::before {
+  content: "\f094"; }
+
+.fa-head-side-mask::before {
+  content: "\e063"; }
+
+.fa-handshake::before {
+  content: "\f2b5"; }
+
+.fa-gem::before {
+  content: "\f3a5"; }
+
+.fa-dolly::before {
+  content: "\f472"; }
+
+.fa-dolly-box::before {
+  content: "\f472"; }
+
+.fa-smoking::before {
+  content: "\f48d"; }
+
+.fa-minimize::before {
+  content: "\f78c"; }
+
+.fa-compress-arrows-alt::before {
+  content: "\f78c"; }
+
+.fa-monument::before {
+  content: "\f5a6"; }
+
+.fa-snowplow::before {
+  content: "\f7d2"; }
+
+.fa-angles-right::before {
+  content: "\f101"; }
+
+.fa-angle-double-right::before {
+  content: "\f101"; }
+
+.fa-cannabis::before {
+  content: "\f55f"; }
+
+.fa-circle-play::before {
+  content: "\f144"; }
+
+.fa-play-circle::before {
+  content: "\f144"; }
+
+.fa-tablets::before {
+  content: "\f490"; }
+
+.fa-ethernet::before {
+  content: "\f796"; }
+
+.fa-euro-sign::before {
+  content: "\f153"; }
+
+.fa-eur::before {
+  content: "\f153"; }
+
+.fa-euro::before {
+  content: "\f153"; }
+
+.fa-chair::before {
+  content: "\f6c0"; }
+
+.fa-circle-check::before {
+  content: "\f058"; }
+
+.fa-check-circle::before {
+  content: "\f058"; }
+
+.fa-circle-stop::before {
+  content: "\f28d"; }
+
+.fa-stop-circle::before {
+  content: "\f28d"; }
+
+.fa-compass-drafting::before {
+  content: "\f568"; }
+
+.fa-drafting-compass::before {
+  content: "\f568"; }
+
+.fa-plate-wheat::before {
+  content: "\e55a"; }
+
+.fa-icicles::before {
+  content: "\f7ad"; }
+
+.fa-person-shelter::before {
+  content: "\e54f"; }
+
+.fa-neuter::before {
+  content: "\f22c"; }
+
+.fa-id-badge::before {
+  content: "\f2c1"; }
+
+.fa-marker::before {
+  content: "\f5a1"; }
+
+.fa-face-laugh-beam::before {
+  content: "\f59a"; }
+
+.fa-laugh-beam::before {
+  content: "\f59a"; }
+
+.fa-helicopter-symbol::before {
+  content: "\e502"; }
+
+.fa-universal-access::before {
+  content: "\f29a"; }
+
+.fa-circle-chevron-up::before {
+  content: "\f139"; }
+
+.fa-chevron-circle-up::before {
+  content: "\f139"; }
+
+.fa-lari-sign::before {
+  content: "\e1c8"; }
+
+.fa-volcano::before {
+  content: "\f770"; }
+
+.fa-person-walking-dashed-line-arrow-right::before {
+  content: "\e553"; }
+
+.fa-sterling-sign::before {
+  content: "\f154"; }
+
+.fa-gbp::before {
+  content: "\f154"; }
+
+.fa-pound-sign::before {
+  content: "\f154"; }
+
+.fa-viruses::before {
+  content: "\e076"; }
+
+.fa-square-person-confined::before {
+  content: "\e577"; }
+
+.fa-user-tie::before {
+  content: "\f508"; }
+
+.fa-arrow-down-long::before {
+  content: "\f175"; }
+
+.fa-long-arrow-down::before {
+  content: "\f175"; }
+
+.fa-tent-arrow-down-to-line::before {
+  content: "\e57e"; }
+
+.fa-certificate::before {
+  content: "\f0a3"; }
+
+.fa-reply-all::before {
+  content: "\f122"; }
+
+.fa-mail-reply-all::before {
+  content: "\f122"; }
+
+.fa-suitcase::before {
+  content: "\f0f2"; }
+
+.fa-person-skating::before {
+  content: "\f7c5"; }
+
+.fa-skating::before {
+  content: "\f7c5"; }
+
+.fa-filter-circle-dollar::before {
+  content: "\f662"; }
+
+.fa-funnel-dollar::before {
+  content: "\f662"; }
+
+.fa-camera-retro::before {
+  content: "\f083"; }
+
+.fa-circle-arrow-down::before {
+  content: "\f0ab"; }
+
+.fa-arrow-circle-down::before {
+  content: "\f0ab"; }
+
+.fa-file-import::before {
+  content: "\f56f"; }
+
+.fa-arrow-right-to-file::before {
+  content: "\f56f"; }
+
+.fa-square-arrow-up-right::before {
+  content: "\f14c"; }
+
+.fa-external-link-square::before {
+  content: "\f14c"; }
+
+.fa-box-open::before {
+  content: "\f49e"; }
+
+.fa-scroll::before {
+  content: "\f70e"; }
+
+.fa-spa::before {
+  content: "\f5bb"; }
+
+.fa-location-pin-lock::before {
+  content: "\e51f"; }
+
+.fa-pause::before {
+  content: "\f04c"; }
+
+.fa-hill-avalanche::before {
+  content: "\e507"; }
+
+.fa-temperature-empty::before {
+  content: "\f2cb"; }
+
+.fa-temperature-0::before {
+  content: "\f2cb"; }
+
+.fa-thermometer-0::before {
+  content: "\f2cb"; }
+
+.fa-thermometer-empty::before {
+  content: "\f2cb"; }
+
+.fa-bomb::before {
+  content: "\f1e2"; }
+
+.fa-registered::before {
+  content: "\f25d"; }
+
+.fa-address-card::before {
+  content: "\f2bb"; }
+
+.fa-contact-card::before {
+  content: "\f2bb"; }
+
+.fa-vcard::before {
+  content: "\f2bb"; }
+
+.fa-scale-unbalanced-flip::before {
+  content: "\f516"; }
+
+.fa-balance-scale-right::before {
+  content: "\f516"; }
+
+.fa-subscript::before {
+  content: "\f12c"; }
+
+.fa-diamond-turn-right::before {
+  content: "\f5eb"; }
+
+.fa-directions::before {
+  content: "\f5eb"; }
+
+.fa-burst::before {
+  content: "\e4dc"; }
+
+.fa-house-laptop::before {
+  content: "\e066"; }
+
+.fa-laptop-house::before {
+  content: "\e066"; }
+
+.fa-face-tired::before {
+  content: "\f5c8"; }
+
+.fa-tired::before {
+  content: "\f5c8"; }
+
+.fa-money-bills::before {
+  content: "\e1f3"; }
+
+.fa-smog::before {
+  content: "\f75f"; }
+
+.fa-crutch::before {
+  content: "\f7f7"; }
+
+.fa-cloud-arrow-up::before {
+  content: "\f0ee"; }
+
+.fa-cloud-upload::before {
+  content: "\f0ee"; }
+
+.fa-cloud-upload-alt::before {
+  content: "\f0ee"; }
+
+.fa-palette::before {
+  content: "\f53f"; }
+
+.fa-arrows-turn-right::before {
+  content: "\e4c0"; }
+
+.fa-vest::before {
+  content: "\e085"; }
+
+.fa-ferry::before {
+  content: "\e4ea"; }
+
+.fa-arrows-down-to-people::before {
+  content: "\e4b9"; }
+
+.fa-seedling::before {
+  content: "\f4d8"; }
+
+.fa-sprout::before {
+  content: "\f4d8"; }
+
+.fa-left-right::before {
+  content: "\f337"; }
+
+.fa-arrows-alt-h::before {
+  content: "\f337"; }
+
+.fa-boxes-packing::before {
+  content: "\e4c7"; }
+
+.fa-circle-arrow-left::before {
+  content: "\f0a8"; }
+
+.fa-arrow-circle-left::before {
+  content: "\f0a8"; }
+
+.fa-group-arrows-rotate::before {
+  content: "\e4f6"; }
+
+.fa-bowl-food::before {
+  content: "\e4c6"; }
+
+.fa-candy-cane::before {
+  content: "\f786"; }
+
+.fa-arrow-down-wide-short::before {
+  content: "\f160"; }
+
+.fa-sort-amount-asc::before {
+  content: "\f160"; }
+
+.fa-sort-amount-down::before {
+  content: "\f160"; }
+
+.fa-cloud-bolt::before {
+  content: "\f76c"; }
+
+.fa-thunderstorm::before {
+  content: "\f76c"; }
+
+.fa-text-slash::before {
+  content: "\f87d"; }
+
+.fa-remove-format::before {
+  content: "\f87d"; }
+
+.fa-face-smile-wink::before {
+  content: "\f4da"; }
+
+.fa-smile-wink::before {
+  content: "\f4da"; }
+
+.fa-file-word::before {
+  content: "\f1c2"; }
+
+.fa-file-powerpoint::before {
+  content: "\f1c4"; }
+
+.fa-arrows-left-right::before {
+  content: "\f07e"; }
+
+.fa-arrows-h::before {
+  content: "\f07e"; }
+
+.fa-house-lock::before {
+  content: "\e510"; }
+
+.fa-cloud-arrow-down::before {
+  content: "\f0ed"; }
+
+.fa-cloud-download::before {
+  content: "\f0ed"; }
+
+.fa-cloud-download-alt::before {
+  content: "\f0ed"; }
+
+.fa-children::before {
+  content: "\e4e1"; }
+
+.fa-chalkboard::before {
+  content: "\f51b"; }
+
+.fa-blackboard::before {
+  content: "\f51b"; }
+
+.fa-user-large-slash::before {
+  content: "\f4fa"; }
+
+.fa-user-alt-slash::before {
+  content: "\f4fa"; }
+
+.fa-envelope-open::before {
+  content: "\f2b6"; }
+
+.fa-handshake-simple-slash::before {
+  content: "\e05f"; }
+
+.fa-handshake-alt-slash::before {
+  content: "\e05f"; }
+
+.fa-mattress-pillow::before {
+  content: "\e525"; }
+
+.fa-guarani-sign::before {
+  content: "\e19a"; }
+
+.fa-arrows-rotate::before {
+  content: "\f021"; }
+
+.fa-refresh::before {
+  content: "\f021"; }
+
+.fa-sync::before {
+  content: "\f021"; }
+
+.fa-fire-extinguisher::before {
+  content: "\f134"; }
+
+.fa-cruzeiro-sign::before {
+  content: "\e152"; }
+
+.fa-greater-than-equal::before {
+  content: "\f532"; }
+
+.fa-shield-halved::before {
+  content: "\f3ed"; }
+
+.fa-shield-alt::before {
+  content: "\f3ed"; }
+
+.fa-book-atlas::before {
+  content: "\f558"; }
+
+.fa-atlas::before {
+  content: "\f558"; }
+
+.fa-virus::before {
+  content: "\e074"; }
+
+.fa-envelope-circle-check::before {
+  content: "\e4e8"; }
+
+.fa-layer-group::before {
+  content: "\f5fd"; }
+
+.fa-arrows-to-dot::before {
+  content: "\e4be"; }
+
+.fa-archway::before {
+  content: "\f557"; }
+
+.fa-heart-circle-check::before {
+  content: "\e4fd"; }
+
+.fa-house-chimney-crack::before {
+  content: "\f6f1"; }
+
+.fa-house-damage::before {
+  content: "\f6f1"; }
+
+.fa-file-zipper::before {
+  content: "\f1c6"; }
+
+.fa-file-archive::before {
+  content: "\f1c6"; }
+
+.fa-square::before {
+  content: "\f0c8"; }
+
+.fa-martini-glass-empty::before {
+  content: "\f000"; }
+
+.fa-glass-martini::before {
+  content: "\f000"; }
+
+.fa-couch::before {
+  content: "\f4b8"; }
+
+.fa-cedi-sign::before {
+  content: "\e0df"; }
+
+.fa-italic::before {
+  content: "\f033"; }
+
+.fa-church::before {
+  content: "\f51d"; }
+
+.fa-comments-dollar::before {
+  content: "\f653"; }
+
+.fa-democrat::before {
+  content: "\f747"; }
+
+.fa-z::before {
+  content: "\5a"; }
+
+.fa-person-skiing::before {
+  content: "\f7c9"; }
+
+.fa-skiing::before {
+  content: "\f7c9"; }
+
+.fa-road-lock::before {
+  content: "\e567"; }
+
+.fa-a::before {
+  content: "\41"; }
+
+.fa-temperature-arrow-down::before {
+  content: "\e03f"; }
+
+.fa-temperature-down::before {
+  content: "\e03f"; }
+
+.fa-feather-pointed::before {
+  content: "\f56b"; }
+
+.fa-feather-alt::before {
+  content: "\f56b"; }
+
+.fa-p::before {
+  content: "\50"; }
+
+.fa-snowflake::before {
+  content: "\f2dc"; }
+
+.fa-newspaper::before {
+  content: "\f1ea"; }
+
+.fa-rectangle-ad::before {
+  content: "\f641"; }
+
+.fa-ad::before {
+  content: "\f641"; }
+
+.fa-circle-arrow-right::before {
+  content: "\f0a9"; }
+
+.fa-arrow-circle-right::before {
+  content: "\f0a9"; }
+
+.fa-filter-circle-xmark::before {
+  content: "\e17b"; }
+
+.fa-locust::before {
+  content: "\e520"; }
+
+.fa-sort::before {
+  content: "\f0dc"; }
+
+.fa-unsorted::before {
+  content: "\f0dc"; }
+
+.fa-list-ol::before {
+  content: "\f0cb"; }
+
+.fa-list-1-2::before {
+  content: "\f0cb"; }
+
+.fa-list-numeric::before {
+  content: "\f0cb"; }
+
+.fa-person-dress-burst::before {
+  content: "\e544"; }
+
+.fa-money-check-dollar::before {
+  content: "\f53d"; }
+
+.fa-money-check-alt::before {
+  content: "\f53d"; }
+
+.fa-vector-square::before {
+  content: "\f5cb"; }
+
+.fa-bread-slice::before {
+  content: "\f7ec"; }
+
+.fa-language::before {
+  content: "\f1ab"; }
+
+.fa-face-kiss-wink-heart::before {
+  content: "\f598"; }
+
+.fa-kiss-wink-heart::before {
+  content: "\f598"; }
+
+.fa-filter::before {
+  content: "\f0b0"; }
+
+.fa-question::before {
+  content: "\3f"; }
+
+.fa-file-signature::before {
+  content: "\f573"; }
+
+.fa-up-down-left-right::before {
+  content: "\f0b2"; }
+
+.fa-arrows-alt::before {
+  content: "\f0b2"; }
+
+.fa-house-chimney-user::before {
+  content: "\e065"; }
+
+.fa-hand-holding-heart::before {
+  content: "\f4be"; }
+
+.fa-puzzle-piece::before {
+  content: "\f12e"; }
+
+.fa-money-check::before {
+  content: "\f53c"; }
+
+.fa-star-half-stroke::before {
+  content: "\f5c0"; }
+
+.fa-star-half-alt::before {
+  content: "\f5c0"; }
+
+.fa-code::before {
+  content: "\f121"; }
+
+.fa-whiskey-glass::before {
+  content: "\f7a0"; }
+
+.fa-glass-whiskey::before {
+  content: "\f7a0"; }
+
+.fa-building-circle-exclamation::before {
+  content: "\e4d3"; }
+
+.fa-magnifying-glass-chart::before {
+  content: "\e522"; }
+
+.fa-arrow-up-right-from-square::before {
+  content: "\f08e"; }
+
+.fa-external-link::before {
+  content: "\f08e"; }
+
+.fa-cubes-stacked::before {
+  content: "\e4e6"; }
+
+.fa-won-sign::before {
+  content: "\f159"; }
+
+.fa-krw::before {
+  content: "\f159"; }
+
+.fa-won::before {
+  content: "\f159"; }
+
+.fa-virus-covid::before {
+  content: "\e4a8"; }
+
+.fa-austral-sign::before {
+  content: "\e0a9"; }
+
+.fa-f::before {
+  content: "\46"; }
+
+.fa-leaf::before {
+  content: "\f06c"; }
+
+.fa-road::before {
+  content: "\f018"; }
+
+.fa-taxi::before {
+  content: "\f1ba"; }
+
+.fa-cab::before {
+  content: "\f1ba"; }
+
+.fa-person-circle-plus::before {
+  content: "\e541"; }
+
+.fa-chart-pie::before {
+  content: "\f200"; }
+
+.fa-pie-chart::before {
+  content: "\f200"; }
+
+.fa-bolt-lightning::before {
+  content: "\e0b7"; }
+
+.fa-sack-xmark::before {
+  content: "\e56a"; }
+
+.fa-file-excel::before {
+  content: "\f1c3"; }
+
+.fa-file-contract::before {
+  content: "\f56c"; }
+
+.fa-fish-fins::before {
+  content: "\e4f2"; }
+
+.fa-building-flag::before {
+  content: "\e4d5"; }
+
+.fa-face-grin-beam::before {
+  content: "\f582"; }
+
+.fa-grin-beam::before {
+  content: "\f582"; }
+
+.fa-object-ungroup::before {
+  content: "\f248"; }
+
+.fa-poop::before {
+  content: "\f619"; }
+
+.fa-location-pin::before {
+  content: "\f041"; }
+
+.fa-map-marker::before {
+  content: "\f041"; }
+
+.fa-kaaba::before {
+  content: "\f66b"; }
+
+.fa-toilet-paper::before {
+  content: "\f71e"; }
+
+.fa-helmet-safety::before {
+  content: "\f807"; }
+
+.fa-hard-hat::before {
+  content: "\f807"; }
+
+.fa-hat-hard::before {
+  content: "\f807"; }
+
+.fa-eject::before {
+  content: "\f052"; }
+
+.fa-circle-right::before {
+  content: "\f35a"; }
+
+.fa-arrow-alt-circle-right::before {
+  content: "\f35a"; }
+
+.fa-plane-circle-check::before {
+  content: "\e555"; }
+
+.fa-face-rolling-eyes::before {
+  content: "\f5a5"; }
+
+.fa-meh-rolling-eyes::before {
+  content: "\f5a5"; }
+
+.fa-object-group::before {
+  content: "\f247"; }
+
+.fa-chart-line::before {
+  content: "\f201"; }
+
+.fa-line-chart::before {
+  content: "\f201"; }
+
+.fa-mask-ventilator::before {
+  content: "\e524"; }
+
+.fa-arrow-right::before {
+  content: "\f061"; }
+
+.fa-signs-post::before {
+  content: "\f277"; }
+
+.fa-map-signs::before {
+  content: "\f277"; }
+
+.fa-cash-register::before {
+  content: "\f788"; }
+
+.fa-person-circle-question::before {
+  content: "\e542"; }
+
+.fa-h::before {
+  content: "\48"; }
+
+.fa-tarp::before {
+  content: "\e57b"; }
+
+.fa-screwdriver-wrench::before {
+  content: "\f7d9"; }
+
+.fa-tools::before {
+  content: "\f7d9"; }
+
+.fa-arrows-to-eye::before {
+  content: "\e4bf"; }
+
+.fa-plug-circle-bolt::before {
+  content: "\e55b"; }
+
+.fa-heart::before {
+  content: "\f004"; }
+
+.fa-mars-and-venus::before {
+  content: "\f224"; }
+
+.fa-house-user::before {
+  content: "\e1b0"; }
+
+.fa-home-user::before {
+  content: "\e1b0"; }
+
+.fa-dumpster-fire::before {
+  content: "\f794"; }
+
+.fa-house-crack::before {
+  content: "\e3b1"; }
+
+.fa-martini-glass-citrus::before {
+  content: "\f561"; }
+
+.fa-cocktail::before {
+  content: "\f561"; }
+
+.fa-face-surprise::before {
+  content: "\f5c2"; }
+
+.fa-surprise::before {
+  content: "\f5c2"; }
+
+.fa-bottle-water::before {
+  content: "\e4c5"; }
+
+.fa-circle-pause::before {
+  content: "\f28b"; }
+
+.fa-pause-circle::before {
+  content: "\f28b"; }
+
+.fa-toilet-paper-slash::before {
+  content: "\e072"; }
+
+.fa-apple-whole::before {
+  content: "\f5d1"; }
+
+.fa-apple-alt::before {
+  content: "\f5d1"; }
+
+.fa-kitchen-set::before {
+  content: "\e51a"; }
+
+.fa-r::before {
+  content: "\52"; }
+
+.fa-temperature-quarter::before {
+  content: "\f2ca"; }
+
+.fa-temperature-1::before {
+  content: "\f2ca"; }
+
+.fa-thermometer-1::before {
+  content: "\f2ca"; }
+
+.fa-thermometer-quarter::before {
+  content: "\f2ca"; }
+
+.fa-cube::before {
+  content: "\f1b2"; }
+
+.fa-bitcoin-sign::before {
+  content: "\e0b4"; }
+
+.fa-shield-dog::before {
+  content: "\e573"; }
+
+.fa-solar-panel::before {
+  content: "\f5ba"; }
+
+.fa-lock-open::before {
+  content: "\f3c1"; }
+
+.fa-elevator::before {
+  content: "\e16d"; }
+
+.fa-money-bill-transfer::before {
+  content: "\e528"; }
+
+.fa-money-bill-trend-up::before {
+  content: "\e529"; }
+
+.fa-house-flood-water-circle-arrow-right::before {
+  content: "\e50f"; }
+
+.fa-square-poll-horizontal::before {
+  content: "\f682"; }
+
+.fa-poll-h::before {
+  content: "\f682"; }
+
+.fa-circle::before {
+  content: "\f111"; }
+
+.fa-backward-fast::before {
+  content: "\f049"; }
+
+.fa-fast-backward::before {
+  content: "\f049"; }
+
+.fa-recycle::before {
+  content: "\f1b8"; }
+
+.fa-user-astronaut::before {
+  content: "\f4fb"; }
+
+.fa-plane-slash::before {
+  content: "\e069"; }
+
+.fa-trademark::before {
+  content: "\f25c"; }
+
+.fa-basketball::before {
+  content: "\f434"; }
+
+.fa-basketball-ball::before {
+  content: "\f434"; }
+
+.fa-satellite-dish::before {
+  content: "\f7c0"; }
+
+.fa-circle-up::before {
+  content: "\f35b"; }
+
+.fa-arrow-alt-circle-up::before {
+  content: "\f35b"; }
+
+.fa-mobile-screen-button::before {
+  content: "\f3cd"; }
+
+.fa-mobile-alt::before {
+  content: "\f3cd"; }
+
+.fa-volume-high::before {
+  content: "\f028"; }
+
+.fa-volume-up::before {
+  content: "\f028"; }
+
+.fa-users-rays::before {
+  content: "\e593"; }
+
+.fa-wallet::before {
+  content: "\f555"; }
+
+.fa-clipboard-check::before {
+  content: "\f46c"; }
+
+.fa-file-audio::before {
+  content: "\f1c7"; }
+
+.fa-burger::before {
+  content: "\f805"; }
+
+.fa-hamburger::before {
+  content: "\f805"; }
+
+.fa-wrench::before {
+  content: "\f0ad"; }
+
+.fa-bugs::before {
+  content: "\e4d0"; }
+
+.fa-rupee-sign::before {
+  content: "\f156"; }
+
+.fa-rupee::before {
+  content: "\f156"; }
+
+.fa-file-image::before {
+  content: "\f1c5"; }
+
+.fa-circle-question::before {
+  content: "\f059"; }
+
+.fa-question-circle::before {
+  content: "\f059"; }
+
+.fa-plane-departure::before {
+  content: "\f5b0"; }
+
+.fa-handshake-slash::before {
+  content: "\e060"; }
+
+.fa-book-bookmark::before {
+  content: "\e0bb"; }
+
+.fa-code-branch::before {
+  content: "\f126"; }
+
+.fa-hat-cowboy::before {
+  content: "\f8c0"; }
+
+.fa-bridge::before {
+  content: "\e4c8"; }
+
+.fa-phone-flip::before {
+  content: "\f879"; }
+
+.fa-phone-alt::before {
+  content: "\f879"; }
+
+.fa-truck-front::before {
+  content: "\e2b7"; }
+
+.fa-cat::before {
+  content: "\f6be"; }
+
+.fa-anchor-circle-exclamation::before {
+  content: "\e4ab"; }
+
+.fa-truck-field::before {
+  content: "\e58d"; }
+
+.fa-route::before {
+  content: "\f4d7"; }
+
+.fa-clipboard-question::before {
+  content: "\e4e3"; }
+
+.fa-panorama::before {
+  content: "\e209"; }
+
+.fa-comment-medical::before {
+  content: "\f7f5"; }
+
+.fa-teeth-open::before {
+  content: "\f62f"; }
+
+.fa-file-circle-minus::before {
+  content: "\e4ed"; }
+
+.fa-tags::before {
+  content: "\f02c"; }
+
+.fa-wine-glass::before {
+  content: "\f4e3"; }
+
+.fa-forward-fast::before {
+  content: "\f050"; }
+
+.fa-fast-forward::before {
+  content: "\f050"; }
+
+.fa-face-meh-blank::before {
+  content: "\f5a4"; }
+
+.fa-meh-blank::before {
+  content: "\f5a4"; }
+
+.fa-square-parking::before {
+  content: "\f540"; }
+
+.fa-parking::before {
+  content: "\f540"; }
+
+.fa-house-signal::before {
+  content: "\e012"; }
+
+.fa-bars-progress::before {
+  content: "\f828"; }
+
+.fa-tasks-alt::before {
+  content: "\f828"; }
+
+.fa-faucet-drip::before {
+  content: "\e006"; }
+
+.fa-cart-flatbed::before {
+  content: "\f474"; }
+
+.fa-dolly-flatbed::before {
+  content: "\f474"; }
+
+.fa-ban-smoking::before {
+  content: "\f54d"; }
+
+.fa-smoking-ban::before {
+  content: "\f54d"; }
+
+.fa-terminal::before {
+  content: "\f120"; }
+
+.fa-mobile-button::before {
+  content: "\f10b"; }
+
+.fa-house-medical-flag::before {
+  content: "\e514"; }
+
+.fa-basket-shopping::before {
+  content: "\f291"; }
+
+.fa-shopping-basket::before {
+  content: "\f291"; }
+
+.fa-tape::before {
+  content: "\f4db"; }
+
+.fa-bus-simple::before {
+  content: "\f55e"; }
+
+.fa-bus-alt::before {
+  content: "\f55e"; }
+
+.fa-eye::before {
+  content: "\f06e"; }
+
+.fa-face-sad-cry::before {
+  content: "\f5b3"; }
+
+.fa-sad-cry::before {
+  content: "\f5b3"; }
+
+.fa-audio-description::before {
+  content: "\f29e"; }
+
+.fa-person-military-to-person::before {
+  content: "\e54c"; }
+
+.fa-file-shield::before {
+  content: "\e4f0"; }
+
+.fa-user-slash::before {
+  content: "\f506"; }
+
+.fa-pen::before {
+  content: "\f304"; }
+
+.fa-tower-observation::before {
+  content: "\e586"; }
+
+.fa-file-code::before {
+  content: "\f1c9"; }
+
+.fa-signal::before {
+  content: "\f012"; }
+
+.fa-signal-5::before {
+  content: "\f012"; }
+
+.fa-signal-perfect::before {
+  content: "\f012"; }
+
+.fa-bus::before {
+  content: "\f207"; }
+
+.fa-heart-circle-xmark::before {
+  content: "\e501"; }
+
+.fa-house-chimney::before {
+  content: "\e3af"; }
+
+.fa-home-lg::before {
+  content: "\e3af"; }
+
+.fa-window-maximize::before {
+  content: "\f2d0"; }
+
+.fa-face-frown::before {
+  content: "\f119"; }
+
+.fa-frown::before {
+  content: "\f119"; }
+
+.fa-prescription::before {
+  content: "\f5b1"; }
+
+.fa-shop::before {
+  content: "\f54f"; }
+
+.fa-store-alt::before {
+  content: "\f54f"; }
+
+.fa-floppy-disk::before {
+  content: "\f0c7"; }
+
+.fa-save::before {
+  content: "\f0c7"; }
+
+.fa-vihara::before {
+  content: "\f6a7"; }
+
+.fa-scale-unbalanced::before {
+  content: "\f515"; }
+
+.fa-balance-scale-left::before {
+  content: "\f515"; }
+
+.fa-sort-up::before {
+  content: "\f0de"; }
+
+.fa-sort-asc::before {
+  content: "\f0de"; }
+
+.fa-comment-dots::before {
+  content: "\f4ad"; }
+
+.fa-commenting::before {
+  content: "\f4ad"; }
+
+.fa-plant-wilt::before {
+  content: "\e5aa"; }
+
+.fa-diamond::before {
+  content: "\f219"; }
+
+.fa-face-grin-squint::before {
+  content: "\f585"; }
+
+.fa-grin-squint::before {
+  content: "\f585"; }
+
+.fa-hand-holding-dollar::before {
+  content: "\f4c0"; }
+
+.fa-hand-holding-usd::before {
+  content: "\f4c0"; }
+
+.fa-bacterium::before {
+  content: "\e05a"; }
+
+.fa-hand-pointer::before {
+  content: "\f25a"; }
+
+.fa-drum-steelpan::before {
+  content: "\f56a"; }
+
+.fa-hand-scissors::before {
+  content: "\f257"; }
+
+.fa-hands-praying::before {
+  content: "\f684"; }
+
+.fa-praying-hands::before {
+  content: "\f684"; }
+
+.fa-arrow-rotate-right::before {
+  content: "\f01e"; }
+
+.fa-arrow-right-rotate::before {
+  content: "\f01e"; }
+
+.fa-arrow-rotate-forward::before {
+  content: "\f01e"; }
+
+.fa-redo::before {
+  content: "\f01e"; }
+
+.fa-biohazard::before {
+  content: "\f780"; }
+
+.fa-location-crosshairs::before {
+  content: "\f601"; }
+
+.fa-location::before {
+  content: "\f601"; }
+
+.fa-mars-double::before {
+  content: "\f227"; }
+
+.fa-child-dress::before {
+  content: "\e59c"; }
+
+.fa-users-between-lines::before {
+  content: "\e591"; }
+
+.fa-lungs-virus::before {
+  content: "\e067"; }
+
+.fa-face-grin-tears::before {
+  content: "\f588"; }
+
+.fa-grin-tears::before {
+  content: "\f588"; }
+
+.fa-phone::before {
+  content: "\f095"; }
+
+.fa-calendar-xmark::before {
+  content: "\f273"; }
+
+.fa-calendar-times::before {
+  content: "\f273"; }
+
+.fa-child-reaching::before {
+  content: "\e59d"; }
+
+.fa-head-side-virus::before {
+  content: "\e064"; }
+
+.fa-user-gear::before {
+  content: "\f4fe"; }
+
+.fa-user-cog::before {
+  content: "\f4fe"; }
+
+.fa-arrow-up-1-9::before {
+  content: "\f163"; }
+
+.fa-sort-numeric-up::before {
+  content: "\f163"; }
+
+.fa-door-closed::before {
+  content: "\f52a"; }
+
+.fa-shield-virus::before {
+  content: "\e06c"; }
+
+.fa-dice-six::before {
+  content: "\f526"; }
+
+.fa-mosquito-net::before {
+  content: "\e52c"; }
+
+.fa-bridge-water::before {
+  content: "\e4ce"; }
+
+.fa-person-booth::before {
+  content: "\f756"; }
+
+.fa-text-width::before {
+  content: "\f035"; }
+
+.fa-hat-wizard::before {
+  content: "\f6e8"; }
+
+.fa-pen-fancy::before {
+  content: "\f5ac"; }
+
+.fa-person-digging::before {
+  content: "\f85e"; }
+
+.fa-digging::before {
+  content: "\f85e"; }
+
+.fa-trash::before {
+  content: "\f1f8"; }
+
+.fa-gauge-simple::before {
+  content: "\f629"; }
+
+.fa-gauge-simple-med::before {
+  content: "\f629"; }
+
+.fa-tachometer-average::before {
+  content: "\f629"; }
+
+.fa-book-medical::before {
+  content: "\f7e6"; }
+
+.fa-poo::before {
+  content: "\f2fe"; }
+
+.fa-quote-right::before {
+  content: "\f10e"; }
+
+.fa-quote-right-alt::before {
+  content: "\f10e"; }
+
+.fa-shirt::before {
+  content: "\f553"; }
+
+.fa-t-shirt::before {
+  content: "\f553"; }
+
+.fa-tshirt::before {
+  content: "\f553"; }
+
+.fa-cubes::before {
+  content: "\f1b3"; }
+
+.fa-divide::before {
+  content: "\f529"; }
+
+.fa-tenge-sign::before {
+  content: "\f7d7"; }
+
+.fa-tenge::before {
+  content: "\f7d7"; }
+
+.fa-headphones::before {
+  content: "\f025"; }
+
+.fa-hands-holding::before {
+  content: "\f4c2"; }
+
+.fa-hands-clapping::before {
+  content: "\e1a8"; }
+
+.fa-republican::before {
+  content: "\f75e"; }
+
+.fa-arrow-left::before {
+  content: "\f060"; }
+
+.fa-person-circle-xmark::before {
+  content: "\e543"; }
+
+.fa-ruler::before {
+  content: "\f545"; }
+
+.fa-align-left::before {
+  content: "\f036"; }
+
+.fa-dice-d6::before {
+  content: "\f6d1"; }
+
+.fa-restroom::before {
+  content: "\f7bd"; }
+
+.fa-j::before {
+  content: "\4a"; }
+
+.fa-users-viewfinder::before {
+  content: "\e595"; }
+
+.fa-file-video::before {
+  content: "\f1c8"; }
+
+.fa-up-right-from-square::before {
+  content: "\f35d"; }
+
+.fa-external-link-alt::before {
+  content: "\f35d"; }
+
+.fa-table-cells::before {
+  content: "\f00a"; }
+
+.fa-th::before {
+  content: "\f00a"; }
+
+.fa-file-pdf::before {
+  content: "\f1c1"; }
+
+.fa-book-bible::before {
+  content: "\f647"; }
+
+.fa-bible::before {
+  content: "\f647"; }
+
+.fa-o::before {
+  content: "\4f"; }
+
+.fa-suitcase-medical::before {
+  content: "\f0fa"; }
+
+.fa-medkit::before {
+  content: "\f0fa"; }
+
+.fa-user-secret::before {
+  content: "\f21b"; }
+
+.fa-otter::before {
+  content: "\f700"; }
+
+.fa-person-dress::before {
+  content: "\f182"; }
+
+.fa-female::before {
+  content: "\f182"; }
+
+.fa-comment-dollar::before {
+  content: "\f651"; }
+
+.fa-business-time::before {
+  content: "\f64a"; }
+
+.fa-briefcase-clock::before {
+  content: "\f64a"; }
+
+.fa-table-cells-large::before {
+  content: "\f009"; }
+
+.fa-th-large::before {
+  content: "\f009"; }
+
+.fa-book-tanakh::before {
+  content: "\f827"; }
+
+.fa-tanakh::before {
+  content: "\f827"; }
+
+.fa-phone-volume::before {
+  content: "\f2a0"; }
+
+.fa-volume-control-phone::before {
+  content: "\f2a0"; }
+
+.fa-hat-cowboy-side::before {
+  content: "\f8c1"; }
+
+.fa-clipboard-user::before {
+  content: "\f7f3"; }
+
+.fa-child::before {
+  content: "\f1ae"; }
+
+.fa-lira-sign::before {
+  content: "\f195"; }
+
+.fa-satellite::before {
+  content: "\f7bf"; }
+
+.fa-plane-lock::before {
+  content: "\e558"; }
+
+.fa-tag::before {
+  content: "\f02b"; }
+
+.fa-comment::before {
+  content: "\f075"; }
+
+.fa-cake-candles::before {
+  content: "\f1fd"; }
+
+.fa-birthday-cake::before {
+  content: "\f1fd"; }
+
+.fa-cake::before {
+  content: "\f1fd"; }
+
+.fa-envelope::before {
+  content: "\f0e0"; }
+
+.fa-angles-up::before {
+  content: "\f102"; }
+
+.fa-angle-double-up::before {
+  content: "\f102"; }
+
+.fa-paperclip::before {
+  content: "\f0c6"; }
+
+.fa-arrow-right-to-city::before {
+  content: "\e4b3"; }
+
+.fa-ribbon::before {
+  content: "\f4d6"; }
+
+.fa-lungs::before {
+  content: "\f604"; }
+
+.fa-arrow-up-9-1::before {
+  content: "\f887"; }
+
+.fa-sort-numeric-up-alt::before {
+  content: "\f887"; }
+
+.fa-litecoin-sign::before {
+  content: "\e1d3"; }
+
+.fa-border-none::before {
+  content: "\f850"; }
+
+.fa-circle-nodes::before {
+  content: "\e4e2"; }
+
+.fa-parachute-box::before {
+  content: "\f4cd"; }
+
+.fa-indent::before {
+  content: "\f03c"; }
+
+.fa-truck-field-un::before {
+  content: "\e58e"; }
+
+.fa-hourglass::before {
+  content: "\f254"; }
+
+.fa-hourglass-empty::before {
+  content: "\f254"; }
+
+.fa-mountain::before {
+  content: "\f6fc"; }
+
+.fa-user-doctor::before {
+  content: "\f0f0"; }
+
+.fa-user-md::before {
+  content: "\f0f0"; }
+
+.fa-circle-info::before {
+  content: "\f05a"; }
+
+.fa-info-circle::before {
+  content: "\f05a"; }
+
+.fa-cloud-meatball::before {
+  content: "\f73b"; }
+
+.fa-camera::before {
+  content: "\f030"; }
+
+.fa-camera-alt::before {
+  content: "\f030"; }
+
+.fa-square-virus::before {
+  content: "\e578"; }
+
+.fa-meteor::before {
+  content: "\f753"; }
+
+.fa-car-on::before {
+  content: "\e4dd"; }
+
+.fa-sleigh::before {
+  content: "\f7cc"; }
+
+.fa-arrow-down-1-9::before {
+  content: "\f162"; }
+
+.fa-sort-numeric-asc::before {
+  content: "\f162"; }
+
+.fa-sort-numeric-down::before {
+  content: "\f162"; }
+
+.fa-hand-holding-droplet::before {
+  content: "\f4c1"; }
+
+.fa-hand-holding-water::before {
+  content: "\f4c1"; }
+
+.fa-water::before {
+  content: "\f773"; }
+
+.fa-calendar-check::before {
+  content: "\f274"; }
+
+.fa-braille::before {
+  content: "\f2a1"; }
+
+.fa-prescription-bottle-medical::before {
+  content: "\f486"; }
+
+.fa-prescription-bottle-alt::before {
+  content: "\f486"; }
+
+.fa-landmark::before {
+  content: "\f66f"; }
+
+.fa-truck::before {
+  content: "\f0d1"; }
+
+.fa-crosshairs::before {
+  content: "\f05b"; }
+
+.fa-person-cane::before {
+  content: "\e53c"; }
+
+.fa-tent::before {
+  content: "\e57d"; }
+
+.fa-vest-patches::before {
+  content: "\e086"; }
+
+.fa-check-double::before {
+  content: "\f560"; }
+
+.fa-arrow-down-a-z::before {
+  content: "\f15d"; }
+
+.fa-sort-alpha-asc::before {
+  content: "\f15d"; }
+
+.fa-sort-alpha-down::before {
+  content: "\f15d"; }
+
+.fa-money-bill-wheat::before {
+  content: "\e52a"; }
+
+.fa-cookie::before {
+  content: "\f563"; }
+
+.fa-arrow-rotate-left::before {
+  content: "\f0e2"; }
+
+.fa-arrow-left-rotate::before {
+  content: "\f0e2"; }
+
+.fa-arrow-rotate-back::before {
+  content: "\f0e2"; }
+
+.fa-arrow-rotate-backward::before {
+  content: "\f0e2"; }
+
+.fa-undo::before {
+  content: "\f0e2"; }
+
+.fa-hard-drive::before {
+  content: "\f0a0"; }
+
+.fa-hdd::before {
+  content: "\f0a0"; }
+
+.fa-face-grin-squint-tears::before {
+  content: "\f586"; }
+
+.fa-grin-squint-tears::before {
+  content: "\f586"; }
+
+.fa-dumbbell::before {
+  content: "\f44b"; }
+
+.fa-rectangle-list::before {
+  content: "\f022"; }
+
+.fa-list-alt::before {
+  content: "\f022"; }
+
+.fa-tarp-droplet::before {
+  content: "\e57c"; }
+
+.fa-house-medical-circle-check::before {
+  content: "\e511"; }
+
+.fa-person-skiing-nordic::before {
+  content: "\f7ca"; }
+
+.fa-skiing-nordic::before {
+  content: "\f7ca"; }
+
+.fa-calendar-plus::before {
+  content: "\f271"; }
+
+.fa-plane-arrival::before {
+  content: "\f5af"; }
+
+.fa-circle-left::before {
+  content: "\f359"; }
+
+.fa-arrow-alt-circle-left::before {
+  content: "\f359"; }
+
+.fa-train-subway::before {
+  content: "\f239"; }
+
+.fa-subway::before {
+  content: "\f239"; }
+
+.fa-chart-gantt::before {
+  content: "\e0e4"; }
+
+.fa-indian-rupee-sign::before {
+  content: "\e1bc"; }
+
+.fa-indian-rupee::before {
+  content: "\e1bc"; }
+
+.fa-inr::before {
+  content: "\e1bc"; }
+
+.fa-crop-simple::before {
+  content: "\f565"; }
+
+.fa-crop-alt::before {
+  content: "\f565"; }
+
+.fa-money-bill-1::before {
+  content: "\f3d1"; }
+
+.fa-money-bill-alt::before {
+  content: "\f3d1"; }
+
+.fa-left-long::before {
+  content: "\f30a"; }
+
+.fa-long-arrow-alt-left::before {
+  content: "\f30a"; }
+
+.fa-dna::before {
+  content: "\f471"; }
+
+.fa-virus-slash::before {
+  content: "\e075"; }
+
+.fa-minus::before {
+  content: "\f068"; }
+
+.fa-subtract::before {
+  content: "\f068"; }
+
+.fa-chess::before {
+  content: "\f439"; }
+
+.fa-arrow-left-long::before {
+  content: "\f177"; }
+
+.fa-long-arrow-left::before {
+  content: "\f177"; }
+
+.fa-plug-circle-check::before {
+  content: "\e55c"; }
+
+.fa-street-view::before {
+  content: "\f21d"; }
+
+.fa-franc-sign::before {
+  content: "\e18f"; }
+
+.fa-volume-off::before {
+  content: "\f026"; }
+
+.fa-hands-asl-interpreting::before {
+  content: "\f2a3"; }
+
+.fa-american-sign-language-interpreting::before {
+  content: "\f2a3"; }
+
+.fa-asl-interpreting::before {
+  content: "\f2a3"; }
+
+.fa-hands-american-sign-language-interpreting::before {
+  content: "\f2a3"; }
+
+.fa-gear::before {
+  content: "\f013"; }
+
+.fa-cog::before {
+  content: "\f013"; }
+
+.fa-droplet-slash::before {
+  content: "\f5c7"; }
+
+.fa-tint-slash::before {
+  content: "\f5c7"; }
+
+.fa-mosque::before {
+  content: "\f678"; }
+
+.fa-mosquito::before {
+  content: "\e52b"; }
+
+.fa-star-of-david::before {
+  content: "\f69a"; }
+
+.fa-person-military-rifle::before {
+  content: "\e54b"; }
+
+.fa-cart-shopping::before {
+  content: "\f07a"; }
+
+.fa-shopping-cart::before {
+  content: "\f07a"; }
+
+.fa-vials::before {
+  content: "\f493"; }
+
+.fa-plug-circle-plus::before {
+  content: "\e55f"; }
+
+.fa-place-of-worship::before {
+  content: "\f67f"; }
+
+.fa-grip-vertical::before {
+  content: "\f58e"; }
+
+.fa-arrow-turn-up::before {
+  content: "\f148"; }
+
+.fa-level-up::before {
+  content: "\f148"; }
+
+.fa-u::before {
+  content: "\55"; }
+
+.fa-square-root-variable::before {
+  content: "\f698"; }
+
+.fa-square-root-alt::before {
+  content: "\f698"; }
+
+.fa-clock::before {
+  content: "\f017"; }
+
+.fa-clock-four::before {
+  content: "\f017"; }
+
+.fa-backward-step::before {
+  content: "\f048"; }
+
+.fa-step-backward::before {
+  content: "\f048"; }
+
+.fa-pallet::before {
+  content: "\f482"; }
+
+.fa-faucet::before {
+  content: "\e005"; }
+
+.fa-baseball-bat-ball::before {
+  content: "\f432"; }
+
+.fa-s::before {
+  content: "\53"; }
+
+.fa-timeline::before {
+  content: "\e29c"; }
+
+.fa-keyboard::before {
+  content: "\f11c"; }
+
+.fa-caret-down::before {
+  content: "\f0d7"; }
+
+.fa-house-chimney-medical::before {
+  content: "\f7f2"; }
+
+.fa-clinic-medical::before {
+  content: "\f7f2"; }
+
+.fa-temperature-three-quarters::before {
+  content: "\f2c8"; }
+
+.fa-temperature-3::before {
+  content: "\f2c8"; }
+
+.fa-thermometer-3::before {
+  content: "\f2c8"; }
+
+.fa-thermometer-three-quarters::before {
+  content: "\f2c8"; }
+
+.fa-mobile-screen::before {
+  content: "\f3cf"; }
+
+.fa-mobile-android-alt::before {
+  content: "\f3cf"; }
+
+.fa-plane-up::before {
+  content: "\e22d"; }
+
+.fa-piggy-bank::before {
+  content: "\f4d3"; }
+
+.fa-battery-half::before {
+  content: "\f242"; }
+
+.fa-battery-3::before {
+  content: "\f242"; }
+
+.fa-mountain-city::before {
+  content: "\e52e"; }
+
+.fa-coins::before {
+  content: "\f51e"; }
+
+.fa-khanda::before {
+  content: "\f66d"; }
+
+.fa-sliders::before {
+  content: "\f1de"; }
+
+.fa-sliders-h::before {
+  content: "\f1de"; }
+
+.fa-folder-tree::before {
+  content: "\f802"; }
+
+.fa-network-wired::before {
+  content: "\f6ff"; }
+
+.fa-map-pin::before {
+  content: "\f276"; }
+
+.fa-hamsa::before {
+  content: "\f665"; }
+
+.fa-cent-sign::before {
+  content: "\e3f5"; }
+
+.fa-flask::before {
+  content: "\f0c3"; }
+
+.fa-person-pregnant::before {
+  content: "\e31e"; }
+
+.fa-wand-sparkles::before {
+  content: "\f72b"; }
+
+.fa-ellipsis-vertical::before {
+  content: "\f142"; }
+
+.fa-ellipsis-v::before {
+  content: "\f142"; }
+
+.fa-ticket::before {
+  content: "\f145"; }
+
+.fa-power-off::before {
+  content: "\f011"; }
+
+.fa-right-long::before {
+  content: "\f30b"; }
+
+.fa-long-arrow-alt-right::before {
+  content: "\f30b"; }
+
+.fa-flag-usa::before {
+  content: "\f74d"; }
+
+.fa-laptop-file::before {
+  content: "\e51d"; }
+
+.fa-tty::before {
+  content: "\f1e4"; }
+
+.fa-teletype::before {
+  content: "\f1e4"; }
+
+.fa-diagram-next::before {
+  content: "\e476"; }
+
+.fa-person-rifle::before {
+  content: "\e54e"; }
+
+.fa-house-medical-circle-exclamation::before {
+  content: "\e512"; }
+
+.fa-closed-captioning::before {
+  content: "\f20a"; }
+
+.fa-person-hiking::before {
+  content: "\f6ec"; }
+
+.fa-hiking::before {
+  content: "\f6ec"; }
+
+.fa-venus-double::before {
+  content: "\f226"; }
+
+.fa-images::before {
+  content: "\f302"; }
+
+.fa-calculator::before {
+  content: "\f1ec"; }
+
+.fa-people-pulling::before {
+  content: "\e535"; }
+
+.fa-n::before {
+  content: "\4e"; }
+
+.fa-cable-car::before {
+  content: "\f7da"; }
+
+.fa-tram::before {
+  content: "\f7da"; }
+
+.fa-cloud-rain::before {
+  content: "\f73d"; }
+
+.fa-building-circle-xmark::before {
+  content: "\e4d4"; }
+
+.fa-ship::before {
+  content: "\f21a"; }
+
+.fa-arrows-down-to-line::before {
+  content: "\e4b8"; }
+
+.fa-download::before {
+  content: "\f019"; }
+
+.fa-face-grin::before {
+  content: "\f580"; }
+
+.fa-grin::before {
+  content: "\f580"; }
+
+.fa-delete-left::before {
+  content: "\f55a"; }
+
+.fa-backspace::before {
+  content: "\f55a"; }
+
+.fa-eye-dropper::before {
+  content: "\f1fb"; }
+
+.fa-eye-dropper-empty::before {
+  content: "\f1fb"; }
+
+.fa-eyedropper::before {
+  content: "\f1fb"; }
+
+.fa-file-circle-check::before {
+  content: "\e5a0"; }
+
+.fa-forward::before {
+  content: "\f04e"; }
+
+.fa-mobile::before {
+  content: "\f3ce"; }
+
+.fa-mobile-android::before {
+  content: "\f3ce"; }
+
+.fa-mobile-phone::before {
+  content: "\f3ce"; }
+
+.fa-face-meh::before {
+  content: "\f11a"; }
+
+.fa-meh::before {
+  content: "\f11a"; }
+
+.fa-align-center::before {
+  content: "\f037"; }
+
+.fa-book-skull::before {
+  content: "\f6b7"; }
+
+.fa-book-dead::before {
+  content: "\f6b7"; }
+
+.fa-id-card::before {
+  content: "\f2c2"; }
+
+.fa-drivers-license::before {
+  content: "\f2c2"; }
+
+.fa-outdent::before {
+  content: "\f03b"; }
+
+.fa-dedent::before {
+  content: "\f03b"; }
+
+.fa-heart-circle-exclamation::before {
+  content: "\e4fe"; }
+
+.fa-house::before {
+  content: "\f015"; }
+
+.fa-home::before {
+  content: "\f015"; }
+
+.fa-home-alt::before {
+  content: "\f015"; }
+
+.fa-home-lg-alt::before {
+  content: "\f015"; }
+
+.fa-calendar-week::before {
+  content: "\f784"; }
+
+.fa-laptop-medical::before {
+  content: "\f812"; }
+
+.fa-b::before {
+  content: "\42"; }
+
+.fa-file-medical::before {
+  content: "\f477"; }
+
+.fa-dice-one::before {
+  content: "\f525"; }
+
+.fa-kiwi-bird::before {
+  content: "\f535"; }
+
+.fa-arrow-right-arrow-left::before {
+  content: "\f0ec"; }
+
+.fa-exchange::before {
+  content: "\f0ec"; }
+
+.fa-rotate-right::before {
+  content: "\f2f9"; }
+
+.fa-redo-alt::before {
+  content: "\f2f9"; }
+
+.fa-rotate-forward::before {
+  content: "\f2f9"; }
+
+.fa-utensils::before {
+  content: "\f2e7"; }
+
+.fa-cutlery::before {
+  content: "\f2e7"; }
+
+.fa-arrow-up-wide-short::before {
+  content: "\f161"; }
+
+.fa-sort-amount-up::before {
+  content: "\f161"; }
+
+.fa-mill-sign::before {
+  content: "\e1ed"; }
+
+.fa-bowl-rice::before {
+  content: "\e2eb"; }
+
+.fa-skull::before {
+  content: "\f54c"; }
+
+.fa-tower-broadcast::before {
+  content: "\f519"; }
+
+.fa-broadcast-tower::before {
+  content: "\f519"; }
+
+.fa-truck-pickup::before {
+  content: "\f63c"; }
+
+.fa-up-long::before {
+  content: "\f30c"; }
+
+.fa-long-arrow-alt-up::before {
+  content: "\f30c"; }
+
+.fa-stop::before {
+  content: "\f04d"; }
+
+.fa-code-merge::before {
+  content: "\f387"; }
+
+.fa-upload::before {
+  content: "\f093"; }
+
+.fa-hurricane::before {
+  content: "\f751"; }
+
+.fa-mound::before {
+  content: "\e52d"; }
+
+.fa-toilet-portable::before {
+  content: "\e583"; }
+
+.fa-compact-disc::before {
+  content: "\f51f"; }
+
+.fa-file-arrow-down::before {
+  content: "\f56d"; }
+
+.fa-file-download::before {
+  content: "\f56d"; }
+
+.fa-caravan::before {
+  content: "\f8ff"; }
+
+.fa-shield-cat::before {
+  content: "\e572"; }
+
+.fa-bolt::before {
+  content: "\f0e7"; }
+
+.fa-zap::before {
+  content: "\f0e7"; }
+
+.fa-glass-water::before {
+  content: "\e4f4"; }
+
+.fa-oil-well::before {
+  content: "\e532"; }
+
+.fa-vault::before {
+  content: "\e2c5"; }
+
+.fa-mars::before {
+  content: "\f222"; }
+
+.fa-toilet::before {
+  content: "\f7d8"; }
+
+.fa-plane-circle-xmark::before {
+  content: "\e557"; }
+
+.fa-yen-sign::before {
+  content: "\f157"; }
+
+.fa-cny::before {
+  content: "\f157"; }
+
+.fa-jpy::before {
+  content: "\f157"; }
+
+.fa-rmb::before {
+  content: "\f157"; }
+
+.fa-yen::before {
+  content: "\f157"; }
+
+.fa-ruble-sign::before {
+  content: "\f158"; }
+
+.fa-rouble::before {
+  content: "\f158"; }
+
+.fa-rub::before {
+  content: "\f158"; }
+
+.fa-ruble::before {
+  content: "\f158"; }
+
+.fa-sun::before {
+  content: "\f185"; }
+
+.fa-guitar::before {
+  content: "\f7a6"; }
+
+.fa-face-laugh-wink::before {
+  content: "\f59c"; }
+
+.fa-laugh-wink::before {
+  content: "\f59c"; }
+
+.fa-horse-head::before {
+  content: "\f7ab"; }
+
+.fa-bore-hole::before {
+  content: "\e4c3"; }
+
+.fa-industry::before {
+  content: "\f275"; }
+
+.fa-circle-down::before {
+  content: "\f358"; }
+
+.fa-arrow-alt-circle-down::before {
+  content: "\f358"; }
+
+.fa-arrows-turn-to-dots::before {
+  content: "\e4c1"; }
+
+.fa-florin-sign::before {
+  content: "\e184"; }
+
+.fa-arrow-down-short-wide::before {
+  content: "\f884"; }
+
+.fa-sort-amount-desc::before {
+  content: "\f884"; }
+
+.fa-sort-amount-down-alt::before {
+  content: "\f884"; }
+
+.fa-less-than::before {
+  content: "\3c"; }
+
+.fa-angle-down::before {
+  content: "\f107"; }
+
+.fa-car-tunnel::before {
+  content: "\e4de"; }
+
+.fa-head-side-cough::before {
+  content: "\e061"; }
+
+.fa-grip-lines::before {
+  content: "\f7a4"; }
+
+.fa-thumbs-down::before {
+  content: "\f165"; }
+
+.fa-user-lock::before {
+  content: "\f502"; }
+
+.fa-arrow-right-long::before {
+  content: "\f178"; }
+
+.fa-long-arrow-right::before {
+  content: "\f178"; }
+
+.fa-anchor-circle-xmark::before {
+  content: "\e4ac"; }
+
+.fa-ellipsis::before {
+  content: "\f141"; }
+
+.fa-ellipsis-h::before {
+  content: "\f141"; }
+
+.fa-chess-pawn::before {
+  content: "\f443"; }
+
+.fa-kit-medical::before {
+  content: "\f479"; }
+
+.fa-first-aid::before {
+  content: "\f479"; }
+
+.fa-person-through-window::before {
+  content: "\e5a9"; }
+
+.fa-toolbox::before {
+  content: "\f552"; }
+
+.fa-hands-holding-circle::before {
+  content: "\e4fb"; }
+
+.fa-bug::before {
+  content: "\f188"; }
+
+.fa-credit-card::before {
+  content: "\f09d"; }
+
+.fa-credit-card-alt::before {
+  content: "\f09d"; }
+
+.fa-car::before {
+  content: "\f1b9"; }
+
+.fa-automobile::before {
+  content: "\f1b9"; }
+
+.fa-hand-holding-hand::before {
+  content: "\e4f7"; }
+
+.fa-book-open-reader::before {
+  content: "\f5da"; }
+
+.fa-book-reader::before {
+  content: "\f5da"; }
+
+.fa-mountain-sun::before {
+  content: "\e52f"; }
+
+.fa-arrows-left-right-to-line::before {
+  content: "\e4ba"; }
+
+.fa-dice-d20::before {
+  content: "\f6cf"; }
+
+.fa-truck-droplet::before {
+  content: "\e58c"; }
+
+.fa-file-circle-xmark::before {
+  content: "\e5a1"; }
+
+.fa-temperature-arrow-up::before {
+  content: "\e040"; }
+
+.fa-temperature-up::before {
+  content: "\e040"; }
+
+.fa-medal::before {
+  content: "\f5a2"; }
+
+.fa-bed::before {
+  content: "\f236"; }
+
+.fa-square-h::before {
+  content: "\f0fd"; }
+
+.fa-h-square::before {
+  content: "\f0fd"; }
+
+.fa-podcast::before {
+  content: "\f2ce"; }
+
+.fa-temperature-full::before {
+  content: "\f2c7"; }
+
+.fa-temperature-4::before {
+  content: "\f2c7"; }
+
+.fa-thermometer-4::before {
+  content: "\f2c7"; }
+
+.fa-thermometer-full::before {
+  content: "\f2c7"; }
+
+.fa-bell::before {
+  content: "\f0f3"; }
+
+.fa-superscript::before {
+  content: "\f12b"; }
+
+.fa-plug-circle-xmark::before {
+  content: "\e560"; }
+
+.fa-star-of-life::before {
+  content: "\f621"; }
+
+.fa-phone-slash::before {
+  content: "\f3dd"; }
+
+.fa-paint-roller::before {
+  content: "\f5aa"; }
+
+.fa-handshake-angle::before {
+  content: "\f4c4"; }
+
+.fa-hands-helping::before {
+  content: "\f4c4"; }
+
+.fa-location-dot::before {
+  content: "\f3c5"; }
+
+.fa-map-marker-alt::before {
+  content: "\f3c5"; }
+
+.fa-file::before {
+  content: "\f15b"; }
+
+.fa-greater-than::before {
+  content: "\3e"; }
+
+.fa-person-swimming::before {
+  content: "\f5c4"; }
+
+.fa-swimmer::before {
+  content: "\f5c4"; }
+
+.fa-arrow-down::before {
+  content: "\f063"; }
+
+.fa-droplet::before {
+  content: "\f043"; }
+
+.fa-tint::before {
+  content: "\f043"; }
+
+.fa-eraser::before {
+  content: "\f12d"; }
+
+.fa-earth-americas::before {
+  content: "\f57d"; }
+
+.fa-earth::before {
+  content: "\f57d"; }
+
+.fa-earth-america::before {
+  content: "\f57d"; }
+
+.fa-globe-americas::before {
+  content: "\f57d"; }
+
+.fa-person-burst::before {
+  content: "\e53b"; }
+
+.fa-dove::before {
+  content: "\f4ba"; }
+
+.fa-battery-empty::before {
+  content: "\f244"; }
+
+.fa-battery-0::before {
+  content: "\f244"; }
+
+.fa-socks::before {
+  content: "\f696"; }
+
+.fa-inbox::before {
+  content: "\f01c"; }
+
+.fa-section::before {
+  content: "\e447"; }
+
+.fa-gauge-high::before {
+  content: "\f625"; }
+
+.fa-tachometer-alt::before {
+  content: "\f625"; }
+
+.fa-tachometer-alt-fast::before {
+  content: "\f625"; }
+
+.fa-envelope-open-text::before {
+  content: "\f658"; }
+
+.fa-hospital::before {
+  content: "\f0f8"; }
+
+.fa-hospital-alt::before {
+  content: "\f0f8"; }
+
+.fa-hospital-wide::before {
+  content: "\f0f8"; }
+
+.fa-wine-bottle::before {
+  content: "\f72f"; }
+
+.fa-chess-rook::before {
+  content: "\f447"; }
+
+.fa-bars-staggered::before {
+  content: "\f550"; }
+
+.fa-reorder::before {
+  content: "\f550"; }
+
+.fa-stream::before {
+  content: "\f550"; }
+
+.fa-dharmachakra::before {
+  content: "\f655"; }
+
+.fa-hotdog::before {
+  content: "\f80f"; }
+
+.fa-person-walking-with-cane::before {
+  content: "\f29d"; }
+
+.fa-blind::before {
+  content: "\f29d"; }
+
+.fa-drum::before {
+  content: "\f569"; }
+
+.fa-ice-cream::before {
+  content: "\f810"; }
+
+.fa-heart-circle-bolt::before {
+  content: "\e4fc"; }
+
+.fa-fax::before {
+  content: "\f1ac"; }
+
+.fa-paragraph::before {
+  content: "\f1dd"; }
+
+.fa-check-to-slot::before {
+  content: "\f772"; }
+
+.fa-vote-yea::before {
+  content: "\f772"; }
+
+.fa-star-half::before {
+  content: "\f089"; }
+
+.fa-boxes-stacked::before {
+  content: "\f468"; }
+
+.fa-boxes::before {
+  content: "\f468"; }
+
+.fa-boxes-alt::before {
+  content: "\f468"; }
+
+.fa-link::before {
+  content: "\f0c1"; }
+
+.fa-chain::before {
+  content: "\f0c1"; }
+
+.fa-ear-listen::before {
+  content: "\f2a2"; }
+
+.fa-assistive-listening-systems::before {
+  content: "\f2a2"; }
+
+.fa-tree-city::before {
+  content: "\e587"; }
+
+.fa-play::before {
+  content: "\f04b"; }
+
+.fa-font::before {
+  content: "\f031"; }
+
+.fa-rupiah-sign::before {
+  content: "\e23d"; }
+
+.fa-magnifying-glass::before {
+  content: "\f002"; }
+
+.fa-search::before {
+  content: "\f002"; }
+
+.fa-table-tennis-paddle-ball::before {
+  content: "\f45d"; }
+
+.fa-ping-pong-paddle-ball::before {
+  content: "\f45d"; }
+
+.fa-table-tennis::before {
+  content: "\f45d"; }
+
+.fa-person-dots-from-line::before {
+  content: "\f470"; }
+
+.fa-diagnoses::before {
+  content: "\f470"; }
+
+.fa-trash-can-arrow-up::before {
+  content: "\f82a"; }
+
+.fa-trash-restore-alt::before {
+  content: "\f82a"; }
+
+.fa-naira-sign::before {
+  content: "\e1f6"; }
+
+.fa-cart-arrow-down::before {
+  content: "\f218"; }
+
+.fa-walkie-talkie::before {
+  content: "\f8ef"; }
+
+.fa-file-pen::before {
+  content: "\f31c"; }
+
+.fa-file-edit::before {
+  content: "\f31c"; }
+
+.fa-receipt::before {
+  content: "\f543"; }
+
+.fa-square-pen::before {
+  content: "\f14b"; }
+
+.fa-pen-square::before {
+  content: "\f14b"; }
+
+.fa-pencil-square::before {
+  content: "\f14b"; }
+
+.fa-suitcase-rolling::before {
+  content: "\f5c1"; }
+
+.fa-person-circle-exclamation::before {
+  content: "\e53f"; }
+
+.fa-chevron-down::before {
+  content: "\f078"; }
+
+.fa-battery-full::before {
+  content: "\f240"; }
+
+.fa-battery::before {
+  content: "\f240"; }
+
+.fa-battery-5::before {
+  content: "\f240"; }
+
+.fa-skull-crossbones::before {
+  content: "\f714"; }
+
+.fa-code-compare::before {
+  content: "\e13a"; }
+
+.fa-list-ul::before {
+  content: "\f0ca"; }
+
+.fa-list-dots::before {
+  content: "\f0ca"; }
+
+.fa-school-lock::before {
+  content: "\e56f"; }
+
+.fa-tower-cell::before {
+  content: "\e585"; }
+
+.fa-down-long::before {
+  content: "\f309"; }
+
+.fa-long-arrow-alt-down::before {
+  content: "\f309"; }
+
+.fa-ranking-star::before {
+  content: "\e561"; }
+
+.fa-chess-king::before {
+  content: "\f43f"; }
+
+.fa-person-harassing::before {
+  content: "\e549"; }
+
+.fa-brazilian-real-sign::before {
+  content: "\e46c"; }
+
+.fa-landmark-dome::before {
+  content: "\f752"; }
+
+.fa-landmark-alt::before {
+  content: "\f752"; }
+
+.fa-arrow-up::before {
+  content: "\f062"; }
+
+.fa-tv::before {
+  content: "\f26c"; }
+
+.fa-television::before {
+  content: "\f26c"; }
+
+.fa-tv-alt::before {
+  content: "\f26c"; }
+
+.fa-shrimp::before {
+  content: "\e448"; }
+
+.fa-list-check::before {
+  content: "\f0ae"; }
+
+.fa-tasks::before {
+  content: "\f0ae"; }
+
+.fa-jug-detergent::before {
+  content: "\e519"; }
+
+.fa-circle-user::before {
+  content: "\f2bd"; }
+
+.fa-user-circle::before {
+  content: "\f2bd"; }
+
+.fa-user-shield::before {
+  content: "\f505"; }
+
+.fa-wind::before {
+  content: "\f72e"; }
+
+.fa-car-burst::before {
+  content: "\f5e1"; }
+
+.fa-car-crash::before {
+  content: "\f5e1"; }
+
+.fa-y::before {
+  content: "\59"; }
+
+.fa-person-snowboarding::before {
+  content: "\f7ce"; }
+
+.fa-snowboarding::before {
+  content: "\f7ce"; }
+
+.fa-truck-fast::before {
+  content: "\f48b"; }
+
+.fa-shipping-fast::before {
+  content: "\f48b"; }
+
+.fa-fish::before {
+  content: "\f578"; }
+
+.fa-user-graduate::before {
+  content: "\f501"; }
+
+.fa-circle-half-stroke::before {
+  content: "\f042"; }
+
+.fa-adjust::before {
+  content: "\f042"; }
+
+.fa-clapperboard::before {
+  content: "\e131"; }
+
+.fa-circle-radiation::before {
+  content: "\f7ba"; }
+
+.fa-radiation-alt::before {
+  content: "\f7ba"; }
+
+.fa-baseball::before {
+  content: "\f433"; }
+
+.fa-baseball-ball::before {
+  content: "\f433"; }
+
+.fa-jet-fighter-up::before {
+  content: "\e518"; }
+
+.fa-diagram-project::before {
+  content: "\f542"; }
+
+.fa-project-diagram::before {
+  content: "\f542"; }
+
+.fa-copy::before {
+  content: "\f0c5"; }
+
+.fa-volume-xmark::before {
+  content: "\f6a9"; }
+
+.fa-volume-mute::before {
+  content: "\f6a9"; }
+
+.fa-volume-times::before {
+  content: "\f6a9"; }
+
+.fa-hand-sparkles::before {
+  content: "\e05d"; }
+
+.fa-grip::before {
+  content: "\f58d"; }
+
+.fa-grip-horizontal::before {
+  content: "\f58d"; }
+
+.fa-share-from-square::before {
+  content: "\f14d"; }
+
+.fa-share-square::before {
+  content: "\f14d"; }
+
+.fa-child-combatant::before {
+  content: "\e4e0"; }
+
+.fa-child-rifle::before {
+  content: "\e4e0"; }
+
+.fa-gun::before {
+  content: "\e19b"; }
+
+.fa-square-phone::before {
+  content: "\f098"; }
+
+.fa-phone-square::before {
+  content: "\f098"; }
+
+.fa-plus::before {
+  content: "\2b"; }
+
+.fa-add::before {
+  content: "\2b"; }
+
+.fa-expand::before {
+  content: "\f065"; }
+
+.fa-computer::before {
+  content: "\e4e5"; }
+
+.fa-xmark::before {
+  content: "\f00d"; }
+
+.fa-close::before {
+  content: "\f00d"; }
+
+.fa-multiply::before {
+  content: "\f00d"; }
+
+.fa-remove::before {
+  content: "\f00d"; }
+
+.fa-times::before {
+  content: "\f00d"; }
+
+.fa-arrows-up-down-left-right::before {
+  content: "\f047"; }
+
+.fa-arrows::before {
+  content: "\f047"; }
+
+.fa-chalkboard-user::before {
+  content: "\f51c"; }
+
+.fa-chalkboard-teacher::before {
+  content: "\f51c"; }
+
+.fa-peso-sign::before {
+  content: "\e222"; }
+
+.fa-building-shield::before {
+  content: "\e4d8"; }
+
+.fa-baby::before {
+  content: "\f77c"; }
+
+.fa-users-line::before {
+  content: "\e592"; }
+
+.fa-quote-left::before {
+  content: "\f10d"; }
+
+.fa-quote-left-alt::before {
+  content: "\f10d"; }
+
+.fa-tractor::before {
+  content: "\f722"; }
+
+.fa-trash-arrow-up::before {
+  content: "\f829"; }
+
+.fa-trash-restore::before {
+  content: "\f829"; }
+
+.fa-arrow-down-up-lock::before {
+  content: "\e4b0"; }
+
+.fa-lines-leaning::before {
+  content: "\e51e"; }
+
+.fa-ruler-combined::before {
+  content: "\f546"; }
+
+.fa-copyright::before {
+  content: "\f1f9"; }
+
+.fa-equals::before {
+  content: "\3d"; }
+
+.fa-blender::before {
+  content: "\f517"; }
+
+.fa-teeth::before {
+  content: "\f62e"; }
+
+.fa-shekel-sign::before {
+  content: "\f20b"; }
+
+.fa-ils::before {
+  content: "\f20b"; }
+
+.fa-shekel::before {
+  content: "\f20b"; }
+
+.fa-sheqel::before {
+  content: "\f20b"; }
+
+.fa-sheqel-sign::before {
+  content: "\f20b"; }
+
+.fa-map::before {
+  content: "\f279"; }
+
+.fa-rocket::before {
+  content: "\f135"; }
+
+.fa-photo-film::before {
+  content: "\f87c"; }
+
+.fa-photo-video::before {
+  content: "\f87c"; }
+
+.fa-folder-minus::before {
+  content: "\f65d"; }
+
+.fa-store::before {
+  content: "\f54e"; }
+
+.fa-arrow-trend-up::before {
+  content: "\e098"; }
+
+.fa-plug-circle-minus::before {
+  content: "\e55e"; }
+
+.fa-sign-hanging::before {
+  content: "\f4d9"; }
+
+.fa-sign::before {
+  content: "\f4d9"; }
+
+.fa-bezier-curve::before {
+  content: "\f55b"; }
+
+.fa-bell-slash::before {
+  content: "\f1f6"; }
+
+.fa-tablet::before {
+  content: "\f3fb"; }
+
+.fa-tablet-android::before {
+  content: "\f3fb"; }
+
+.fa-school-flag::before {
+  content: "\e56e"; }
+
+.fa-fill::before {
+  content: "\f575"; }
+
+.fa-angle-up::before {
+  content: "\f106"; }
+
+.fa-drumstick-bite::before {
+  content: "\f6d7"; }
+
+.fa-holly-berry::before {
+  content: "\f7aa"; }
+
+.fa-chevron-left::before {
+  content: "\f053"; }
+
+.fa-bacteria::before {
+  content: "\e059"; }
+
+.fa-hand-lizard::before {
+  content: "\f258"; }
+
+.fa-notdef::before {
+  content: "\e1fe"; }
+
+.fa-disease::before {
+  content: "\f7fa"; }
+
+.fa-briefcase-medical::before {
+  content: "\f469"; }
+
+.fa-genderless::before {
+  content: "\f22d"; }
+
+.fa-chevron-right::before {
+  content: "\f054"; }
+
+.fa-retweet::before {
+  content: "\f079"; }
+
+.fa-car-rear::before {
+  content: "\f5de"; }
+
+.fa-car-alt::before {
+  content: "\f5de"; }
+
+.fa-pump-soap::before {
+  content: "\e06b"; }
+
+.fa-video-slash::before {
+  content: "\f4e2"; }
+
+.fa-battery-quarter::before {
+  content: "\f243"; }
+
+.fa-battery-2::before {
+  content: "\f243"; }
+
+.fa-radio::before {
+  content: "\f8d7"; }
+
+.fa-baby-carriage::before {
+  content: "\f77d"; }
+
+.fa-carriage-baby::before {
+  content: "\f77d"; }
+
+.fa-traffic-light::before {
+  content: "\f637"; }
+
+.fa-thermometer::before {
+  content: "\f491"; }
+
+.fa-vr-cardboard::before {
+  content: "\f729"; }
+
+.fa-hand-middle-finger::before {
+  content: "\f806"; }
+
+.fa-percent::before {
+  content: "\25"; }
+
+.fa-percentage::before {
+  content: "\25"; }
+
+.fa-truck-moving::before {
+  content: "\f4df"; }
+
+.fa-glass-water-droplet::before {
+  content: "\e4f5"; }
+
+.fa-display::before {
+  content: "\e163"; }
+
+.fa-face-smile::before {
+  content: "\f118"; }
+
+.fa-smile::before {
+  content: "\f118"; }
+
+.fa-thumbtack::before {
+  content: "\f08d"; }
+
+.fa-thumb-tack::before {
+  content: "\f08d"; }
+
+.fa-trophy::before {
+  content: "\f091"; }
+
+.fa-person-praying::before {
+  content: "\f683"; }
+
+.fa-pray::before {
+  content: "\f683"; }
+
+.fa-hammer::before {
+  content: "\f6e3"; }
+
+.fa-hand-peace::before {
+  content: "\f25b"; }
+
+.fa-rotate::before {
+  content: "\f2f1"; }
+
+.fa-sync-alt::before {
+  content: "\f2f1"; }
+
+.fa-spinner::before {
+  content: "\f110"; }
+
+.fa-robot::before {
+  content: "\f544"; }
+
+.fa-peace::before {
+  content: "\f67c"; }
+
+.fa-gears::before {
+  content: "\f085"; }
+
+.fa-cogs::before {
+  content: "\f085"; }
+
+.fa-warehouse::before {
+  content: "\f494"; }
+
+.fa-arrow-up-right-dots::before {
+  content: "\e4b7"; }
+
+.fa-splotch::before {
+  content: "\f5bc"; }
+
+.fa-face-grin-hearts::before {
+  content: "\f584"; }
+
+.fa-grin-hearts::before {
+  content: "\f584"; }
+
+.fa-dice-four::before {
+  content: "\f524"; }
+
+.fa-sim-card::before {
+  content: "\f7c4"; }
+
+.fa-transgender::before {
+  content: "\f225"; }
+
+.fa-transgender-alt::before {
+  content: "\f225"; }
+
+.fa-mercury::before {
+  content: "\f223"; }
+
+.fa-arrow-turn-down::before {
+  content: "\f149"; }
+
+.fa-level-down::before {
+  content: "\f149"; }
+
+.fa-person-falling-burst::before {
+  content: "\e547"; }
+
+.fa-award::before {
+  content: "\f559"; }
+
+.fa-ticket-simple::before {
+  content: "\f3ff"; }
+
+.fa-ticket-alt::before {
+  content: "\f3ff"; }
+
+.fa-building::before {
+  content: "\f1ad"; }
+
+.fa-angles-left::before {
+  content: "\f100"; }
+
+.fa-angle-double-left::before {
+  content: "\f100"; }
+
+.fa-qrcode::before {
+  content: "\f029"; }
+
+.fa-clock-rotate-left::before {
+  content: "\f1da"; }
+
+.fa-history::before {
+  content: "\f1da"; }
+
+.fa-face-grin-beam-sweat::before {
+  content: "\f583"; }
+
+.fa-grin-beam-sweat::before {
+  content: "\f583"; }
+
+.fa-file-export::before {
+  content: "\f56e"; }
+
+.fa-arrow-right-from-file::before {
+  content: "\f56e"; }
+
+.fa-shield::before {
+  content: "\f132"; }
+
+.fa-shield-blank::before {
+  content: "\f132"; }
+
+.fa-arrow-up-short-wide::before {
+  content: "\f885"; }
+
+.fa-sort-amount-up-alt::before {
+  content: "\f885"; }
+
+.fa-house-medical::before {
+  content: "\e3b2"; }
+
+.fa-golf-ball-tee::before {
+  content: "\f450"; }
+
+.fa-golf-ball::before {
+  content: "\f450"; }
+
+.fa-circle-chevron-left::before {
+  content: "\f137"; }
+
+.fa-chevron-circle-left::before {
+  content: "\f137"; }
+
+.fa-house-chimney-window::before {
+  content: "\e00d"; }
+
+.fa-pen-nib::before {
+  content: "\f5ad"; }
+
+.fa-tent-arrow-turn-left::before {
+  content: "\e580"; }
+
+.fa-tents::before {
+  content: "\e582"; }
+
+.fa-wand-magic::before {
+  content: "\f0d0"; }
+
+.fa-magic::before {
+  content: "\f0d0"; }
+
+.fa-dog::before {
+  content: "\f6d3"; }
+
+.fa-carrot::before {
+  content: "\f787"; }
+
+.fa-moon::before {
+  content: "\f186"; }
+
+.fa-wine-glass-empty::before {
+  content: "\f5ce"; }
+
+.fa-wine-glass-alt::before {
+  content: "\f5ce"; }
+
+.fa-cheese::before {
+  content: "\f7ef"; }
+
+.fa-yin-yang::before {
+  content: "\f6ad"; }
+
+.fa-music::before {
+  content: "\f001"; }
+
+.fa-code-commit::before {
+  content: "\f386"; }
+
+.fa-temperature-low::before {
+  content: "\f76b"; }
+
+.fa-person-biking::before {
+  content: "\f84a"; }
+
+.fa-biking::before {
+  content: "\f84a"; }
+
+.fa-broom::before {
+  content: "\f51a"; }
+
+.fa-shield-heart::before {
+  content: "\e574"; }
+
+.fa-gopuram::before {
+  content: "\f664"; }
+
+.fa-earth-oceania::before {
+  content: "\e47b"; }
+
+.fa-globe-oceania::before {
+  content: "\e47b"; }
+
+.fa-square-xmark::before {
+  content: "\f2d3"; }
+
+.fa-times-square::before {
+  content: "\f2d3"; }
+
+.fa-xmark-square::before {
+  content: "\f2d3"; }
+
+.fa-hashtag::before {
+  content: "\23"; }
+
+.fa-up-right-and-down-left-from-center::before {
+  content: "\f424"; }
+
+.fa-expand-alt::before {
+  content: "\f424"; }
+
+.fa-oil-can::before {
+  content: "\f613"; }
+
+.fa-t::before {
+  content: "\54"; }
+
+.fa-hippo::before {
+  content: "\f6ed"; }
+
+.fa-chart-column::before {
+  content: "\e0e3"; }
+
+.fa-infinity::before {
+  content: "\f534"; }
+
+.fa-vial-circle-check::before {
+  content: "\e596"; }
+
+.fa-person-arrow-down-to-line::before {
+  content: "\e538"; }
+
+.fa-voicemail::before {
+  content: "\f897"; }
+
+.fa-fan::before {
+  content: "\f863"; }
+
+.fa-person-walking-luggage::before {
+  content: "\e554"; }
+
+.fa-up-down::before {
+  content: "\f338"; }
+
+.fa-arrows-alt-v::before {
+  content: "\f338"; }
+
+.fa-cloud-moon-rain::before {
+  content: "\f73c"; }
+
+.fa-calendar::before {
+  content: "\f133"; }
+
+.fa-trailer::before {
+  content: "\e041"; }
+
+.fa-bahai::before {
+  content: "\f666"; }
+
+.fa-haykal::before {
+  content: "\f666"; }
+
+.fa-sd-card::before {
+  content: "\f7c2"; }
+
+.fa-dragon::before {
+  content: "\f6d5"; }
+
+.fa-shoe-prints::before {
+  content: "\f54b"; }
+
+.fa-circle-plus::before {
+  content: "\f055"; }
+
+.fa-plus-circle::before {
+  content: "\f055"; }
+
+.fa-face-grin-tongue-wink::before {
+  content: "\f58b"; }
+
+.fa-grin-tongue-wink::before {
+  content: "\f58b"; }
+
+.fa-hand-holding::before {
+  content: "\f4bd"; }
+
+.fa-plug-circle-exclamation::before {
+  content: "\e55d"; }
+
+.fa-link-slash::before {
+  content: "\f127"; }
+
+.fa-chain-broken::before {
+  content: "\f127"; }
+
+.fa-chain-slash::before {
+  content: "\f127"; }
+
+.fa-unlink::before {
+  content: "\f127"; }
+
+.fa-clone::before {
+  content: "\f24d"; }
+
+.fa-person-walking-arrow-loop-left::before {
+  content: "\e551"; }
+
+.fa-arrow-up-z-a::before {
+  content: "\f882"; }
+
+.fa-sort-alpha-up-alt::before {
+  content: "\f882"; }
+
+.fa-fire-flame-curved::before {
+  content: "\f7e4"; }
+
+.fa-fire-alt::before {
+  content: "\f7e4"; }
+
+.fa-tornado::before {
+  content: "\f76f"; }
+
+.fa-file-circle-plus::before {
+  content: "\e494"; }
+
+.fa-book-quran::before {
+  content: "\f687"; }
+
+.fa-quran::before {
+  content: "\f687"; }
+
+.fa-anchor::before {
+  content: "\f13d"; }
+
+.fa-border-all::before {
+  content: "\f84c"; }
+
+.fa-face-angry::before {
+  content: "\f556"; }
+
+.fa-angry::before {
+  content: "\f556"; }
+
+.fa-cookie-bite::before {
+  content: "\f564"; }
+
+.fa-arrow-trend-down::before {
+  content: "\e097"; }
+
+.fa-rss::before {
+  content: "\f09e"; }
+
+.fa-feed::before {
+  content: "\f09e"; }
+
+.fa-draw-polygon::before {
+  content: "\f5ee"; }
+
+.fa-scale-balanced::before {
+  content: "\f24e"; }
+
+.fa-balance-scale::before {
+  content: "\f24e"; }
+
+.fa-gauge-simple-high::before {
+  content: "\f62a"; }
+
+.fa-tachometer::before {
+  content: "\f62a"; }
+
+.fa-tachometer-fast::before {
+  content: "\f62a"; }
+
+.fa-shower::before {
+  content: "\f2cc"; }
+
+.fa-desktop::before {
+  content: "\f390"; }
+
+.fa-desktop-alt::before {
+  content: "\f390"; }
+
+.fa-m::before {
+  content: "\4d"; }
+
+.fa-table-list::before {
+  content: "\f00b"; }
+
+.fa-th-list::before {
+  content: "\f00b"; }
+
+.fa-comment-sms::before {
+  content: "\f7cd"; }
+
+.fa-sms::before {
+  content: "\f7cd"; }
+
+.fa-book::before {
+  content: "\f02d"; }
+
+.fa-user-plus::before {
+  content: "\f234"; }
+
+.fa-check::before {
+  content: "\f00c"; }
+
+.fa-battery-three-quarters::before {
+  content: "\f241"; }
+
+.fa-battery-4::before {
+  content: "\f241"; }
+
+.fa-house-circle-check::before {
+  content: "\e509"; }
+
+.fa-angle-left::before {
+  content: "\f104"; }
+
+.fa-diagram-successor::before {
+  content: "\e47a"; }
+
+.fa-truck-arrow-right::before {
+  content: "\e58b"; }
+
+.fa-arrows-split-up-and-left::before {
+  content: "\e4bc"; }
+
+.fa-hand-fist::before {
+  content: "\f6de"; }
+
+.fa-fist-raised::before {
+  content: "\f6de"; }
+
+.fa-cloud-moon::before {
+  content: "\f6c3"; }
+
+.fa-briefcase::before {
+  content: "\f0b1"; }
+
+.fa-person-falling::before {
+  content: "\e546"; }
+
+.fa-image-portrait::before {
+  content: "\f3e0"; }
+
+.fa-portrait::before {
+  content: "\f3e0"; }
+
+.fa-user-tag::before {
+  content: "\f507"; }
+
+.fa-rug::before {
+  content: "\e569"; }
+
+.fa-earth-europe::before {
+  content: "\f7a2"; }
+
+.fa-globe-europe::before {
+  content: "\f7a2"; }
+
+.fa-cart-flatbed-suitcase::before {
+  content: "\f59d"; }
+
+.fa-luggage-cart::before {
+  content: "\f59d"; }
+
+.fa-rectangle-xmark::before {
+  content: "\f410"; }
+
+.fa-rectangle-times::before {
+  content: "\f410"; }
+
+.fa-times-rectangle::before {
+  content: "\f410"; }
+
+.fa-window-close::before {
+  content: "\f410"; }
+
+.fa-baht-sign::before {
+  content: "\e0ac"; }
+
+.fa-book-open::before {
+  content: "\f518"; }
+
+.fa-book-journal-whills::before {
+  content: "\f66a"; }
+
+.fa-journal-whills::before {
+  content: "\f66a"; }
+
+.fa-handcuffs::before {
+  content: "\e4f8"; }
+
+.fa-triangle-exclamation::before {
+  content: "\f071"; }
+
+.fa-exclamation-triangle::before {
+  content: "\f071"; }
+
+.fa-warning::before {
+  content: "\f071"; }
+
+.fa-database::before {
+  content: "\f1c0"; }
+
+.fa-share::before {
+  content: "\f064"; }
+
+.fa-arrow-turn-right::before {
+  content: "\f064"; }
+
+.fa-mail-forward::before {
+  content: "\f064"; }
+
+.fa-bottle-droplet::before {
+  content: "\e4c4"; }
+
+.fa-mask-face::before {
+  content: "\e1d7"; }
+
+.fa-hill-rockslide::before {
+  content: "\e508"; }
+
+.fa-right-left::before {
+  content: "\f362"; }
+
+.fa-exchange-alt::before {
+  content: "\f362"; }
+
+.fa-paper-plane::before {
+  content: "\f1d8"; }
+
+.fa-road-circle-exclamation::before {
+  content: "\e565"; }
+
+.fa-dungeon::before {
+  content: "\f6d9"; }
+
+.fa-align-right::before {
+  content: "\f038"; }
+
+.fa-money-bill-1-wave::before {
+  content: "\f53b"; }
+
+.fa-money-bill-wave-alt::before {
+  content: "\f53b"; }
+
+.fa-life-ring::before {
+  content: "\f1cd"; }
+
+.fa-hands::before {
+  content: "\f2a7"; }
+
+.fa-sign-language::before {
+  content: "\f2a7"; }
+
+.fa-signing::before {
+  content: "\f2a7"; }
+
+.fa-calendar-day::before {
+  content: "\f783"; }
+
+.fa-water-ladder::before {
+  content: "\f5c5"; }
+
+.fa-ladder-water::before {
+  content: "\f5c5"; }
+
+.fa-swimming-pool::before {
+  content: "\f5c5"; }
+
+.fa-arrows-up-down::before {
+  content: "\f07d"; }
+
+.fa-arrows-v::before {
+  content: "\f07d"; }
+
+.fa-face-grimace::before {
+  content: "\f57f"; }
+
+.fa-grimace::before {
+  content: "\f57f"; }
+
+.fa-wheelchair-move::before {
+  content: "\e2ce"; }
+
+.fa-wheelchair-alt::before {
+  content: "\e2ce"; }
+
+.fa-turn-down::before {
+  content: "\f3be"; }
+
+.fa-level-down-alt::before {
+  content: "\f3be"; }
+
+.fa-person-walking-arrow-right::before {
+  content: "\e552"; }
+
+.fa-square-envelope::before {
+  content: "\f199"; }
+
+.fa-envelope-square::before {
+  content: "\f199"; }
+
+.fa-dice::before {
+  content: "\f522"; }
+
+.fa-bowling-ball::before {
+  content: "\f436"; }
+
+.fa-brain::before {
+  content: "\f5dc"; }
+
+.fa-bandage::before {
+  content: "\f462"; }
+
+.fa-band-aid::before {
+  content: "\f462"; }
+
+.fa-calendar-minus::before {
+  content: "\f272"; }
+
+.fa-circle-xmark::before {
+  content: "\f057"; }
+
+.fa-times-circle::before {
+  content: "\f057"; }
+
+.fa-xmark-circle::before {
+  content: "\f057"; }
+
+.fa-gifts::before {
+  content: "\f79c"; }
+
+.fa-hotel::before {
+  content: "\f594"; }
+
+.fa-earth-asia::before {
+  content: "\f57e"; }
+
+.fa-globe-asia::before {
+  content: "\f57e"; }
+
+.fa-id-card-clip::before {
+  content: "\f47f"; }
+
+.fa-id-card-alt::before {
+  content: "\f47f"; }
+
+.fa-magnifying-glass-plus::before {
+  content: "\f00e"; }
+
+.fa-search-plus::before {
+  content: "\f00e"; }
+
+.fa-thumbs-up::before {
+  content: "\f164"; }
+
+.fa-user-clock::before {
+  content: "\f4fd"; }
+
+.fa-hand-dots::before {
+  content: "\f461"; }
+
+.fa-allergies::before {
+  content: "\f461"; }
+
+.fa-file-invoice::before {
+  content: "\f570"; }
+
+.fa-window-minimize::before {
+  content: "\f2d1"; }
+
+.fa-mug-saucer::before {
+  content: "\f0f4"; }
+
+.fa-coffee::before {
+  content: "\f0f4"; }
+
+.fa-brush::before {
+  content: "\f55d"; }
+
+.fa-mask::before {
+  content: "\f6fa"; }
+
+.fa-magnifying-glass-minus::before {
+  content: "\f010"; }
+
+.fa-search-minus::before {
+  content: "\f010"; }
+
+.fa-ruler-vertical::before {
+  content: "\f548"; }
+
+.fa-user-large::before {
+  content: "\f406"; }
+
+.fa-user-alt::before {
+  content: "\f406"; }
+
+.fa-train-tram::before {
+  content: "\e5b4"; }
+
+.fa-user-nurse::before {
+  content: "\f82f"; }
+
+.fa-syringe::before {
+  content: "\f48e"; }
+
+.fa-cloud-sun::before {
+  content: "\f6c4"; }
+
+.fa-stopwatch-20::before {
+  content: "\e06f"; }
+
+.fa-square-full::before {
+  content: "\f45c"; }
+
+.fa-magnet::before {
+  content: "\f076"; }
+
+.fa-jar::before {
+  content: "\e516"; }
+
+.fa-note-sticky::before {
+  content: "\f249"; }
+
+.fa-sticky-note::before {
+  content: "\f249"; }
+
+.fa-bug-slash::before {
+  content: "\e490"; }
+
+.fa-arrow-up-from-water-pump::before {
+  content: "\e4b6"; }
+
+.fa-bone::before {
+  content: "\f5d7"; }
+
+.fa-user-injured::before {
+  content: "\f728"; }
+
+.fa-face-sad-tear::before {
+  content: "\f5b4"; }
+
+.fa-sad-tear::before {
+  content: "\f5b4"; }
+
+.fa-plane::before {
+  content: "\f072"; }
+
+.fa-tent-arrows-down::before {
+  content: "\e581"; }
+
+.fa-exclamation::before {
+  content: "\21"; }
+
+.fa-arrows-spin::before {
+  content: "\e4bb"; }
+
+.fa-print::before {
+  content: "\f02f"; }
+
+.fa-turkish-lira-sign::before {
+  content: "\e2bb"; }
+
+.fa-try::before {
+  content: "\e2bb"; }
+
+.fa-turkish-lira::before {
+  content: "\e2bb"; }
+
+.fa-dollar-sign::before {
+  content: "\24"; }
+
+.fa-dollar::before {
+  content: "\24"; }
+
+.fa-usd::before {
+  content: "\24"; }
+
+.fa-x::before {
+  content: "\58"; }
+
+.fa-magnifying-glass-dollar::before {
+  content: "\f688"; }
+
+.fa-search-dollar::before {
+  content: "\f688"; }
+
+.fa-users-gear::before {
+  content: "\f509"; }
+
+.fa-users-cog::before {
+  content: "\f509"; }
+
+.fa-person-military-pointing::before {
+  content: "\e54a"; }
+
+.fa-building-columns::before {
+  content: "\f19c"; }
+
+.fa-bank::before {
+  content: "\f19c"; }
+
+.fa-institution::before {
+  content: "\f19c"; }
+
+.fa-museum::before {
+  content: "\f19c"; }
+
+.fa-university::before {
+  content: "\f19c"; }
+
+.fa-umbrella::before {
+  content: "\f0e9"; }
+
+.fa-trowel::before {
+  content: "\e589"; }
+
+.fa-d::before {
+  content: "\44"; }
+
+.fa-stapler::before {
+  content: "\e5af"; }
+
+.fa-masks-theater::before {
+  content: "\f630"; }
+
+.fa-theater-masks::before {
+  content: "\f630"; }
+
+.fa-kip-sign::before {
+  content: "\e1c4"; }
+
+.fa-hand-point-left::before {
+  content: "\f0a5"; }
+
+.fa-handshake-simple::before {
+  content: "\f4c6"; }
+
+.fa-handshake-alt::before {
+  content: "\f4c6"; }
+
+.fa-jet-fighter::before {
+  content: "\f0fb"; }
+
+.fa-fighter-jet::before {
+  content: "\f0fb"; }
+
+.fa-square-share-nodes::before {
+  content: "\f1e1"; }
+
+.fa-share-alt-square::before {
+  content: "\f1e1"; }
+
+.fa-barcode::before {
+  content: "\f02a"; }
+
+.fa-plus-minus::before {
+  content: "\e43c"; }
+
+.fa-video::before {
+  content: "\f03d"; }
+
+.fa-video-camera::before {
+  content: "\f03d"; }
+
+.fa-graduation-cap::before {
+  content: "\f19d"; }
+
+.fa-mortar-board::before {
+  content: "\f19d"; }
+
+.fa-hand-holding-medical::before {
+  content: "\e05c"; }
+
+.fa-person-circle-check::before {
+  content: "\e53e"; }
+
+.fa-turn-up::before {
+  content: "\f3bf"; }
+
+.fa-level-up-alt::before {
+  content: "\f3bf"; }
+
+.sr-only,
+.fa-sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  padding: 0;
+  margin: -1px;
+  overflow: hidden;
+  clip: rect(0, 0, 0, 0);
+  white-space: nowrap;
+  border-width: 0; }
+
+.sr-only-focusable:not(:focus),
+.fa-sr-only-focusable:not(:focus) {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  padding: 0;
+  margin: -1px;
+  overflow: hidden;
+  clip: rect(0, 0, 0, 0);
+  white-space: nowrap;
+  border-width: 0; }
+:root, :host {
+  --fa-style-family-brands: 'Font Awesome 6 Brands';
+  --fa-font-brands: normal 400 1em/1 'Font Awesome 6 Brands'; }
+
+@font-face {
+  font-family: 'Font Awesome 6 Brands';
+  font-style: normal;
+  font-weight: 400;
+  font-display: block;
+  src: url("../fonts/fa/fa-brands-400.woff2") format("woff2"), url("../fonts/fa/fa-brands-400.ttf") format("truetype"); }
+
+.fab,
+.fa-brands {
+  font-weight: 400; }
+
+.fa-monero:before {
+  content: "\f3d0"; }
+
+.fa-hooli:before {
+  content: "\f427"; }
+
+.fa-yelp:before {
+  content: "\f1e9"; }
+
+.fa-cc-visa:before {
+  content: "\f1f0"; }
+
+.fa-lastfm:before {
+  content: "\f202"; }
+
+.fa-shopware:before {
+  content: "\f5b5"; }
+
+.fa-creative-commons-nc:before {
+  content: "\f4e8"; }
+
+.fa-aws:before {
+  content: "\f375"; }
+
+.fa-redhat:before {
+  content: "\f7bc"; }
+
+.fa-yoast:before {
+  content: "\f2b1"; }
+
+.fa-cloudflare:before {
+  content: "\e07d"; }
+
+.fa-ups:before {
+  content: "\f7e0"; }
+
+.fa-wpexplorer:before {
+  content: "\f2de"; }
+
+.fa-dyalog:before {
+  content: "\f399"; }
+
+.fa-bity:before {
+  content: "\f37a"; }
+
+.fa-stackpath:before {
+  content: "\f842"; }
+
+.fa-buysellads:before {
+  content: "\f20d"; }
+
+.fa-first-order:before {
+  content: "\f2b0"; }
+
+.fa-modx:before {
+  content: "\f285"; }
+
+.fa-guilded:before {
+  content: "\e07e"; }
+
+.fa-vnv:before {
+  content: "\f40b"; }
+
+.fa-square-js:before {
+  content: "\f3b9"; }
+
+.fa-js-square:before {
+  content: "\f3b9"; }
+
+.fa-microsoft:before {
+  content: "\f3ca"; }
+
+.fa-qq:before {
+  content: "\f1d6"; }
+
+.fa-orcid:before {
+  content: "\f8d2"; }
+
+.fa-java:before {
+  content: "\f4e4"; }
+
+.fa-invision:before {
+  content: "\f7b0"; }
+
+.fa-creative-commons-pd-alt:before {
+  content: "\f4ed"; }
+
+.fa-centercode:before {
+  content: "\f380"; }
+
+.fa-glide-g:before {
+  content: "\f2a6"; }
+
+.fa-drupal:before {
+  content: "\f1a9"; }
+
+.fa-hire-a-helper:before {
+  content: "\f3b0"; }
+
+.fa-creative-commons-by:before {
+  content: "\f4e7"; }
+
+.fa-unity:before {
+  content: "\e049"; }
+
+.fa-whmcs:before {
+  content: "\f40d"; }
+
+.fa-rocketchat:before {
+  content: "\f3e8"; }
+
+.fa-vk:before {
+  content: "\f189"; }
+
+.fa-untappd:before {
+  content: "\f405"; }
+
+.fa-mailchimp:before {
+  content: "\f59e"; }
+
+.fa-css3-alt:before {
+  content: "\f38b"; }
+
+.fa-square-reddit:before {
+  content: "\f1a2"; }
+
+.fa-reddit-square:before {
+  content: "\f1a2"; }
+
+.fa-vimeo-v:before {
+  content: "\f27d"; }
+
+.fa-contao:before {
+  content: "\f26d"; }
+
+.fa-square-font-awesome:before {
+  content: "\e5ad"; }
+
+.fa-deskpro:before {
+  content: "\f38f"; }
+
+.fa-sistrix:before {
+  content: "\f3ee"; }
+
+.fa-square-instagram:before {
+  content: "\e055"; }
+
+.fa-instagram-square:before {
+  content: "\e055"; }
+
+.fa-battle-net:before {
+  content: "\f835"; }
+
+.fa-the-red-yeti:before {
+  content: "\f69d"; }
+
+.fa-square-hacker-news:before {
+  content: "\f3af"; }
+
+.fa-hacker-news-square:before {
+  content: "\f3af"; }
+
+.fa-edge:before {
+  content: "\f282"; }
+
+.fa-napster:before {
+  content: "\f3d2"; }
+
+.fa-square-snapchat:before {
+  content: "\f2ad"; }
+
+.fa-snapchat-square:before {
+  content: "\f2ad"; }
+
+.fa-google-plus-g:before {
+  content: "\f0d5"; }
+
+.fa-artstation:before {
+  content: "\f77a"; }
+
+.fa-markdown:before {
+  content: "\f60f"; }
+
+.fa-sourcetree:before {
+  content: "\f7d3"; }
+
+.fa-google-plus:before {
+  content: "\f2b3"; }
+
+.fa-diaspora:before {
+  content: "\f791"; }
+
+.fa-foursquare:before {
+  content: "\f180"; }
+
+.fa-stack-overflow:before {
+  content: "\f16c"; }
+
+.fa-github-alt:before {
+  content: "\f113"; }
+
+.fa-phoenix-squadron:before {
+  content: "\f511"; }
+
+.fa-pagelines:before {
+  content: "\f18c"; }
+
+.fa-algolia:before {
+  content: "\f36c"; }
+
+.fa-red-river:before {
+  content: "\f3e3"; }
+
+.fa-creative-commons-sa:before {
+  content: "\f4ef"; }
+
+.fa-safari:before {
+  content: "\f267"; }
+
+.fa-google:before {
+  content: "\f1a0"; }
+
+.fa-square-font-awesome-stroke:before {
+  content: "\f35c"; }
+
+.fa-font-awesome-alt:before {
+  content: "\f35c"; }
+
+.fa-atlassian:before {
+  content: "\f77b"; }
+
+.fa-linkedin-in:before {
+  content: "\f0e1"; }
+
+.fa-digital-ocean:before {
+  content: "\f391"; }
+
+.fa-nimblr:before {
+  content: "\f5a8"; }
+
+.fa-chromecast:before {
+  content: "\f838"; }
+
+.fa-evernote:before {
+  content: "\f839"; }
+
+.fa-hacker-news:before {
+  content: "\f1d4"; }
+
+.fa-creative-commons-sampling:before {
+  content: "\f4f0"; }
+
+.fa-adversal:before {
+  content: "\f36a"; }
+
+.fa-creative-commons:before {
+  content: "\f25e"; }
+
+.fa-watchman-monitoring:before {
+  content: "\e087"; }
+
+.fa-fonticons:before {
+  content: "\f280"; }
+
+.fa-weixin:before {
+  content: "\f1d7"; }
+
+.fa-shirtsinbulk:before {
+  content: "\f214"; }
+
+.fa-codepen:before {
+  content: "\f1cb"; }
+
+.fa-git-alt:before {
+  content: "\f841"; }
+
+.fa-lyft:before {
+  content: "\f3c3"; }
+
+.fa-rev:before {
+  content: "\f5b2"; }
+
+.fa-windows:before {
+  content: "\f17a"; }
+
+.fa-wizards-of-the-coast:before {
+  content: "\f730"; }
+
+.fa-square-viadeo:before {
+  content: "\f2aa"; }
+
+.fa-viadeo-square:before {
+  content: "\f2aa"; }
+
+.fa-meetup:before {
+  content: "\f2e0"; }
+
+.fa-centos:before {
+  content: "\f789"; }
+
+.fa-adn:before {
+  content: "\f170"; }
+
+.fa-cloudsmith:before {
+  content: "\f384"; }
+
+.fa-pied-piper-alt:before {
+  content: "\f1a8"; }
+
+.fa-square-dribbble:before {
+  content: "\f397"; }
+
+.fa-dribbble-square:before {
+  content: "\f397"; }
+
+.fa-codiepie:before {
+  content: "\f284"; }
+
+.fa-node:before {
+  content: "\f419"; }
+
+.fa-mix:before {
+  content: "\f3cb"; }
+
+.fa-steam:before {
+  content: "\f1b6"; }
+
+.fa-cc-apple-pay:before {
+  content: "\f416"; }
+
+.fa-scribd:before {
+  content: "\f28a"; }
+
+.fa-openid:before {
+  content: "\f19b"; }
+
+.fa-instalod:before {
+  content: "\e081"; }
+
+.fa-expeditedssl:before {
+  content: "\f23e"; }
+
+.fa-sellcast:before {
+  content: "\f2da"; }
+
+.fa-square-twitter:before {
+  content: "\f081"; }
+
+.fa-twitter-square:before {
+  content: "\f081"; }
+
+.fa-r-project:before {
+  content: "\f4f7"; }
+
+.fa-delicious:before {
+  content: "\f1a5"; }
+
+.fa-freebsd:before {
+  content: "\f3a4"; }
+
+.fa-vuejs:before {
+  content: "\f41f"; }
+
+.fa-accusoft:before {
+  content: "\f369"; }
+
+.fa-ioxhost:before {
+  content: "\f208"; }
+
+.fa-fonticons-fi:before {
+  content: "\f3a2"; }
+
+.fa-app-store:before {
+  content: "\f36f"; }
+
+.fa-cc-mastercard:before {
+  content: "\f1f1"; }
+
+.fa-itunes-note:before {
+  content: "\f3b5"; }
+
+.fa-golang:before {
+  content: "\e40f"; }
+
+.fa-kickstarter:before {
+  content: "\f3bb"; }
+
+.fa-grav:before {
+  content: "\f2d6"; }
+
+.fa-weibo:before {
+  content: "\f18a"; }
+
+.fa-uncharted:before {
+  content: "\e084"; }
+
+.fa-firstdraft:before {
+  content: "\f3a1"; }
+
+.fa-square-youtube:before {
+  content: "\f431"; }
+
+.fa-youtube-square:before {
+  content: "\f431"; }
+
+.fa-wikipedia-w:before {
+  content: "\f266"; }
+
+.fa-wpressr:before {
+  content: "\f3e4"; }
+
+.fa-rendact:before {
+  content: "\f3e4"; }
+
+.fa-angellist:before {
+  content: "\f209"; }
+
+.fa-galactic-republic:before {
+  content: "\f50c"; }
+
+.fa-nfc-directional:before {
+  content: "\e530"; }
+
+.fa-skype:before {
+  content: "\f17e"; }
+
+.fa-joget:before {
+  content: "\f3b7"; }
+
+.fa-fedora:before {
+  content: "\f798"; }
+
+.fa-stripe-s:before {
+  content: "\f42a"; }
+
+.fa-meta:before {
+  content: "\e49b"; }
+
+.fa-laravel:before {
+  content: "\f3bd"; }
+
+.fa-hotjar:before {
+  content: "\f3b1"; }
+
+.fa-bluetooth-b:before {
+  content: "\f294"; }
+
+.fa-sticker-mule:before {
+  content: "\f3f7"; }
+
+.fa-creative-commons-zero:before {
+  content: "\f4f3"; }
+
+.fa-hips:before {
+  content: "\f452"; }
+
+.fa-behance:before {
+  content: "\f1b4"; }
+
+.fa-reddit:before {
+  content: "\f1a1"; }
+
+.fa-discord:before {
+  content: "\f392"; }
+
+.fa-chrome:before {
+  content: "\f268"; }
+
+.fa-app-store-ios:before {
+  content: "\f370"; }
+
+.fa-cc-discover:before {
+  content: "\f1f2"; }
+
+.fa-wpbeginner:before {
+  content: "\f297"; }
+
+.fa-confluence:before {
+  content: "\f78d"; }
+
+.fa-mdb:before {
+  content: "\f8ca"; }
+
+.fa-dochub:before {
+  content: "\f394"; }
+
+.fa-accessible-icon:before {
+  content: "\f368"; }
+
+.fa-ebay:before {
+  content: "\f4f4"; }
+
+.fa-amazon:before {
+  content: "\f270"; }
+
+.fa-unsplash:before {
+  content: "\e07c"; }
+
+.fa-yarn:before {
+  content: "\f7e3"; }
+
+.fa-square-steam:before {
+  content: "\f1b7"; }
+
+.fa-steam-square:before {
+  content: "\f1b7"; }
+
+.fa-500px:before {
+  content: "\f26e"; }
+
+.fa-square-vimeo:before {
+  content: "\f194"; }
+
+.fa-vimeo-square:before {
+  content: "\f194"; }
+
+.fa-asymmetrik:before {
+  content: "\f372"; }
+
+.fa-font-awesome:before {
+  content: "\f2b4"; }
+
+.fa-font-awesome-flag:before {
+  content: "\f2b4"; }
+
+.fa-font-awesome-logo-full:before {
+  content: "\f2b4"; }
+
+.fa-gratipay:before {
+  content: "\f184"; }
+
+.fa-apple:before {
+  content: "\f179"; }
+
+.fa-hive:before {
+  content: "\e07f"; }
+
+.fa-gitkraken:before {
+  content: "\f3a6"; }
+
+.fa-keybase:before {
+  content: "\f4f5"; }
+
+.fa-apple-pay:before {
+  content: "\f415"; }
+
+.fa-padlet:before {
+  content: "\e4a0"; }
+
+.fa-amazon-pay:before {
+  content: "\f42c"; }
+
+.fa-square-github:before {
+  content: "\f092"; }
+
+.fa-github-square:before {
+  content: "\f092"; }
+
+.fa-stumbleupon:before {
+  content: "\f1a4"; }
+
+.fa-fedex:before {
+  content: "\f797"; }
+
+.fa-phoenix-framework:before {
+  content: "\f3dc"; }
+
+.fa-shopify:before {
+  content: "\e057"; }
+
+.fa-neos:before {
+  content: "\f612"; }
+
+.fa-hackerrank:before {
+  content: "\f5f7"; }
+
+.fa-researchgate:before {
+  content: "\f4f8"; }
+
+.fa-swift:before {
+  content: "\f8e1"; }
+
+.fa-angular:before {
+  content: "\f420"; }
+
+.fa-speakap:before {
+  content: "\f3f3"; }
+
+.fa-angrycreative:before {
+  content: "\f36e"; }
+
+.fa-y-combinator:before {
+  content: "\f23b"; }
+
+.fa-empire:before {
+  content: "\f1d1"; }
+
+.fa-envira:before {
+  content: "\f299"; }
+
+.fa-square-gitlab:before {
+  content: "\e5ae"; }
+
+.fa-gitlab-square:before {
+  content: "\e5ae"; }
+
+.fa-studiovinari:before {
+  content: "\f3f8"; }
+
+.fa-pied-piper:before {
+  content: "\f2ae"; }
+
+.fa-wordpress:before {
+  content: "\f19a"; }
+
+.fa-product-hunt:before {
+  content: "\f288"; }
+
+.fa-firefox:before {
+  content: "\f269"; }
+
+.fa-linode:before {
+  content: "\f2b8"; }
+
+.fa-goodreads:before {
+  content: "\f3a8"; }
+
+.fa-square-odnoklassniki:before {
+  content: "\f264"; }
+
+.fa-odnoklassniki-square:before {
+  content: "\f264"; }
+
+.fa-jsfiddle:before {
+  content: "\f1cc"; }
+
+.fa-sith:before {
+  content: "\f512"; }
+
+.fa-themeisle:before {
+  content: "\f2b2"; }
+
+.fa-page4:before {
+  content: "\f3d7"; }
+
+.fa-hashnode:before {
+  content: "\e499"; }
+
+.fa-react:before {
+  content: "\f41b"; }
+
+.fa-cc-paypal:before {
+  content: "\f1f4"; }
+
+.fa-squarespace:before {
+  content: "\f5be"; }
+
+.fa-cc-stripe:before {
+  content: "\f1f5"; }
+
+.fa-creative-commons-share:before {
+  content: "\f4f2"; }
+
+.fa-bitcoin:before {
+  content: "\f379"; }
+
+.fa-keycdn:before {
+  content: "\f3ba"; }
+
+.fa-opera:before {
+  content: "\f26a"; }
+
+.fa-itch-io:before {
+  content: "\f83a"; }
+
+.fa-umbraco:before {
+  content: "\f8e8"; }
+
+.fa-galactic-senate:before {
+  content: "\f50d"; }
+
+.fa-ubuntu:before {
+  content: "\f7df"; }
+
+.fa-draft2digital:before {
+  content: "\f396"; }
+
+.fa-stripe:before {
+  content: "\f429"; }
+
+.fa-houzz:before {
+  content: "\f27c"; }
+
+.fa-gg:before {
+  content: "\f260"; }
+
+.fa-dhl:before {
+  content: "\f790"; }
+
+.fa-square-pinterest:before {
+  content: "\f0d3"; }
+
+.fa-pinterest-square:before {
+  content: "\f0d3"; }
+
+.fa-xing:before {
+  content: "\f168"; }
+
+.fa-blackberry:before {
+  content: "\f37b"; }
+
+.fa-creative-commons-pd:before {
+  content: "\f4ec"; }
+
+.fa-playstation:before {
+  content: "\f3df"; }
+
+.fa-quinscape:before {
+  content: "\f459"; }
+
+.fa-less:before {
+  content: "\f41d"; }
+
+.fa-blogger-b:before {
+  content: "\f37d"; }
+
+.fa-opencart:before {
+  content: "\f23d"; }
+
+.fa-vine:before {
+  content: "\f1ca"; }
+
+.fa-paypal:before {
+  content: "\f1ed"; }
+
+.fa-gitlab:before {
+  content: "\f296"; }
+
+.fa-typo3:before {
+  content: "\f42b"; }
+
+.fa-reddit-alien:before {
+  content: "\f281"; }
+
+.fa-yahoo:before {
+  content: "\f19e"; }
+
+.fa-dailymotion:before {
+  content: "\e052"; }
+
+.fa-affiliatetheme:before {
+  content: "\f36b"; }
+
+.fa-pied-piper-pp:before {
+  content: "\f1a7"; }
+
+.fa-bootstrap:before {
+  content: "\f836"; }
+
+.fa-odnoklassniki:before {
+  content: "\f263"; }
+
+.fa-nfc-symbol:before {
+  content: "\e531"; }
+
+.fa-ethereum:before {
+  content: "\f42e"; }
+
+.fa-speaker-deck:before {
+  content: "\f83c"; }
+
+.fa-creative-commons-nc-eu:before {
+  content: "\f4e9"; }
+
+.fa-patreon:before {
+  content: "\f3d9"; }
+
+.fa-avianex:before {
+  content: "\f374"; }
+
+.fa-ello:before {
+  content: "\f5f1"; }
+
+.fa-gofore:before {
+  content: "\f3a7"; }
+
+.fa-bimobject:before {
+  content: "\f378"; }
+
+.fa-facebook-f:before {
+  content: "\f39e"; }
+
+.fa-square-google-plus:before {
+  content: "\f0d4"; }
+
+.fa-google-plus-square:before {
+  content: "\f0d4"; }
+
+.fa-mandalorian:before {
+  content: "\f50f"; }
+
+.fa-first-order-alt:before {
+  content: "\f50a"; }
+
+.fa-osi:before {
+  content: "\f41a"; }
+
+.fa-google-wallet:before {
+  content: "\f1ee"; }
+
+.fa-d-and-d-beyond:before {
+  content: "\f6ca"; }
+
+.fa-periscope:before {
+  content: "\f3da"; }
+
+.fa-fulcrum:before {
+  content: "\f50b"; }
+
+.fa-cloudscale:before {
+  content: "\f383"; }
+
+.fa-forumbee:before {
+  content: "\f211"; }
+
+.fa-mizuni:before {
+  content: "\f3cc"; }
+
+.fa-schlix:before {
+  content: "\f3ea"; }
+
+.fa-square-xing:before {
+  content: "\f169"; }
+
+.fa-xing-square:before {
+  content: "\f169"; }
+
+.fa-bandcamp:before {
+  content: "\f2d5"; }
+
+.fa-wpforms:before {
+  content: "\f298"; }
+
+.fa-cloudversify:before {
+  content: "\f385"; }
+
+.fa-usps:before {
+  content: "\f7e1"; }
+
+.fa-megaport:before {
+  content: "\f5a3"; }
+
+.fa-magento:before {
+  content: "\f3c4"; }
+
+.fa-spotify:before {
+  content: "\f1bc"; }
+
+.fa-optin-monster:before {
+  content: "\f23c"; }
+
+.fa-fly:before {
+  content: "\f417"; }
+
+.fa-aviato:before {
+  content: "\f421"; }
+
+.fa-itunes:before {
+  content: "\f3b4"; }
+
+.fa-cuttlefish:before {
+  content: "\f38c"; }
+
+.fa-blogger:before {
+  content: "\f37c"; }
+
+.fa-flickr:before {
+  content: "\f16e"; }
+
+.fa-viber:before {
+  content: "\f409"; }
+
+.fa-soundcloud:before {
+  content: "\f1be"; }
+
+.fa-digg:before {
+  content: "\f1a6"; }
+
+.fa-tencent-weibo:before {
+  content: "\f1d5"; }
+
+.fa-symfony:before {
+  content: "\f83d"; }
+
+.fa-maxcdn:before {
+  content: "\f136"; }
+
+.fa-etsy:before {
+  content: "\f2d7"; }
+
+.fa-facebook-messenger:before {
+  content: "\f39f"; }
+
+.fa-audible:before {
+  content: "\f373"; }
+
+.fa-think-peaks:before {
+  content: "\f731"; }
+
+.fa-bilibili:before {
+  content: "\e3d9"; }
+
+.fa-erlang:before {
+  content: "\f39d"; }
+
+.fa-cotton-bureau:before {
+  content: "\f89e"; }
+
+.fa-dashcube:before {
+  content: "\f210"; }
+
+.fa-42-group:before {
+  content: "\e080"; }
+
+.fa-innosoft:before {
+  content: "\e080"; }
+
+.fa-stack-exchange:before {
+  content: "\f18d"; }
+
+.fa-elementor:before {
+  content: "\f430"; }
+
+.fa-square-pied-piper:before {
+  content: "\e01e"; }
+
+.fa-pied-piper-square:before {
+  content: "\e01e"; }
+
+.fa-creative-commons-nd:before {
+  content: "\f4eb"; }
+
+.fa-palfed:before {
+  content: "\f3d8"; }
+
+.fa-superpowers:before {
+  content: "\f2dd"; }
+
+.fa-resolving:before {
+  content: "\f3e7"; }
+
+.fa-xbox:before {
+  content: "\f412"; }
+
+.fa-searchengin:before {
+  content: "\f3eb"; }
+
+.fa-tiktok:before {
+  content: "\e07b"; }
+
+.fa-square-facebook:before {
+  content: "\f082"; }
+
+.fa-facebook-square:before {
+  content: "\f082"; }
+
+.fa-renren:before {
+  content: "\f18b"; }
+
+.fa-linux:before {
+  content: "\f17c"; }
+
+.fa-glide:before {
+  content: "\f2a5"; }
+
+.fa-linkedin:before {
+  content: "\f08c"; }
+
+.fa-hubspot:before {
+  content: "\f3b2"; }
+
+.fa-deploydog:before {
+  content: "\f38e"; }
+
+.fa-twitch:before {
+  content: "\f1e8"; }
+
+.fa-ravelry:before {
+  content: "\f2d9"; }
+
+.fa-mixer:before {
+  content: "\e056"; }
+
+.fa-square-lastfm:before {
+  content: "\f203"; }
+
+.fa-lastfm-square:before {
+  content: "\f203"; }
+
+.fa-vimeo:before {
+  content: "\f40a"; }
+
+.fa-mendeley:before {
+  content: "\f7b3"; }
+
+.fa-uniregistry:before {
+  content: "\f404"; }
+
+.fa-figma:before {
+  content: "\f799"; }
+
+.fa-creative-commons-remix:before {
+  content: "\f4ee"; }
+
+.fa-cc-amazon-pay:before {
+  content: "\f42d"; }
+
+.fa-dropbox:before {
+  content: "\f16b"; }
+
+.fa-instagram:before {
+  content: "\f16d"; }
+
+.fa-cmplid:before {
+  content: "\e360"; }
+
+.fa-facebook:before {
+  content: "\f09a"; }
+
+.fa-gripfire:before {
+  content: "\f3ac"; }
+
+.fa-jedi-order:before {
+  content: "\f50e"; }
+
+.fa-uikit:before {
+  content: "\f403"; }
+
+.fa-fort-awesome-alt:before {
+  content: "\f3a3"; }
+
+.fa-phabricator:before {
+  content: "\f3db"; }
+
+.fa-ussunnah:before {
+  content: "\f407"; }
+
+.fa-earlybirds:before {
+  content: "\f39a"; }
+
+.fa-trade-federation:before {
+  content: "\f513"; }
+
+.fa-autoprefixer:before {
+  content: "\f41c"; }
+
+.fa-whatsapp:before {
+  content: "\f232"; }
+
+.fa-slideshare:before {
+  content: "\f1e7"; }
+
+.fa-google-play:before {
+  content: "\f3ab"; }
+
+.fa-viadeo:before {
+  content: "\f2a9"; }
+
+.fa-line:before {
+  content: "\f3c0"; }
+
+.fa-google-drive:before {
+  content: "\f3aa"; }
+
+.fa-servicestack:before {
+  content: "\f3ec"; }
+
+.fa-simplybuilt:before {
+  content: "\f215"; }
+
+.fa-bitbucket:before {
+  content: "\f171"; }
+
+.fa-imdb:before {
+  content: "\f2d8"; }
+
+.fa-deezer:before {
+  content: "\e077"; }
+
+.fa-raspberry-pi:before {
+  content: "\f7bb"; }
+
+.fa-jira:before {
+  content: "\f7b1"; }
+
+.fa-docker:before {
+  content: "\f395"; }
+
+.fa-screenpal:before {
+  content: "\e570"; }
+
+.fa-bluetooth:before {
+  content: "\f293"; }
+
+.fa-gitter:before {
+  content: "\f426"; }
+
+.fa-d-and-d:before {
+  content: "\f38d"; }
+
+.fa-microblog:before {
+  content: "\e01a"; }
+
+.fa-cc-diners-club:before {
+  content: "\f24c"; }
+
+.fa-gg-circle:before {
+  content: "\f261"; }
+
+.fa-pied-piper-hat:before {
+  content: "\f4e5"; }
+
+.fa-kickstarter-k:before {
+  content: "\f3bc"; }
+
+.fa-yandex:before {
+  content: "\f413"; }
+
+.fa-readme:before {
+  content: "\f4d5"; }
+
+.fa-html5:before {
+  content: "\f13b"; }
+
+.fa-sellsy:before {
+  content: "\f213"; }
+
+.fa-sass:before {
+  content: "\f41e"; }
+
+.fa-wirsindhandwerk:before {
+  content: "\e2d0"; }
+
+.fa-wsh:before {
+  content: "\e2d0"; }
+
+.fa-buromobelexperte:before {
+  content: "\f37f"; }
+
+.fa-salesforce:before {
+  content: "\f83b"; }
+
+.fa-octopus-deploy:before {
+  content: "\e082"; }
+
+.fa-medapps:before {
+  content: "\f3c6"; }
+
+.fa-ns8:before {
+  content: "\f3d5"; }
+
+.fa-pinterest-p:before {
+  content: "\f231"; }
+
+.fa-apper:before {
+  content: "\f371"; }
+
+.fa-fort-awesome:before {
+  content: "\f286"; }
+
+.fa-waze:before {
+  content: "\f83f"; }
+
+.fa-cc-jcb:before {
+  content: "\f24b"; }
+
+.fa-snapchat:before {
+  content: "\f2ab"; }
+
+.fa-snapchat-ghost:before {
+  content: "\f2ab"; }
+
+.fa-fantasy-flight-games:before {
+  content: "\f6dc"; }
+
+.fa-rust:before {
+  content: "\e07a"; }
+
+.fa-wix:before {
+  content: "\f5cf"; }
+
+.fa-square-behance:before {
+  content: "\f1b5"; }
+
+.fa-behance-square:before {
+  content: "\f1b5"; }
+
+.fa-supple:before {
+  content: "\f3f9"; }
+
+.fa-rebel:before {
+  content: "\f1d0"; }
+
+.fa-css3:before {
+  content: "\f13c"; }
+
+.fa-staylinked:before {
+  content: "\f3f5"; }
+
+.fa-kaggle:before {
+  content: "\f5fa"; }
+
+.fa-space-awesome:before {
+  content: "\e5ac"; }
+
+.fa-deviantart:before {
+  content: "\f1bd"; }
+
+.fa-cpanel:before {
+  content: "\f388"; }
+
+.fa-goodreads-g:before {
+  content: "\f3a9"; }
+
+.fa-square-git:before {
+  content: "\f1d2"; }
+
+.fa-git-square:before {
+  content: "\f1d2"; }
+
+.fa-square-tumblr:before {
+  content: "\f174"; }
+
+.fa-tumblr-square:before {
+  content: "\f174"; }
+
+.fa-trello:before {
+  content: "\f181"; }
+
+.fa-creative-commons-nc-jp:before {
+  content: "\f4ea"; }
+
+.fa-get-pocket:before {
+  content: "\f265"; }
+
+.fa-perbyte:before {
+  content: "\e083"; }
+
+.fa-grunt:before {
+  content: "\f3ad"; }
+
+.fa-weebly:before {
+  content: "\f5cc"; }
+
+.fa-connectdevelop:before {
+  content: "\f20e"; }
+
+.fa-leanpub:before {
+  content: "\f212"; }
+
+.fa-black-tie:before {
+  content: "\f27e"; }
+
+.fa-themeco:before {
+  content: "\f5c6"; }
+
+.fa-python:before {
+  content: "\f3e2"; }
+
+.fa-android:before {
+  content: "\f17b"; }
+
+.fa-bots:before {
+  content: "\e340"; }
+
+.fa-free-code-camp:before {
+  content: "\f2c5"; }
+
+.fa-hornbill:before {
+  content: "\f592"; }
+
+.fa-js:before {
+  content: "\f3b8"; }
+
+.fa-ideal:before {
+  content: "\e013"; }
+
+.fa-git:before {
+  content: "\f1d3"; }
+
+.fa-dev:before {
+  content: "\f6cc"; }
+
+.fa-sketch:before {
+  content: "\f7c6"; }
+
+.fa-yandex-international:before {
+  content: "\f414"; }
+
+.fa-cc-amex:before {
+  content: "\f1f3"; }
+
+.fa-uber:before {
+  content: "\f402"; }
+
+.fa-github:before {
+  content: "\f09b"; }
+
+.fa-php:before {
+  content: "\f457"; }
+
+.fa-alipay:before {
+  content: "\f642"; }
+
+.fa-youtube:before {
+  content: "\f167"; }
+
+.fa-skyatlas:before {
+  content: "\f216"; }
+
+.fa-firefox-browser:before {
+  content: "\e007"; }
+
+.fa-replyd:before {
+  content: "\f3e6"; }
+
+.fa-suse:before {
+  content: "\f7d6"; }
+
+.fa-jenkins:before {
+  content: "\f3b6"; }
+
+.fa-twitter:before {
+  content: "\f099"; }
+
+.fa-rockrms:before {
+  content: "\f3e9"; }
+
+.fa-pinterest:before {
+  content: "\f0d2"; }
+
+.fa-buffer:before {
+  content: "\f837"; }
+
+.fa-npm:before {
+  content: "\f3d4"; }
+
+.fa-yammer:before {
+  content: "\f840"; }
+
+.fa-btc:before {
+  content: "\f15a"; }
+
+.fa-dribbble:before {
+  content: "\f17d"; }
+
+.fa-stumbleupon-circle:before {
+  content: "\f1a3"; }
+
+.fa-internet-explorer:before {
+  content: "\f26b"; }
+
+.fa-stubber:before {
+  content: "\e5c7"; }
+
+.fa-telegram:before {
+  content: "\f2c6"; }
+
+.fa-telegram-plane:before {
+  content: "\f2c6"; }
+
+.fa-old-republic:before {
+  content: "\f510"; }
+
+.fa-odysee:before {
+  content: "\e5c6"; }
+
+.fa-square-whatsapp:before {
+  content: "\f40c"; }
+
+.fa-whatsapp-square:before {
+  content: "\f40c"; }
+
+.fa-node-js:before {
+  content: "\f3d3"; }
+
+.fa-edge-legacy:before {
+  content: "\e078"; }
+
+.fa-slack:before {
+  content: "\f198"; }
+
+.fa-slack-hash:before {
+  content: "\f198"; }
+
+.fa-medrt:before {
+  content: "\f3c8"; }
+
+.fa-usb:before {
+  content: "\f287"; }
+
+.fa-tumblr:before {
+  content: "\f173"; }
+
+.fa-vaadin:before {
+  content: "\f408"; }
+
+.fa-quora:before {
+  content: "\f2c4"; }
+
+.fa-reacteurope:before {
+  content: "\f75d"; }
+
+.fa-medium:before {
+  content: "\f23a"; }
+
+.fa-medium-m:before {
+  content: "\f23a"; }
+
+.fa-amilia:before {
+  content: "\f36d"; }
+
+.fa-mixcloud:before {
+  content: "\f289"; }
+
+.fa-flipboard:before {
+  content: "\f44d"; }
+
+.fa-viacoin:before {
+  content: "\f237"; }
+
+.fa-critical-role:before {
+  content: "\f6c9"; }
+
+.fa-sitrox:before {
+  content: "\e44a"; }
+
+.fa-discourse:before {
+  content: "\f393"; }
+
+.fa-joomla:before {
+  content: "\f1aa"; }
+
+.fa-mastodon:before {
+  content: "\f4f6"; }
+
+.fa-airbnb:before {
+  content: "\f834"; }
+
+.fa-wolf-pack-battalion:before {
+  content: "\f514"; }
+
+.fa-buy-n-large:before {
+  content: "\f8a6"; }
+
+.fa-gulp:before {
+  content: "\f3ae"; }
+
+.fa-creative-commons-sampling-plus:before {
+  content: "\f4f1"; }
+
+.fa-strava:before {
+  content: "\f428"; }
+
+.fa-ember:before {
+  content: "\f423"; }
+
+.fa-canadian-maple-leaf:before {
+  content: "\f785"; }
+
+.fa-teamspeak:before {
+  content: "\f4f9"; }
+
+.fa-pushed:before {
+  content: "\f3e1"; }
+
+.fa-wordpress-simple:before {
+  content: "\f411"; }
+
+.fa-nutritionix:before {
+  content: "\f3d6"; }
+
+.fa-wodu:before {
+  content: "\e088"; }
+
+.fa-google-pay:before {
+  content: "\e079"; }
+
+.fa-intercom:before {
+  content: "\f7af"; }
+
+.fa-zhihu:before {
+  content: "\f63f"; }
+
+.fa-korvue:before {
+  content: "\f42f"; }
+
+.fa-pix:before {
+  content: "\e43a"; }
+
+.fa-steam-symbol:before {
+  content: "\f3f6"; }
+:root, :host {
+  --fa-style-family-classic: 'Font Awesome 6 Free';
+  --fa-font-regular: normal 400 1em/1 'Font Awesome 6 Free'; }
+
+@font-face {
+  font-family: 'Font Awesome 6 Free';
+  font-style: normal;
+  font-weight: 400;
+  font-display: block;
+  src: url("../fonts/fa/fa-regular-400.woff2") format("woff2"), url("../fonts/fa/fa-regular-400.ttf") format("truetype"); }
+
+.far,
+.fa-regular {
+  font-weight: 400; }
+:root, :host {
+  --fa-style-family-classic: 'Font Awesome 6 Free';
+  --fa-font-solid: normal 900 1em/1 'Font Awesome 6 Free'; }
+
+@font-face {
+  font-family: 'Font Awesome 6 Free';
+  font-style: normal;
+  font-weight: 900;
+  font-display: block;
+  src: url("../fonts/fa/fa-solid-900.woff2") format("woff2"), url("../fonts/fa/fa-solid-900.ttf") format("truetype"); }
+
+.fas,
+.fa-solid {
+  font-weight: 900; }
+@font-face {
+  font-family: 'Font Awesome 5 Brands';
+  font-display: block;
+  font-weight: 400;
+  src: url("../fonts/fa/fa-brands-400.woff2") format("woff2"), url("../fonts/fa/fa-brands-400.ttf") format("truetype"); }
+
+@font-face {
+  font-family: 'Font Awesome 5 Free';
+  font-display: block;
+  font-weight: 900;
+  src: url("../fonts/fa/fa-solid-900.woff2") format("woff2"), url("../fonts/fa/fa-solid-900.ttf") format("truetype"); }
+
+@font-face {
+  font-family: 'Font Awesome 5 Free';
+  font-display: block;
+  font-weight: 400;
+  src: url("../fonts/fa/fa-regular-400.woff2") format("woff2"), url("../fonts/fa/fa-regular-400.ttf") format("truetype"); }
+@font-face {
+  font-family: 'FontAwesome';
+  font-display: block;
+  src: url("../fonts/fa/fa-solid-900.woff2") format("woff2"), url("../fonts/fa/fa-solid-900.ttf") format("truetype"); }
+
+@font-face {
+  font-family: 'FontAwesome';
+  font-display: block;
+  src: url("../fonts/fa/fa-brands-400.woff2") format("woff2"), url("../fonts/fa/fa-brands-400.ttf") format("truetype"); }
+
+@font-face {
+  font-family: 'FontAwesome';
+  font-display: block;
+  src: url("../fonts/fa/fa-regular-400.woff2") format("woff2"), url("../fonts/fa/fa-regular-400.ttf") format("truetype");
+  unicode-range: U+F003,U+F006,U+F014,U+F016-F017,U+F01A-F01B,U+F01D,U+F022,U+F03E,U+F044,U+F046,U+F05C-F05D,U+F06E,U+F070,U+F087-F088,U+F08A,U+F094,U+F096-F097,U+F09D,U+F0A0,U+F0A2,U+F0A4-F0A7,U+F0C5,U+F0C7,U+F0E5-F0E6,U+F0EB,U+F0F6-F0F8,U+F10C,U+F114-F115,U+F118-F11A,U+F11C-F11D,U+F133,U+F147,U+F14E,U+F150-F152,U+F185-F186,U+F18E,U+F190-F192,U+F196,U+F1C1-F1C9,U+F1D9,U+F1DB,U+F1E3,U+F1EA,U+F1F7,U+F1F9,U+F20A,U+F247-F248,U+F24A,U+F24D,U+F255-F25B,U+F25D,U+F271-F274,U+F278,U+F27B,U+F28C,U+F28E,U+F29C,U+F2B5,U+F2B7,U+F2BA,U+F2BC,U+F2BE,U+F2C0-F2C1,U+F2C3,U+F2D0,U+F2D2,U+F2D4,U+F2DC; }
+
+@font-face {
+  font-family: 'FontAwesome';
+  font-display: block;
+  src: url("../fonts/fa/fa-v4compatibility.woff2") format("woff2"), url("../fonts/fa/fa-v4compatibility.ttf") format("truetype");
+  unicode-range: U+F041,U+F047,U+F065-F066,U+F07D-F07E,U+F080,U+F08B,U+F08E,U+F090,U+F09A,U+F0AC,U+F0AE,U+F0B2,U+F0D0,U+F0D6,U+F0E4,U+F0EC,U+F10A-F10B,U+F123,U+F13E,U+F148-F149,U+F14C,U+F156,U+F15E,U+F160-F161,U+F163,U+F175-F178,U+F195,U+F1F8,U+F219,U+F27A; }

+ 104 - 0
css/general.css

@@ -0,0 +1,104 @@
+/* 
+    Created on : Feb 13, 2023, 1:56:53 PM
+    Author     : Ale
+*/
+/***** COLORES *****/
+.bg-azul1 { background: var(--azul1) !important; }
+.bg-azul2 { background: var(--azul2) !important; }
+.bg-mainColor { background: var(--mainColor); }
+.text-azul1 { color: var(--azul1) !important; }
+.text-azul2 { color: var(--azul2) !important; }
+.text-mainColor { color: var(--mainColor) !important; }
+
+/***** GENERAL *****/
+label { margin-bottom: 0; }
+.lblTit { font-family: 'indivisa-text-bold'; color: var(--primary); margin-right: 1rem;  }
+.pointer { cursor: pointer; }
+.table { color: var(--dark); }
+
+/***** FONTS *****/
+.display-5 { font-size: 2.5rem; font-weight: 300; line-height: 1.2 }
+@media (max-width: 1200px) {
+    .display-5 { font-size:calc(1.375rem + 1.5vw); }
+}
+.display-6 { font-size: 1.5rem; font-weight: 300; line-height: 1.2 }
+@media (max-width: 1200px) {
+    .display-6 { font-size:calc(1.275rem + 0.3vw); }
+}
+.display-7 { font-size: 1.25rem; font-weight: 300; line-height: 1.2 }
+@media (max-width: 1200px) {
+    .display-7 { font-size:calc(1.175rem); }
+}
+
+/***** CONTENEDORES *****/
+body { font-family: 'indivisa-text', Arial; font-size: 14px !important; color: var(--dark); }
+.marco{ max-width: 960px; width: 100%; margin-left: auto; margin-right: auto; margin-bottom: 1.5rem; }
+.container-fluid { padding: 0; }
+
+/***** MAIN Y BARRA *****/
+.barra { background: var(--mainBG); min-height: 45px; }
+.barra > h4 { color: #FFFFFF; font-weight: bold; margin-bottom: 0 !important; }
+main { min-height: 600px; }
+
+/***** ENCABEZADOS *****/
+h1, h2, h3, h4, h5, h6 { font-family: 'indivisa-text-black'; color: var(--primary); }
+
+/***** BOTONES *****/
+.btn { border: 0; }
+.btn-verde { color: var(--success); }
+.btn-verde:hover, .btn-verde:active, .btn-verde:focus { color: var(--success); background: var(--success-25); }
+.btn-rojo { color: var(--danger); }
+.btn-rojo:hover, .btn-rojo:active, .btn-rojo:focus { color: var(--danger); background: var(--danger-25); }
+.btn-amarillo { color: var(--yellow); }
+.btn-amarillo:hover, .btn-amarillo:active, .btn-amarillo:focus { color: var(--yellow); background: var(--yellow-25); }
+.btn-gris { color: var(--gray); }
+.btn-gris:hover, .btn-gris:active, .btn-gris:focus { color: var(--gray); background: var(--gray-25); }
+.btn-azul1 { color: var(--azul1); }
+.btn-azul1:hover, .btn-azul1:active, .btn-azul1:focus { color: var(--azul1); background: var(--azul1-25); }
+.btn-azul2 { color: var(--azul2); }
+.btn-azul2:hover, .btn-azul2:active, .btn-azul2:focus { color: var(--azul2); background: var(--azul2-25); }
+
+/***** MODALS *****/
+.modalGral .modal-content { border: 0; background: var(--mainBG); padding: 1rem; }
+.modalGral .modal-header, .modalGral .modal-body, .modalGral .modal-footer { color: var(--primary); background: var(--white); border: 0; padding: 1rem; }
+.modalGral .modal-title { flex-grow: 1; text-align: center; }
+.close, .close:hover { color: var(--azul2); cursor: pointer; }
+.modalGral .btnIcon { font-size: 1.5rem; padding: 0.25em 0.5em; margin: 0; }
+
+/***** AVISOS *****/
+.msgAviso.modal-content { background: transparent; border: 0; }
+.msgAviso > .iconAviso { color: var(--white); border-radius: 25px 0 0 25px; padding: 2rem; }
+.msgAviso > .txtAviso { border-radius: 0 25px 25px 0; border: 1px solid var(--light); background: var(--white); padding: 2rem; }
+.txtAviso > .rounded-pill { text-align: center; min-width: 75px; cursor: pointer; }
+.txtAviso > .rounded-pill:hover { opacity: 0.5; }
+
+/***** TABS *****/
+.tabGral { border-bottom: 2px solid var(--azul1); }
+.tabGral > button.nav-link { background: var(--gray-25); color: var(--primary); border: 2px solid var(--white) !important; border-bottom: 0 !important; outline: none !important; -webkit-transform: skew(-20deg); -o-transform: skew(-20deg); transform: skew(-20deg); -o-transform: skew(-20deg); }
+.tabGral > button.nav-link > label { cursor: pointer; -webkit-transform: skew(20deg); -o-transform: skew(20deg); transform: skew(20deg); -o-transform: skew(20deg); }
+.tabGral > button.nav-link.active { background: var(--azul1); font-family: 'indivisa-text-bold'; }
+.tabGral > button.nav-link.active, .tabGral > button.nav-link.active > label { cursor: default; }
+.tabGral > button.nav-link:not(.active):hover { background: var(--gray-75); color: var(--white); }
+
+/***** ICONOS ACCIONES *****/
+.iconAcciones { font-size: 1.25em; margin: 0 0.25em; cursor: pointer; }
+.iconAcciones:hover { opacity: 0.5; }
+.iconBorder{ border: 15px solid; }
+.bigIcon{ font-size: 2rem; }
+.bigIcon:hover{ opacity: 0.75; }
+
+/***** MSGBOX *****/
+.msgBox { position: relative; min-height: 25vmin; padding: 5vmin; width: 80%; margin: 0 auto; }
+.msgBox > .imgBoxIzq, .msgBox > .imgBoxDer { position: absolute; width: 10vmin; }
+.msgBox > .imgBoxIzq { top: 0; left: 0; -webkit-transform: rotate(-180deg); -o-transform: rotate(-180deg); transform: rotate(-180deg); -o-transform: rotate(-180deg); }
+.msgBox > .imgBoxDer { bottom: 0; right: 0; }
+.msgBox > .hrArriba, .msgBox > .hrAbajo { position: absolute; border-top-width: 3px; width: 75%; }
+.msgBox > .hrArriba { top: 1.5vmin; right: 0; border-top-color: var(--azul1); }
+.msgBox > .hrAbajo { bottom: 1.5vmin; left: 0; border-top-color: var(--azul2); }
+
+/***** TOOLTIP *****/
+.tooltip-inner { background-color: var(--azul2); }
+.bs-tooltip-auto[x-placement^="top"] .arrow::before, .bs-tooltip-top .arrow::before { border-top-color: var(--azul2); }
+.bs-tooltip-auto[x-placement^="bottom"] .arrow::before, .bs-tooltip-bottom .arrow::before { border-bottom-color: var(--azul2); }
+.bs-tooltip-auto[x-placement^="left"] .arrow::before, .bs-tooltip-left .arrow::before { border-left-color: var(--azul2); }
+.bs-tooltip-auto[x-placement^="right"] .arrow::before, .bs-tooltip-right .arrow::before { border-right-color: var(--azul2); }

+ 40 - 0
css/index.css

@@ -0,0 +1,40 @@
+/*
+To change this license header, choose License Headers in Project Properties.
+To change this template file, choose Tools | Templates
+and open the template in the editor.
+*/
+/* 
+    Created on : 26/03/2020, 06:44:41 PM
+    Author     : Ale
+*/
+.fac{
+    font-family: 'indivisa-text';
+    color: #969696;
+    font-size: 1.25rem;
+}
+.content{
+    height: 700px;
+    background: url('../img/Ing4-BN.png') no-repeat;
+    object-fit: fit;
+}
+.logSize{
+    width: 50% !important;  
+    max-width: 600px;
+}
+.icon{
+    font-size:2rem;
+    color: #001D68;
+}
+@media (max-width: 768px){
+    .content{
+        height: 400px;
+    }
+    .logSize{
+        width: 90% !important;
+    }
+}
+@media (max-height: 768px){
+    .content{
+        height: 500px;
+    }
+}

+ 67 - 0
css/indivisa.css

@@ -0,0 +1,67 @@
+@font-face {
+    font-family: 'indivisa-text';
+    src: url('../fonts/indivisaFont/eot/IndivisaTextSans-Regular.eot');
+    src:
+         url('../fonts/indivisaFont/woff/IndivisaTextSans-Regular.woff'),
+         url('../fonts/indivisaFont/ttf/IndivisaTextSans-Regular.ttf'),
+         url('../fonts/indivisaFont/eot/IndivisaTextSans-Regular.svg#IndivisaTextSans-Regular');
+    font-weight: normal;
+    font-style: normal;
+}
+@font-face {
+    font-family: 'indivisa-text-italic';
+    src: url('../fonts/indivisaFont/eot/IndivisaTextSans-RegularItalic.eot');
+    src:
+         url('../fonts/indivisaFont/woff/IndivisaTextSans-RegularItalic.woff'),
+         url('../fonts/indivisaFont/ttf/IndivisaTextSans-RegularItalic.ttf'),
+         url('../fonts/indivisaFont/eot/IndivisaTextSans-RegularItalic.svg#IndivisaTextSans-RegularItalic');
+    font-weight: normal;
+    font-style: normal;
+}
+@font-face {
+    font-family: 'indivisa-text-bold';
+    src: url('../fonts/indivisaFont/eot/IndivisaTextSans-Bold.eot');
+    src:
+         url('../fonts/indivisaFont/woff/IndivisaTextSans-Bold.woff'),
+         url('../fonts/indivisaFont/ttf/IndivisaTextSans-Bold.ttf'),
+         url('../fonts/indivisaFont/eot/IndivisaTextSans-Bold.svg#IndivisaTextSans-Bold');
+    font-weight: normal;
+    font-style: normal;
+}
+@font-face {
+    font-family: 'indivisa-text-bold-italic';
+    src: url('../fonts/indivisaFont/eot/IndivisaTextSans-BoldItalic.eot');
+    src:
+         url('../fonts/indivisaFont/woff/IndivisaTextSans-BoldItalic.woff'),
+         url('../fonts/indivisaFont/ttf/IndivisaTextSans-BoldItalic.ttf'),
+         url('../fonts/indivisaFont/eot/IndivisaTextSans-BoldItalic.svg#IndivisaTextSans-BoldItalic');
+    font-weight: normal;
+    font-style: normal;
+}
+@font-face {
+    font-family: 'indivisa-text-black';
+    src: url('../fonts/indivisaFont/eot/IndivisaTextSans-Black.eot');
+    src:
+         url('../fonts/indivisaFont/woff/IndivisaTextSans-Black.woff'),
+         url('../fonts/indivisaFont/ttf/IndivisaTextSans-Black.ttf'),
+         url('../fonts/indivisaFont/eot/IndivisaTextSans-Black.svg#IndivisaTextSans-Black');
+    font-weight: normal;
+    font-style: normal;
+}
+@font-face {
+    font-family: 'indivisa-text-black-italic';
+    src: url('../fonts/indivisaFont/eot/IndivisaTextSans-BlackItalic.eot');
+    src:
+         url('../fonts/indivisaFont/woff/IndivisaTextSans-BlackItalic.woff'),
+         url('../fonts/indivisaFont/ttf/IndivisaTextSans-BlackItalic.ttf'),
+         url('../fonts/indivisaFont/eot/IndivisaTextSans-BlackItalic.svg#IndivisaTextSans-BlackItalic');
+    font-weight: normal;
+    font-style: normal;
+}
+
+.indivisa-text{font-family: 'indivisa-text' !important;}
+.indivisa-text-italic{font-family: 'indivisa-text-italic' !important;}
+.indivisa-text-bold{font-family: 'indivisa-text-bold' !important;}
+.indivisa-text-bold-italic{font-family: 'indivisa-text-bold-italic' !important;}
+.indivisa-text-black{font-family: 'indivisa-text-black' !important;}
+.indivisa-text-black-italic{font-family: 'indivisa-text-black-italic' !important;}

+ 258 - 0
css/ingfont.css

@@ -0,0 +1,258 @@
+@font-face {
+  font-family: 'ingfont';
+  src:  url('../fonts/facIng/ingfont.eot?mtaar2');
+  src:  url('../fonts/facIng/ingfont.eot?mtaar2#iefix') format('embedded-opentype'),
+    url('../fonts/facIng/ingfont.ttf?mtaar2') format('truetype'),
+    url('../fonts/facIng/ingfont.woff?mtaar2') format('woff'),
+    url('../fonts/facIng/ingfont.svg?mtaar2#ingfont') format('svg');
+  font-weight: normal;
+  font-style: normal;
+  font-display: block;
+}
+
+[class^="ing-"], [class*=" ing-"] {
+  /* use !important to prevent issues with browser extensions that change fonts */
+  font-family: 'ingfont' !important;
+  speak: never;
+  font-style: normal;
+  font-weight: normal;
+  font-variant: normal;
+  text-transform: none;
+  line-height: 1;
+
+  /* Better Font Rendering =========== */
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.ing-fb1:before {
+  content: "\e932";
+}
+.ing-fb2:before {
+  content: "\e933";
+}
+.ing-tw1:before {
+  content: "\e912";
+}
+.ing-tw2:before {
+  content: "\e900";
+}
+.ing-in1:before {
+  content: "\e91a";
+}
+.ing-in2:before {
+  content: "\e902";
+}
+.ing-insta1:before {
+  content: "\e924";
+}
+.ing-insta2:before {
+  content: "\e923";
+}
+.ing-youtube:before {
+  content: "\e90e";
+}
+.ing-telefono:before {
+  content: "\e911";
+}
+.ing-mail:before {
+  content: "\e907";
+}
+.ing-link:before {
+  content: "\e919";
+}
+.ing-ubicacion:before {
+  content: "\e908";
+}
+.ing-puntos:before {
+  content: "\e917";
+}
+.ing-usuario:before {
+  content: "\e90d";
+}
+.ing-pass:before {
+  content: "\e906";
+}
+.ing-menu:before {
+  content: "\e901";
+}
+.ing-salir:before {
+  content: "\e90f";
+}
+.ing-flecha:before {
+  content: "\e905";
+}
+.ing-cambiar:before {
+  content: "\e93c";
+}
+.ing-caret:before {
+  content: "\e90b";
+}
+.ing-aceptar:before {
+  content: "\e916";
+}
+.ing-cancelar:before {
+  content: "\e910";
+}
+.ing-mas:before {
+  content: "\e91d";
+}
+.ing-menos:before {
+  content: "\e91e";
+}
+.ing-editar:before {
+  content: "\e938";
+}
+.ing-buscar:before {
+  content: "\e939";
+}
+.ing-ojo:before {
+  content: "\e92a";
+}
+.ing-borrar:before {
+  content: "\e942";
+}
+.ing-basura:before {
+  content: "\e941";
+}
+.ing-camara:before {
+  content: "\e909";
+}
+.ing-importante:before {
+  content: "\e935";
+}
+.ing-bullet:before {
+  content: "\e943";
+}
+.ing-home:before {
+  content: "\e934";
+}
+.ing-formacion:before {
+  content: "\e914";
+}
+.ing-empleo:before {
+  content: "\e915";
+}
+.ing-insignia1:before {
+  content: "\e920";
+}
+.ing-insignia2:before {
+  content: "\e91f";
+}
+.ing-insignia3:before {
+  content: "\e921";
+}
+.ing-insignia4:before {
+  content: "\e922";
+}
+.ing-eventos:before {
+  content: "\e90a";
+}
+.ing-reporte:before {
+  content: "\e918";
+}
+.ing-catalogo:before {
+  content: "\e936";
+}
+.ing-evalua-cartel:before {
+  content: "\e913";
+}
+.ing-revision-cartel:before {
+  content: "\e90c";
+}
+.ing-reporte-resultados:before {
+  content: "\e929";
+}
+.ing-mi-cartel:before {
+  content: "\e91b";
+}
+.ing-galeria:before {
+  content: "\e925";
+}
+.ing-iniciar-sesion:before {
+  content: "\e926";
+}
+.ing-finalistas:before {
+  content: "\e927";
+}
+.ing-comite:before {
+  content: "\e92b";
+}
+.ing-administrador:before {
+  content: "\e92c";
+}
+.ing-estrella1:before {
+  content: "\e903";
+}
+.ing-estrella2:before {
+  content: "\e904";
+}
+.ing-carga-archivo:before {
+  content: "\e93d";
+}
+.ing-carga-multiple:before {
+  content: "\e93e";
+}
+.ing-descarga:before {
+  content: "\e928";
+}
+.ing-autorizar:before {
+  content: "\e92d";
+}
+.ing-negar:before {
+  content: "\e92e";
+}
+.ing-no-cargado:before {
+  content: "\e92f";
+}
+.ing-alumnos:before {
+  content: "\e91c";
+}
+.ing-cardex:before {
+  content: "\e93f";
+}
+.ing-configuracion:before {
+  content: "\e940";
+}
+.ing-listado-menus:before {
+  content: "\e944";
+}
+.ing-mi-cuenta:before {
+  content: "\e945";
+}
+.ing-ver:before {
+  content: "\e946";
+}
+.ing-grafica:before {
+  content: "\e930";
+}
+.ing-clic:before {
+  content: "\e931";
+}
+.ing-guardar:before {
+  content: "\e937";
+}
+.ing-regresar:before {
+  content: "\e93a";
+}
+.ing-cuadrado:before {
+  content: "\e93b";
+}
+.ing-imprimir:before {
+  content: "\e947";
+}
+.ing-importante2:before {
+  content: "\e948";
+}
+.ing-copiar:before {
+  content: "\e949";
+}
+.ing-reloj:before {
+  content: "\e94a";
+}
+.ing-retardo:before {
+  content: "\e94b";
+}
+.ing-justificar:before {
+  content: "\e94c";
+}

+ 938 - 0
css/jquery-ui.css

@@ -0,0 +1,938 @@
+/*! jQuery UI - v1.12.1 - 2020-04-06
+* http://jqueryui.com
+* Includes: draggable.css, core.css, resizable.css, selectable.css, sortable.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, theme.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=custom-theme&bgImgOpacityError=&bgImgOpacityHighlight=&bgImgOpacityActive=&bgImgOpacityHover=&bgImgOpacityDefault=&bgImgOpacityContent=&bgImgOpacityHeader=&cornerRadiusShadow=8px&offsetLeftShadow=0px&offsetTopShadow=0px&thicknessShadow=5px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=%23666666&opacityOverlay=50&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=%23969696&iconColorError=%23FFFFFF&fcError=%23FFFFFF&borderColorError=%23D21034&bgTextureError=flat&bgColorError=%23D21034&iconColorHighlight=%23B7B7B7&fcHighlight=%23B7B7B7&borderColorHighlight=%23DBDCDD&bgTextureHighlight=flat&bgColorHighlight=%23DBDCDD&iconColorActive=%23FFFFFF&fcActive=%23FFFFFF&borderColorActive=%23001D68&bgTextureActive=flat&bgColorActive=%23001D68&iconColorHover=%23FFFFFF&fcHover=%23FFFFFF&borderColorHover=%23D21034&bgTextureHover=flat&bgColorHover=%23D21034&iconColorDefault=%23969696&fcDefault=%23969696&borderColorDefault=%23969696&bgTextureDefault=flat&bgColorDefault=%23FFFFFF&iconColorContent=%23222222&fcContent=%23222222&borderColorContent=%23969696&bgTextureContent=flat&bgColorContent=%23FFFFFF&iconColorHeader=%23FFFFFF&fcHeader=%23FFFFFF&borderColorHeader=%23001D68&bgTextureHeader=flat&bgColorHeader=%23001D68&cornerRadius=5px&fwDefault=normal&fsDefault=1em&ffDefault='indivisa-text'
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+.ui-draggable-handle {
+	-ms-touch-action: none;
+	touch-action: none;
+}
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden {
+    display: none;
+}
+.ui-helper-hidden-accessible {
+    border: 0;
+    clip: rect(0 0 0 0);
+    height: 1px;
+    margin: -1px;
+    overflow: hidden;
+    padding: 0;
+    position: absolute;
+    width: 1px;
+}
+.ui-helper-reset {
+    margin: 0;
+    padding: 0;
+    border: 0;
+    outline: 0;
+    line-height: 1.3;
+    text-decoration: none;
+    font-size: 100%;
+    list-style: none;
+}
+.ui-helper-clearfix:before,
+.ui-helper-clearfix:after {
+    content: "";
+    display: table;
+    border-collapse: collapse;
+}
+.ui-helper-clearfix:after {
+    clear: both;
+}
+.ui-helper-zfix {
+    width: 100%;
+    height: 100%;
+    top: 0;
+    left: 0;
+    position: absolute;
+    opacity: 0;
+    filter:Alpha(Opacity=0); /* support: IE8 */
+}
+
+.ui-front {
+    z-index: 100;
+}
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled {
+    cursor: default !important;
+    pointer-events: none;
+}
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay {
+    position: fixed;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+}
+.ui-resizable {
+    position: relative;
+}
+.ui-resizable-handle {
+    position: absolute;
+    font-size: 0.1px;
+    display: block;
+    -ms-touch-action: none;
+    touch-action: none;
+}
+.ui-resizable-disabled .ui-resizable-handle,
+.ui-resizable-autohide .ui-resizable-handle {
+    display: none;
+}
+.ui-resizable-n {
+    cursor: n-resize;
+    height: 7px;
+    width: 100%;
+    top: -5px;
+    left: 0;
+}
+.ui-resizable-s {
+    cursor: s-resize;
+    height: 7px;
+    width: 100%;
+    bottom: -5px;
+    left: 0;
+}
+.ui-resizable-e {
+    cursor: e-resize;
+    width: 7px;
+    right: -5px;
+    top: 0;
+    height: 100%;
+}
+.ui-resizable-w {
+    cursor: w-resize;
+    width: 7px;
+    left: -5px;
+    top: 0;
+    height: 100%;
+}
+.ui-resizable-se {
+    cursor: se-resize;
+    width: 12px;
+    height: 12px;
+    right: 1px;
+    bottom: 1px;
+}
+.ui-resizable-sw {
+    cursor: sw-resize;
+    width: 9px;
+    height: 9px;
+    left: -5px;
+    bottom: -5px;
+}
+.ui-resizable-nw {
+    cursor: nw-resize;
+    width: 9px;
+    height: 9px;
+    left: -5px;
+    top: -5px;
+}
+.ui-resizable-ne {
+    cursor: ne-resize;
+    width: 9px;
+    height: 9px;
+    right: -5px;
+    top: -5px;
+}
+.ui-selectable {
+    -ms-touch-action: none;
+    touch-action: none;
+}
+.ui-selectable-helper {
+    position: absolute;
+    z-index: 100;
+    border: 1px dotted black;
+}
+.ui-sortable-handle {
+    -ms-touch-action: none;
+    touch-action: none;
+}
+.ui-button {
+    padding: .4em 1em;
+    display: inline-block;
+    position: relative;
+    line-height: normal;
+    margin-right: .1em;
+    cursor: pointer;
+    vertical-align: middle;
+    text-align: center;
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+    color: #969696 !important;
+    /* Support: IE <= 11 */
+    overflow: visible;
+}
+
+.ui-button,
+.ui-button:link,
+.ui-button:visited,
+.ui-button:hover,
+.ui-button:active {
+    text-decoration: none;
+}
+
+/* to make room for the icon, a width needs to be set here 
+.ui-button-icon-only {
+	width: 2em;
+	box-sizing: border-box;
+	text-indent: -9999px;
+	white-space: nowrap;
+}*/
+
+/* no icon support for input elements 
+input.ui-button.ui-button-icon-only {
+	text-indent: 0;
+}*/
+
+/* button icon element(s) 
+.ui-button-icon-only .ui-icon {
+	position: absolute;
+	top: 50%;
+	left: 50%;
+	margin-top: -8px;
+	margin-left: -8px;
+}
+
+.ui-button.ui-icon-notext .ui-icon {
+	padding: 0;
+	width: 2.1em;
+	height: 2.1em;
+	text-indent: -9999px;
+	white-space: nowrap;
+
+}
+
+input.ui-button.ui-icon-notext .ui-icon {
+	width: auto;
+	height: auto;
+	text-indent: 0;
+	white-space: normal;
+	padding: .4em 1em;
+}*/
+
+/* workarounds */
+/* Support: Firefox 5 - 40 */
+input.ui-button::-moz-focus-inner,
+button.ui-button::-moz-focus-inner {
+    border: 0;
+    padding: 0;
+}
+/*.ui-controlgroup {
+	vertical-align: middle;
+	display: inline-block;
+}
+.ui-controlgroup > .ui-controlgroup-item {
+	float: left;
+	margin-left: 0;
+	margin-right: 0;
+}
+.ui-controlgroup > .ui-controlgroup-item:focus,
+.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
+	z-index: 9999;
+}
+.ui-controlgroup-vertical > .ui-controlgroup-item {
+	display: block;
+	float: none;
+	width: 100%;
+	margin-top: 0;
+	margin-bottom: 0;
+	text-align: left;
+}
+.ui-controlgroup-vertical .ui-controlgroup-item {
+	box-sizing: border-box;
+}
+.ui-controlgroup .ui-controlgroup-label {
+	padding: .4em 1em;
+}
+.ui-controlgroup .ui-controlgroup-label span {
+	font-size: 80%;
+}
+.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
+	border-left: none;
+}
+.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
+	border-top: none;
+}
+.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
+	border-right: none;
+}
+.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
+	border-bottom: none;
+}*/
+
+/* Spinner specific style fixes 
+.ui-controlgroup-vertical .ui-spinner-input {
+
+	/* Support: IE8 only, Android < 4.4 only *
+	width: 75%;
+	width: calc( 100% - 2.4em );
+}
+.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
+	border-top-style: solid;
+}
+
+.ui-checkboxradio-label .ui-icon-background {
+	box-shadow: inset 1px 1px 1px #ccc;
+	border-radius: .12em;
+	border: none;
+}
+.ui-checkboxradio-radio-label .ui-icon-background {
+	width: 16px;
+	height: 16px;
+	border-radius: 1em;
+	overflow: visible;
+	border: none;
+}
+.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
+.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
+	background-image: none;
+	width: 8px;
+	height: 8px;
+	border-width: 4px;
+	border-style: solid;
+}
+.ui-checkboxradio-disabled {
+	pointer-events: none;
+}*/
+.ui-datepicker {
+    width: 17em;
+    padding: .2em .2em 0;
+    display: none;
+}
+.ui-datepicker .ui-datepicker-header {
+    position: relative;
+    padding: .2em 0;
+}
+.ui-datepicker .ui-datepicker-prev,
+.ui-datepicker .ui-datepicker-next {
+    position: absolute;
+    top: 2px;
+    width: 1.8em;
+    height: 1.8em;
+}
+.ui-datepicker .ui-datepicker-prev-hover,
+.ui-datepicker .ui-datepicker-next-hover {
+    top: 1px;
+}
+.ui-datepicker .ui-datepicker-prev {
+    left: 2px;
+}
+.ui-datepicker .ui-datepicker-next {
+    right: 2px;
+}
+.ui-datepicker .ui-datepicker-prev-hover {
+    left: 1px;
+}
+.ui-datepicker .ui-datepicker-next-hover {
+    right: 1px;
+}
+.ui-datepicker .ui-datepicker-prev span,
+.ui-datepicker .ui-datepicker-next span {
+    display: block;
+    position: absolute;
+    left: 50%;
+    margin-left: -8px;
+    top: 50%;
+    margin-top: -8px;
+}
+.ui-datepicker .ui-datepicker-title {
+    margin: 0 2.3em;
+    line-height: 1.8em;
+    text-align: center;
+}
+.ui-datepicker .ui-datepicker-title select {
+    font-size: 1em;
+    margin: 1px 0;
+}
+.ui-datepicker select.ui-datepicker-month,
+.ui-datepicker select.ui-datepicker-year {
+    width: 45%;
+}
+.ui-datepicker table {
+    width: 100%;
+    font-size: .9em;
+    border-collapse: collapse;
+    margin: 0 0 .4em;
+}
+.ui-datepicker th {
+    padding: .7em .3em;
+    text-align: center;
+    font-weight: bold;
+    border: 0;
+}
+.ui-datepicker td {
+    border: 0;
+    padding: 1px;
+}
+.ui-datepicker td span,
+.ui-datepicker td a {
+    display: block;
+    padding: .2em;
+    text-align: right;
+    text-decoration: none;
+}
+.ui-datepicker .ui-datepicker-buttonpane {
+    /*background-image: none;*/
+    margin: .7em 0 0 0;
+    padding: 0 .2em;
+    border-left: 0;
+    border-right: 0;
+    border-bottom: 0;
+}
+.ui-datepicker .ui-datepicker-buttonpane button {
+    float: right;
+    margin: .5em .2em .4em;
+    cursor: pointer;
+    padding: .2em .6em .3em .6em;
+    width: auto;
+    overflow: visible;
+}
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
+    float: left;
+}
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi {
+    width: auto;
+}
+.ui-datepicker-multi .ui-datepicker-group {
+    float: left;
+}
+.ui-datepicker-multi .ui-datepicker-group table {
+    width: 95%;
+    margin: 0 auto .4em;
+}
+.ui-datepicker-multi-2 .ui-datepicker-group {
+    width: 50%;
+}
+.ui-datepicker-multi-3 .ui-datepicker-group {
+    width: 33.3%;
+}
+.ui-datepicker-multi-4 .ui-datepicker-group {
+    width: 25%;
+}
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
+    border-left-width: 0;
+}
+.ui-datepicker-multi .ui-datepicker-buttonpane {
+    clear: left;
+}
+.ui-datepicker-row-break {
+    clear: both;
+    width: 100%;
+    font-size: 0;
+}
+
+/* RTL support */
+.ui-datepicker-rtl {
+    direction: rtl;
+}
+.ui-datepicker-rtl .ui-datepicker-prev {
+    right: 2px;
+    left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next {
+    left: 2px;
+    right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-prev:hover {
+    right: 1px;
+    left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next:hover {
+    left: 1px;
+    right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane {
+    clear: right;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button {
+    float: left;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
+.ui-datepicker-rtl .ui-datepicker-group {
+    float: right;
+}
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
+    border-right-width: 0;
+    border-left-width: 1px;
+}
+
+/* Component containers
+----------------------------------*/
+.ui-widget {
+    font-family: 'indivisa-text';
+    font-size: 1em;
+}
+.ui-widget .ui-widget {
+    font-size: 1em;
+}
+.ui-widget input,
+.ui-widget select,
+.ui-widget textarea,
+.ui-widget button {
+    font-family: 'indivisa-text';
+    font-size: 1em;
+}
+.ui-widget.ui-widget-content {
+    border: 1px solid #969696;
+}
+.ui-widget-content {
+    border: 1px solid #969696;
+    background: #FFFFFF;
+    color: #222222;
+}
+.ui-widget-content a {
+    color: #222222;
+}
+.ui-widget-header {
+    border: 1px solid #001D68;
+    background: #001D68;
+    color: #FFFFFF;
+    font-weight: bold;
+}
+.ui-widget-header a {
+    color: #FFFFFF;
+}
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default,
+.ui-widget-content .ui-state-default,
+.ui-widget-header .ui-state-default,
+.ui-button,
+
+/* We use html here because we need a greater specificity to make sure disabled
+works properly when clicked or hovered */
+html .ui-button.ui-state-disabled:hover,
+html .ui-button.ui-state-disabled:active {
+    border: 1px solid #969696;
+    background: transparent;
+    font-weight: normal;
+    color: #969696;
+}
+.ui-state-default a,
+.ui-state-default a:link,
+.ui-state-default a:visited,
+a.ui-button,
+a:link.ui-button,
+a:visited.ui-button,
+.ui-button {
+    color: #969696;
+    text-decoration: none;
+}
+.ui-state-hover,
+.ui-widget-content .ui-state-hover,
+.ui-widget-header .ui-state-hover,
+.ui-state-focus,
+.ui-widget-content .ui-state-focus,
+.ui-widget-header .ui-state-focus,
+.ui-button:hover,
+.ui-button:focus {
+    border: 1px solid #001D68 !important;
+    background: #001D68 !important;
+    font-weight: normal;
+    color: #FFFFFF !important;
+}
+.ui-state-hover a,
+.ui-state-hover a:hover,
+.ui-state-hover a:link,
+.ui-state-hover a:visited,
+.ui-state-focus a,
+.ui-state-focus a:hover,
+.ui-state-focus a:link,
+.ui-state-focus a:visited,
+a.ui-button:hover,
+a.ui-button:focus {
+    color: #FFFFFF;
+    text-decoration: none;
+}
+
+.ui-visual-focus {
+    box-shadow: 0 0 3px 1px rgb(94, 158, 214);
+}
+.ui-state-active,
+.ui-widget-content .ui-state-active,
+.ui-widget-header .ui-state-active,
+a.ui-button:active,
+.ui-button:active,
+.ui-button.ui-state-active:hover {
+    border: 1px solid #D21034;
+    background: #D21034;
+    font-weight: normal;
+    color: #FFFFFF !important;
+}
+.ui-icon-background,
+.ui-state-active .ui-icon-background {
+    border: #D21034;
+    background-color: #FFFFFF;
+}
+.ui-state-active a,
+.ui-state-active a:link,
+.ui-state-active a:visited {
+    color: #FFFFFF;
+    text-decoration: none;
+}
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight,
+.ui-widget-content .ui-state-highlight,
+.ui-widget-header .ui-state-highlight {
+    border: 1px solid #DBDCDD;
+    background: #DBDCDD;
+    color: #B7B7B7;
+}
+.ui-state-checked {
+    border: 1px solid #DBDCDD;
+    background: #DBDCDD;
+}
+.ui-state-highlight a,
+.ui-widget-content .ui-state-highlight a,
+.ui-widget-header .ui-state-highlight a {
+    color: #B7B7B7;
+}
+.ui-state-error,
+.ui-widget-content .ui-state-error,
+.ui-widget-header .ui-state-error {
+    border: 1px solid #D21034;
+    background: #D21034;
+    color: #FFFFFF;
+}
+.ui-state-error a,
+.ui-widget-content .ui-state-error a,
+.ui-widget-header .ui-state-error a {
+    color: #FFFFFF;
+}
+.ui-state-error-text,
+.ui-widget-content .ui-state-error-text,
+.ui-widget-header .ui-state-error-text {
+    color: #FFFFFF;
+}
+.ui-priority-primary,
+.ui-widget-content .ui-priority-primary,
+.ui-widget-header .ui-priority-primary {
+    font-weight: bold;
+}
+.ui-priority-secondary,
+.ui-widget-content .ui-priority-secondary,
+.ui-widget-header .ui-priority-secondary {
+    opacity: .7;
+    filter:Alpha(Opacity=70); /* support: IE8 */
+    font-weight: normal;
+}
+.ui-state-disabled,
+.ui-widget-content .ui-state-disabled,
+.ui-widget-header .ui-state-disabled {
+    opacity: .35;
+    filter:Alpha(Opacity=35); /* support: IE8 */
+    /*background-image: none;*/
+}
+.ui-state-disabled .ui-icon {
+    filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
+}
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-left,
+.ui-corner-tl {
+    border-top-left-radius: 5px;
+}
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-right,
+.ui-corner-tr {
+    border-top-right-radius: 5px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-left,
+.ui-corner-bl {
+    border-bottom-left-radius: 5px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-right,
+.ui-corner-br {
+    border-bottom-right-radius: 5px;
+}
+
+/* Overlays */
+.ui-widget-overlay {
+    background: #969696;
+    opacity: .5;
+    filter: Alpha(Opacity=50); /* support: IE8 */
+}
+.ui-widget-shadow {
+    -webkit-box-shadow: 0 0 5px 1px rgba(150,150,150,.2);
+    box-shadow: 0 0 5px 1px rgba(150,150,150,.2);
+}
+
+/* Icons *
+----------------------------------*/
+.ui-icon{
+    font-family: 'ingfont'; 
+}
+.ui-datepicker .ui-icon {
+    display: block;
+    overflow: hidden;
+    left: .5em;
+    top: .3em;
+}
+.ui-icon-circle-triangle-w:before,
+.ui-icon-circle-triangle-e:before {
+    content: "\e90b";
+}
+/*.ui-icon {
+	display: inline-block;
+	vertical-align: middle;
+	margin-top: -.25em;
+	position: relative;
+	text-indent: -99999px;
+	overflow: hidden;
+	background-repeat: no-repeat;
+       
+}
+
+.ui-widget-icon-block {
+	left: 50%;
+	margin-left: -8px;
+	display: block;
+}
+
+.ui-datepicker .ui-icon {
+    display: block;
+    text-indent: -99999px;
+    overflow: hidden;
+    background-repeat: no-repeat;
+    left: .5em;
+    top: .3em;
+}
+.ui-icon {
+	width: 16px;
+	height: 16px;
+}
+.ui-icon,
+.ui-widget-content .ui-icon {
+	background-image: url("images/ui-icons_222222_256x240.png");
+}
+.ui-widget-header .ui-icon {
+	background-image: url("images/ui-icons_FFFFFF_256x240.png");
+}
+.ui-state-hover .ui-icon,
+.ui-state-focus .ui-icon,
+.ui-button:hover .ui-icon,
+.ui-button:focus .ui-icon {
+	background-image: url("images/ui-icons_FFFFFF_256x240.png");
+}
+.ui-state-active .ui-icon,
+.ui-button:active .ui-icon {
+	background-image: url("images/ui-icons_FFFFFF_256x240.png");
+}
+.ui-state-highlight .ui-icon,
+.ui-button .ui-state-highlight.ui-icon {
+	background-image: url("images/ui-icons_B7B7B7_256x240.png");
+}
+.ui-state-error .ui-icon,
+.ui-state-error-text .ui-icon {
+	background-image: url("images/ui-icons_FFFFFF_256x240.png");
+}
+.ui-button .ui-icon {
+	background-image: url("images/ui-icons_969696_256x240.png");
+}
+
+/ positioning /
+.ui-icon-blank { background-position: 16px 16px; }
+.ui-icon-caret-1-n { background-position: 0 0; }
+.ui-icon-caret-1-ne { background-position: -16px 0; }
+.ui-icon-caret-1-e { background-position: -32px 0; }
+.ui-icon-caret-1-se { background-position: -48px 0; }
+.ui-icon-caret-1-s { background-position: -65px 0; }
+.ui-icon-caret-1-sw { background-position: -80px 0; }
+.ui-icon-caret-1-w { background-position: -96px 0; }
+.ui-icon-caret-1-nw { background-position: -112px 0; }
+.ui-icon-caret-2-n-s { background-position: -128px 0; }
+.ui-icon-caret-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -65px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -65px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-on { background-position: -96px -144px; }
+.ui-icon-radio-off { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }*/

+ 167 - 0
css/month-picker.css

@@ -0,0 +1,167 @@
+/*
+The jQuery UI Month Picker Version 3.0.4
+https://github.com/KidSysco/jquery-ui-month-picker/
+
+Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see
+<http://www.gnu.org/licenses/gpl-3.0.txt>.
+*/
+
+.month-picker {
+    display: inline-block;
+    position: absolute;
+    z-index: 9999;
+}
+
+.month-picker table {
+  border-collapse: separate;
+  border-spacing: 2px 2px;
+  font-size: 12px;
+}
+
+.month-picker td {
+    padding: 0px;
+}
+
+/*
+Prevents the button labels from maving sligtly to the left
+when applying the width CSS property to the buttons.
+See: .month-picker-month-table button { width: 4.3em; }
+*/
+.month-picker .ui-button-text {
+  padding: .4em 0;
+}
+
+.month-picker-header {
+    margin: 3px 3px 0px 3px;
+}
+
+.month-picker-year-table {
+    width: 100%;
+    /*
+    Makes sure the next/previous/jump years buttons are not unnecessarily
+    selected if the user clicks them a couple of times fast.
+    */
+    -ms-user-select: none; /* IE 10+ */
+    -moz-user-select: -moz-none;
+    -khtml-user-select: none;
+    -webkit-user-select: none;
+    user-select: none;
+}
+
+/*
+The plugin uses buttons with a transparent background in the year-table
+(aka header) in order to look consistent with jQuery UI datepicker and to
+make the year title a button that blends into the heading in the default state.
+
+The plugin does this by removing the .ui-state-default class from (in MonthPicker.js)
+the a tags (buttons) which also ends up removing the 1px border that it applies.
+
+To prevent the button from resizing and moving everything around when you hover
+in and out, we use a carefully constructed selector, which gets overroden by the
+more specific .ui-state-hover/actove class selectors in the jquery-ui.css
+that apply the visible borders that we want.
+
+This selector applies a 1px transparent border that keeps the button
+in the same size, but it doesen't hide the borders that .ui-state-hover/actove give us.
+*/
+.month-picker-year-table a {
+    border: 1px solid transparent;
+}
+
+/*
+Sets the size of the next/previous buttons,
+and makes the buttons in the heading (year-table) sligtly bigger,
+and removes the pointer cursor from the buttons in the heading (year-table).
+*/
+.month-picker-year-table .ui-button {
+    /*font-size: 1.1em;
+    width: 1.5em;
+    height: 1.5em;*/
+    cursor: default;
+    margin: 0;
+}
+
+.month-picker-year-table .month-picker-title {
+    text-align: center;
+}
+
+.month-picker-year-table .month-picker-title .ui-button {
+    font-size: 1em;
+    padding: 0;
+    width: 100%;
+    font-weight: bold;
+}
+
+/*
+The buttons in the heading (year-table) are slightly shrinked, but because jQuery ui and
+the .month-picker .ui-button-text rule at the top of this CSS file apply some
+padding which results in the button text being moved to the bottom of
+the button.
+
+This rule removes the unnecessary padding so the text in
+the jump years button will be vericaly centred.
+*/
+.month-picker-year-table .ui-button-text {
+    padding: 0;
+}
+
+.month-picker-month-table td {
+    height: 35px;
+    text-align: center;
+}
+
+/*
+Makes sure the buttons stay in the same size when swithching
+to the Jump years menu.
+this also ensures that the entire menu dosen't resize itself
+in response to the slightly bigger buttons in the Jump years menu.
+ */
+.month-picker-month-table .ui-button {
+    width: 4.2em;
+    margin: .2em;
+}
+
+.month-picker-open-button {
+    height: 20px;
+    width: 20px;
+    vertical-align: bottom;
+}
+
+.month-picker-invalid-message {
+    display: none;
+    background-color: Yellow;
+}
+
+.month-picker-disabled {
+    background-color: #e1e1e1;
+}
+
+.month-picker-title > .ui-button{
+    color: #FFFFFF !important;
+}
+
+.month-picker-title > .ui-button:hover{
+    cursor: pointer;
+    line-height: 1;
+}
+
+/********* COLORES PERSONALIZADOS **********/
+.ui-icon-circle-triangle-w { display: inline-block; -webkit-transform: rotate(90deg); -moz-transform: rotate(90deg); -o-transform: rotate(90deg); transform: rotate(90deg); }
+.ui-icon-circle-triangle-e { display: inline-block; -webkit-transform: rotate(-90deg); -moz-transform: rotate(-90deg); -o-transform: rotate(-90deg); transform: rotate(-90deg); }
+.month-picker-title > a:hover { color: var(--azul1) !important; }
+.month-picker-previous a:hover, .month-picker-next a:hover { color: var(--azul2) !important; }
+.month-picker-previous a:not(.ui-button-disabled), .month-picker-next a:not(.ui-button-disabled){ cursor: pointer; }
+.month-picker-month-table a:hover { border: 1px solid var(--azul1) !important; background: var(--azul1) !important;}
+.month-picker-month-table .ui-state-highlight { background: var(--danger); color: var(--white) !important; }

+ 209 - 0
css/richtext.css

@@ -0,0 +1,209 @@
+.richText {
+	position: relative;
+	border: 1px solid #D6D8D8;
+	background: #D6D8D8;
+	width: 100%;
+	border-radius: 0.25rem;
+}
+
+.richText .richText-toolbar ul {
+	padding: 0 !important;
+	margin: 0 !important;
+	display: flex;
+	flex-wrap: wrap;
+        justify-content: left;/*center*/
+}
+
+.richText .richText-toolbar ul li {
+	list-style: none;
+}
+
+.richText .richText-toolbar ul li a {
+	display: block;
+	padding: 0.25rem 0.5rem;
+        color: #001D68;
+	cursor: pointer;
+	-webkit-transition: color 0.4s;
+	-moz-transition: color 0.4s;
+	transition: color 0.4s;
+}
+
+.richText .richText-toolbar ul li a:hover {
+    color: #001D68;
+    opacity: 0.75;
+    background: #e0e0e0;
+}
+.richText .richText-toolbar ul li a.is-disabled:hover {
+    opacity: 0.4;
+    background: #D6D8D8;   
+}
+
+.richText .richText-toolbar ul li a .fa, .richText .richText-toolbar ul li a .fas, .richText .richText-toolbar ul li a .far, .richText .richText-toolbar ul li a svg {
+	pointer-events: none;
+}
+
+.richText .richText-toolbar ul li[data-disable="true"] {
+	opacity: 0.1;
+}
+
+.richText .richText-toolbar ul li[data-disable="true"] a {
+	cursor: default;
+}
+
+.richText .richText-toolbar ul li:not([data-disable="true"]).is-selected .richText-dropdown-outer {
+	display: block;
+}
+
+.richText .richText-toolbar ul:after {
+	display: block;
+	content: "";
+	clear: both;
+}
+
+.richText .richText-toolbar:last-child {
+	font-size: 0.75rem;
+}
+
+.richText .richText-toolbar:after {
+	display: block;
+	clear: both;
+	content: "";
+}
+
+.richText .richText-form select {cursor: pointer;}
+
+.richText .richText-editor {
+	padding: 0.5rem;
+	background-color: #FFFFFF;
+	height: 20rem;
+	outline: none;
+	overflow-y: scroll;
+	overflow-x: auto;
+}
+
+.richText .richText-toolbar ul li a .richText-dropdown-outer {
+	display: none;
+	position: absolute;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	background-color: rgba(0, 0, 0, 0.3);
+	cursor: default;
+}
+
+.richText .richText-toolbar ul li a .richText-dropdown-outer .richText-dropdown {
+	/*position: relative;
+	z-index:10;
+	display: block;
+	margin: 3% auto 0 auto;
+	background-color: #D6D8D8;
+	border: 0.1rem solid #777777;
+	border-radius: 0.25rem;
+	    padding: 0.75rem;
+    padding-top: 1.5rem;
+	max-width: 90%;
+	-webkit-box-shadow: 0 0 5px 0 #777777;
+	-moz-box-shadow: 0 0 5px 0 #777777;
+	box-shadow: 0 0 5px 0 #777777;*/
+    /*MODIFICADO*/
+    position: relative;
+    z-index:10;
+    display: block;
+    max-width: 80%;
+    margin: 3% auto 0 auto !important;
+    border: 1px solid #F0F0F0;
+    box-shadow: 2px 2px #001D68;
+    padding: 1.5rem !important;
+    background: #FFFFFF;
+    border-radius: .3rem;
+    outline: 0;
+}
+
+.richText .richText-toolbar ul li a .richText-dropdown-outer .richText-dropdown .richText-dropdown-close {
+	position: absolute;
+	top: 0.25rem;
+	right: 0.5rem;
+	color: #CE0E2D;
+	cursor: pointer;
+}
+
+.richText .richText-toolbar ul li a .richText-dropdown-outer .richText-dropdown .richText-dropdown-close:hover {
+	opacity: 0.5
+}
+
+.richText-form-item{
+    position: relative;
+    display: flex;
+    flex-wrap: wrap;
+    align-items: stretch;
+    width: 100%;
+}
+
+.richText .richText-form label {
+   /*display: flex;
+    align-items: left;/*center*
+    padding: 0.375rem 0.75rem;
+    margin-bottom: 0;
+    font-size: 1rem;
+    font-weight: 400;
+    line-height: 1.5;
+	font-weight: 600;
+    text-align: left;/*center*
+    white-space: nowrap;*/
+}
+
+.richText .richText-form input[type="text"], .richText .richText-form input[type="file"], .richText .richText-form input[type="number"], .richText .richText-form select {
+	display: block;
+    height: calc(1.5em + 0.75rem + 2px);
+    padding: 0.375rem 0.75rem;
+    font-size: 1rem;
+    font-weight: 400;
+    line-height: 1.5;
+    color: #777777;
+    background-color: #FFFFFF;
+    background-clip: padding-box;
+    border: 1px solid #D6D8DB;
+    border-radius: 0.25rem;
+    transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+    position: relative;
+    flex: 1 1 auto;
+    width: 1%;
+    margin-bottom: 0;
+}
+
+.richText .richText-toolbar ul li a .richText-dropdown-outer ul.richText-dropdown {list-style: none;}
+.richText .richText-toolbar ul li a .richText-dropdown-outer ul.richText-dropdown li {display: block;float: none;font-family: Calibri,Verdana,Helvetica,sans-serif;}
+.richText .richText-toolbar ul li a .richText-dropdown-outer ul.richText-dropdown li a {display: block;padding: 10px 15px;border-bottom: #EFEFEF solid 1px;}
+.richText .richText-toolbar ul li a .richText-dropdown-outer ul.richText-dropdown li a:hover {background-color: #FFFFFF; color: #D21034;}
+.richText .richText-toolbar ul li a .richText-dropdown-outer ul.richText-dropdown li.inline {margin: 10px 6px;float: left;}
+.richText .richText-toolbar ul li a .richText-dropdown-outer ul.richText-dropdown li.inline a {display: block;padding: 0;margin: 0;border: none;-webkit-border-radius: 50%;-moz-border-radius: 50%;border-radius: 50%;-webkit-box-shadow: 0 0 10px 0 #999;-moz-box-shadow: 0 0 10px 0 #999;box-shadow: 0 0 10px 0 #999;}
+.richText .richText-toolbar ul li a .richText-dropdown-outer ul.richText-dropdown li.inline a span {display: block;height: 30px;width: 30px;-webkit-border-radius: 50%;-moz-border-radius: 50%;border-radius: 50%;}
+
+
+.richText .richText-undo, .richText .richText-redo {
+	float: left;
+	display: block;
+	padding: 0.5rem;
+	cursor: pointer;
+}
+
+.richText .richText-undo.is-disabled, .richText .richText-redo.is-disabled {
+	opacity: 0.4;
+}
+
+.richText .richText-help {
+	display: none;
+}
+
+/*
+.richText .richText-initial {margin-bottom: -4px;padding: 10px;background-color: #282828;border: none;color: #33FF33;font-family: Monospace,Calibri,Verdana,Helvetica,sans-serif;max-width: 100%;min-width: 100%;width: 100%;min-height: 400px;height: 400px;}
+.richText .richText-editor ul, .richText .richText-editor ol {margin: 10px 25px;}
+.richText .richText-editor:focus {border-left: #3498db solid 2px;}
+.richText .richText-editor table {margin: 10px 0;border-spacing: 0;width: 100%;}
+.richText .richText-editor table td, .richText .richText-editor table th {padding: 10px;border: #EFEFEF solid 1px;}
+.richText .richText-help {float: right;display: block;padding: 10px 15px;cursor: pointer;}
+.richText .richText-help-popup a {color: #3498db;text-decoration: underline;}
+.richText .richText-help-popup hr {margin: 10px auto 5px auto;border: none;border-top: #EFEFEF solid 1px;}
+.richText .richText-list.list-rightclick {position: absolute;background-color: #FAFAFA;border-right: #EFEFEF solid 1px;border-bottom: #EFEFEF solid 1px;}
+.richText .richText-list.list-rightclick li {padding: 5px 7px;cursor: pointer;list-style: none;}*/

+ 25 - 0
css/secciones/empleo.css

@@ -0,0 +1,25 @@
+.timeline { position: relative; max-width: 960px; margin: 0 auto; }
+.timeline::after { content: ''; position: absolute; width: 2px; background: var(--gray); top: 0; bottom: 0; left: 50%; margin-left: -1px; }
+.trabajo { padding: 1rem; position: relative; background: var(--white); width: 50%; }
+.trabajo > div { padding-bottom: 0.5rem; }
+.trabajo > div > div { padding: 0 1rem; margin-bottom: 0.25rem;  }
+.trabajo > div > div.fecha { width: 60%; padding: 0.25rem 1rem; height: 30px; max-height: 30px; margin-top: -15px; outline: 5px solid white; margin-bottom: 0.5rem!important; }
+.trabajo:nth-child(odd) { left: 0;}
+.trabajo:nth-child(odd) > div { border-radius: 5px; border: 2px solid var(--azul1); }
+.trabajo:nth-child(odd) > div > div.fecha { background: var(--azul1); border-radius: 15px 0 0 15px; align-self: end; text-align: right; margin-right: -1rem; }
+.trabajo:nth-child(even) { left: 50%;}
+.trabajo:nth-child(even) > div { border-radius: 5px; border: 2px solid var(--azul2); }
+.trabajo:nth-child(even) > div > div.fecha { background: var(--azul2);  border-radius: 0 15px 15px 0; margin-left: -1rem; }
+.alert { display: none; }
+
+@media (max-width: 576px) {
+  .timeline::after { display: none; }
+  .trabajo { width: 100%; }
+  .trabajo > div > div.fecha { margin-left: -2px !important; }
+  .trabajo:nth-child(odd) > div > div.fecha { border-radius: 0 15px 15px 0; align-self: start; text-align: left; }
+  .trabajo:nth-child(even) { left: 0; }
+}
+
+@media (max-width: 410px) {
+  .trabajo > div > div.fecha { width: 75%; }
+}

+ 21 - 0
css/secciones/eventos.css

@@ -0,0 +1,21 @@
+.dropdownlist { width:225px; }
+.bigFont { color: var(--primary) !important; font-size: 1.25rem !important; font-family: 'indivisa-text-bold-italic'; }
+.evento { border-bottom: 1px solid var(--mainColor); padding: 1em; }
+.calendario { width: 100px; max-width: 100px; border-radius:8px; background: var(--light-75); border-top: 20px solid; height:100px; max-height: 100px; }
+.calendario > span { font-size: 0.85em; margin-bottom: 0.5em; }
+.tituloEvento { font-size: 1.5em; }
+.fa-circle-info { color: var(--azul2); cursor: pointer; }
+.fa-circle-info:hover { opacity: 0.5; }
+.fa-circle-info.view { color: var(--gray); }
+.botones { width: 150px; max-width: 150px; }
+.collapse { background: var(--mainColor-25); }
+.collapse img { max-width: 100%; }
+.txtLabel { font-size: 1rem; }
+.carga { display: none; }
+.cif-file-container { height: 200px; max-height: 200px; }
+.cif-file-container.cif-container-image-type .cif-file-row, .cif-file-container.cif-container-image-type .cif-parent { padding: 0; border: 0; text-align: center; }
+.cif-img { height: 200px; max-height: 200px; width: 200px; max-width: 200px; object-fit: cover; border: 3px solid var(--mainColor); }
+.alert-dismissible .close { font-size: 1em; }
+.alert-dismissible .close:hover { color: inherit; }
+.is-invalid { border-color: var(--danger); }
+.is-invalid > * { color: var(--danger) !important; }

+ 15 - 0
css/secciones/formacion.css

@@ -0,0 +1,15 @@
+.ing-estrella1.empty { color: var(--mainColor-50); }
+.ing-estrella1.half { background: linear-gradient(90deg, var(--yellow) 50%, var(--mainColor-50) 50%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
+.ing-estrella1.full { color: var(--yellow); }
+.ing-insignia3.empty { color: var(--mainColor-50); }
+.ing-insignia3.half { background: linear-gradient(90deg, var(--gold) 50%, var(--mainColor-50) 50%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
+.ing-insignia3.full { color: var(--gold); }
+
+.tarjeta { min-height: 220px; height: 220px; max-height: 220px; min-width: 220px; width: 220px; max-width: 220px; background: var(--mainColor-25); border-radius: 1rem; margin-bottom: 1rem; }
+.tarjeta label { font-family: 'indivisa-text-italic'; }
+
+.timeline-item { padding: 1em; margin: 0 0.5em 0 1em; position: relative; border-left: 2px solid var(--mainColor); width: 90%; }
+.timeline-item:last-child { border-image: linear-gradient(to bottom, var(--mainColor) 60%, rgba(var(--mainColor), 0)) 1 100%; }
+.timeline-item > .bullet { width: 28px; height: 28px; top: 1em; left: -13px; background: var(--white); display: flex; justify-content: center; align-items: center; }
+.timeline-item > .bullet > .figura { width: 25px; height: 25px; background: var(--mainColor); clip-path: polygon(70% 0%, 100% 50%, 70% 100%, 0% 100%, 25% 50%, 0% 0%); }
+.timeline-item > div > .fecha { height: 25px; background: var(--mainColor-75); color: var(--white); clip-path: polygon(90% 0%, 100% 50%, 90% 100%, 0% 100%, 5% 50%, 0% 0%); padding: 0 1.5em 0 1em; }

+ 92 - 0
css/secciones/home.css

@@ -0,0 +1,92 @@
+main { display: grid; grid-template-areas: 'bg-main datos' 'bg-main intereses'; grid-template-columns: auto 1fr; grid-template-rows: auto 1fr; justify-content: start; align-content: start; }
+.btns { display: none; }
+
+.bg-main { background: var(--mainBGSub); background-size: contain; grid-area: bg-main; }
+.datos { grid-area: datos; }
+.tooltip-inner { max-width: 250px; }
+.foto { width: 240px; height: 200px; padding: 0 20px; }
+.foto > img { width: 200px; min-width: 200px; max-width: 200px; height: 200px; min-height: 200px; max-height: 200px; }
+.divIconsFoto { bottom: 0px; right: 20px; width: 200px; background: var(--claro-75); padding: 0.15em 0;  }
+.iconFoto { width: 34px; height: 34px; border-radius: 50%; background: var(--mainColor-50); font-size: 1.25rem; color: var(--azul2); cursor: pointer; }
+.iconFoto:hover { background: var(--mainColor); color: var(--white); }
+.carga { display: none; }
+.cif-file-container { height: 200px; max-height: 200px; }
+.cif-file-container.cif-container-image-type .cif-file-row, .cif-file-container.cif-container-image-type .cif-parent { padding: 0; border: 0; text-align: center; }
+.cif-img { height: 200px; max-height: 200px; width: 200px; max-width: 200px; object-fit: cover; border: 3px solid var(--mainColor); }
+.alert-dismissible .close { font-size: 1em; }
+.alert-dismissible .close:hover { color: inherit; }
+.cif-file-picker.cif-pkr-archivo.is-invalid { border-color: var(--danger); }
+.cif-file-picker.cif-pkr-archivo.is-invalid > * { color: var(--danger) !important; }
+
+.acercaTit { background: var(--dark); color: var(--white); font-family: 'indivisa-text-bold-italic'; }
+#txtAcerca { max-width: calc(200px + 2rem); color: var(--white); }
+#txtAcerca.editable { background: var(--white); color: var(--azul2); border: 1px solid var(--azul2); border-radius: 5px; font-weight: 300; vertical-align: middle; padding: 0.5rem; outline: 0;  }
+#txtAcerca[placeholder]:empty:before { content: attr(placeholder); color: #555; }
+#txtAcerca[placeholder]:empty:focus:before { content: ''; }
+.btnCirc { display: flex; justify-content: center; align-items: center; width: 32px; height: 32px; border-radius: 16px; background: var(--claro-50); }
+
+#divRedes { max-width: calc(200px + 2rem); }
+.iconRedes { width: 30px; height: 30px; display: flex; justify-content: center; align-items: center; border: 0; background: var(--dark); color: var(--white); border-radius: 50%; margin: 0.25rem; cursor: pointer; }
+.iconRedes:hover { background: var(--white); color: var(--dark); }
+.iconRedes:focus, .iconRedes:active { outline: 0; background: var(--azul2); color: var(--white) !important; }
+.popover { background: var(--white); border-color: var(--azul2); }
+.popover-header { background: var(--white); border-bottom: 0; text-align: center; position: relative; }
+.popover-header:before { content: ''; position: absolute; left: 10%; bottom: 0; height: 1px; width: 80%; border-bottom: 1px solid var(--azul2); }
+.popover-header > .ing-cancelar { position: absolute; top: -10px; right: -10px; width: 20px; height: 20px; border-radius: 50%; display: flex; justify-content: center; align-items: center;
+    font-size: 0.5em; background: var(--danger); color: var(--white); cursor: pointer; }
+.popover-header > .ing-cancelar:hover { border: 1px solid var(--danger); background: var(--white); color: var(--danger); }
+.bs-popover-auto[x-placement^=top]>.arrow::before, .bs-popover-top>.arrow::before { border-top-color: var(--azul2); }
+.bs-popover-auto[x-placement^=top]>.arrow::after, .bs-popover-top>.arrow::after { border-top-color: var(--white); }
+.bs-popover-auto[x-placement^=bottom]>.arrow::before, .bs-popover-bottom>.arrow::before { border-bottom-color: var(--azul2);}
+.bs-popover-auto[x-placement^=bottom]>.arrow::after, .bs-popover-bottom>.arrow::after { border-bottom-color: var(--white); }
+.bs-popover-auto[x-placement^=right]>.arrow::before, .bs-popover-right > .arrow::before { border-right-color: var(--azul2); }
+.bs-popover-auto[x-placement^=right]>.arrow::after, .bs-popover-right > .arrow::after { border-right-color: var(--white); }
+.bs-popover-auto[x-placement^=left]>.arrow::before, .bs-popover-left > .arrow::before { border-left-color: var(--azul2); }
+.bs-popover-auto[x-placement^=left]>.arrow::after, .bs-popover-left > .arrow::after { border-left-color: var(--white); }
+.popover-body ul { list-style: none; margin-bottom: 0; padding-inline-start: 2em; }
+.popover-body ul > li:before { display: inline-block; margin-left: -2em; margin-right: 0.5em; content: '\25A0'; transform: translateY(-0.15em); color: var(--azul1); }
+.popover-body ul > li, .popover-body ul > li > div { display: flex; justify-content: start; align-items: start; }
+.popover-body ul > li { flex-direction: row; }
+.popover-body ul > li > div { flex-direction: column; }
+.popover-body ul > li > div > span { font-size: 0.75em; line-height: 1; color: var(--gray); margin-bottom: 0.5em; }
+.titRed > span { background: var(--azul1); color: var(--white); width: 28px; height: 28px; border-radius: 14px; display: flex; justify-content: center; align-items: center; }
+.titRed > label { position: relative; height: 28px; max-height: 28px; width: 100%; border-radius: 0 14px 14px 0; background: var(--azul1-75); color: var(--white); padding-left: 20px; display: flex; justify-content: start; align-items: center;  }
+.titRed > label:after { content: ''; width: 14px; height: 28px; border-radius: 0 14px 14px 0; background: var(--white); position: absolute; top: 0; left: 0; }
+.redes ul > li { border-bottom: 1px solid var(--mainColor-50); }
+.redes ul > li:last-child { border-bottom: 0; }
+.red > div > span { font-size: 0.75em; color: var(--gray); }
+#modalSupRedes .modal-body { max-height: 600px; }
+
+#nombre, #apellidos{ line-height: inherit; padding: 0 0.5rem !important; }
+#nombre:disabled, #apellidos:disabled { display: none; }
+#curp:disabled { border: 0; color: var(--azul2); }
+.tooltip-inner { background: var(--azul2); }
+.bs-tooltip-auto[x-placement^=top] .arrow::before, .bs-tooltip-top .arrow::before { border-top-color: var(--azul2); }
+
+section > div { margin-bottom: 1.5rem; }
+section > div > div.num { text-align: center; letter-spacing: 2px; color: var(--white); padding: 0.25em 0.5em; min-width: 100px; width: 100px; margin-right: 1em; background: var(--mainColor); }
+section > div:first-of-type > div.num { background: var(--azul1); }
+.bordeInfInteres { border-bottom: 1px solid var(--gray-25); }
+#eliminaIntereses { display: none; }
+.intereses { grid-area: intereses; }
+.intereses > .bordeInf { border-bottom: 2px solid var(--mainColor); }
+
+.intereses ul, .redes ul { list-style: none; padding-inline-start: 1em; }
+.intereses ul > li, .redes ul > li { padding: 0.5em; }
+.interes > .flex-grow-1, .red > .flex-grow-1 { line-height: 1; }
+.interes > .ing-cuadrado { font-size: 0.5em; margin-top: 0.5em; }
+.interes > .ing-cancelar, .red > .ing-cancelar { font-size: 0.75em; margin-top: 0.25em; }
+.interes > .ing-cuadrado, .interes > .ing-cancelar, .red > .ing-cancelar { margin-right: 5px; }
+.interes > .ing-basura, .interes > .ing-cancelar, .red > .ing-basura, .red > .ing-cancelar { color: var(--danger); cursor: pointer; }
+.interes > .ing-basura, .interes > .ing-cancelar, .red > .ing-cancelar{ display: none; }
+/*.intereses ul > li:before { display: inline-block; margin-left: -2em; margin-right: 0.5em; content: '\25A0'; transform: translateY(-0.15em); }
+.intereses ul:nth-child(odd) > li:before { color: var(--azul1); }
+.intereses ul:nth-child(even) > li:before { color: var(--azul2); }*/
+
+.borrar, .hoverElim  { background: var(--danger-25); }
+
+@media (max-width: 576px) {
+    main {grid-template-areas: 'datos' 'bg-main' 'intereses'}
+    .txtAcerca { max-width: 100%; }
+    .bordeDer { border-right: 0; }
+}

+ 49 - 0
css/secciones/horarios.css

@@ -0,0 +1,49 @@
+/* 
+    Created on : Feb 16, 2023, 8:18:52 AM
+    Author     : Ale
+*/
+.horario > thead > tr { background: var(--primary); color: var(--white); text-align: center; border: 0;}
+.horario tr { height: 30px; max-height: 30px; }
+.horario td { height: 30px; max-height: 30px; padding: 0; margin: 0; border: 1px solid var(--mainColor-25);  /*border-left: 2px solid var(--white) !important; border-right: 2px solid var(--white) !important; border-bottom: 1px solid var(--light);*/ }
+.horaGral { font-family: 'indivisa-text-bold'; text-align: center; vertical-align: middle !important; background: var(--gray-25); }
+.cuadro { width: 24px; height: 24px; }
+.clase { background: var(--light); }
+.atencion { background: #76D9C7; }
+.gestion { background: #EBEB88; }
+.bloque > div { overflow-y: auto;  padding: 0.75em; border: 1px solid var(--mainColor); cursor: default; }
+.bloque > div > p { margin-bottom: 0.5rem; }
+.bloque > div > .hora  { font-size: 0.75em; }
+.clase > div > .materia { font-family: 'indivisa-text-bold'; color: var(--azul1); }
+.clase > div > .grupo { font-family: 'indivisa-text-bold'; }
+.clase > div > .profesor { font-size: 0.75em; font-family: 'indivisa-text-italic'; color: var(--azul2); }
+.tabla-submaterias td { vertical-align: middle; }
+ul { margin: 0; padding: 0; list-style: none; }
+ul li.pendiente:before { font-family: 'ingfont'; content: '\e935'; padding: 0 0.5em; }
+ul li.profesor:before { font-family: 'ingfont'; content: '\e90d'; padding: 0 0.5em; }
+.dia0 { width: 9%; }
+.dia1, .dia2, .dia3, .dia4, .dia5, .dia6 { width: 15%; }
+.oculto { display: none !important; }
+.prev, .next { color: var(--white); padding: 0.75em 0.5em; font-size: 1.5em; background: var(--azul2); position: relative; margin: 0 0.5em; cursor: pointer; }
+.prev > span, .next > span { display: flex; justify-content: center; align-items: center; }
+.prev:hover, .next:hover { opacity: 0.5; }
+.prev:after { background: var(--azul2); content: ""; position: absolute; display: block; width: 100%; height: 100%; top: 0; left: 0; z-index: -1; transform-origin: bottom left; -ms-transform: skew(-20deg, 0deg); -webkit-transform: skew(-20deg, 0deg); transform: skew(-20deg, 0deg); }
+.next:after { background: var(--azul2); content: ""; position:absolute; display: block; width: 100%; height: 100%; top: 0; right: 0; z-index: -1; transform-origin: top right; -ms-transform: skew(-20deg, 0deg); -webkit-transform: skew(-20deg, 0deg); transform: skew(-20deg, 0deg); }
+.prev > span:before { -webkit-transform: rotate(90deg); -moz-transform:rotate(90deg); -o-transform:rotate(90deg); transform: rotate(90deg); }
+.next > span:before { -webkit-transform: rotate(-90deg); -moz-transform:rotate(-90deg); -o-transform:rotate(-90deg); transform: rotate(-90deg); }
+.inactivo { color: var(--white) !important; background: var(--gray) !important; }
+.inactivo:hover { opacity: 1 !important; cursor: default !important; }
+.inactivo:after { background: var(--gray) !important; }
+.table.extras > thead { background: var(--azul2); color: var(--white); text-align: center; font-family: 'indivisa-text-bold'; }
+.table.extras > tbody > tr:nth-child(even) { background: var(--mainColor-25); }
+@media (max-width: 768px){
+    .dia0 { width: 17.5%; }
+    .dia1, .dia2, .dia3, .dia4, .dia5, .dia6 { width: 27.5%; }
+}
+@media (max-width: 576px){
+    .dia0 { width: 20%; }
+    .dia1, .dia2, .dia3, .dia4, .dia5, .dia6 { width: 40%; }
+}
+@media (max-width: 375px){
+    .dia0 { width: 25%; }
+    .dia1, .dia2, .dia3, .dia4, .dia5, .dia6 { width: 75%; }
+}

+ 6 - 0
css/secciones/index_bypass.css

@@ -0,0 +1,6 @@
+#nicoImg { width: 25vw; }
+.borde { border: 4px solid var(--azul1); border-radius: 10px; box-shadow: 4px 4px 2px var(--dark-50); }
+.switch { width: 6.25em; }
+.switch.active:before { left: 4.75em; }  /*Ajustar si varía el width principal width - (1.25+0.25)em */
+#clave, #dlAlumno { display: none; }
+.ing-ojo { display: none; position: absolute; top: 0.75rem; right: 0.75rem; font-size: 1.25em; cursor: pointer; }

+ 19 - 0
css/secciones/insignias.css

@@ -0,0 +1,19 @@
+/* 
+    Created on : Feb 15, 2023, 9:52:13 AM
+    Author     : Ale
+*/
+.encabezado { font-family: 'indivisa-text-bold'; margin-bottom: 0.5rem; }
+.encabezado > a { width: 100%; display: flex; }
+.encabezado > a:hover { opacity: 0.5; }
+.encabezado > a > span { height: 40px; display: flex; }
+.encabezado > a  > div { overflow: hidden; height: 40px; display: flex; justify-content: start; align-items: center; }
+.encabezado > a  > span { width: 40px; clip-path: polygon(100% 0%, 100% 100%, 0 100%, 0% 0%);  }
+.encabezado > a > span > i { -webkit-transform: rotate(90deg); -o-transform:rotate(90deg); transform: rotate(90deg); }
+.encabezado > a.collapsed > span:first-of-type { transition: clip-path 2s; clip-path: polygon(100% 0, 100% 100%, 0% 100%, 50% 50%, 0% 0%); }
+.encabezado > a.collapsed > span:last-of-type { transition: clip-path 2s; clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 100%, 0% 0%); }
+.encabezado > a.collapsed > span > i { -webkit-transform: rotate(0deg); -o-transform:rotate(0deg); transform: rotate(0deg); }
+
+.contenido { background: var(--light); padding: 1.5rem; margin-bottom: 0.5rem; }
+.contenido > div { margin-bottom: 1rem; position: relative; }
+.contenido > div:last-of-type { margin-bottom: 0; }
+.contenido > div > span.ing-cuadrado { position: absolute; font-size: 50%; top: 7px; left: 4px; }

+ 188 - 0
css/template.css

@@ -0,0 +1,188 @@
+/***** COLORES *****/
+:root {
+    --mainBG: url('../img/pleca.webp');
+    --mainBGSub: url('../../img/pleca.webp');
+    --mainColor: #95B1BC;
+    --mainColor-25: rgba(149, 177, 188, 0.25);
+    --mainColor-50: rgba(149, 177, 188, 0.5);
+    --mainColor-75: rgba(149, 177, 188, 0.75);
+    --success: #339933 !important;
+    --success-25: rgba(51, 153, 51, 0.25);
+    --success-50: rgba(51, 153, 51, 0.5);
+    --success-75: rgba(51, 153, 51, 0.75);
+    --primary: #001D68;
+    --primary-25: rgba(0, 29, 104, 0.25);
+    --primary-50: rgba(0, 29, 104, 0.5);
+    --primary-75: rgba(0, 29, 104, 0.75);
+    --primary-hover: #101097;
+    --danger: #D21034 !important;
+    --danger-25: rgba(210, 16, 52, 0.25);
+    --danger-50: rgba(210, 16, 52, 0.5);
+    --danger-75: rgba(210, 16, 52, 0.75);
+    --yellow: #FFC107 !important;
+    --yellow-25: rgba(255, 193, 7, 0.25);
+    --yellow-50: rgba(255, 193, 7, 0.5);
+    --yellow-75: rgba(255, 193, 7, 0.75);
+    --dark: #696969 !important;
+    --dark-25: rgba(105, 105, 105, 0.25);
+    --dark-50: rgba(105, 105, 105, 0.50);
+    --dark-75: rgba(105, 105, 105, 0.75);
+    --light: #F0F0F0 !important;
+    --light-25: rgba(240, 240, 240, 0.25);
+    --light-50: rgba(240, 240, 240, 0.5);
+    --light-75: rgba(240, 240, 240, 0.75);
+    --gray: #969696 !important;
+    --gray-25: rgba(150, 150, 150, 0.25);
+    --gray-50: rgba(150, 150, 150, 0.5);
+    --gray-75: rgba(150, 150, 150, 0.75);
+    --azul1: #00A6CE;
+    --azul1-25: rgba(0, 166, 206, 0.25);
+    --azul1-50: rgba(0, 166, 206, 0.5);
+    --azul1-75: rgba(0, 166, 206, 0.75);
+    --azul2: #0C7696;
+    --azul2-25: rgba(12, 118, 150, 0.25);
+    --azul2-50: rgba(12, 118, 150, 0.5);
+    --azul2-75: rgba(12, 118, 150, 0.75);
+    --claro: #E0E0E0;
+    --claro-25: rgba(224, 224, 224, 0.25);
+    --claro-50: rgba(224, 224, 224, 0.5);
+    --claro-75: rgba(224, 224, 224, 0.75);
+    --gold: #D4AF37;
+    --gold-25: rgba(212, 175, 55, 0.25);
+    --gold-50: rgba(212, 175, 55, 0.5);
+    --gold-75: rgba(212, 175, 55, 0.75);
+    --silver: #B4B4B4;
+    --silver-25: rgba(180, 180, 180, 0.25);
+    --silver-50: rgba(180, 180, 180, 0.5);
+    --silver-75: rgba(180, 180, 180, 0.75);
+    --bronze: #AD8A56;
+    --bronze-25: rgba(173, 138, 86, 0.25);
+    --bronze-50: rgba(173, 138, 86, 0.5);
+    --bronze-75: rgba(173, 138, 86, 0.75);
+}
+
+/***** HEADER *****/
+header { padding: 20px 0; height: 110px; }
+.menu, .footer { margin: 0 auto; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; }
+.subMenu { background-color: var(--light); width: 100%; padding: 0px 10px; font-size: 15px; }
+.subMenu .barra { max-width: 960px; min-height: 54px; padding: 16px 0; }
+header .logotipo { float: left; clear: none; text-align: inherit; width: 20%; margin-left: 0; margin-right: 0; }
+header .logotipo:before { content: ''; display: table; }
+header .logotipo img, aside .logotipo img { max-width: 200px; }
+.mainMenu { min-width: 85px; }
+.nav-item { border-right: 1px solid var(--gray); }
+.nav-item:last-child { border-right: 0; }
+.nav-item > a { color:var(--gray); padding: 1px 6px; }
+.nav-item > a:hover { color: var(--danger); }
+.max-h { height: 45px !important; max-height: 45px; }
+.max-w { width: 45px !important; max-width: 45px; }
+.iconOff { font-size: 16px; color: var(--danger); display: block; width: 60px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; border-radius: 30px 0 0 30px; border: none; background: transparent; }
+.iconOff:hover, .iconOff:active { text-decoration: none; background: var(--danger); color: var(--white); }
+.salir { margin-right: -20px; }
+
+/***** MENÚ *****/
+.iconMenu { font-size: 32px; }
+.iconMenuSidebar { font-size: small; }
+#sidebarCollapse:hover, #sidebarCollapse:active, #dismiss:hover, #dismiss:active { opacity: 0.8 !important; }
+#accordionMenu { font-size: 16px; }
+
+/***** SIDEBAR MENÚ *****/
+#sidebar { width: 100%; max-width: 400px; position: fixed; top: 0; right: -400px; height: 100vh; z-index: 1023; transition: all 0.3s; overflow-y: auto; }
+#sidebar.active { right: 0; }
+.logotipo a img { width: 300px; }
+.overlay { display: none; position: fixed; width: 100vw; height: 100vh; background: rgba(0, 0, 0, 0.75); z-index: 1022; opacity: 0; transition: all 0.5s ease-in-out; }
+.overlay.active { display: block; opacity: 1; }
+a:hover{ color: var(--danger); text-decoration: none; }
+
+/* ICONOS MENU */
+header{ padding: 20px 0; height: 110px; }
+header .logotipo{ float: left; clear: none; text-align: inherit; width: 20%;margin-left: 0; margin-right: 0; }
+header .logotipo:before { content: '';display: table; }
+header .logotipo img, aside .logotipo img { max-width: 200px; }
+.mainMenu{ min-width: 85px; }
+.menu .nav-item{ border-right: 1px solid var(--gray); text-align: center; display: flex; align-items: center; }
+.menu .nav-item:last-child { border-right: 0; }
+.menu .nav-item > a, .menu .nav-item > span{ color:var(--gray);padding: 1px 10px; }
+.menu .nav-item > a:hover{ color:var(--danger);text-decoration: none; }
+.menu .nav-item > a{ transition: color 0.6s ease; display: block; }
+.side-menu .fa-angle-right{ transition: .3s transform ease-in-out; }
+#accordionMenu ul { list-style: none; margin-left: 1.5em; padding-inline-start: 0; }
+#accordionMenu .side-menu:not(.collapsed) .fa-angle-right { display: inline-block; transform: rotate(90deg) }
+.side-menu.activo, #accordionMenu ul li a.activo { color: var(--danger) !important; font-family: 'indivisa-text-bold-italic'; }
+.iconLogin, .iconOff { font-size: 16px; display: block; width: 60px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; border-radius: 30px 0 0 30px; }
+.iconOff:hover, .iconOff:active { text-decoration: none; background: var(--danger); color: var(--white); height: 40px; }
+.iconOff { color: var(--danger); }
+.iconLogin:hover, .iconLogin:active, .iconOff:hover, .iconOff:active { text-decoration: none; color: var(--white); height: 40px; }
+.iconLogin { color: var(--success); }
+.iconLogin:hover, .iconLogin:active { background: var(--success); }
+.iconSesion { margin-right: -20px; }
+.menuicon { font-size: 40px; cursor: pointer; border-radius: 50%; }
+.menuicon:hover { color: var(--primary-hover) !important; }
+.cerraricon { height: 45px !important; max-height: 45px; width: 45px !important; max-width: 45px; border: 3px solid var(--light); cursor: pointer; }
+.cerraricon:hover { background: var(--primary-hover) !important; }
+
+/***** FOOTER *****/
+footer{ font-size: 14px; color: var(--white); }
+footer .footerTop { background: var(--primary); padding: 15px 0; }
+footer .footerTop .logotipo { overflow: hidden; }
+footer .footerTop .logotipo h3 { display: inline-block; vertical-align: top; color: var(--white); margin: 0; float: right; text-align: right; font-size: 25px; font-family: 'indivisa-text'; }
+footer .footerTop .logotipo h3 span { display: block; }
+footer .footerTop .menuFooter h3 { font-size: 12px; font-family: 'indivisa-text'; color: var(--white) !important; }
+footer .footerTop .menuFooter ul { overflow: hidden; }
+footer ul { list-style: none; padding: 0; margin: 0; }
+footer .footerTop .menuFooter ul>li { *zoom: 1; float: left; clear: none; text-align: inherit; width: 16%; margin-left: 0; margin-right: 3%; }
+footer .footerTop .menuFooter ul>li ul li a{ font-size:10px; }
+footer ul>li { display: inline-block; vertical-align: top; }
+.footerMore { position: relative; display: none; padding: 5px 0; }
+footer a { color: var(--white);-webkit-transition: color 0.5s; transition: color 0.5s; }
+footer a:hover{ color: #CE0E2D !important; text-decoration: none !important; }
+footer .footerTop .menuFooter ul>li ul li { display: block; width: 100%; margin-bottom: 0px; }
+
+footer .ubicacion { margin-top: 20px; overflow: hidden; }
+footer .ubicacion .address { display: inline-block; /*width: 65%;*/ vertical-align: bottom; }
+footer .ubicacion .address h4, footer .ubicacion .address h4 a { color: #0FB7F1; font-size: 14px; margin: 0 0 0 -5px; position: relative; }
+footer .ubicacion .address h4 a { display: inline-block; }
+
+footer .ubicacion .redes{ display: inline-block; vertical-align: bottom; }
+footer .ubicacion .redes h4{ display: inline-block; vertical-align: middle; margin: 0; font-size: 16px !important; font-weight: bold; }
+footer .ubicacion .redes ul{ display: inline-block; vertical-align: middle; }
+footer .ubicacion .redes ul li{ margin-left: 2px; }
+
+footer .footerMiddle { background: #071e58; overflow: hidden; }
+footer .footerMiddle nav ul { text-align: center; }
+footer .footerMiddle nav ul li { border-right: 1px solid var(--white); padding: 1px 10px; display: inline-block; margin-bottom: 10px;}
+footer ul>li { display: inline-block; vertical-align: top;}
+
+footer .footerBottom { background: #091941; overflow: hidden; padding: 15px 0;}
+.footerBottom .logotipos{display:inline-block;vertical-align:middle;width:20%}
+footer .footerBottom .logotipos a{display:inline-block;width:80px;margin-right:6px}
+footer .footerBottom .logotipos a.internacional{width:80px}
+footer .footerBottom .logotipos a.red{width:75px}
+footer .footerBottom .legales{text-align:right;float:right;width:60%;margin-right:0;margin-left:auto;padding-top:10px;padding-bottom:0}
+footer .footerBottom .legales ul li{border-right:1px solid var(--white);padding:1px 10px}
+footer .footerBottom .legales ul li:last-child{border:0}
+footer .tab-pane p{font-size:12px; line-height: 18px;}
+
+/********** MOBILE **********/
+@media (max-width:768px) {
+    footer { font-size: 12px; }
+    footer .ubicacion .redes { text-align: center; }
+    footer .navbar-toggler { font-size: 12px !important; }
+    footer .footerBottom .logotipos { text-align:center; }
+    footer .footerBottom .legales ul { margin-left: auto; margin-right: auto; }
+}
+@media (max-width:560px) {
+    footer .ubicacion { margin-top: 0; }
+    footer .footerMiddle ul li, footer .footerBottom .legales ul li { text-align: center; padding:10px 0; border: none; }
+}
+@media (max-width:480px) {
+    footer .footerTop .logotipo .lasalle { max-width:125px; }
+}
+@media (max-width: 575px) {
+    #errorImg { width: 25vw; }
+}
+/***** SCROLLBAR *****/
+::-webkit-scrollbar {width: 8px;}/*Ancho*/
+::-webkit-scrollbar-track {background: #F1F1F1;}/*Riel*/
+::-webkit-scrollbar-thumb {background: #D6D8DB;}/* Handle */
+::-webkit-scrollbar-thumb:hover { background: var(--primary); }/*Hover Handle */

+ 12 - 0
docs/generales.json

@@ -0,0 +1,12 @@
+{
+    "idiomas":[
+        "Alban\u00e9s","Alem\u00e1n","Am\u00e1rico","\u00c1rabe","Armenio","Azerbaiyano","Bengal\u00ed","Bielorruso","Birmano","Bosnio","B\u00falgaro",
+        "Canar\u00e9s","Catal\u00e1n","Cebuano","Checo","Chino (Simplificado)","Chino (Tradicional)","Cingal\u00e9s","Coreano","Corso","Criollo haitiano",
+        "Croata","Dan\u00e9s","Eslovaco","Esloveno","Espa\u00f1ol","Esperanto","Estonio","Euskera","Fin\u00e9s","Franc\u00e9s","Fris\u00f3n occidental",
+        "Ga\u00e9lico escoc\u00e9s","Gal\u00e9s","Gallego","Georgiano","Griego","Guyarat\u00ed","Hausa","Hawaiano","Hebreo","Hindi","Hmong","H\u00fangaro",
+        "Igbo","Indonesio","Ingl\u00e9s","Irland\u00e9s","Island\u00e9s","Italiano","Japon\u00e9s","Javan\u00e9s","Jemer","Kazajo","Kinyarwanda","Kirgu\u00eds",
+        "Kurdo","Lao","Lat\u00edn","Let\u00f3n","Lituano","Luxemburgu\u00e9s","Macedonio","Malayalam","Malayo","Malgache","Malt\u00e9s","Maor\u00ed","Marat\u00ed",
+        "Mongol","Neerland\u00e9s","Nepal\u00ed","Noruego","Nyanja","Oriya","Past\u00fan","Persa","Polaco","Portugu\u00e9s","Punyab\u00ed","Rumano","Ruso","Samoano",
+        "Serbio","Shona","Sindhi","Somal\u00ed","Sotho meridional","Suajili","Sueco","Sundan\u00e9s","Tagalo","Tailand\u00e9s","Tamil","T\u00e1rtaro","Tayiko","Telugu",
+        "Turco","Turcomano","Ucraniano","Uigur","Urdu","Uzbeko","Vietnamita","Xhosa","Yidis","Yoruba","Zul\u00fa"]
+}

+ 4 - 0
docs/redes.txt

@@ -0,0 +1,4 @@
+ing-up-s|G+
+ing-up-s|Instagram
+ing-in-s|Linkedin
+ing-up-s|Página Web

+ 168 - 0
ejemplo.php

@@ -0,0 +1,168 @@
+<?php
+require_once 'classes/Template.php';
+$titulo = 'Ejemplo';
+?>
+<!DOCTYPE html>
+<html lang="es" prefix="og: http://ogp.me/ns#">
+    <head>
+	<title>Alumnos - <?php echo $titulo; ?></title>
+        <?php Template::getCSS(array('elementos.css')); ?>
+    </head>
+    <body>
+        <?php Template::header($titulo); ?>
+        <main class="container-fluid content marco">
+            <h4 class="text-dark">Botones</h4>
+            <div class="d-flex flex-row justify-content-between align-items-center">
+                <button class="btn btn-verde">btn-verde</button>
+                <button class="btn btn-rojo">btn-rojo</button>
+                <button class="btn btn-amarillo">btn-amarillo</button>
+                <button class="btn btn-gris">btn-gris</button>
+                <button class="btn btn-azul1">btn-azul1</button>
+                <button class="btn btn-azul2">btn-azul2</button>
+            </div>
+            <hr class="mb-3">
+            <h4 class="text-dark">Encabezados</h4>
+            <div class="d-flex flex-row flex-wrap justify-content-between align-items-center">
+                <h2>Encabezado-h2</h2>
+                <h4>Encabezado-h4</h4>
+                <h6>Encabezado-h6</h6>
+            </div>
+            <hr class="mb-3">
+            <h4 class="text-dark">Modals y Avisos(estos pueden ser en modal o directo en página) </h4>
+            <div class="d-flex flex-row flex-wrap justify-content-between align-items-center">
+                <button type="button" class="btn btn-primary mx-1" data-toggle="modal" data-target="#modalConfirmar">Modal Confirmar|Forms</button>
+                <button type="button" class="btn btn-primary mx-1" data-toggle="modal" data-target="#modalAviso">Modal Aviso</button>
+                <div class="mx-1 msgAviso d-flex flex-row justify-content-between align-items-stretch">
+                    <div class="iconAviso bg-warning d-flex justify-content-center align-items-center"><i class="display-3 ing-importante"></i></div>
+                    <div class="txtAviso flex-grow-1 d-flex flex-column justify-content-center align-items-center">
+                        <div class="display-5 indivisa-text-black mb-3">Título</div>
+                        <div>Texto del Mensaje</div>
+                    </div>
+                </div>
+            </div>
+            <div class="modal fade" id="modalAviso" tabindex="-1" aria-labelledby="modalAviso" aria-hidden="true">
+                <div class="modal-dialog modal-dialog-centered">
+                    <div class="modal-content msgAviso d-flex flex-row justify-content-between align-items-stretch">
+                        <div class="modal-header iconAviso bg-warning d-flex justify-content-center align-items-center"><i class="display-3 ing-importante"></i></div>
+                        <div class="modal-body txtAviso flex-grow-1 d-flex flex-column justify-content-center align-items-center">
+                            <div class="display-5 indivisa-text-black mb-3">Título</div>
+                            <div class="mb-3">Texto del Mensaje</div>
+                            <div class="rounded-pill p-2 text-white bg-warning" data-dismiss="modal" aria-label="Close">Cerrar</div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="modalGral modal fade" id="modalConfirmar" tabindex="-1" data-backdrop="static" aria-labelledby="modalConfirmar" aria-hidden="true">
+                <div class="modal-dialog modal-dialog-centered">
+                    <div class="modal-content">
+                        <div class="modal-header">
+                            <h5 class="modal-title" id="exampleModalLabel">Modal title</h5>
+                        </div>
+                        <div class="modal-body">...</div>
+                        <div class="modal-footer">                            
+                            <button type="button" class="btn btn-verde btnIcon"><span class="ing-aceptar"></span></button>
+                            <button type="button" class="btn btn-rojo btnIcon" data-dismiss="modal"><span class="ing-cancelar"></span></button>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <hr class="mb-3">
+            <h4 class="text-dark">Dropdownlist</h4>
+            <div class="d-flex flex-row justify-content-between align-items-start">
+                <div id="ddlNormal" class="position-relative dropdownlist mx-2">
+                    <button id="btnNormal">
+                        <label>Dropdownlist</label>
+                        <span class="ing-caret"></span>
+                    </button>
+                    <ul>
+                        <li data-id="1" class="dropdownlist-item">Opción 1</li>
+                        <li data-id="2" class="dropdownlist-item">Opción 2</li>
+                        <li data-id="3" class="dropdownlist-item">Opción 3</li>
+                    </ul>
+                </div>
+                <div id="ddlAzul1" class="position-relative dropdownlist dropdownlist-azul1 mx-2">
+                    <button id="btnAzul1">
+                        <label>Dropdownlist</label>
+                        <span class="ing-caret"></span>
+                    </button>
+                    <ul>
+                        <li data-id="1" class="dropdownlist-item">Opción 1</li>
+                        <li data-id="2" class="dropdownlist-item">Opción 2</li>
+                        <li data-id="3" class="dropdownlist-item">Opción 3</li>
+                    </ul>
+                </div>
+                <div id="ddlAzul2" class="position-relative dropdownlist dropdownlist-azul2 mx-2">
+                    <button id="btnAzul2">
+                        <label>Dropdownlist</label>
+                        <span class="ing-caret"></span>
+                    </button>
+                    <ul>
+                        <li data-id="1" class="dropdownlist-item">Opción 1</li>
+                        <li data-id="2" class="dropdownlist-item">Opción 2</li>
+                        <li data-id="3" class="dropdownlist-item">Opción 3</li>
+                    </ul>
+                </div>
+            </div>
+            <hr class="mb-3">
+            <h4 class="text-dark">Datalist</h4>
+            <div id="dlEjemplo" class="position-relative datalist">
+                <input id="inputEjemplo" class="datalist-input" type="text" placeholder="Escribe aquí el dato que buscas" autocomplete="off">
+                <span id="iconEjemplo" class="text-primary input-buscar"></span>
+                <ul style="display:none">
+                    <li data-id="1">Opción 1</li>
+                    <li data-id="2">Opción 2</li>
+                    <li data-id="3">Opción 3</li>
+                    <li data-id="4">Opción 4</li>
+                    <li data-id="5">Opción 5</li>
+                </ul>
+            </div>           
+            <hr class="mb-3">
+            <h4 class="text-dark">Mensajes</h4>
+            <div class="msgBox d-flex flex-row justify-content-center align-items-center">
+                <img src="img/triangulos.svg" class="imgBoxIzq" />
+                <img src="img/triangulos.svg" class="imgBoxDer" />
+                <hr class="hrArriba">
+                <hr class="hrAbajo">
+                <div class="display-5">Mensaje</div>
+            </div>
+            
+        </main>
+        <!--- FOOTER--->
+        <div style="isolation: isolate;">
+        <?php Template::footer(); ?>
+        </div>
+        <?php Template::getJS(array('elementos.js')); ?>
+        <script>
+        let dropdownlist_click = [false,false,false];
+        let datalist_click = [false]; //Un lugar en el arreglo por cada DataList
+        $(document).ready(function (){
+            /***** DROPDOWNLIST *****/
+            $('#btnNormal').click({elem: 'Normal'},clickDropdownList);
+            $('#btnNormal').blur({elem: 'Normal', index: 0},blurDropdownList);
+            $('#ddlNormal ul li').mousedown({index: 0},mousedownDropdownList);
+            $('#ddlNormal ul li').mouseup({elem: 'Normal', index: 0},mouseupDropdownList);
+            $('#ddlNormal ul li').click(itemDropdownList);
+            $('#btnAzul1').click({elem: 'Azul1'},clickDropdownList);
+            $('#btnAzul1').blur({elem: 'Azul1', index: 1},blurDropdownList);         
+            $('#ddlAzul1 ul li').mousedown({index: 1},mousedownDropdownList);
+            $('#ddlAzul1 ul li').mouseup({elem: 'Azul1', index: 1},mouseupDropdownList);
+            $('#ddlAzul1 ul li').click(itemDropdownList);
+            $('#btnAzul2').click({elem: 'Azul2'},clickDropdownList);
+            $('#btnAzul2').blur({elem: 'Azul2', index: 2},blurDropdownList);
+            $('#ddlAzul2 ul li').mousedown({index: 2},mousedownDropdownList);
+            $('#ddlAzul2 ul li').mouseup({elem: 'Azul2', index: 2},mouseupDropdownList);
+            $('#ddlAzul2 ul li').click(itemDropdownList);
+            
+        /***** DATALIST *****/            
+            $('#dlEjemplo ul li').mousedown({index: 0},mousedownDataList);
+            $('#dlEjemplo ul li').mouseup({elem: 'Ejemplo', index: 0},mouseupDataList);
+            $('#inputEjemplo').click({elem: 'Ejemplo'},clickDataList);
+            $('#inputEjemplo').blur({elem: 'Ejemplo', index: 0},blurDataList);
+            $('#inputEjemplo').keyup({elem: 'Ejemplo'},inputKeyUp);
+            $('#iconEjemplo').mousedown({index: 0},mousedownDataList);
+            $('#iconEjemplo').mouseup({elem: 'Ejemplo', index: 0},mouseupDataList);
+            $('#iconEjemplo').click({elem: 'Ejemplo'},limpiaInputDL);
+        });
+        </script>
+    </body>
+</html>

+ 136 - 0
empleo.php

@@ -0,0 +1,136 @@
+<?php
+session_start();
+require_once 'include/bd_pdo.php';
+require_once 'classes/MainMenu.php';
+require_once 'classes/Template.php';
+require_once 'classes/ValidaSesion.php';
+
+//CONSTANTES Y VARIABLES GLOBALES
+$menu = 44;
+$submenu = 442;
+$titulo = '';
+
+if (!isset($_SESSION['usuario_id']))
+    ValidaSesion::salirPagina();
+else {
+    if(isset($_SESSION['usuario_id']))
+        $objSesion = new ValidaSesion($pdo, $submenu);
+    else 
+        ValidaSesion::salirPagina();
+}
+if (isset($objSesion)) { 
+    $titulo = $objSesion->nombrePagina(); ?>
+<!DOCTYPE html>
+<html>
+    <head>
+	<title>Alumnos - <?php echo $titulo; ?></title>
+        <?php if ($objSesion->tieneAcceso())
+            Template::getCSS(array('jquery-ui.css','richtext.css','elementos.css','month-picker.css','secciones/empleo.css'));
+        else
+            Template::getCSS(); ?>
+    </head>
+    <body>
+        <input id="idUser" type="hidden" value="<?php echo $_SESSION['usuario_id']; ?>" />
+        <?php $menuObj = new MainMenu($_SESSION["RolUsuario_id"], $menu, $submenu, $pdo);
+        $menuObj->printMenu($titulo);
+    if ($objSesion->tieneAcceso()) { ?>
+        <main class="container-fluid marco d-flex flex-column acceso">
+            <button class="btn btn-verde align-self-end" id="btnAgregar"><i class="ing-mas mr-1"></i>Agregar un empleo</button>
+            <div class="flex-grow-1"></div>
+        </main>
+        <div class="modalGral modal fade" id="modalEmpleo" tabindex="-1" data-backdrop="static" aria-labelledby="modalConfirmar" aria-hidden="true">
+            <div class="modal-dialog modal-dialog-centered">
+                <div class="modal-content">
+                    <div class="modal-header">
+                        <h5 class="modal-title" id="titModal"></h5>
+                    </div>
+                    <div class="modal-body d-flex flex-column justify-content-start align-items-start">
+                        <label class="lblTit">Puesto</label>
+                        <input id="inputPuesto" name="puesto" type="text" placeholder="Escribe el puesto" class="mb-3">
+                        <label class="lblTit">Empresa</label>
+                        <div id="dlEmpresa" class="position-relative datalist mb-3">
+                            <input id="inputEmpresa" class="datalist-input" type="text" placeholder="Escribe el nombre de la empresa" autocomplete="off">
+                            <span id="iconEmpresa" class="text-primary input-buscar"></span>
+                            <?php
+                                $listaEmpresas = array();
+                                $stmt = $pdo->prepare("SELECT * FROM alu_fs_empresa()");
+                                if(!$stmt->execute())
+                                    print_r($stmt->errorInfo());
+                                else
+                                    $listaEmpresas = $stmt->fetchAll();
+                                $stmt->closeCursor();
+                                $stmt = null; ?>
+                            <ul style="display:none">
+                                <?php foreach ($listaEmpresas as $empresa) { ?>
+                                <li><?php echo $empresa['Trabajo_empresa']; ?></li>
+                                <?php } ?>
+                            </ul>
+                        </div>
+                        <label class="lblTit">Periodo</label>
+                        <div class="d-inline-flex justify-content-start align-items-center mb-3">
+                            <label class="mb-1 mr-2">Actualmente tengo este cargo</label>
+                            <div class="switch switch-SiNo" data-on="SI" data-off="NO" id="switchActual">
+                                <div class="span">NO</div>
+                                <input type="checkbox" id="actual" name="actual" />
+                            </div>
+                            <!--input type="checkbox" data-toggle="toggle" data-onstyle="success" data-offstyle="danger" data-on="SI" data-off="NO" id="actual" name="actual" /-->
+                        </div>
+                        <div class="alert alert-warning mb-1" role="alert">La fecha de término <b>no</b> puede ser anterior a la fecha de inicio</div>
+                        <div class="d-flex flex-row justify-content-between align-items-center mb-3">
+                            <input id="inputFechaInicio" name="fecha1" type="text" class="datepicker inputAjustado month-year-input" placeholder="Fecha de inicio" readonly>
+                            <span class="endDate mx-2">-</span>
+                            <label id="lblActualidad" class="inputAjustado mb-0" style="display: none">Actualidad</label>
+                            <input id="inputFechaFin" name="fecha2" type="text" class="datepicker endDate inputAjustado month-year-input" placeholder="Fecha de Término" readonly>
+                        </div>
+                        <label class="lblTit">Funciones</label>
+                        <textarea id="txtDescripcion" name="funciones" class="richtext" rows="10"></textarea>
+                    </div>
+                    <div class="modal-footer">                            
+                        <button type="button" class="btn btn-verde btnIcon" id="btnOkEmpleo"><span class="ing-aceptar"></span></button>
+                        <button type="button" class="btn btn-rojo btnIcon" data-dismiss="modal"><span class="ing-cancelar"></span></button>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="modalGral modal fade" id="modalEliminar" tabindex="-1" data-backdrop="static" aria-labelledby="modalEliminar" aria-hidden="true">
+            <div class="modal-dialog modal-dialog-centered">
+                <div class="modal-content">
+                    <div class="modal-body text-center display-5">¿Estás seguro de querer eliminar el empleo de <span class="text-azul1"></span>?</div>
+                    <div class="modal-footer">
+                        <button type="button" class="btn btn-verde btnIcon" id="btnOkEliminar"><span class="ing-aceptar"></span></button>
+                        <button type="button" class="btn btn-rojo btnIcon" data-dismiss="modal"><span class="ing-cancelar"></span></button>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="modal fade" id="modalAviso" tabindex="-1" aria-labelledby="modalAviso" aria-hidden="true">
+            <div class="modal-dialog modal-dialog-centered">
+                <div class="modal-content msgAviso d-flex flex-row justify-content-between align-items-stretch">
+                    <div class="modal-header iconAviso d-flex justify-content-center align-items-center"><i class="display-3 "></i></div>
+                    <div class="modal-body txtAviso flex-grow-1 d-flex flex-column justify-content-center align-items-center">
+                        <div class="display-5 msg1 indivisa-text-black mb-3"></div>
+                        <div class="mb-3 msg2"></div>
+                        <div class="rounded-pill p-2 text-white" data-dismiss="modal" aria-label="Close">Cerrar</div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    <?php } else { ?>
+        <main class="container-fluid content marco">
+            <div class="row justify-content-center" style="min-height: 600px;">
+                <img id="errorImg" class="col-sm-3" src="img/nico_error.svg" />
+                <div class="col-sm-9 display-4 d-flex flex-row justify-content-center align-items-center text-center">No tienes acceso a ésta página</div>
+            </div>
+        </main>
+    <?php } ?>
+        <div style="isolation: isolate;">
+        <?php Template::footer(); ?>
+        </div>
+        <?php if ($objSesion->tieneAcceso())
+            Template::getJS(array('jquery-ui.js','richtext.js','month-picker.js','elementos.js','secciones/empleo.js'));
+        else 
+            Template::getJS(); ?>
+    </body>
+</html>
+<?php } else 
+    ValidaSesion::salirPagina();

+ 41 - 0
error.php

@@ -0,0 +1,41 @@
+<?php
+session_start();
+require_once 'classes/MainMenu.php';
+require_once 'classes/Template.php';
+?>
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>Alumnos - Error  ☠️</title>
+        <?php Template::getCSS(); ?>
+        <style>            
+        .display-4 { word-wrap: break-word;}
+        button:has(+ .collapse.show) { border-radius: 0.25rem 0.25rem 0 0; color: var(--gray); background: var(--gray-25); }
+        .card { border-radius: 0 0.25rem 0.25rem 0.25rem; border-width: 2px; }
+        </style>
+    </head>
+    <body>
+        <?php $menuObj = new MainMenu(0, -1, -1, null);
+        $menuObj->printMenu('',true); ?>
+        <main class="container-fluid marco">            
+            <div class="row justify-content-center">
+                <img id="errorImg" class="col-sm-3" src="img/nico_error.svg" />
+                <div class="col-sm-9 d-flex flex-column">                    
+                    <div class="display-4 text-center p-2 mb-3"><?php if (isset($_SESSION['msg'])) print_r($_SESSION['msg']); else echo '¡Lo sentimos!<br>Se presentó un problema, por favor inténtalo más tarde.' ?></div>                
+                    <a class="btn btn-azul1 display-6" href="index.php"><i class="ing-regresar mr-1 small"></i>Regresar a la página principal</a>
+                </div>
+                <div class="col-sm-12 mt-4">
+                    <button class="btn btn-gris small" type="button" data-toggle="collapse" data-target="#collapseError" aria-expanded="false" aria-controls="collapseError"><i class="ing-ojo mr-1"></i>Ver Detalle del Error</button>
+                    <div class="collapse" id="collapseError">
+                        <div class="card card-body"><?php if (isset($_SESSION['error'])) print_r($_SESSION['error']); else echo 'Sin detalle' ?></div>
+                    </div>
+                </div>
+            </div>
+        </main>
+        <div style="isolation: isolate;">
+        <?php Template::footer(); ?>
+        </div>
+        <?php Template::getJS(); ?>
+    </body>
+</html>
+<?php session_destroy();

+ 146 - 0
eventos.php

@@ -0,0 +1,146 @@
+<?php
+session_start();
+require_once 'include/bd_pdo.php';
+require_once 'classes/Archivos.php';
+require_once 'classes/MainMenu.php';
+require_once 'classes/Template.php';
+require_once 'classes/ValidaSesion.php';
+
+//CONSTANTES Y VARIABLES GLOBALES
+$menu = 43;
+$submenu = 433;
+$titulo = '';
+
+if (!isset($_SESSION['usuario_id']))
+    ValidaSesion::salirPagina();
+else {
+    if(isset($_SESSION['usuario_id']))
+        $objSesion = new ValidaSesion($pdo, $submenu);
+    else 
+        ValidaSesion::salirPagina();
+}
+if (isset($objSesion)) { 
+    $titulo = $objSesion->nombrePagina();?>
+
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>Alumnos - <?php echo $titulo; ?></title>
+        <?php if($objSesion->tieneAcceso())
+            Template::getCSS(array('elementos.css', 'custominputfile.css', 'secciones/eventos.css'));
+        else
+            Template::getCSS(); ?>
+    </head>
+    <body>    
+    <input id="idUser" type="hidden" value="<?php echo $_SESSION['usuario_id']; ?>" />
+        <?php $menuObj = new MainMenu($_SESSION["RolUsuario_id"], $menu, $submenu, $pdo);
+        $menuObj->printMenu($titulo);
+    if ($objSesion->tieneAcceso()) { ?>
+        <main class="container-fluid content marco">
+            <div class="d-inline-flex flex-row flex-wrap justify-content-center justify-content-sm-start align-items-start">
+                <div id="ddlMeses" data-id="0" class="dropdownlist dropdownlist-azul1 m-2 mb-0">
+                    <button id="btnMeses"><label class="bigFont">Selecciona un mes</label><span class="ing-caret"></span></button>
+                    <ul>
+                        <li data-id="1" class="dropdownlist-item bigFont">Enero</li>
+                        <li data-id="2" class="dropdownlist-item bigFont">Febrero</li>
+                        <li data-id="3" class="dropdownlist-item bigFont">Marzo</li>
+                        <li data-id="4" class="dropdownlist-item bigFont">Abril</li>
+                        <li data-id="5" class="dropdownlist-item bigFont">Mayo</li>
+                        <li data-id="6" class="dropdownlist-item bigFont">Junio</li>
+                        <li data-id="7" class="dropdownlist-item bigFont">Julio</li>
+                        <li data-id="8" class="dropdownlist-item bigFont">Agosto</li>
+                        <li data-id="9" class="dropdownlist-item bigFont">Septiembre</li>
+                        <li data-id="10" class="dropdownlist-item bigFont">Octubre</li>
+                        <li data-id="11" class="dropdownlist-item bigFont">Noviembre</li>
+                        <li data-id="12" class="dropdownlist-item bigFont">Diciembre</li>
+                    </ul>
+                </div>
+                <div id="ddlAnios" data-id="0" class="dropdownlist dropdownlist-azul2 m-2 mb-0" style="min-width:225px;">
+                    <button id="btnAnios"><label class="bigFont">Selecciona un año</label><span class="ing-caret"></span></button>
+                    <ul>
+                        <li data-id="2020" class="dropdownlist-item bigFont">2020</li>
+                        <li data-id="2021" class="dropdownlist-item bigFont">2021</li>
+                        <li data-id="2022" class="dropdownlist-item bigFont">2022</li>
+                        <li data-id="2023" class="dropdownlist-item bigFont">2023</li>
+                    </ul>
+                </div>
+            </div>
+            <div id="eventos"></div>
+        </main>
+        <!--- MODAL --->
+        <div class="modalGral modal fade" id="modalConfirmar" tabindex="-1" data-backdrop="static" aria-labelledby="modalConfirmar" aria-hidden="true">
+            <div class="modal-dialog modal-dialog-centered">
+                <div class="modal-content">
+                    <div class="modal-body text-center display-5"></div>
+                    <div class="modal-footer">
+                        <button type="button" class="btn btn-verde btnIcon" id="btnConfirmar"><span class="ing-aceptar"></span></button>
+                        <button type="button" class="btn btn-rojo btnIcon" data-dismiss="modal"><span class="ing-cancelar"></span></button>
+                    </div>
+                </div>
+            </div>
+        </div>        
+        <div class="modalGral modal fade" id="modalSubirArchivo" tabindex="-1" data-backdrop="static" aria-labelledby="modalSubirArchivo" aria-hidden="true">
+            <div class="modal-dialog modal-dialog-centered">
+                <form id="formArchivo" class="modal-content" method="post" enctype="multipart/form-data">
+                    <div class="modal-header">
+                        <h3 class="modal-title">Cargar Evidencia</h3>
+                    </div>
+                    <div class="modal-body text-center">
+                        <div id="msgDetalle" class="display-7 text-secondary mb-3"></div>
+                        <div id="divArchivo" class="w-100 d-flex flex-column">
+                            <div class="carga text-azul2 mb-3">
+                                <div class="d-flex flex-column justify-content-center align-items-center">
+                                    <div class="display-6 text-azul2">Cargando archivo</div>
+                                    <div>
+                                        <div class="mb-2 fa-solid fa-gear fa-spin" style="color: var(--azul2);"></div>
+                                        <div class="mb-2 fa-solid fa-gear fa-spin fa-rotate-by fa-spin" style="--fa-rotate-angle: 45deg; color: var(--azul2-75);"></div>
+                                        <div class="mb-2 fa-solid fa-gear fa-spin" style="color: var(--azul2-50);"></div>
+                                        <div class="mb-2 fa-solid fa-gear fa-spin fa-rotate-by fa-spin" style="--fa-rotate-angle: 45deg; color: var(--azul2-25);"></div>
+                                        <div class="mb-2 fa-solid fa-gear fa-spin" style="color: var(--azul1-25);"></div>
+                                        <div class="mb-2 fa-solid fa-gear fa-spin fa-rotate-by fa-spin" style="--fa-rotate-angle: 45deg; color: var(--azul1-50);"></div>
+                                        <div class="mb-2 fa-solid fa-gear fa-spin" style="color: var(--azul1-75);"></div>
+                                        <div class="mb-2 fa-solid fa-gear fa-spin fa-rotate-by fa-spin" style="--fa-rotate-angle: 45deg; color: var(--azul1);"></div>
+                                    </div>
+                                </div>
+                            </div>
+                            <input id="addArchivo" name="archivo" type="file" accept=".pdf, .zip, .rar">
+                        </div>
+                    </div>
+                    <div class="modal-footer">
+                        <button type="button" class="btn btn-verde btnIcon" id="btnOkArchivo"><span class="ing-aceptar"></span></button>
+                        <button type="button" class="btn btn-rojo btnIcon" data-dismiss="modal"><span class="ing-cancelar"></span></button>
+                    </div>
+                </form>
+            </div>
+        </div>
+        <div class="modal fade" id="modalAviso" tabindex="-1" aria-labelledby="modalAviso" aria-hidden="true">
+            <div class="modal-dialog modal-dialog-centered">
+                <div class="modal-content msgAviso d-flex flex-row justify-content-between align-items-stretch">
+                    <div class="modal-header iconAviso d-flex justify-content-center align-items-center"><i class="display-3 "></i></div>
+                    <div class="modal-body txtAviso flex-grow-1 d-flex flex-column justify-content-center align-items-center">
+                        <div class="display-5 msg1 indivisa-text-black mb-3">Título</div>
+                        <div class="mb-3 msg2">Texto del Mensaje</div>
+                        <div class="rounded-pill p-2 text-white" data-dismiss="modal" aria-label="Close">Cerrar</div>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div style="isolation: isolate;">        
+    <?php }  else { ?>
+        <main class="container-fluid content marco">
+            <div class="row justify-content-center" style="min-height: 600px;">
+                <img id="errorImg" class="col-sm-3" src="img/nico_error.svg" />
+                <div class="col-sm-9 display-4 d-flex flex-row justify-content-center align-items-center text-center">No tienes acceso a ésta página</div>
+            </div>
+        </main>
+    <?php }
+        Template::footer(); ?>
+        </div>     
+    <?php if($objSesion->tieneAcceso())
+        Template::getJS(array('elementos.js', 'custominputfile.js', 'secciones/eventos.js'));
+    else
+        Template::getJS(); ?>
+    </body>
+</html>
+<?php } else 
+    ValidaSesion::salirPagina();

二进制
fonts/fa/fa-brands-400.ttf


二进制
fonts/fa/fa-brands-400.woff2


二进制
fonts/fa/fa-regular-400.ttf


二进制
fonts/fa/fa-regular-400.woff2


二进制
fonts/fa/fa-solid-900.ttf


二进制
fonts/fa/fa-solid-900.woff2


二进制
fonts/fa/fa-v4compatibility.ttf


二进制
fonts/fa/fa-v4compatibility.woff2


文件差异内容过多而无法显示
+ 4 - 0
fonts/fa/fa_all.css


二进制
fonts/facIng/ingfont.eot


文件差异内容过多而无法显示
+ 15 - 0
fonts/facIng/ingfont.svg


二进制
fonts/facIng/ingfont.ttf


二进制
fonts/facIng/ingfont.woff


二进制
fonts/indivisaFont/eot/IndivisaDisplaySans-Heavy.eot


二进制
fonts/indivisaFont/eot/IndivisaDisplaySans-HeavyItalic.eot


二进制
fonts/indivisaFont/eot/IndivisaDisplaySans-Regular.eot


二进制
fonts/indivisaFont/eot/IndivisaDisplaySans-RegularItalic.eot


二进制
fonts/indivisaFont/eot/IndivisaDisplaySans-Thin.eot


二进制
fonts/indivisaFont/eot/IndivisaDisplaySans-ThinItalic.eot


二进制
fonts/indivisaFont/eot/IndivisaTextSans-Black.eot


二进制
fonts/indivisaFont/eot/IndivisaTextSans-BlackItalic.eot


二进制
fonts/indivisaFont/eot/IndivisaTextSans-Bold.eot


二进制
fonts/indivisaFont/eot/IndivisaTextSans-BoldItalic.eot


二进制
fonts/indivisaFont/eot/IndivisaTextSans-Light.eot


二进制
fonts/indivisaFont/eot/IndivisaTextSans-LightItalic.eot


二进制
fonts/indivisaFont/eot/IndivisaTextSans-Regular.eot


二进制
fonts/indivisaFont/eot/IndivisaTextSans-RegularItalic.eot


二进制
fonts/indivisaFont/otf/IndivisaDisplaySans-Heavy.otf


二进制
fonts/indivisaFont/otf/IndivisaDisplaySans-HeavyItalic.otf


二进制
fonts/indivisaFont/otf/IndivisaDisplaySans-Regular.otf


二进制
fonts/indivisaFont/otf/IndivisaDisplaySans-RegularItalic.otf


二进制
fonts/indivisaFont/otf/IndivisaDisplaySans-Thin.otf


二进制
fonts/indivisaFont/otf/IndivisaDisplaySans-ThinItalic.otf


二进制
fonts/indivisaFont/otf/IndivisaTextSans-Black.otf


二进制
fonts/indivisaFont/otf/IndivisaTextSans-BlackItalic.otf


二进制
fonts/indivisaFont/otf/IndivisaTextSans-Bold.otf


二进制
fonts/indivisaFont/otf/IndivisaTextSans-BoldItalic.otf


二进制
fonts/indivisaFont/otf/IndivisaTextSans-Light.otf


二进制
fonts/indivisaFont/otf/IndivisaTextSans-LightItalic.otf


二进制
fonts/indivisaFont/otf/IndivisaTextSans-Regular.otf


二进制
fonts/indivisaFont/otf/IndivisaTextSans-RegularItalic.otf


文件差异内容过多而无法显示
+ 10 - 0
fonts/indivisaFont/svg/IndivisaDisplaySans-Heavy.svg


文件差异内容过多而无法显示
+ 10 - 0
fonts/indivisaFont/svg/IndivisaDisplaySans-HeavyItalic.svg


文件差异内容过多而无法显示
+ 10 - 0
fonts/indivisaFont/svg/IndivisaDisplaySans-Regular.svg


文件差异内容过多而无法显示
+ 10 - 0
fonts/indivisaFont/svg/IndivisaDisplaySans-RegularItalic.svg


文件差异内容过多而无法显示
+ 10 - 0
fonts/indivisaFont/svg/IndivisaDisplaySans-Thin.svg


文件差异内容过多而无法显示
+ 10 - 0
fonts/indivisaFont/svg/IndivisaDisplaySans-ThinItalic.svg


文件差异内容过多而无法显示
+ 11 - 0
fonts/indivisaFont/svg/IndivisaTextSans-Black.svg


文件差异内容过多而无法显示
+ 11 - 0
fonts/indivisaFont/svg/IndivisaTextSans-BlackItalic.svg


文件差异内容过多而无法显示
+ 11 - 0
fonts/indivisaFont/svg/IndivisaTextSans-Bold.svg


文件差异内容过多而无法显示
+ 11 - 0
fonts/indivisaFont/svg/IndivisaTextSans-BoldItalic.svg


文件差异内容过多而无法显示
+ 11 - 0
fonts/indivisaFont/svg/IndivisaTextSans-Light.svg


文件差异内容过多而无法显示
+ 11 - 0
fonts/indivisaFont/svg/IndivisaTextSans-LightItalic.svg


文件差异内容过多而无法显示
+ 11 - 0
fonts/indivisaFont/svg/IndivisaTextSans-Regular.svg


文件差异内容过多而无法显示
+ 11 - 0
fonts/indivisaFont/svg/IndivisaTextSans-RegularItalic.svg


部分文件因为文件数量过多而无法显示