diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index b847dc58..3c777a2e 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -2,6 +2,7 @@ # [Choice] PHP version (use -bullseye variants on local arm64/Apple Silicon): 8, 8.0, 7, 7.4, 7.3, 8-bullseye, 8.0-bullseye, 7-bullseye, 7.4-bullseye, 7.3-bullseye, 8-buster, 8.0-buster, 7-buster, 7.4-buster, 7.3-buster ARG VARIANT=7-bullseye FROM mcr.microsoft.com/vscode/devcontainers/php:0-${VARIANT} +RUN docker-php-ext-install mysqli pdo_mysql # [Choice] Node.js version: none, lts/*, 16, 14, 12, 10 ARG NODE_VERSION="none" diff --git a/README.md b/README.md index 46e2e3c5..ecb16e3a 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,8 @@ Some things to try: - Press F5 to launch the app in the container. - Once the breakpoint is hit, try hovering over variables, examining locals, and more. 1. **Running a server:** - - From the terminal, run `php -S 0.0.0.0:8000` + -php -S 0.0.0.0:8000 From the terminal, run ``php -S 0.0.0.0:8000 +` - Click "Open in Browser" in the notification that appears to access the web app on this new port. - You can view an organized table of your forwarded ports in the 'Ports' view, which can be accessed with the command **Ports: Focus on Ports View**. - Notice port 8000 in the 'Ports' view is labeled "Hello Remote World." In `devcontainer.json`, you can set `"portsAttributes"`, such as a label for your forwarded ports and the action to be taken when the port is autoforwarded. diff --git a/practicas/Proyecto 1 Escape Room/config.php b/practicas/Proyecto 1 Escape Room/config.php new file mode 100644 index 00000000..e69de29b diff --git a/practicas/Proyecto 1 Escape Room/estilos.css b/practicas/Proyecto 1 Escape Room/estilos.css new file mode 100644 index 00000000..e69de29b diff --git a/practicas/Proyecto 1 Escape Room/finish.php b/practicas/Proyecto 1 Escape Room/finish.php new file mode 100644 index 00000000..e69de29b diff --git a/practicas/Proyecto 1 Escape Room/functions.php b/practicas/Proyecto 1 Escape Room/functions.php new file mode 100644 index 00000000..e69de29b diff --git a/practicas/Proyecto 1 Escape Room/header.php b/practicas/Proyecto 1 Escape Room/header.php new file mode 100644 index 00000000..e69de29b diff --git a/practicas/Proyecto 1 Escape Room/index.php b/practicas/Proyecto 1 Escape Room/index.php new file mode 100644 index 00000000..e69de29b diff --git a/practicas/Proyecto 1 Escape Room/room.php b/practicas/Proyecto 1 Escape Room/room.php new file mode 100644 index 00000000..e69de29b diff --git a/practicas/Proyecto 1 Escape Room/uploads b/practicas/Proyecto 1 Escape Room/uploads new file mode 100644 index 00000000..e69de29b diff --git a/practicas/mini-wp2/README.TXT b/practicas/mini-wp2/README.TXT new file mode 100644 index 00000000..f0029287 --- /dev/null +++ b/practicas/mini-wp2/README.TXT @@ -0,0 +1,7 @@ +Primera pagina: formulario para iniciar session login.php +si pasa, nos llevara a index.php +y de ahi nos tiene que saludar desde un personajes.php +y no mostrara un formulario que nos pedira nuestro personaje favorita + +y en otra pagina se tendrá que ver el personaje y para cerrar sesion logout.php +header.php, el header.php debe aparecer en index.php y y en personajes.php, ese header sera dinamico diff --git a/practicas/mini-wp2/data.php b/practicas/mini-wp2/data.php new file mode 100644 index 00000000..a4ff04b4 --- /dev/null +++ b/practicas/mini-wp2/data.php @@ -0,0 +1,49 @@ + 'Noticia 1', + 'contenido' => 'Contenido de la noticia 1', + 'fecha' => '2024-10-01', + 'imagen' => 'https://via.placeholder.com/150', + 'categoria' => 'Tecnología' + ], + [ + 'titulo' => 'Noticia 2', + 'contenido' => 'Contenido de la noticia 2', + 'fecha' => '2024-10-02', + 'imagen' => 'https://via.placeholder.com/150', + 'categoria' => 'Salud' + ], + [ + 'titulo' => 'Noticia 3', + 'contenido' => 'Contenido de la noticia 3', + 'fecha' => '2024-10-03', + 'imagen' => 'https://via.placeholder.com/150', + 'categoria' => 'Deportes' + ], + [ + 'titulo' => 'Noticia 4', + 'contenido' => 'Contenido de la noticia 4', + 'fecha' => '2024-10-04', + 'imagen' => 'https://via.placeholder.com/150', + 'categoria' => 'Cultura' + ], + [ + 'titulo' => 'Noticia 5', + 'contenido' => 'Contenido de la noticia 5', + 'fecha' => '2024-10-05', + 'imagen' => 'https://via.placeholder.com/150', + 'categoria' => 'Economía' + ] + ]; +} + +// Fin de data.php +?> diff --git a/practicas/mini-wp2/form.php b/practicas/mini-wp2/form.php new file mode 100644 index 00000000..f8e287d5 --- /dev/null +++ b/practicas/mini-wp2/form.php @@ -0,0 +1,114 @@ + $titulo, + 'contenido' => $contenido, + 'fecha' => $fecha, + 'imagen' => $imagen, + 'categoria' => $categoria + ]; + + // ------------------------------ + // 5. MOSTRAMOS MENSAJE DE ÉXITO + $mensaje = "

Noticia añadida correctamente.

"; + + } else { + // ------------------------------ + // 6. MENSAJE DE ERROR SI ALGÚN CAMPO ESTÁ VACÍO + $mensaje = "

Error: Todos los campos son obligatorios.

"; + } +} +// Fin del bloque POST +?> + +, , el menú y el inicio del +include 'inc/header.php'; +?> + +
+

Añadir nueva noticia

+ + + + + +
+ +

+ + +

+ + +

+ + +

+ + +

+ + + +
+ + +

Volver a la lista de noticias

+
+ + y cierra y +include 'inc/footer.php'; +?> diff --git a/practicas/mini-wp2/inc/footer.php b/practicas/mini-wp2/inc/footer.php new file mode 100644 index 00000000..4b645165 --- /dev/null +++ b/practicas/mini-wp2/inc/footer.php @@ -0,0 +1,15 @@ + + +
+ + + + + + diff --git a/practicas/mini-wp2/inc/header.php b/practicas/mini-wp2/inc/header.php new file mode 100644 index 00000000..4898ddc9 --- /dev/null +++ b/practicas/mini-wp2/inc/header.php @@ -0,0 +1,32 @@ +, enlace a CSS y el menú de navegación +?> + + + + + + + + + Mini WordPress + + + + + + +
+ +

Mini WordPress con Array Multidimensional

+ + + +
diff --git a/practicas/mini-wp2/index.php b/practicas/mini-wp2/index.php new file mode 100644 index 00000000..30058226 --- /dev/null +++ b/practicas/mini-wp2/index.php @@ -0,0 +1,107 @@ +Noticia eliminada correctamente.

"; + } +} +?> + +, , y el menú de navegación +include 'inc/header.php'; +?> + +
+

Noticias actuales

+ + + + + + $noticia): ?> +
+ + + +

+ + +

+ + | + + +

+ + + + <?= htmlspecialchars($noticia['titulo']) ?> + + + +

+ + + +

Eliminar noticia

+ +
+ + + +

Añadir nueva noticia

+
+ + y cierra y +include 'inc/footer.php'; +?> diff --git a/practicas/mini-wp2/styles/index.css b/practicas/mini-wp2/styles/index.css new file mode 100644 index 00000000..53b3f90b --- /dev/null +++ b/practicas/mini-wp2/styles/index.css @@ -0,0 +1,153 @@ +/* ------------------------------ + ESTILOS GENERALES DEL BODY +--------------------------------*/ +body { + font-family: 'Arial', Helvetica, sans-serif; /* Tipografía clara y legible */ + margin: 0; + padding: 0; + background-color: #f4f4f9; /* Fondo suave, más agradable que un color fuerte */ + color: #333; /* Color de texto principal */ +} + +/* ------------------------------ + ENCABEZADO +--------------------------------*/ +header { + background-color: #428082; /* Azul verdoso */ + color: white; + padding: 20px 40px; + text-align: center; + box-shadow: 0 2px 5px rgba(0,0,0,0.2); +} + +header h1 { + margin: 0; + font-size: 2em; +} + +header nav ul { + list-style: none; + padding: 0; + margin: 10px 0 0 0; + display: flex; + justify-content: center; /* Centrar los enlaces del menú */ + gap: 20px; +} + +header nav a { + text-decoration: none; + color: white; + font-weight: bold; +} + +header nav a:hover { + text-decoration: underline; +} + +/* ------------------------------ + FOOTER +--------------------------------*/ +footer { + background-color: #2c5d5b; + color: white; + text-align: center; + padding: 15px; + margin-top: 40px; +} + +/* ------------------------------ + MAIN +--------------------------------*/ +main { + max-width: 1000px; /* Limita el ancho del contenido para mejor lectura */ + margin: 20px auto; + padding: 0 20px; +} + +/* ------------------------------ + FORMULARIO +--------------------------------*/ +form { + background-color: #fff; + padding: 20px; + border-radius: 12px; + box-shadow: 0 4px 10px rgba(0,0,0,0.1); +} + +form label { + display: block; + font-weight: bold; + margin-bottom: 5px; +} + +form input[type="text"], +form input[type="date"], +form input[type="url"], +form textarea { + width: 100%; + padding: 8px; + margin-bottom: 15px; + border-radius: 6px; + border: 1px solid #ccc; + font-size: 1em; +} + +form button { + background-color: #428082; + color: white; + border: none; + padding: 10px 20px; + font-size: 1em; + border-radius: 8px; + cursor: pointer; + transition: background-color 0.3s ease; +} + +form button:hover { + background-color: #2c5d5b; +} + +/* ------------------------------ + ARTÍCULOS / NOTICIAS +--------------------------------*/ +article { + background-color: white; + margin: 20px 0; + padding: 20px; + border-radius: 12px; + box-shadow: 0 4px 15px rgba(0,0,0,0.1); +} + +article h3 { + margin-top: 0; + color: #428082; +} + +article img { + max-width: 100%; + height: auto; + border-radius: 8px; + margin: 10px 0; +} + +article a { + color: #e74c3c; /* Rojo para el enlace de eliminar */ + font-weight: bold; + text-decoration: none; +} + +article a:hover { + text-decoration: underline; +} + +/* ------------------------------ + ENLACES GENERALES +--------------------------------*/ +a { + color: #428082; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} diff --git a/practicas/pp1-primera-app/demostracion.php b/practicas/pp1-primera-app/demostracion.php new file mode 100644 index 00000000..425ca8c7 --- /dev/null +++ b/practicas/pp1-primera-app/demostracion.php @@ -0,0 +1,4 @@ + diff --git a/practicas/pp1-primera-app/hola.php b/practicas/pp1-primera-app/hola.php new file mode 100644 index 00000000..5b639eca --- /dev/null +++ b/practicas/pp1-primera-app/hola.php @@ -0,0 +1,100 @@ + + + + + + Módulo 7 - Práctica 1 + + + + +
+ Logo FP Llefià +

Módulo 7 - Práctica 1. Mi primera aplicación en PHP

+
+ + +
+
+ Mi foto +

Carolina Gonzalez

+
+
+

+ Este párrafo explica el código de las áreas señaladas del archivo index.php que tenemos por defecto. + Por ejemplo, la sección del header define la navegación principal, + las columnas se organizan mediante CSS puro usando flexbox y estilos personalizados, + y el footer muestra la fecha actual utilizando PHP para generarla automáticamente. +

+
+
+ + + + + diff --git a/practicas/pp2-extra/ex4.php b/practicas/pp2-extra/ex4.php new file mode 100644 index 00000000..16318328 --- /dev/null +++ b/practicas/pp2-extra/ex4.php @@ -0,0 +1,63 @@ + + + + + Ejercicio 4 - Pares agrupados + + + +

Pares entre 50 y 500 agrupados por decenas

+ "; + echo "
De $decena a " . ($decena + 9) . "
"; //con punto por que debo incluir la operacion en medio del HTML que quiero mostrar con el echo + echo "
"; + for ($i = $decena; $i <= $decena + 9 && $i <= 500; $i++) { + if ($i % 2 == 0) { + $class = "num"; + if ($i % 12 == 0) { + $class .= " mult12"; //.= concatena strings con el espacio para pegar una clase detras de otra en el CSS + } elseif ($i % 6 == 0) { + $class .= " mult6"; + } elseif ($i % 4 == 0) { + $class .= " mult4"; + } + echo "
$i
"; + $contador++; + $sum += $i; + } + } + echo "
"; + echo "
Cantidad de elementos: $contador | Suma del Grupo De $decena a " . ($decena + 9) . ": $sum
"; + echo ""; + echo "
"; + $totalContador += $contador; + $totalSum += $sum; + } + + echo "

Total global de pares: $totalContador | Suma global: $totalSum

"; + ?> +

Volver al índice

+ + diff --git a/practicas/pp2-extra/ex5.php b/practicas/pp2-extra/ex5.php new file mode 100644 index 00000000..689c9b92 --- /dev/null +++ b/practicas/pp2-extra/ex5.php @@ -0,0 +1,76 @@ + + + + + Ejercicio 6 - Análisis de valores aleatorios con cambios de zona + + + +
+

Análisis de 30 valores aleatorios

+
+ 66) $clase = "verde"; + + // Contar pares e impares + if ($num % 2 == 0) { + $pares++; + } + else { + $impares++; + } + + // Contar cambios de zona comparando con el valor anterior + if ($i > 0 && $clase != $zonaAnterior) { + $cambios++; + } + $zonaAnterior = $clase; // Actualizamos la zona anterior + + // Mostrar el número en su div correspondiente + echo "
$num
"; + } + + // Calcular mínimo, máximo y media + $min = min($valores); + $max = max($valores); + $media = array_sum($valores) / count($valores); + + echo "
"; // cerrar grid + + // Mostrar resultados estadísticos + echo "

Mínimo: $min | Máximo: $max | Media: " . number_format($media, 2) . "

"; + echo "

Pares: $pares | Impares: $impares | Cambios de zona: $cambios

"; + + // Leyenda de colores + echo "

Leyenda: Azul < 33 | Gris 33–66 | Verde > 66

"; + ?> +
+ +

Volver al índice

+ + diff --git a/practicas/pp2-extra/index.php b/practicas/pp2-extra/index.php new file mode 100644 index 00000000..51a4aed3 --- /dev/null +++ b/practicas/pp2-extra/index.php @@ -0,0 +1,34 @@ + + + + + Práctica 2 - PHP + + + +

Práctica 2 - PHP

+ Ejercicio 1: Números pares + Ejercicio 2: Tablas de multiplicar + Ejercicio 3: Número par o impar + Ejercicio Extra 1: Divisores y número primo + Ejercicio Extra 2: El hombre del tiempo + +

Parte EXTRA de PP2

+ Ejercicio 4: Pares 50-500 agrupados + Ejercicio 6: Análisis de valores aleatorios + + \ No newline at end of file diff --git a/practicas/pp2/ex1.php b/practicas/pp2/ex1.php new file mode 100644 index 00000000..b724a371 --- /dev/null +++ b/practicas/pp2/ex1.php @@ -0,0 +1,25 @@ + + + + + Ejercicio 1 - Números pares + + + +

Números pares del 50 al 500

+ $i"; + } + ?> +

Volver al índice

+ + diff --git a/practicas/pp2/ex2.php b/practicas/pp2/ex2.php new file mode 100644 index 00000000..dea3ee14 --- /dev/null +++ b/practicas/pp2/ex2.php @@ -0,0 +1,31 @@ + + + + + Ejercicio 2 - Tablas de multiplicar + + + +

Tablas de multiplicar (1 al 10)

+

Tabla del $n

"; + for ($m = 1; $m <= 9; $m++) { + $res = $n * $m; + echo "$n x $m = $res
"; + } + echo ""; + } + ?> +

Volver al índice

+ + diff --git a/practicas/pp2/ex3.php b/practicas/pp2/ex3.php new file mode 100644 index 00000000..7fc20b7f --- /dev/null +++ b/practicas/pp2/ex3.php @@ -0,0 +1,23 @@ + + + + + Ejercicio 3 - Número aleatorio + + + +

Número aleatorio entre 0 y 100

+ $num es PAR"; + } else { + echo "
$num es IMPAR
"; + } + ?> +

Volver al índice

+ + diff --git a/practicas/pp2/extra1.php b/practicas/pp2/extra1.php new file mode 100644 index 00000000..e8949af3 --- /dev/null +++ b/practicas/pp2/extra1.php @@ -0,0 +1,74 @@ + + + + + Ejercicio Extra 1 - Divisores y primo + + + +
+ Número generado: $num"; + echo "

Divisores de $num:

"; + + $contador = 0; + echo "
"; + for ($i = 1; $i <= $num; $i++) { + if ($num % $i == 0) { + echo "
$i
"; + $contador++; + } + } + echo "
"; + + if ($contador == 2) { + echo "

$num es un número primo.

"; + } else { + echo "

$num no es un número primo.

"; + } + ?> +
+

Volver al índice

+ + diff --git a/practicas/pp2/extra2.php b/practicas/pp2/extra2.php new file mode 100644 index 00000000..f504cf85 --- /dev/null +++ b/practicas/pp2/extra2.php @@ -0,0 +1,77 @@ + + + + + Ejercicio Extra 2 - El hombre del tiempo + + + +
+

Clasificación de Temperaturas

+
+ $temp °C
Frío
"; + } elseif ($temp <= 25) { + echo "
$temp °C
Temperatura Suave
"; + } else { + echo "
$temp °C
Calor
"; + } + } + + $media = $suma / $cantidad; + echo "
"; + echo "

Media de las temperaturas: " . number_format($media, 2) . " °C

"; // con . por que estoy incluyendo una funcion en el medio del HTML que despliego + ?> + + +

Volver al índice

+ + diff --git a/practicas/pp2/index.php b/practicas/pp2/index.php new file mode 100644 index 00000000..4e3df40f --- /dev/null +++ b/practicas/pp2/index.php @@ -0,0 +1,30 @@ + + + + + Práctica 2 - PHP + + + +

Práctica 2 - PHP

+ Ejercicio 1: Números pares + Ejercicio 2: Tablas de multiplicar + Ejercicio 3: Número par o impar + Ejercicio Extra 1: Divisores y número primo + Ejercicio Extra 2: El hombre del tiempo + + diff --git a/practicas/pp3/detalle.php b/practicas/pp3/detalle.php new file mode 100644 index 00000000..a947ae77 --- /dev/null +++ b/practicas/pp3/detalle.php @@ -0,0 +1,252 @@ + + + + + + + Detalle - <?php echo $pelicula['nombre']; ?> + + + + + + + + + + + + + +
+
+ +
+ + Imagen de <?php echo $pelicula['nombre']; ?> +
+ + +
+ ' . $pelicula['nombre'] . ''; + + // Sinopsis + echo '

Sinopsis: ' . $pelicula['sinopsis'] . '

'; + + // Duración + echo '

Duración: ' . $pelicula['duracion'] . '

'; + + // Director + echo '

Director: ' . $pelicula['director'] . '

'; + + // Reparto (solo si existe y es un array) + if (!empty($pelicula['reparto']) && is_array($pelicula['reparto'])) { + echo '

Reparto: ' . implode(", ", $pelicula['reparto']) . '

'; + } + + // Clasificación por edad + echo '

Clasificación: ' . $pelicula['calificacion'] . '

'; + + // Género + echo '

Género: ' . $pelicula['genero'] . '

'; + + + // Algunas películas tienen una valoración numérica (de 0 a 10). + // Queremos mostrarla como estrellas (de 1 a 5) y el valor numérico. + + // Supongamos que tenemos una película con: + // $pelicula["valoracion"] = 8.4; + // + // El objetivo es convertir esa valoración de 0 a 10 + // en un sistema visual de estrellas (de 1 a 5) y mostrar ambas formas. + // + // Verificamos que el arreglo $pelicula contenga la clave "valoracion". + // Convertimos el valor a número decimal (float). + // Reducimos la escala de 10 a 5 dividiendo por 2 y redondeando al entero mas cercano + // Generamos una cadena con estrellas llenas (⭐) y vacías (☆). + // Mostramos el resultado con formato HTML. + // + // Resultado esperado (para 8.4): + // Valoración: ⭐⭐⭐⭐☆ (8.4/10) + if (isset($pelicula["valoracion"])) { + // Convertimos la valoración de 10 puntos a 5 estrellas + $valoracion10 = (float)$pelicula["valoracion"]; + $valoracion5 = round($valoracion10 / 2); + + // Generamos las estrellas visuales con str_repeat() + // "⭐" se repite tantas veces como $valoracion5 + // "☆" se repite el resto hasta completar 5 + $estrellas = str_repeat("⭐", $valoracion5) . str_repeat("☆", 5 - $valoracion5); + + // La función str_repeat(cadena, número) repite una cadena tantas veces + // como se indique en el segundo parámetro. + // + // Ejemplo básico: + // str_repeat("⭐", 3) -> "⭐⭐⭐" + // + // En este contexto: + // - str_repeat("⭐", $valoracion5) genera las estrellas llenas, + // según la valoración redondeada (por ejemplo, 4 -> "⭐⭐⭐⭐"). + // - str_repeat("☆", 5 - $valoracion5) genera las estrellas vacías + // para completar un total de 5 (por ejemplo, si $valoracion5 = 4, + // entonces 5 - 4 = 1 -> "☆"). + // + // Luego ambas cadenas se concatenan: + // "⭐⭐⭐⭐" . "☆" = "⭐⭐⭐⭐☆" + + + // Mostramos el resultado final + echo '

Valoración: ' . $estrellas . ' (' . $valoracion10 . '/10)

'; + } + + // Horarios como enlaces + echo '

Horarios: '; + foreach ($pelicula['horarios'] as $horario) { + echo '' . $horario . ''; + } + echo '

'; + + // Botón para ver el tráiler (lleva a trailer.php?id) + // Botón para regresar a la cartelera (index.php) + echo 'Ver tráiler '; + echo 'Volver a cartelera'; + ?> +
+
+ + + + + + + + + + + +
+ + + + + + + diff --git a/practicas/pp3/imagenes/facebook.png b/practicas/pp3/imagenes/facebook.png new file mode 100644 index 00000000..cf08d894 Binary files /dev/null and b/practicas/pp3/imagenes/facebook.png differ diff --git a/practicas/pp3/imagenes/iconoLista.png b/practicas/pp3/imagenes/iconoLista.png new file mode 100644 index 00000000..a1b62a7b Binary files /dev/null and b/practicas/pp3/imagenes/iconoLista.png differ diff --git a/practicas/pp3/imagenes/iconoTabla.png b/practicas/pp3/imagenes/iconoTabla.png new file mode 100644 index 00000000..ef2f13a0 Binary files /dev/null and b/practicas/pp3/imagenes/iconoTabla.png differ diff --git a/practicas/pp3/imagenes/instagram.png b/practicas/pp3/imagenes/instagram.png new file mode 100644 index 00000000..9d5713df Binary files /dev/null and b/practicas/pp3/imagenes/instagram.png differ diff --git a/practicas/pp3/imagenes/logo.png b/practicas/pp3/imagenes/logo.png new file mode 100644 index 00000000..f612d5a7 Binary files /dev/null and b/practicas/pp3/imagenes/logo.png differ diff --git a/practicas/pp3/imagenes/tiktok.png b/practicas/pp3/imagenes/tiktok.png new file mode 100644 index 00000000..8a7cf586 Binary files /dev/null and b/practicas/pp3/imagenes/tiktok.png differ diff --git a/practicas/pp3/imagenes/x.png b/practicas/pp3/imagenes/x.png new file mode 100644 index 00000000..1332d613 Binary files /dev/null and b/practicas/pp3/imagenes/x.png differ diff --git a/practicas/pp3/index.php b/practicas/pp3/index.php new file mode 100644 index 00000000..2973cf27 --- /dev/null +++ b/practicas/pp3/index.php @@ -0,0 +1,265 @@ + + + + + + Cartelera - Cinemes Màgic Badalona + + + + + + + + + + +
+
+ + +
+

Cartelera

+
+ + +
+
+ + +
+ +
+ + +
+
+ + +
+ $pelicula) { + + // Cada película ocupa una columna del grid + echo '
'; + echo '
'; + echo '' . $pelicula['nombre'] . ''; + echo '
'; + echo '
' . $pelicula['nombre'] . '
'; + echo '

Horarios: ' . implode(", ", $pelicula['horarios']) . '

'; + echo 'Ver tráiler'; + echo 'Ver más info'; + echo '
'; + echo '
'; + echo '
'; + } + ?> +
+
+
+ + + + + + + + + diff --git a/practicas/pp3/pelicules.php b/practicas/pp3/pelicules.php new file mode 100644 index 00000000..7653db24 --- /dev/null +++ b/practicas/pp3/pelicules.php @@ -0,0 +1,272 @@ + "AFTERBURN", + "imagen" => "https://www.ocinemagic.es//images/pelicules/8908.jpg", + "horarios" => ["20:40", "22:40"], + "sinopsis" => "Después de que una erupción solar masiva destruyera el hemisferio oriental de la Tierra, un envalentonado cazatesoros a sueldo viaja a Europa para encontrar la codiciada Mona Lisa, solo para descubrir que lo que el mundo realmente necesita es un héroe, no una pintura.", + "duracion" => "105 min", + "director" => "J.J Perry", + "reparto" => ["Olga Kurylenko", "Kristofer Hivju", "Dave Bautista", "Samuel L. Jackson"], + "calificacion" => "+16", + "genero" => "Ciencia ficción", + "trailer" => "https://www.youtube.com/watch?v=yhCPdFOrFvI", + "valoracion" => 7.8, + "imagenes_extra" => [ + "https://m.media-amazon.com/images/M/MV5BNGJhMjZiYzMtYTBjOS00MWFjLWEwZTItNTRjNDc1Y2Q5N2UwXkEyXkFqcGc@._V1_.jpg", + "https://www.accioncine.es/wp-content/uploads/2025/09/afterburn-2-1024x576.jpg", + "https://decine21.com/img/upload/obras/afterburn-50694/afterburn-50694-e1.jpg", + "https://images.justwatch.com/backdrop/336141420/s640/cazadores-del-fin-del-mundo" + ] + ], + [ + "nombre" => "El Gran Premio: A Todo Gas", + "imagen" => "https://www.ocinemagic.es//images/pelicules/8794.jpg", + "horarios" => ["15:30", "18:30", "21:30"], + "sinopsis" => "Edda sueña con convertirse en piloto de carreras. Inesperadamente, su deseo se hace realidad: ¡éste pasa de ser un parque de atracciones en decadencia a un circuito de competición! Junto a su ídolo, el piloto Ed, afrontará los desafíos del Gran Premio de Europa y descubrirá un complot para sabotear la carrera. ¿Conseguirán salvar la competición y evitar el cierre del parque?", + "duracion" => "152 min", + "director" => "Waldemas Fast", + "reparto" => ["Christian Bale", "Heath Ledger", "Aaron Eckhart"], + "calificacion" => "Apta", + "genero" => "Acción / Superhéroes", + "trailer" => "https://www.youtube.com/watch?v=zWcWGvMfKY0", + "valoracion" => 8.1, + "imagenes_extra" => [ + "https://www.bizcochito.es/Films/Gallery03/tt32897929.webp", + "https://www.bizcochito.es/Films/Gallery02/tt32897929.webp", + "https://m.media-amazon.com/images/M/MV5BNzI4MzhlY2QtN2QxMC00ZmY2LTk1NjMtMmY2MjM3ZWUxZWFhXkEyXkFqcGc@._V1_.jpg", + "https://www.ecartelera.com/images/img/242600/242619_el-gran-premio-a-todo-gas.jpg" + ] + ], + [ + "nombre" => "El Cautivo", + "imagen" => "https://www.ocinemagic.es//images/pelicules/8853.jpg", + "horarios" => ["16:00", "18:10", "19:45", "22:15"], + "sinopsis" => "Año 1575. El joven soldado Miguel de Cervantes es capturado en alta mar por corsarios árabes y llevado a Argel como rehén. Consciente de que allí le espera una cruel muerte si su familia no paga pronto su rescate, Miguel encontrará refugio en su pasión por contar historias. Sus fascinantes relatos devuelven la esperanza a sus compañeros de prisión y acaban por llamar la atención de Hasán, el misterioso y temido Bajá de Argel, con el que comienza a desarrollar una extraña afinidad. Mientras los conflictos crecen entre sus compañeros, Miguel, llevado por su inquebrantable optimismo, comenzará a idear un arriesgado plan de fuga.", + "duracion" => "133 min", + "director" => "Alejandro Amenábar", + "reparto" => ["Julio Peña Fernández", "Alessandro Borghi", "Miguel Rellán", "Fernando Tejero"], + "calificacion" => "+12", + "genero" => "Drama", + "trailer" => "https://www.youtube.com/watch?v=Zy4GBAoS7l4", + "valoracion" => 8.7, + "imagenes_extra" => [ + "https://s3.ppllstatics.com/rc/www/multimedia/2025/09/11/el-cautivo-kY6D-U2302902285787q1C-1200x840@RC.jpg", + "https://www.cameraandlightmag.com/wp-content/uploads/2025/06/EL-CAUTIVO-A.Amenabar-Julio-Pena-Roberto-Alamo-LuciaFaraig-MG_0785-1.jpg", + "https://imagenes.20minutos.es/files/image_1920_1080/uploads/imagenes/2025/09/11/68c2dd147a5cd.jpeg", + "https://hips.hearstapps.com/vidthumb/images/mg-0096-68c2c855cc0db.jpg?crop=0.9997037037037038xw:1xh;center,top&resize=1200:*" + ] + ], + [ + "nombre" => "Expediente Warren: El Último Rito", + "imagen" => "https://www.ocinemagic.es//images/pelicules/8672.jpg", + "horarios" => ["14:00", "18:00", "22:00"], + "sinopsis" => "El siguiente capítulo en la historia de Ed y Lorraine Warren.", + "duracion" => "135 min", + "director" => " Michael Chaves", + "reparto" => ["Patrick Wilson", "Vera Farmiga", "Mia Tomlinson", "Ben Hardy"], + "calificacion" => "+16", + "genero" => "Terrot", + "trailer" => "https://www.youtube.com/watch?v=CtFXWuYKnp8", + "valoracion" => 7.2, + "imagenes_extra" => [ + "https://www.ocinemagic.es/images/extra/warren1.jpg", + "https://www.ocinemagic.es/images/extra/warren2.jpg", + "https://www.ocinemagic.es/images/extra/warren3.jpg", + "https://www.ocinemagic.es/images/extra/warren4.jpg" + ] + ], + [ + "nombre" => "F1 La Pelicula", + "imagen" => "https://www.ocinemagic.es//images/pelicules/8260.jpg", + "horarios" => ["16:30", "20:30"], + "sinopsis" => "Apodado 'el más grande que nunca existió', Sonny Hayes fue el fenómeno más prometedor de la FORMULA 1 en la década de 1990 hasta que un accidente en la pista casi acaba con su carrera. Treinta años después, es un piloto de alquiler nómada cuando se le acerca su antiguo compañero de equipo Rubén Cervantes, propietario de un equipo de Fórmula 1 en apuros que está al borde del colapso. Rubén convence a Sonny para que regrese a la Fórmula 1 y tenga una última oportunidad de salvar el equipo y ser el mejor del mundo. Pilotará junto a Joshua Pearce, el novato del equipo que quiere marcar su propio ritmo. Pero a medida que rugen los motores, el pasado de Sonny le atrapa y descubre que en la FÓRMULA 1, tu compañero de equipo es tu competencia más feroz, y que el camino hacia la redención no es algo que puedas recorrer solo.", + "duracion" => "155 min", + "director" => "Joseph Kosinski", + "reparto" => ["Brad Pitt", "Javier Bardem", "Damson Idris", "Kerry Condon"], + "calificacion" => "+12", + "genero" => "Drama", + "trailer" => "https://www.youtube.com/watch?v=kVrqfYjkTdQ", + "valoracion" => 8.4, + "imagenes_extra" => [ + "https://www.ocinemagic.es/images/extra/f1_1.jpg", + "https://www.ocinemagic.es/images/extra/f1_2.jpg", + "https://www.ocinemagic.es/images/extra/f1_3.jpg", + "https://www.ocinemagic.es/images/extra/f1_4.jpg" + ] + ], + [ + "nombre" => "Guardianes de la Noche", + "imagen" => "https://www.ocinemagic.es//images/pelicules/8705.jpg", + "horarios" => ["15:00", "19:00", "22:30"], + "sinopsis" => "La serie 'Guardianes de la Noche', también conocida como Kimetsu no Yaiba, sigue la historia de Tanjiro Kamado, un joven que se convierte en cazador de demonios después de que su familia es asesinada y su hermana Nezuko es convertida en demonio. La trama se desarrolla en el Japón de la era Taisho y se centra en la lucha de Tanjiro para proteger a la humanidad y encontrar una cura para Nezuko.", + "duracion" => "155 min", + "director" => "Haruo Sotozaki", + "reparto" => " ", + "calificacion" => "+16", + "genero" => "Animación Anim", + "trailer" => "https://www.youtube.com/watch?v=X3E4zogzWsY", + "valoracion" => 9.1, + "imagenes_extra" => [ + "https://www.ocinemagic.es/images/extra/guardianes1.jpg", + "https://www.ocinemagic.es/images/extra/guardianes2.jpg", + "https://www.ocinemagic.es/images/extra/guardianes3.jpg", + "https://www.ocinemagic.es/images/extra/guardianes4.jpg" + ] + ], + [ + "nombre" => "Avatar: El sentido del agua", + "imagen" => "https://www.ocinemagic.es//images/pelicules/8918.jpg", + "horarios" => ["17:00", "20:00", "23:00"], + "sinopsis" => "Jake Sully y Neytiri luchan por proteger su hogar en Pandora frente a nuevas amenazas.", + "duracion" => "192 ", + "director" => "James Cameron", + "reparto" => ["Sam Worthington", "Zoe Saldana", "Sigourney Weaver"], + "calificacion" => "+13", + "genero" => "Ciencia ficción / Aventuras", + "trailer" => "https://www.youtube.com/watch?v=FSyWAxUg3Go", + "valoracion" => 8.5, + "imagenes_extra" => [ + "https://www.ocinemagic.es/images/extra1_avatar2.jpg", + "https://www.ocinemagic.es/images/extra2_avatar2.jpg" + ] + ], + [ + "nombre" => "Dora: Aventuras Mágicas", + "imagen" => "https://www.ocinemagic.es//images/pelicules/8991.jpg", + "horarios" => ["10:30", "13:30", "16:30"], + "sinopsis" => "Dora se embarca en un viaje mágico para rescatar a sus amigos y descubrir tesoros escondidos.", + "duracion" => "95 min", + "director" => "James Bobin", + "reparto" => ["Isabela Moner", "Michael Peña", "Eva Longoria"], + "calificacion" => "Apta", + "genero" => "Animación / Infantil", + "trailer" => "https://www.youtube.com/watch?v=VR3VzzKTIe0", + "valoracion" => 6.0, + "imagenes_extra" => [ + "https://www.ocinemagic.es/images/extra1_dora.jpg", + "https://www.ocinemagic.es/images/extra2_dora.jpg" + ] + ], + [ + "nombre" => "La Sospecha de Sofía", + "imagen" => "https://www.ocinemagic.es//images/pelicules/8962.jpg", + "horarios" => ["19:00", "21:30"], + "sinopsis" => "Sofía se ve envuelta en un misterio que amenaza con revelar secretos ocultos de su familia.", + "duracion" => "110 min", + "director" => "Juan Pérez", + "reparto" => ["Ana de Armas", "Javier Gutiérrez"], + "calificacion" => "+12", + "genero" => "Thriller", + "trailer" => "https://www.youtube.com/watch?v=5c0d82QtKiw", + "valoracion" => 7.0, + "imagenes_extra" => [ + "https://www.ocinemagic.es/images/extra1_sofia.jpg", + "https://www.ocinemagic.es/images/extra2_sofia.jpg" + ] + ], + [ + "nombre" => "Los 4 Fantásticos", + "imagen" => "https://www.ocinemagic.es//images/pelicules/8590.jpg", + "horarios" => ["18:00", "21:00"], + "sinopsis" => "Un grupo de jóvenes adquiere superpoderes y debe enfrentarse a villanos que amenazan al mundo.", + "duracion" => "130 min", + "director" => "Josh Trank", + "reparto" => ["Miles Teller", "Michael B. Jordan", "Kate Mara", "Jamie Bell"], + "calificacion" => "+13", + "genero" => "Superhéroes / Acción", + "trailer" => "https://www.youtube.com/watch?v=-c3DOvZ2uNY", + "valoracion" => 5.5, + "imagenes_extra" => [ + "https://www.ocinemagic.es/images/extra1_4fantasticos.jpg", + "https://www.ocinemagic.es/images/extra2_4fantasticos.jpg" + ] + ], + [ + "nombre" => "Los Tipos Malos 2", + "imagen" => "https://www.ocinemagic.es//images/pelicules/8826.jpg", + "horarios" => ["12:00", "15:00", "18:00"], + "sinopsis" => "Los villanos se enfrentan a nuevas aventuras y desafíos en su intento de redimirse.", + "duracion" => "105 min", + "director" => "Pierre Coffin", + "reparto" => ["Pierre Coffin", "Steve Carell", "Kristen Wiig"], + "calificacion" => "Apta", + "genero" => "Animación / Comedia", + "trailer" => "https://www.youtube.com/watch?v=PnUcgVUuYjs", + "valoracion" => 7.1, + "imagenes_extra" => [ + "https://www.ocinemagic.es/images/extra1_malostipos2.jpg", + "https://www.ocinemagic.es/images/extra2_malostipos2.jpg" + ] + ], + [ + "nombre" => "Maleficio: La Regla de Osha", + "imagen" => "https://www.ocinemagic.es//images/pelicules/8964.jpg", + "horarios" => ["20:00", "22:30"], + "sinopsis" => "Un antiguo mal amenaza con despertar y solo Osha puede detenerlo siguiendo la regla prohibida.", + "duracion" => "120 min", + "director" => "Luis Ortega", + "reparto" => ["Maribel Verdú", "Álvaro Morte"], + "calificacion" => "+16", + "genero" => "Terror / Suspense", + "trailer" => "https://www.youtube.com/watch?v=q4i58tRRYLQ", + "valoracion" => 6.5, + "imagenes_extra" => [ + "https://www.ocinemagic.es/images/extra1_maleficio.jpg", + "https://www.ocinemagic.es/images/extra2_maleficio.jpg" + ] + ], + [ + "nombre" => "Maspalomas", + "imagen" => "https://www.ocinemagic.es//images/pelicules/8925.jpg", + "horarios" => ["14:00", "17:00", "20:00"], + "sinopsis" => "Un grupo de amigos vive aventuras inesperadas en las playas de Maspalomas durante el verano.", + "duracion" => "100 min", + "director" => "Carlos Saura", + "reparto" => ["Antonio Banderas", "Penélope Cruz"], + "calificacion" => "+7", + "genero" => "Comedia / Aventura", + "trailer" => "https://www.youtube.com/watch?v=04IgH93jsWw", + "valoracion" => 6.8, + "imagenes_extra" => [ + "https://www.ocinemagic.es/images/extra1_maspalomas.jpg", + "https://www.ocinemagic.es/images/extra2_maspalomas.jpg" + ] + ], + [ + "nombre" => "Un Gran Viaje Atrevido y Maravilloso", + "imagen" => "https://www.ocinemagic.es//images/pelicules/8893.jpg", + "horarios" => ["11:00", "14:00", "17:00"], + "sinopsis" => "Una emocionante aventura donde un grupo de amigos se embarca en un viaje lleno de sorpresas y maravillas.", + "duracion" => "115 min", + "director" => "Fernando Trueba", + "reparto" => ["Javier Cámara", "Candela Peña"], + "calificacion" => "Apta", + "genero" => "Aventura / Familiar", + "trailer" => "https://www.youtube.com/watch?v=QuOH2kRMU1Q", + "valoracion" => 7.5, + "imagenes_extra" => [ + "https://www.ocinemagic.es/images/extra1_viaje.jpg", + "https://www.ocinemagic.es/images/extra2_viaje.jpg" + ] + ], + [ + "nombre" => "Sin Cobertura", + "imagen" => "https://www.ocinemagic.es//images/pelicules/8768.jpg", + "horarios" => ["17:30", "20:30", "23:00"], + "sinopsis" => "Una comedia dramática española donde un grupo de amigos intenta sobrevivir a la vida moderna sin perder la conexión entre ellos.", + "duracion" => "105 min", + "director" => "Juan García", + "reparto" => ["María León", "Javier Gutiérrez", "Aura Garrido"], + "calificacion" => "+12", + "genero" => "Comedia / Drama", + "trailer" => "https://www.youtube.com/watch?v=oxymkDDPgCc", + "valoracion" => 7.0, + "imagenes_extra" => [ + "https://www.ocinemagic.es/images/extra1_sincobertura.jpg", + "https://www.ocinemagic.es/images/extra2_sincobertura.jpg" + ] + ], +]; + +?> diff --git a/practicas/pp3/trailer.php b/practicas/pp3/trailer.php new file mode 100644 index 00000000..e9fe4b3a --- /dev/null +++ b/practicas/pp3/trailer.php @@ -0,0 +1,108 @@ + + + + + + + + + + <?= htmlspecialchars($pelicula['nombre'], ENT_QUOTES); ?> - Tráiler + + + + + + + + +
+

Tráiler -

+
+ + +
+ + +
+ + + +
+ + Volver a la cartelera +
+ + + + + diff --git a/practicas/pp4/tienda/assets/logo_mercadona.jpg b/practicas/pp4/tienda/assets/logo_mercadona.jpg new file mode 100644 index 00000000..0073301d Binary files /dev/null and b/practicas/pp4/tienda/assets/logo_mercadona.jpg differ diff --git a/practicas/pp4/tienda/data/notas.txt b/practicas/pp4/tienda/data/notas.txt new file mode 100644 index 00000000..2d8c443d --- /dev/null +++ b/practicas/pp4/tienda/data/notas.txt @@ -0,0 +1,3 @@ +foto: + +https://media.licdn.com/dms/image/v2/D4D03AQHTZRjzO36pjg/profile-displayphoto-shrink_200_200/profile-displayphoto-shrink_200_200/0/1678238223269?e=2147483647&v=beta&t=oYX54R_gpHn7kGydlw3ii7hKPjzGEI4niTttM5Ym0Z4 \ No newline at end of file diff --git a/practicas/pp4/tienda/data/productos.php b/practicas/pp4/tienda/data/productos.php new file mode 100644 index 00000000..ba1a9fe1 --- /dev/null +++ b/practicas/pp4/tienda/data/productos.php @@ -0,0 +1,102 @@ + 'manzana', + + // 'precio' se define como número (tipo float) y no como texto. + // Esto es importante porque luego lo formatearemos con number_format() + // dentro de la tabla de productos. + 'precio' => 0.75, + + // 'disponible' indica si el producto está en stock. + // Usamos un valor booleano true/false, no texto. + // Posteriormente, en generarTablaProductos(), usaremos un operador ternario + // para mostrar “En stock” o “Agotado” en función de este valor. + 'disponible' => true, + + // 'descripcion' da información adicional del producto. + // Este campo fue agregado como tarea adicional para ampliar la práctica. + // Se mostrará en una columna extra de la tabla, ayudando a ver cómo se manejan cadenas. + 'descripcion' => 'Manzana roja, paquete 1kg' + ], + + [ + 'nombre' => 'pan', + 'precio' => 1.20, + 'disponible' => true, + 'descripcion' => 'Pan integral artesanal 500g' + ], + + [ + 'nombre' => 'leche', + 'precio' => 0.95, + // En este caso marcamos “false” para simular un producto agotado. + // Esto nos servirá para probar el formato condicional: + // en la tabla, esa fila se mostrará en color rojo. + 'disponible' => false, + 'descripcion' => 'Leche semi-desnatada 1L' + ], + + [ + 'nombre' => 'cafe', + 'precio' => 3.50, + 'disponible' => true, + 'descripcion' => 'Café molido 250g' + ], + + [ + 'nombre' => 'huevos', + 'precio' => 2.30, + 'disponible' => false, + 'descripcion' => 'Docena de huevos tamaño M' + ], +]; + +// +// Cómo se conecta con lo que ya hicimos: +// - En index.php, después de recibir los datos del formulario, incluimos este archivo con: +// require_once __DIR__ . '/data/productos.php'; +// Eso carga este array en memoria y deja disponible la variable $productos. +// - Luego, la función generarTablaProductos($productos) (definida en includes/funciones.php) +// recorrerá este array con un bucle foreach para generar una tabla HTML. +// +// Cómo se usará después: +// - En la tabla, la función utilizará ucfirst() sobre 'nombre' para capitalizarlo, +// y number_format() sobre 'precio' para mostrarlo con dos decimales. +// - También usará un operador ternario sobre 'disponible' para decidir el texto “En stock” o “Agotado”, +// aplicando un color rojo a la fila cuando esté agotado. +// - La 'descripcion' se mostrará como una columna extra, cumpliendo la tarea adicional. +// +// Orden lógico en la práctica completa: +// inicio.php → recoge datos del usuario +// index.php → recibe datos, carga productos y funciones +// productos.php → proporciona los datos +// funciones.php → transforma los datos en HTML (tabla y contacto) +// header/footer → dan estructura visual consistente +// + diff --git a/practicas/pp4/tienda/includes/footer.php b/practicas/pp4/tienda/includes/footer.php new file mode 100644 index 00000000..afdb4d28 --- /dev/null +++ b/practicas/pp4/tienda/includes/footer.php @@ -0,0 +1,6 @@ + + diff --git a/practicas/pp4/tienda/includes/funciones.php b/practicas/pp4/tienda/includes/funciones.php new file mode 100644 index 00000000..c27d0137 --- /dev/null +++ b/practicas/pp4/tienda/includes/funciones.php @@ -0,0 +1,406 @@ + con sus datos + * 5. Se aplica formato condicional (rojo si está agotado) + * 6. Se cierra la tabla y se retorna todo el HTML generado + */ +function generarTablaProductos($productos) { + // ----------------------------------------------------------------------- + // PASO 1: Inicializar la variable que contendrá todo el HTML + // ----------------------------------------------------------------------- + // Usamos una variable string que iremos "acumulando" con el operador .= + // Esto es más eficiente que hacer múltiples "echo" y nos permite + // retornar todo el HTML de una vez para que quien llame a la función + // decida dónde y cuándo mostrarlo. + + $html = ''; // String vacío que iremos llenando + + // ----------------------------------------------------------------------- + // PASO 2: Construir el inicio de la tabla con clases de Bootstrap + // ----------------------------------------------------------------------- + // Bootstrap proporciona clases CSS para tablas bonitas y responsivas: + // - "table": estilo base de tabla + // - "table-striped": alterna colores en las filas (zebra) + // - "table-hover": efecto hover al pasar el ratón + // - "table-bordered": añade bordes a las celdas + + $html .= ''; + + // ----------------------------------------------------------------------- + // PASO 3: Crear el encabezado de la tabla () + // ----------------------------------------------------------------------- + // El thead contiene los nombres de las columnas. + // Usamos '; // table-dark: fondo oscuro para el header + $html .= ''; // = table row (fila) + $html .= ''; // Columna 1: nombre del producto + $html .= ''; // Columna 2: precio + $html .= ''; // Columna 3: stock + $html .= ''; // Columna 4: descripción adicional + $html .= ''; + $html .= ''; + + // ----------------------------------------------------------------------- + // PASO 4: Crear el cuerpo de la tabla () + // ----------------------------------------------------------------------- + // Aquí es donde irán todas las filas con los datos de los productos. + + $html .= ''; + + // ----------------------------------------------------------------------- + // PASO 5: Recorrer el array de productos con FOREACH + // ----------------------------------------------------------------------- + // CONCEPTO CLAVE - FOREACH: + // foreach es una estructura de control que recorre arrays. + // Sintaxis: foreach ($array as $elemento) + // En cada iteración, $elemento toma el valor del siguiente item del array. + // + // En nuestro caso: + // - $productos es el array completo que contiene todos los productos + // - $producto (singular) es la variable temporal que en cada vuelta del bucle + // contendrá UN producto específico (con sus keys: nombre, precio, etc.) + // + // ¿Por qué es útil? + // Porque no sabemos cuántos productos hay. Puede haber 5, 10 o 100. + // El foreach automáticamente se encarga de recorrerlos todos sin que + // tengamos que usar contadores o índices manuales. + + foreach ($productos as $producto) { + // En este punto, $producto contiene un array asociativo como: + // [ + // 'nombre' => 'manzana', + // 'precio' => 0.75, + // 'disponible' => true, + // 'descripcion' => 'Manzana roja, paquete 1kg' + // ] + + // ------------------------------------------------------------------- + // PASO 5.1: Determinar si la fila debe ser roja (producto agotado) + // ------------------------------------------------------------------- + // CONCEPTO: Operador ternario (condición ? si_verdadero : si_falso) + // Es una forma compacta de escribir un if-else en una sola línea. + // + // Equivalente en if-else tradicional: + // if (!$producto['disponible']) { + // $claseFilaRoja = 'table-danger'; + // } else { + // $claseFilaRoja = ''; + // } + // + // El operador ternario hace lo mismo pero es más conciso. + // Si el producto NO está disponible, asignamos la clase 'table-danger' + // (clase de Bootstrap que pinta la fila de rojo). + + $claseFilaRoja = !$producto['disponible'] ? 'table-danger' : ''; + + // ------------------------------------------------------------------- + // PASO 5.2: Formatear el nombre del producto + // ------------------------------------------------------------------- + // FUNCIÓN ucfirst(): convierte el primer carácter de un string en mayúscula + // + // ¿Por qué usar ucfirst()? + // En el array de productos guardamos los nombres en minúscula ('manzana') + // pero queremos mostrarlos con mayúscula inicial ('Manzana') en la tabla. + // Esto demuestra cómo podemos almacenar datos en un formato y mostrarlos + // en otro diferente. + + $nombreFormateado = ucfirst($producto['nombre']); + + // ------------------------------------------------------------------- + // PASO 5.3: Formatear el precio + // ------------------------------------------------------------------- + // FUNCIÓN number_format(): da formato a números con decimales + // Sintaxis: number_format(número, decimales, separador_decimal, separador_miles) + // + // En España usamos: + // - Coma (,) para separar decimales: 1,50 + // - Punto (.) para separar miles: 1.000 + // + // Ejemplos: + // 0.75 → "0,75 €" + // 1.2 → "1,20 €" (añade el cero para tener 2 decimales) + // 1000 → "1.000,00 €" + + $precioFormateado = number_format( + $producto['precio'], // El número a formatear + 2, // Queremos siempre 2 decimales + ',', // Separador de decimales (coma en España) + '.' // Separador de miles (punto en España) + ) . ' €'; // Añadimos el símbolo del euro + + // ------------------------------------------------------------------- + // PASO 5.4: Determinar el texto de disponibilidad + // ------------------------------------------------------------------- + // Otro uso del OPERADOR TERNARIO: + // Si $producto['disponible'] es true, mostramos "✅ En stock" + // Si es false, mostramos "❌ Agotado" + // + // Esto es más legible para el usuario que mostrar "true/false" + + $textoDisponibilidad = $producto['disponible'] + ? '✅ En stock' // Si es true + : '❌ Agotado'; // Si es false + + // ------------------------------------------------------------------- + // PASO 5.5: Obtener la descripción + // ------------------------------------------------------------------- + // Simplemente guardamos la descripción en una variable para usarla + // en el HTML de la tabla. + + $descripcion = $producto['descripcion']; + + // ------------------------------------------------------------------- + // PASO 5.6: Construir la fila con todas las celdas '; // Aplicamos clase roja si está agotado + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + + } // Fin del foreach - vuelve al inicio para el siguiente producto + + // ----------------------------------------------------------------------- + // PASO 6: Cerrar el tbody y la tabla + // ----------------------------------------------------------------------- + + $html .= ''; + $html .= '
(table header) en lugar de (table data) para indicar + // que son encabezados, lo que tiene beneficios semánticos y de accesibilidad. + + $html .= '
ProductoPrecioDisponibilidadDescripción
+ // ------------------------------------------------------------------- + // Ahora que tenemos todos los datos formateados, + // construimos el HTML de la fila. + // + // NOTA sobre la sintaxis: + // Usamos .= para ir "acumulando" strings en la variable $html + // El operador .= es equivalente a: $html = $html . 'nuevo texto' + + $html .= '
' . $nombreFormateado . '' . $precioFormateado . '' . $textoDisponibilidad . '' . $descripcion . '
'; + + // ----------------------------------------------------------------------- + // PASO 7: Retornar el HTML completo + // ----------------------------------------------------------------------- + // La palabra clave "return" devuelve el valor al código que llamó a la función. + // En index.php haremos: echo generarTablaProductos($productos); + // y eso mostrará toda la tabla HTML que hemos construido aquí. + + return $html; +} + +/** + * FUNCIÓN 2: muestraInfoContacto + * + * PROPÓSITO: + * Genera un bloque HTML con la información de contacto del usuario + * (nombre, teléfono y foto de perfil) dentro de un modal de Bootstrap. + * + * @param string $nombre - Nombre del usuario + * @param string $telefono - Teléfono del usuario + * @param string $foto - URL de la foto de perfil + * + * CONCEPTOS APLICADOS: + * - Validación de datos con isset() y empty() + * - Alternancia entre modo PHP y modo HTML + * - Sintaxis corta de echo: + * + * FLUJO DE EJECUCIÓN: + * 1. Validar que los parámetros tengan valores válidos + * 2. Preparar los datos para mostrar + * 3. Salir del modo PHP y escribir HTML limpio + * 4. Insertar variables PHP en el HTML usando + * 5. Volver al modo PHP al finalizar + */ +function muestraInfoContacto($nombre, $telefono, $foto) { + // ----------------------------------------------------------------------- + // PASO 1: Validar los datos recibidos + // ----------------------------------------------------------------------- + // CONCEPTO: Programación defensiva + // Nunca debemos asumir que los datos que recibimos son correctos. + // Siempre validamos antes de usarlos. + // + // isset(): verifica si una variable está definida y no es null + // empty(): verifica si una variable está vacía (null, "", 0, false, []) + // + // Si algún dato crítico falta, mostramos un mensaje de error y salimos. + + if (!isset($nombre) || empty(trim($nombre))) { + echo '
No se proporcionó nombre de contacto.
'; + return; // Salimos de la función sin continuar + } + + // ----------------------------------------------------------------------- + // PASO 2: Limpiar los datos + // ----------------------------------------------------------------------- + // CONCEPTO: Limpieza básica de datos + // + // trim(): elimina espacios en blanco al inicio y final del string + // ¿Por qué? Porque el usuario podría haber escrito " Juan " con espacios + // extra que no queremos mostrar. + + $nombre = trim($nombre); + $telefono = trim($telefono); + + // ----------------------------------------------------------------------- + // PASO 3: Validar la foto + // ----------------------------------------------------------------------- + // Si no proporcionaron una foto o está vacía, usamos una imagen + // placeholder genérica de un servicio público que genera avatares. + + if (!isset($foto) || empty($foto)) { + // ui-avatars.com genera imágenes con las iniciales del nombre + // Es útil para tener siempre una imagen, aunque el usuario no suba una + $foto = 'https://ui-avatars.com/api/?name=' . urlencode($nombre); + } + + // ----------------------------------------------------------------------- + // PASO 4: Construir el HTML de la información de contacto + // ----------------------------------------------------------------------- + // CONCEPTO CLAVE: Alternar entre modo PHP y modo HTML + // + // ¿Por qué hacer esto? + // Cuando tenemos bloques grandes de HTML con pocas variables PHP, + // es mucho más cómodo y legible escribir el HTML directamente + // en lugar de usar echo con comillas y concatenaciones. + // + // VENTAJAS de esta técnica: + // 1. El HTML se ve como HTML real (con coloreado de sintaxis correcto) + // 2. No hay que escapar comillas dentro del HTML + // 3. No hay que concatenar con puntos (.) + // 4. Es más fácil de mantener y editar + // 5. Los editores de código pueden formatear el HTML automáticamente + + ?> + + + +
+
+
+ + + + + Foto de perfil + + +
+ +
+ +

+ + 📞 Teléfono: +

+
+
+
+
+ + ' . $variable . ''; + +// ============================================================================ \ No newline at end of file diff --git a/practicas/pp4/tienda/includes/header.php b/practicas/pp4/tienda/includes/header.php new file mode 100644 index 00000000..95c719fd --- /dev/null +++ b/practicas/pp4/tienda/includes/header.php @@ -0,0 +1,133 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/practicas/pp4/tienda/index.php b/practicas/pp4/tienda/index.php new file mode 100644 index 00000000..a73e03b6 --- /dev/null +++ b/practicas/pp4/tienda/index.php @@ -0,0 +1,310 @@ + + + + + + Mercadona - Productos + + + + + + 'Juan', +// 'telefono' => '612345678', +// 'foto' => 'https://ejemplo.com/foto.jpg' +// ] +// +// OPERADOR ?? (null coalescing): +// Es un operador moderno de PHP que significa "usa esto, o si no existe, usa aquello" +// Sintaxis: $variable = $valor ?? $valorPorDefecto +// +// Equivalente en if tradicional: +// if (isset($_POST['nombre'])) { +// $nombre = $_POST['nombre']; +// } else { +// $nombre = ''; +// } +// +// ¿Por qué usarlo? +// Porque si alguien accede directamente a index.php sin pasar por el formulario, +// $_POST['nombre'] no existirá y daría error. Con ??, obtenemos un valor vacío +// en su lugar, evitando el error. + +$nombre = $_POST['nombre'] ?? ''; // Si no existe, será string vacío +$telefono = $_POST['telefono'] ?? ''; // Ídem +$foto = $_POST['foto'] ?? ''; // Ídem + +// ---------------------------------------------------------------------------- +// PASO 2: Incluir el archivo de funciones +// ---------------------------------------------------------------------------- +// CONCEPTO: require_once +// +// require_once incluye y ejecuta el archivo especificado. +// "once" significa que PHP recordará que ya lo incluyó y no lo volverá a incluir +// aunque haya múltiples require_once del mismo archivo (evita duplicados). +// +// ¿Diferencia entre include, require, include_once, require_once? +// - include: incluye el archivo, pero si no existe, sólo muestra warning y continúa +// - require: incluye el archivo, pero si no existe, genera error fatal y se detiene +// - include_once / require_once: igual que los anteriores pero sólo una vez +// +// ¿Cuándo usar cada uno? +// - require_once: para archivos críticos (sin ellos no puede funcionar la app) +// - include_once: para archivos opcionales (como widgets) +// +// __DIR__: constante mágica de PHP que contiene la ruta del directorio actual +// Es mejor que usar rutas relativas simples porque funciona siempre, no importa +// desde dónde se ejecute el script. + +require_once __DIR__ . '/includes/funciones.php'; + +// Al ejecutar esta línea, PHP lee funciones.php y ahora tenemos disponibles: +// - generarTablaProductos() +// - muestraInfoContacto() + +// ---------------------------------------------------------------------------- +// PASO 3: Incluir el array de productos +// ---------------------------------------------------------------------------- +// Incluimos el archivo que define $productos +// Después de esta línea, tendremos la variable $productos disponible +// con todos los datos de los productos de la tienda. + +require_once __DIR__ . '/data/productos.php'; + +// Ahora $productos contiene: +// [ +// ['nombre' => 'manzana', 'precio' => 0.75, 'disponible' => true, ...], +// ['nombre' => 'pan', 'precio' => 1.20, 'disponible' => true, ...], +// ... +// ] + +// ---------------------------------------------------------------------------- +// PASO 4: Incluir el header +// ---------------------------------------------------------------------------- +// El header tiene acceso a las variables $nombre y $foto que definimos arriba +// porque PHP comparte el scope (ámbito) de las variables entre archivos incluidos. +// Por eso el header puede usarlas para mostrar el saludo personalizado. + +require_once __DIR__ . '/includes/header.php'; + +?> + + + + + + +
+ +
+

Productos disponibles

+
+ + + + + + +
+ +
+ + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/practicas/pp4/tienda/inicio.php b/practicas/pp4/tienda/inicio.php new file mode 100644 index 00000000..eb0f0412 --- /dev/null +++ b/practicas/pp4/tienda/inicio.php @@ -0,0 +1,172 @@ + + + + + + Inicio - Tienda Mercadona + + + +

🛒 Bienvenido a la tienda Mercadona

+

Por favor, introduce tus datos para acceder:

+ + + + + + +
+ + + + + + + + + + + + + + +
+ + + + + + + + \ No newline at end of file diff --git a/practicas/pp5 crud personajes/add_edit_book.php b/practicas/pp5 crud personajes/add_edit_book.php new file mode 100644 index 00000000..9c8e52b9 --- /dev/null +++ b/practicas/pp5 crud personajes/add_edit_book.php @@ -0,0 +1,56 @@ + + + + + + Biblioteca Virtual + + + + + +
+
+
+

Bienvenido, NOMBRE DE USUARIO

+

ROL ADMIN O ROL LECTOR???

+
+ + Volver a la Biblioteca + +
+
+ +
+
+

+

+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+ + + + \ No newline at end of file diff --git a/practicas/pp5 crud personajes/css/style.css b/practicas/pp5 crud personajes/css/style.css new file mode 100644 index 00000000..9eee7a55 --- /dev/null +++ b/practicas/pp5 crud personajes/css/style.css @@ -0,0 +1,189 @@ +@import url('https://fonts.googleapis.com/css2?family=Quicksand:wght@300;400;500;600;700&display=swap'); +* +{ + margin: 0; + padding: 0; + box-sizing: border-box; + +} +body +{ + display: flex; + justify-content: center; + align-items: center; + min-height: 100vh; + background: #000; +} +section +{ + position: absolute; + width: 100vw; + height: 100vh; + display: flex; + justify-content: center; + align-items: center; + gap: 2px; + flex-wrap: wrap; + overflow: hidden; +} +section::before +{ + content: ''; + position: absolute; + width: 100%; + height: 100%; + background: linear-gradient(#000,#daa520,#000); + animation: animate 5s linear infinite; +} +@keyframes animate +{ + 0% + { + transform: translateY(-100%); + } + 100% + { + transform: translateY(100%); + } +} +section span +{ + position: relative; + display: block; + width: calc(6.25vw - 2px); + height: calc(6.25vw - 2px); + background: #181818; + z-index: 2; + transition: 1.5s; +} +section span:hover +{ + background: #daa520; + transition: 0s; +} + +section .signin +{ + position: absolute; + width: 400px; + background: #222; + z-index: 1000; + display: flex; + justify-content: center; + align-items: center; + padding: 40px; + border-radius: 4px; + box-shadow: 0 15px 35px rgba(0,0,0,9); +} +section .signin .content +{ + position: relative; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + gap: 40px; +} +section .signin .content h2 +{ + font-size: 2em; + color: #daa520; + text-transform: uppercase; +} +section .signin .content .form +{ + width: 100%; + display: flex; + flex-direction: column; + gap: 25px; +} +section .signin .content .form .inputBox +{ + position: relative; + width: 100%; +} +section .signin .content .form .inputBox input +{ + position: relative; + width: 100%; + background: #333; + border: none; + outline: none; + padding: 25px 10px 7.5px; + border-radius: 10px; + color: #fff; + font-weight: 500; + font-size: 1em; +} +.inputBox input { + + border: none; + border-radius: 8px; + background: #333; +} +section .signin .content .form .inputBox i +{ + position: absolute; + left: 0; + padding: 15px 10px; + font-style: normal; + color: #aaa; + transition: 0.5s; + pointer-events: none; +} +.signin .content .form .inputBox input:focus ~ i, +.signin .content .form .inputBox input:valid ~ i +{ + transform: translateY(-7.5px); + font-size: 0.8em; + color: #fff; +} +.signin .content .form .links +{ + position: relative; + width: 100%; + display: flex; + justify-content: space-between; +} +.signin .content .form .links a +{ + color: #fff; + text-decoration: none; +} +.signin .content .form .links a:nth-child(2) +{ + color: #daa520; + font-weight: 600; +} +.signin .content .form .inputBox input[type="submit"] +{ + padding: 10px; + background: #daa520; + color: #000; + font-weight: 600; + font-size: 1.35em; + letter-spacing: 0.05em; + cursor: pointer; +} +input[type="submit"]:active +{ + opacity: 0.6; +} +@media (max-width: 900px) +{ + section span + { + width: calc(10vw - 2px); + height: calc(10vw - 2px); + } +} +@media (max-width: 600px) +{ + section span + { + width: calc(20vw - 2px); + height: calc(20vw - 2px); + } +} + diff --git a/practicas/pp5 crud personajes/delete_book.php b/practicas/pp5 crud personajes/delete_book.php new file mode 100644 index 00000000..e69de29b diff --git a/practicas/pp5 crud personajes/functions.php b/practicas/pp5 crud personajes/functions.php new file mode 100644 index 00000000..1ab49bdc --- /dev/null +++ b/practicas/pp5 crud personajes/functions.php @@ -0,0 +1,97 @@ + 'Mario', + 'descripcion' => 'Un fontanero italiano que vive en el Reino Champiñón.', + 'imagen' => 'mario.png' + ], + [ + 'nombre' => 'Link', + 'descripcion' => 'El héroe del tiempo de la serie The Legend of Zelda.', + 'imagen' => 'link.png' + ], + [ + 'nombre' => 'Pikachu', + 'descripcion' => 'Un Pokémon eléctrico conocido por su energía y su poderoso ataque "impactrueno".', + 'imagen' => 'pikachu.png' + ], + [ + 'nombre' => 'Samus', + 'descripcion' => 'Cazadora espacial equipada con un traje de poder avanzado de la saga Metroid.', + 'imagen' => 'samus.png' + ], + [ + 'nombre' => 'Donkey Kong', + 'descripcion' => 'Un gorila fuerte y valiente, protector de su isla y amante de los plátanos.', + 'imagen' => 'donkeykong.png' + ], + [ + 'nombre' => 'Kirby', + 'descripcion' => 'Una pequeña criatura rosada con la habilidad de absorber enemigos y copiar sus poderes.', + 'imagen' => 'kirby.png' + ], + [ + 'nombre' => 'Fox McCloud', + 'descripcion' => 'Líder del escuadrón Star Fox, experto piloto de naves espaciales.', + 'imagen' => 'fox.png' + ], + [ + 'nombre' => 'Yoshi', + 'descripcion' => 'El dinosaurio verde amigo de Mario, conocido por su lengua larga y sus saltos.', + 'imagen' => 'yoshi.png' + ], + [ + 'nombre' => 'Peach', + 'descripcion' => 'La princesa del Reino Champiñón, amable y valiente, a menudo en el centro de las aventuras.', + 'imagen' => 'peach.png' + ], + [ + 'nombre' => 'Bowser', + 'descripcion' => 'El rey de los Koopas y principal rival de Mario, poderoso y temido.', + 'imagen' => 'bowser.png' + ] +]; + + ]; + + //Ahora $_SESSION['personajes'] contiene 2 personajesPERSONAJES'] CONTIENE: + // $_SESSION['personajes'][0] -> Primer personaje (Mario) + // $_SESSION['personajes'][1] -> Segundo personaje (Link) +} + +//FIN INICIALIZACION DE DATOS + +//FUNCION PARA AÑADIR PERSONAJE + +function agregarPersonaje($nombre, $img, $poder, $descripcion){ + function agregarPersonaje($nombre, $descripcion, $imagen) { + // Verificar si la sesión de personajes existe; si no, crearla + if (!isset($_SESSION['personajes'])) { + $_SESSION['personajes'] = []; + } + + // Crear el nuevo personaje como un array asociativo + $nuevoPersonaje = [ + 'nombre' => $nombre, + 'descripcion' => $descripcion, + 'imagen' => $imagen + ]; + + // Agregar el nuevo personaje al final del array + $_SESSION['personajes'][] = $nuevoPersonaje; +} + + +} \ No newline at end of file diff --git a/practicas/pp5 crud personajes/home.php b/practicas/pp5 crud personajes/home.php new file mode 100644 index 00000000..71bf71a4 --- /dev/null +++ b/practicas/pp5 crud personajes/home.php @@ -0,0 +1,88 @@ + + + + + + + Biblioteca Virtual - Home + + + + + + +
+
+
+ Foto de perfil +
+

👋 Bienvenido, AQUÍ VA EL USUARIO!

+ +

Admin ✏️

+ +

Lector 📚

+ +
+
+ + Cerrar sesión ❌ + +
+
+ +
+
+

Biblioteca Virtual

+

Disfruta explorando nuestra colección de libros

+
+ + + +
+ + Agregar Nuevo Libro + +
+ + + +
+ +
+
+ +
+
TITULO
+

Autor: AUTOR

+

DESCRIPCIÓN

+
+ + + + +
+
+ +
+
+ + + + + diff --git a/practicas/pp5 crud personajes/index.php b/practicas/pp5 crud personajes/index.php new file mode 100644 index 00000000..421e7893 --- /dev/null +++ b/practicas/pp5 crud personajes/index.php @@ -0,0 +1,47 @@ + trim($_POST['nombre']), + 'habilidad' => trim($_POST['habilidad']), + 'imagen' => trim($_POST['imagen']) + ]; +} +?> + + + + + + Elegir personaje + + + + + +
+

Hola 👋

+ +

Introduce los datos de tu personaje favorito:

+
+ + + + +
+ + +

Ya ingresaste tu personaje. Puedes verlo en la página Personajes.

+ +
+ + + diff --git a/practicas/pp5 crud personajes/login.php b/practicas/pp5 crud personajes/login.php new file mode 100644 index 00000000..13726b0e --- /dev/null +++ b/practicas/pp5 crud personajes/login.php @@ -0,0 +1,67 @@ + "admin", "password" => "adminpass", "role" => "admin"], + ["username" => "reader", "password" => "readerpass", "role" => "lector"] +]; + +// Procesamiento del formulario. + + + // Validación de credenciales. + + + +?> + + + + + + + Biblioteca Virtual - Login + + + + +
+ + + + + + +
+
+

Inicia sesión

+
+
+ + +
+
+ + +
+
+ + +
+ +
+ + +
+ +
+
+
+
+
+ + + + + diff --git a/practicas/pp5 crud personajes/logout.php b/practicas/pp5 crud personajes/logout.php new file mode 100644 index 00000000..e69de29b diff --git a/practicas/pp6/admin/addFaq.php b/practicas/pp6/admin/addFaq.php new file mode 100644 index 00000000..aaa79292 --- /dev/null +++ b/practicas/pp6/admin/addFaq.php @@ -0,0 +1,168 @@ +prepare( + "INSERT INTO faqs (pregunta, respuesta, categoria, orden, activa) + VALUES (?, ?, ?, ?, ?)" + ); + + if ($stmt) { + $stmt->bind_param("sssil", $pregunta, $respuesta, $categoria, $orden, $activa); + + if ($stmt->execute()) { + header("Location: faqs.php?success=added"); + exit(); + } else { + $error = "Error al crear FAQ: " . $stmt->error; + } + + $stmt->close(); + } + } + + $mysqli->close(); +} + +include '../includes/header.php'; +?> + + +
+
+
+
+

+ Nueva FAQ +

+ +
+
+
+
+ + +
+
+
+
+
+
+ + +
+ + +
+ + +
+
+
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + + Menor = mayor prioridad +
+
+ +
+
+
+ + +
+
+
+
+ +
+ +
+ + Cancelar + + +
+
+
+
+
+
+
+
+ + \ No newline at end of file diff --git a/practicas/pp6/admin/addNoticia.php b/practicas/pp6/admin/addNoticia.php new file mode 100644 index 00000000..6213dcf6 --- /dev/null +++ b/practicas/pp6/admin/addNoticia.php @@ -0,0 +1,215 @@ +prepare( + "INSERT INTO noticias (titulo, subtitulo, contenido, imagen_destacada, autor_id, categoria, destacada, activa, fecha_publicacion, fecha_actualizacion) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, NOW(), NOW())" + ); + + if ($stmt) { + $stmt->bind_param("ssssisii", $titulo, $subtitulo, $contenido, $imagen_path, $autor_id, $categoria, $destacada, $activa); + + if ($stmt->execute()) { + header("Location: noticias.php?success=added"); + exit(); + } else { + $error = "Error al crear noticia: " . $stmt->error; + } + + $stmt->close(); + } + } + } + + $mysqli->close(); +} + +include '../includes/header.php'; +?> + + +
+
+
+
+

+ Nueva Noticia +

+ +
+
+
+
+ + +
+
+
+
+
+
+ + +
+ + +
+ + +
+
+
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + + Resumen breve de la noticia +
+
+ +
+
+ + +
+
+ +
+
+ +
+ + +
+ Opcional. JPG, PNG, GIF (máx 5MB) +
+
+ +
+
+
+ > + +
+
+
+ +
+
+
+ + +
+
+
+
+ +
+ +
+ + Cancelar + + +
+
+
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/practicas/pp6/admin/addProyecto.php b/practicas/pp6/admin/addProyecto.php new file mode 100644 index 00000000..d872eebe --- /dev/null +++ b/practicas/pp6/admin/addProyecto.php @@ -0,0 +1,262 @@ +prepare( + "INSERT INTO proyectos (titulo, descripcion, imagen_principal, cliente, categoria, tecnologias, url_proyecto, fecha_inicio, fecha_fin, orden_visualizacion, destacado, activo) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" + ); + + if ($stmt) { + $stmt->bind_param("sssssssssiil", $titulo, $descripcion, $imagen_path, $cliente, $categoria, $tecnologias, $url_proyecto, $fecha_inicio, $fecha_fin, $orden_visualizacion, $destacado, $activo); + + if ($stmt->execute()) { + header("Location: proyectos.php?success=added"); + exit(); + } else { + $error = "Error al crear proyecto: " . $stmt->error; + } + + $stmt->close(); + } + } + } + + $mysqli->close(); +} + +include '../includes/header.php'; +?> + + +
+
+
+
+

+ Nuevo Proyecto +

+ +
+
+
+
+ + +
+
+
+
+
+
+ + +
+ + +
+ + +
+
+
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + + URL completa del proyecto en producción +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + + Menor número = mayor prioridad +
+
+ +
+
+ +
+ + +
+ Opcional. JPG, PNG, GIF (máx 5MB) +
+
+ +
+
+
+ > + +
+
+
+ +
+
+
+ + +
+
+
+
+ +
+ +
+ + Cancelar + + +
+
+
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/practicas/pp6/admin/addTestimonio.php b/practicas/pp6/admin/addTestimonio.php new file mode 100644 index 00000000..84313d1f --- /dev/null +++ b/practicas/pp6/admin/addTestimonio.php @@ -0,0 +1,234 @@ + 5) { + $error = "La puntuación debe estar entre 1 y 5"; + } else { + // Gestionar foto del cliente + $foto_path = ''; + + if (isset($_FILES['foto_cliente']) && $_FILES['foto_cliente']['error'] === UPLOAD_ERR_OK) { + $resultado = subir_imagen($_FILES['foto_cliente'], 'testimonios'); + if ($resultado['success']) { + $foto_path = $resultado['path']; + } else { + $error = $resultado['message']; + } + } + + if (empty($error)) { + $stmt = $mysqli->prepare( + "INSERT INTO testimonios (nombre_cliente, cargo, empresa, testimonio, foto_cliente, puntuacion, destacado, activo, fecha_testimonio) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, NOW())" + ); + + if ($stmt) { + $stmt->bind_param("sssssiil", $nombre_cliente, $cargo, $empresa, $testimonio, $foto_path, $puntuacion, $destacado, $activo); + + if ($stmt->execute()) { + header("Location: testimonios.php?success=added"); + exit(); + } else { + $error = "Error al crear testimonio: " . $stmt->error; + } + + $stmt->close(); + } + } + } + + $mysqli->close(); +} + +include '../includes/header.php'; +?> + + +
+
+
+
+

+ Nuevo Testimonio +

+ +
+
+
+
+ + +
+
+
+
+
+
+ + +
+ + +
+ + +
+
+
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + + Opinión o comentario del cliente +
+
+ +
+
+ + +
+
+ +
+
+ +
+ + +
+ Opcional. JPG, PNG (máx 5MB) +
+
+ +
+
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+
+ +
+ +
+ + Cancelar + + +
+
+
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/practicas/pp6/admin/addUser,php b/practicas/pp6/admin/addUser,php new file mode 100644 index 00000000..09672a29 --- /dev/null +++ b/practicas/pp6/admin/addUser,php @@ -0,0 +1,237 @@ +real_escape_string($email); + $result = $mysqli->query("SELECT id FROM users WHERE email = '$email_escapado' LIMIT 1"); + + if ($result->num_rows > 0) { + $error = "Este email ya está registrado"; + } else { + // Gestionar avatar + $avatar_path = 'uploads/avatars/default-avatar.jpg'; + + if (isset($_FILES['avatar']) && $_FILES['avatar']['error'] === UPLOAD_ERR_OK) { + $resultado = subir_avatar($_FILES['avatar']); + if ($resultado['success']) { + $avatar_path = $resultado['path']; + } else { + $error = $resultado['message']; + } + } + + if (empty($error)) { + $password_hash = password_hash($password, PASSWORD_DEFAULT); + + $stmt = $mysqli->prepare( + "INSERT INTO users (nombre, apellidos, email, password, foto, role, age, job, activo, date_register) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NOW())" + ); + + if ($stmt) { + $stmt->bind_param("ssssssisi", $nombre, $apellidos, $email, $password_hash, $avatar_path, $role, $age, $job, $activo); + + if ($stmt->execute()) { + header("Location: usuarios.php?success=added"); + exit(); + } else { + $error = "Error al crear usuario: " . $stmt->error; + } + + $stmt->close(); + } + } + } + } + + $mysqli->close(); +} + +include '../includes/header.php'; +?> + + +
+
+
+
+

+ Nuevo Usuario +

+ +
+
+
+
+ + +
+
+
+
+
+
+ + +
+ + +
+ + +
+
+
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ +
+ + +
+ Opcional. JPG, PNG, GIF (máx 5MB) +
+
+ +
+
+
+ > + +
+
+
+
+ +
+ +
+ + Cancelar + + +
+
+
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/practicas/pp6/admin/deleteFaq.php b/practicas/pp6/admin/deleteFaq.php new file mode 100644 index 00000000..5de8b58e --- /dev/null +++ b/practicas/pp6/admin/deleteFaq.php @@ -0,0 +1,44 @@ +prepare("DELETE FROM faqs WHERE id = ?"); +$stmt->bind_param("i", $faq_id); + +if ($stmt->execute()) { + $stmt->close(); + $mysqli->close(); + + header('Location: faqs.php?success=deleted'); + exit(); +} else { + $stmt->close(); + $mysqli->close(); + + header('Location: faqs.php?error=delete_failed'); + exit(); +} +?> \ No newline at end of file diff --git a/practicas/pp6/admin/deleteNoticia.php b/practicas/pp6/admin/deleteNoticia.php new file mode 100644 index 00000000..38f13e6e --- /dev/null +++ b/practicas/pp6/admin/deleteNoticia.php @@ -0,0 +1,62 @@ +prepare("SELECT * FROM noticias WHERE id = ?"); +$stmt->bind_param("i", $noticia_id); +$stmt->execute(); +$result = $stmt->get_result(); +$noticia = $result->fetch_assoc(); +$stmt->close(); + +if (!$noticia) { + header('Location: noticias.php'); + exit(); +} + +// Eliminar noticia +$stmt = $mysqli->prepare("DELETE FROM noticias WHERE id = ?"); +$stmt->bind_param("i", $noticia_id); + +if ($stmt->execute()) { + // Eliminar imagen si existe + if (!empty($noticia['imagen_destacada'])) { + eliminar_imagen('../' . $noticia['imagen_destacada']); + } + + $stmt->close(); + $mysqli->close(); + + header('Location: noticias.php?success=deleted'); + exit(); +} else { + $stmt->close(); + $mysqli->close(); + + header('Location: noticias.php?error=delete_failed'); + exit(); +} +?> \ No newline at end of file diff --git a/practicas/pp6/admin/deleteProyecto.php b/practicas/pp6/admin/deleteProyecto.php new file mode 100644 index 00000000..a98ebbad --- /dev/null +++ b/practicas/pp6/admin/deleteProyecto.php @@ -0,0 +1,62 @@ +prepare("SELECT * FROM proyectos WHERE id = ?"); +$stmt->bind_param("i", $proyecto_id); +$stmt->execute(); +$result = $stmt->get_result(); +$proyecto = $result->fetch_assoc(); +$stmt->close(); + +if (!$proyecto) { + header('Location: proyectos.php'); + exit(); +} + +// Eliminar proyecto +$stmt = $mysqli->prepare("DELETE FROM proyectos WHERE id = ?"); +$stmt->bind_param("i", $proyecto_id); + +if ($stmt->execute()) { + // Eliminar imagen si existe + if (!empty($proyecto['imagen_principal'])) { + eliminar_imagen('../' . $proyecto['imagen_principal']); + } + + $stmt->close(); + $mysqli->close(); + + header('Location: proyectos.php?success=deleted'); + exit(); +} else { + $stmt->close(); + $mysqli->close(); + + header('Location: proyectos.php?error=delete_failed'); + exit(); +} +?> \ No newline at end of file diff --git a/practicas/pp6/admin/deleteTestimonio.php b/practicas/pp6/admin/deleteTestimonio.php new file mode 100644 index 00000000..a5083184 --- /dev/null +++ b/practicas/pp6/admin/deleteTestimonio.php @@ -0,0 +1,62 @@ +prepare("SELECT * FROM testimonios WHERE id = ?"); +$stmt->bind_param("i", $testimonio_id); +$stmt->execute(); +$result = $stmt->get_result(); +$testimonio = $result->fetch_assoc(); +$stmt->close(); + +if (!$testimonio) { + header('Location: testimonios.php'); + exit(); +} + +// Eliminar testimonio +$stmt = $mysqli->prepare("DELETE FROM testimonios WHERE id = ?"); +$stmt->bind_param("i", $testimonio_id); + +if ($stmt->execute()) { + // Eliminar foto si existe + if (!empty($testimonio['foto_cliente'])) { + eliminar_imagen('../' . $testimonio['foto_cliente']); + } + + $stmt->close(); + $mysqli->close(); + + header('Location: testimonios.php?success=deleted'); + exit(); +} else { + $stmt->close(); + $mysqli->close(); + + header('Location: testimonios.php?error=delete_failed'); + exit(); +} +?> \ No newline at end of file diff --git a/practicas/pp6/admin/deleteUser.php b/practicas/pp6/admin/deleteUser.php new file mode 100644 index 00000000..6c250361 --- /dev/null +++ b/practicas/pp6/admin/deleteUser.php @@ -0,0 +1,68 @@ +prepare("SELECT * FROM users WHERE id = ?"); +$stmt->bind_param("i", $user_id); +$stmt->execute(); +$result = $stmt->get_result(); +$usuario = $result->fetch_assoc(); +$stmt->close(); + +if (!$usuario) { + header('Location: usuarios.php'); + exit(); +} + +// Eliminar usuario +$stmt = $mysqli->prepare("DELETE FROM users WHERE id = ?"); +$stmt->bind_param("i", $user_id); + +if ($stmt->execute()) { + // Eliminar avatar si no es el default + if (!empty($usuario['foto']) && $usuario['foto'] != 'uploads/avatars/default-avatar.jpg') { + eliminar_imagen('../' . $usuario['foto']); + } + + $stmt->close(); + $mysqli->close(); + + header('Location: usuarios.php?success=deleted'); + exit(); +} else { + $stmt->close(); + $mysqli->close(); + + header('Location: usuarios.php?error=delete_failed'); + exit(); +} +?> \ No newline at end of file diff --git a/practicas/pp6/admin/editNoticia.php b/practicas/pp6/admin/editNoticia.php new file mode 100644 index 00000000..1c066c5c --- /dev/null +++ b/practicas/pp6/admin/editNoticia.php @@ -0,0 +1,276 @@ +prepare("SELECT * FROM noticias WHERE id = ?"); +$stmt->bind_param("i", $noticia_id); +$stmt->execute(); +$result = $stmt->get_result(); +$noticia = $result->fetch_assoc(); +$stmt->close(); + +if (!$noticia) { + header('Location: noticias.php'); + exit(); +} + +$error = ''; +$success = ''; + +// Procesar formulario +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $titulo = limpiar_input($_POST['titulo']); + $subtitulo = limpiar_input($_POST['subtitulo']); + $contenido = limpiar_input($_POST['contenido']); + $categoria = limpiar_input($_POST['categoria']); + $destacada = isset($_POST['destacada']) ? 1 : 0; + $activa = isset($_POST['activa']) ? 1 : 0; + + // Validaciones + if (empty($titulo)) { + $error = "El título es obligatorio"; + } elseif (empty($contenido)) { + $error = "El contenido es obligatorio"; + } else { + // Gestionar imagen destacada + $imagen_path = $noticia['imagen_destacada']; + + if (isset($_FILES['imagen_destacada']) && $_FILES['imagen_destacada']['error'] === UPLOAD_ERR_OK) { + $resultado = subir_imagen($_FILES['imagen_destacada'], 'noticias'); + if ($resultado['success']) { + // Eliminar imagen anterior si existe + if (!empty($noticia['imagen_destacada'])) { + eliminar_imagen('../' . $noticia['imagen_destacada']); + } + $imagen_path = $resultado['path']; + } else { + $error = $resultado['message']; + } + } + + if (empty($error)) { + $stmt = $mysqli->prepare( + "UPDATE noticias SET titulo = ?, subtitulo = ?, contenido = ?, imagen_destacada = ?, categoria = ?, destacada = ?, activa = ?, fecha_actualizacion = NOW() WHERE id = ?" + ); + + if ($stmt) { + $stmt->bind_param("sssssiii", $titulo, $subtitulo, $contenido, $imagen_path, $categoria, $destacada, $activa, $noticia_id); + + if ($stmt->execute()) { + header("Location: noticias.php?success=updated"); + exit(); + } else { + $error = "Error al actualizar noticia: " . $stmt->error; + } + + $stmt->close(); + } + } + } + + // Recargar datos si hubo error + $stmt = $mysqli->prepare("SELECT * FROM noticias WHERE id = ?"); + $stmt->bind_param("i", $noticia_id); + $stmt->execute(); + $result = $stmt->get_result(); + $noticia = $result->fetch_assoc(); + $stmt->close(); +} + +$mysqli->close(); + +include '../includes/header.php'; +?> + + +
+
+
+
+

+ Editar Noticia +

+ +
+
+
+
+ + +
+
+
+
+
+
+ + +
+ + +
+ + + + +
+ Imagen actual +

Imagen actual

+
+ + +
+
+
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + + Resumen breve de la noticia +
+
+ +
+
+ + +
+
+ +
+
+ +
+ + +
+ Opcional. JPG, PNG, GIF (máx 5MB) +
+
+ +
+
+
+ > + +
+
+
+ +
+
+
+ > + +
+
+
+
+ +
+ +
+
+

+ + + Publicado el + + +
+ + + Actualizado el + + +

+
+
+ + Cancelar + + +
+
+
+
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/practicas/pp6/admin/editProyecto.php b/practicas/pp6/admin/editProyecto.php new file mode 100644 index 00000000..a7667f4b --- /dev/null +++ b/practicas/pp6/admin/editProyecto.php @@ -0,0 +1,307 @@ +prepare("SELECT * FROM proyectos WHERE id = ?"); +$stmt->bind_param("i", $proyecto_id); +$stmt->execute(); +$result = $stmt->get_result(); +$proyecto = $result->fetch_assoc(); +$stmt->close(); + +if (!$proyecto) { + header('Location: proyectos.php'); + exit(); +} + +$error = ''; +$success = ''; + +// Procesar formulario +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $titulo = limpiar_input($_POST['titulo']); + $descripcion = limpiar_input($_POST['descripcion']); + $cliente = limpiar_input($_POST['cliente']); + $categoria = limpiar_input($_POST['categoria']); + $tecnologias = limpiar_input($_POST['tecnologias']); + $url_proyecto = limpiar_input($_POST['url_proyecto']); + $fecha_inicio = !empty($_POST['fecha_inicio']) ? $_POST['fecha_inicio'] : NULL; + $fecha_fin = !empty($_POST['fecha_fin']) ? $_POST['fecha_fin'] : NULL; + $orden_visualizacion = (int) $_POST['orden_visualizacion']; + $destacado = isset($_POST['destacado']) ? 1 : 0; + $activo = isset($_POST['activo']) ? 1 : 0; + + // Validaciones + if (empty($titulo)) { + $error = "El título es obligatorio"; + } elseif (empty($descripcion)) { + $error = "La descripción es obligatoria"; + } else { + // Gestionar imagen principal + $imagen_path = $proyecto['imagen_principal']; + + if (isset($_FILES['imagen_principal']) && $_FILES['imagen_principal']['error'] === UPLOAD_ERR_OK) { + $resultado = subir_imagen($_FILES['imagen_principal'], 'proyectos'); + if ($resultado['success']) { + // Eliminar imagen anterior si existe + if (!empty($proyecto['imagen_principal'])) { + eliminar_imagen('../' . $proyecto['imagen_principal']); + } + $imagen_path = $resultado['path']; + } else { + $error = $resultado['message']; + } + } + + if (empty($error)) { + $stmt = $mysqli->prepare( + "UPDATE proyectos SET titulo = ?, descripcion = ?, imagen_principal = ?, cliente = ?, categoria = ?, tecnologias = ?, url_proyecto = ?, fecha_inicio = ?, fecha_fin = ?, orden_visualizacion = ?, destacado = ?, activo = ? WHERE id = ?" + ); + + if ($stmt) { + $stmt->bind_param("sssssssssiiil", $titulo, $descripcion, $imagen_path, $cliente, $categoria, $tecnologias, $url_proyecto, $fecha_inicio, $fecha_fin, $orden_visualizacion, $destacado, $activo, $proyecto_id); + + if ($stmt->execute()) { + header("Location: proyectos.php?success=updated"); + exit(); + } else { + $error = "Error al actualizar proyecto: " . $stmt->error; + } + + $stmt->close(); + } + } + } + + // Recargar datos si hubo error + $stmt = $mysqli->prepare("SELECT * FROM proyectos WHERE id = ?"); + $stmt->bind_param("i", $proyecto_id); + $stmt->execute(); + $result = $stmt->get_result(); + $proyecto = $result->fetch_assoc(); + $stmt->close(); +} + +$mysqli->close(); + +include '../includes/header.php'; +?> + + +
+
+
+
+

+ Editar Proyecto +

+ +
+
+
+
+ + +
+
+
+
+
+
+ + +
+ + +
+ + + + +
+ Imagen actual +

Imagen actual

+
+ + +
+
+
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + + URL completa del proyecto en producción +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + + Menor número = mayor prioridad +
+
+ +
+
+ +
+ + +
+ Opcional. JPG, PNG, GIF (máx 5MB) +
+
+ +
+
+
+ > + +
+
+
+ +
+
+
+ > + +
+
+
+
+ +
+ +
+ + Cancelar + + +
+
+
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/practicas/pp6/admin/editTestimonio.php b/practicas/pp6/admin/editTestimonio.php new file mode 100644 index 00000000..2fd4e01a --- /dev/null +++ b/practicas/pp6/admin/editTestimonio.php @@ -0,0 +1,290 @@ +prepare("SELECT * FROM testimonios WHERE id = ?"); +$stmt->bind_param("i", $testimonio_id); +$stmt->execute(); +$result = $stmt->get_result(); +$testimonio = $result->fetch_assoc(); +$stmt->close(); + +if (!$testimonio) { + header('Location: testimonios.php'); + exit(); +} + +$error = ''; +$success = ''; + +// Procesar formulario +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $nombre_cliente = limpiar_input($_POST['nombre_cliente']); + $cargo = limpiar_input($_POST['cargo']); + $empresa = limpiar_input($_POST['empresa']); + $testimonio_texto = limpiar_input($_POST['testimonio']); + $puntuacion = (int) $_POST['puntuacion']; + $destacado = isset($_POST['destacado']) ? 1 : 0; + $activo = isset($_POST['activo']) ? 1 : 0; + + // Validaciones + if (empty($nombre_cliente)) { + $error = "El nombre del cliente es obligatorio"; + } elseif (empty($testimonio_texto)) { + $error = "El testimonio es obligatorio"; + } elseif ($puntuacion < 1 || $puntuacion > 5) { + $error = "La puntuación debe estar entre 1 y 5"; + } else { + // Gestionar foto del cliente + $foto_path = $testimonio['foto_cliente']; + + if (isset($_FILES['foto_cliente']) && $_FILES['foto_cliente']['error'] === UPLOAD_ERR_OK) { + $resultado = subir_imagen($_FILES['foto_cliente'], 'testimonios'); + if ($resultado['success']) { + // Eliminar foto anterior si existe + if (!empty($testimonio['foto_cliente'])) { + eliminar_imagen('../' . $testimonio['foto_cliente']); + } + $foto_path = $resultado['path']; + } else { + $error = $resultado['message']; + } + } + + if (empty($error)) { + $stmt = $mysqli->prepare( + "UPDATE testimonios SET nombre_cliente = ?, cargo = ?, empresa = ?, testimonio = ?, foto_cliente = ?, puntuacion = ?, destacado = ?, activo = ? WHERE id = ?" + ); + + if ($stmt) { + $stmt->bind_param("sssssilli", $nombre_cliente, $cargo, $empresa, $testimonio_texto, $foto_path, $puntuacion, $destacado, $activo, $testimonio_id); + + if ($stmt->execute()) { + header("Location: testimonios.php?success=updated"); + exit(); + } else { + $error = "Error al actualizar testimonio: " . $stmt->error; + } + + $stmt->close(); + } + } + } + + // Recargar datos si hubo error + $stmt = $mysqli->prepare("SELECT * FROM testimonios WHERE id = ?"); + $stmt->bind_param("i", $testimonio_id); + $stmt->execute(); + $result = $stmt->get_result(); + $testimonio = $result->fetch_assoc(); + $stmt->close(); +} + +$mysqli->close(); + +include '../includes/header.php'; +?> + + +
+
+
+
+

+ Editar Testimonio +

+ +
+
+
+
+ + +
+
+
+
+
+
+ + +
+ + +
+ + + + +
+ Foto actual +

Foto actual

+
+ + +
+
+
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + + Opinión o comentario del cliente +
+
+ +
+
+ + +
+
+ +
+
+ +
+ + +
+ Opcional. JPG, PNG (máx 5MB) +
+
+ +
+
+
+ > + +
+
+
+ +
+
+
+ > + +
+
+
+
+ +
+ +
+
+

+ + + Registrado el + +

+
+
+ + Cancelar + + +
+
+
+
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/practicas/pp6/admin/editUser.php b/practicas/pp6/admin/editUser.php new file mode 100644 index 00000000..850e911d --- /dev/null +++ b/practicas/pp6/admin/editUser.php @@ -0,0 +1,317 @@ +prepare("SELECT * FROM users WHERE id = ?"); +$stmt->bind_param("i", $user_id); +$stmt->execute(); +$result = $stmt->get_result(); +$usuario = $result->fetch_assoc(); +$stmt->close(); + +if (!$usuario) { + header('Location: usuarios.php'); + exit(); +} + +$error = ''; +$success = ''; + +// Procesar formulario +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $nombre = limpiar_input($_POST['nombre']); + $apellidos = limpiar_input($_POST['apellidos']); + $email = limpiar_input($_POST['email']); + $role = limpiar_input($_POST['role']); + $age = (int) $_POST['age']; + $job = limpiar_input($_POST['job']); + $activo = isset($_POST['activo']) ? 1 : 0; + + // Validaciones + if (!validar_email($email)) { + $error = "El email no es válido"; + } else { + // Verificar email único (excepto el actual) + $email_escapado = $mysqli->real_escape_string($email); + $result = $mysqli->query("SELECT id FROM users WHERE email = '$email_escapado' AND id != $user_id LIMIT 1"); + + if ($result->num_rows > 0) { + $error = "Este email ya está registrado por otro usuario"; + } else { + // Gestionar avatar + $avatar_path = $usuario['foto']; + + if (isset($_FILES['avatar']) && $_FILES['avatar']['error'] === UPLOAD_ERR_OK) { + $resultado = subir_avatar($_FILES['avatar']); + if ($resultado['success']) { + // Eliminar avatar anterior si no es el default + if (!empty($usuario['foto']) && $usuario['foto'] != 'uploads/avatars/default-avatar.jpg') { + eliminar_imagen('../' . $usuario['foto']); + } + $avatar_path = $resultado['path']; + } else { + $error = $resultado['message']; + } + } + + if (empty($error)) { + // Si se proporcionó nueva contraseña + if (!empty($_POST['password'])) { + $password = $_POST['password']; + if (strlen($password) < 6) { + $error = "La contraseña debe tener al menos 6 caracteres"; + } else { + $password_hash = password_hash($password, PASSWORD_DEFAULT); + + $stmt = $mysqli->prepare( + "UPDATE users SET nombre = ?, apellidos = ?, email = ?, password = ?, foto = ?, role = ?, age = ?, job = ?, activo = ? WHERE id = ?" + ); + $stmt->bind_param("ssssssisii", $nombre, $apellidos, $email, $password_hash, $avatar_path, $role, $age, $job, $activo, $user_id); + } + } else { + // Sin cambio de contraseña + $stmt = $mysqli->prepare( + "UPDATE users SET nombre = ?, apellidos = ?, email = ?, foto = ?, role = ?, age = ?, job = ?, activo = ? WHERE id = ?" + ); + $stmt->bind_param("sssssisii", $nombre, $apellidos, $email, $avatar_path, $role, $age, $job, $activo, $user_id); + } + + if (empty($error) && $stmt) { + if ($stmt->execute()) { + // Si el admin se editó a sí mismo, actualizar sesión + if ($user_id == $_SESSION['user_id']) { + $_SESSION['user_name'] = $nombre; + $_SESSION['user_email'] = $email; + $_SESSION['user_role'] = $role; + $_SESSION['user_foto'] = $avatar_path; + } + + header("Location: usuarios.php?success=updated"); + exit(); + } else { + $error = "Error al actualizar usuario: " . $stmt->error; + } + + $stmt->close(); + } + } + } + } + + // Recargar datos del usuario si hubo error + $stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?"); + $stmt->bind_param("i", $user_id); + $stmt->execute(); + $result = $stmt->get_result(); + $usuario = $result->fetch_assoc(); + $stmt->close(); +} + +$mysqli->close(); + +include '../includes/header.php'; +?> + + +
+
+
+
+

+ Editar Usuario +

+ +
+
+
+
+ + +
+
+
+
+
+
+ + +
+ + +
+ + + +
+ + +
+ + + + +
+ Avatar actual +

Avatar actual

+
+ + +
+
+
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + + Déjalo vacío si no quieres cambiarla +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ +
+ + +
+ Opcional. JPG, PNG, GIF (máx 5MB) +
+
+ +
+
+
+ > + +
+
+
+
+ +
+ +
+
+

+ + + Registrado el + +

+
+
+ + Cancelar + + +
+
+
+
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/practicas/pp6/admin/faqs.php b/practicas/pp6/admin/faqs.php new file mode 100644 index 00000000..ef4048c8 --- /dev/null +++ b/practicas/pp6/admin/faqs.php @@ -0,0 +1,158 @@ +query("SELECT * FROM faqs ORDER BY orden ASC, id DESC"); +if ($result) { + while ($row = $result->fetch_assoc()) { + $faqs[] = $row; + } +} + +closeDBConnection($mysqli); + +include '../includes/header.php'; +?> + + +
+
+
+
+

+ Gestión de FAQs +

+ +
+
+
+
+ + +
+
+ + + +
+ + + +
+ + +
+
+

+ Total de FAQs: +

+
+ +
+ +
+
+ 0): ?> +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
IDPreguntaRespuestaCategoríaOrdenEstadoAcciones
+ + + + + + + + - + + + + + + + + Activa + + Inactiva + + + + + + + + +
+
+ +
+

No hay FAQs registradas

+
+ +
+
+ +
+
+ + \ No newline at end of file diff --git a/practicas/pp6/admin/index.php b/practicas/pp6/admin/index.php new file mode 100644 index 00000000..cf8678bb --- /dev/null +++ b/practicas/pp6/admin/index.php @@ -0,0 +1,335 @@ +query("SELECT COUNT(*) as total FROM users"); +$total_usuarios = $result->fetch_assoc()['total']; + +// Contar noticias +$result = $mysqli->query("SELECT COUNT(*) as total FROM noticias"); +$total_noticias = $result->fetch_assoc()['total']; + +// Contar proyectos +$result = $mysqli->query("SELECT COUNT(*) as total FROM proyectos"); +$total_proyectos = $result->fetch_assoc()['total']; + +// Contar testimonios +$result = $mysqli->query("SELECT COUNT(*) as total FROM testimonios"); +$total_testimonios = $result->fetch_assoc()['total']; + +// Contar mensajes sin leer +$result = $mysqli->query("SELECT COUNT(*) as total FROM mensajes_contacto WHERE leido = FALSE"); +$mensajes_sin_leer = $result->fetch_assoc()['total']; + +// Últimos usuarios registrados +$ultimos_usuarios = []; +$result = $mysqli->query("SELECT * FROM users ORDER BY date_register DESC LIMIT 5"); +while ($row = $result->fetch_assoc()) { + $ultimos_usuarios[] = $row; +} + +// Últimos mensajes de contacto +$ultimos_mensajes = []; +$result = $mysqli->query("SELECT * FROM mensajes_contacto ORDER BY fecha_envio DESC LIMIT 5"); +while ($row = $result->fetch_assoc()) { + $ultimos_mensajes[] = $row; +} + +closeDBConnection($mysqli); + +include '../includes/header.php'; +?> + + +
+
+
+
+

+ Panel de Administración +

+

Bienvenido,

+
+
+
+
+ + +
+
+ + +
+
+
+
+
+ +
+

+

Usuarios

+ Ver Todos +
+
+
+ +
+
+
+
+ +
+

+

Noticias

+ Ver Todas +
+
+
+ +
+
+
+
+ +
+

+

Proyectos

+ Ver Todos +
+
+
+ +
+
+
+
+ +
+

+

Mensajes Sin Leer

+ Ver Mensajes +
+
+
+
+ + +
+
+

+ Accesos Rápidos +

+
+
+ +
+
+
+
+
+ Usuarios +
+

Gestionar usuarios del sistema

+ Ver Todos + + Nuevo + +
+
+
+ +
+
+
+
+ Noticias +
+

Gestionar noticias del blog

+ Ver Todas + + Nueva + +
+
+
+ +
+
+
+
+ Proyectos +
+

Gestionar portfolio de proyectos

+ Ver Todos + + Nuevo + +
+
+
+ +
+
+
+
+ Testimonios +
+

Gestionar testimonios de clientes

+ Ver Todos + + Nuevo + +
+
+
+ +
+
+
+
+ FAQs +
+

Gestionar preguntas frecuentes

+ Ver Todas + + Nueva + +
+
+
+ +
+
+
+
+ Mensajes +
+

Ver mensajes de contacto

+ + Ver Mensajes + 0): ?> + + + +
+
+
+
+ + +
+
+
+
+
+ Últimos Usuarios Registrados +
+ + 0): ?> +
+ + + + + + + + + + + + + + + + + + + +
UsuarioEmailRolFecha
+ + + + + + + + +
+
+ +

No hay usuarios registrados

+ +
+
+
+ + +
+
+
+
+ Últimos Mensajes de Contacto +
+ + 0): ?> +
+ + + + + + + + + + + + + + + + + + + +
NombreAsuntoFechaEstado
+ + Sin leer + + Leído + +
+
+ +

No hay mensajes

+ +
+
+
+
+ +
+
+ + \ No newline at end of file diff --git a/practicas/pp6/admin/mensajes.php b/practicas/pp6/admin/mensajes.php new file mode 100644 index 00000000..5c9a29e8 --- /dev/null +++ b/practicas/pp6/admin/mensajes.php @@ -0,0 +1,205 @@ +prepare("UPDATE mensajes_contacto SET leido = TRUE WHERE id = ?"); + $stmt->bind_param("i", $mensaje_id); + $stmt->execute(); + $stmt->close(); + header('Location: mensajes.php?success=marked'); + exit(); +} + +// Eliminar mensaje si se recibe ID +if (isset($_GET['eliminar'])) { + $mensaje_id = (int)$_GET['eliminar']; + $stmt = $mysqli->prepare("DELETE FROM mensajes_contacto WHERE id = ?"); + $stmt->bind_param("i", $mensaje_id); + $stmt->execute(); + $stmt->close(); + header('Location: mensajes.php?success=deleted'); + exit(); +} + +// Obtener todos los mensajes +$mensajes = []; +$result = $mysqli->query("SELECT * FROM mensajes_contacto ORDER BY fecha_envio DESC"); +if ($result) { + while ($row = $result->fetch_assoc()) { + $mensajes[] = $row; + } +} + +// Contar mensajes sin leer +$result = $mysqli->query("SELECT COUNT(*) as total FROM mensajes_contacto WHERE leido = FALSE"); +$mensajes_sin_leer = $result->fetch_assoc()['total']; + +closeDBConnection($mysqli); + +include '../includes/header.php'; +?> + + +
+
+
+
+

+ Mensajes de Contacto + 0): ?> + sin leer + +

+ +
+
+
+
+ + +
+
+ + + +
+ + + +
+ + +
+
+

+ Total de Mensajes: +

+
+
+ + sin leer + +
+
+ + 0): ?> + + +
+ +
+
+
+ + +
+
+
+ + + Nuevo + +
+ + + +
+ + + +
+ + +
+ + Asunto: + +

+
+ + +
+ + Mensaje: + +
+ +
+
+ + +
+ +
+ + + + + + + + +
+
+ +
+
+
+ +
+ + + + +
+
+ +

No hay mensajes

+

Cuando los usuarios envíen mensajes desde el formulario de contacto, aparecerán aquí.

+
+
+ + + +
+
+ + \ No newline at end of file diff --git a/practicas/pp6/admin/noticias.php b/practicas/pp6/admin/noticias.php new file mode 100644 index 00000000..5f7c9570 --- /dev/null +++ b/practicas/pp6/admin/noticias.php @@ -0,0 +1,189 @@ +query( + "SELECT n.*, u.nombre as autor_nombre + FROM noticias n + LEFT JOIN users u ON n.autor_id = u.id + ORDER BY n.fecha_publicacion DESC" +); +if ($result) { + while ($row = $result->fetch_assoc()) { + $noticias[] = $row; + } +} + +closeDBConnection($mysqli); + +include '../includes/header.php'; +?> + + +
+
+
+
+

+ Gestión de Noticias +

+ +
+
+
+
+ + +
+
+ + + +
+ + + +
+ + +
+
+

+ Total de Noticias: +

+
+ +
+ +
+
+ 0): ?> +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDImagenTítuloCategoríaAutorFecha PublicaciónDestacadaEstadoAcciones
+ + <?php echo htmlspecialchars($noticia['titulo']); ?> + + + + + + +
+ +
+ + + + + + - + + + + + Destacada + + + - + + + + Activa + + Inactiva + + + + + + + + + + + +
+
+ +
+

No hay noticias creadas

+
+ +
+
+ +
+
+ + \ No newline at end of file diff --git a/practicas/pp6/admin/proyectos.php b/practicas/pp6/admin/proyectos.php new file mode 100644 index 00000000..dfea0f91 --- /dev/null +++ b/practicas/pp6/admin/proyectos.php @@ -0,0 +1,191 @@ +query("SELECT * FROM proyectos ORDER BY orden_visualizacion ASC, fecha_inicio DESC"); +if ($result) { + while ($row = $result->fetch_assoc()) { + $proyectos[] = $row; + } +} + +closeDBConnection($mysqli); + +include '../includes/header.php'; +?> + + +
+
+
+
+

+ Gestión de Proyectos +

+ +
+
+
+
+ + +
+
+ + + +
+ + + +
+ + +
+
+

+ Total de Proyectos: +

+
+ +
+ +
+
+ 0): ?> +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDImagenTítuloClienteCategoríaTecnologíasFecha InicioDestacadoOrdenEstadoAcciones
+ + <?php echo htmlspecialchars($proyecto['titulo']); ?> + + + + + + + + + + + + - + + + + + + + Destacado + + + - + + + + + + + + Activo + + Inactivo + + + + + + + + + + + +
+
+ +
+

No hay proyectos creados

+
+ +
+
+ +
+
+ + \ No newline at end of file diff --git a/practicas/pp6/admin/testimonios.php b/practicas/pp6/admin/testimonios.php new file mode 100644 index 00000000..4a34f29a --- /dev/null +++ b/practicas/pp6/admin/testimonios.php @@ -0,0 +1,179 @@ +query("SELECT * FROM testimonios ORDER BY puntuacion DESC, fecha_testimonio DESC"); +if ($result) { + while ($row = $result->fetch_assoc()) { + $testimonios[] = $row; + } +} + +closeDBConnection($mysqli); + +include '../includes/header.php'; +?> + + +
+
+
+
+

+ Gestión de Testimonios +

+ +
+
+
+
+ + +
+
+ + + +
+ + + +
+ + +
+
+

+ Total de Testimonios: +

+
+ +
+ +
+
+ 0): ?> +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDFotoClienteCargo/EmpresaTestimonioPuntuaciónFechaDestacadoEstadoAcciones
+ + <?php echo htmlspecialchars($testimonio['nombre_cliente']); ?> + + + + + + + +
+ +
+ + + +
+ (/5) +
+ + + Destacado + + + - + + + + Activo + + Inactivo + + + + + + + + +
+
+ +
+

No hay testimonios registrados

+
+ +
+
+ +
+
+ + \ No newline at end of file diff --git a/practicas/pp6/admin/usuarios.php b/practicas/pp6/admin/usuarios.php new file mode 100644 index 00000000..1ec138db --- /dev/null +++ b/practicas/pp6/admin/usuarios.php @@ -0,0 +1,171 @@ +query("SELECT * FROM users ORDER BY date_register DESC"); +if ($result) { + while ($row = $result->fetch_assoc()) { + $usuarios[] = $row; + } +} + +closeDBConnection($mysqli); + +include '../includes/header.php'; +?> + + +
+
+
+
+

+ Gestión de Usuarios +

+ +
+
+
+
+ + +
+
+ + + +
+ + + +
+ + +
+
+

+ Total de Usuarios: +

+
+ +
+ +
+
+ 0): ?> +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDFotoNombreEmailRolEdadTrabajoFecha RegistroEstadoAcciones
+ + <?php echo htmlspecialchars($usuario['nombre']); ?> + + + + + + + + + + años + + Activo + + Inactivo + + + + + + + + + + + + + +
+
+ +
+

No hay usuarios registrados

+
+ +
+
+ +
+
+ + \ No newline at end of file diff --git a/practicas/pp6/blog-single.php b/practicas/pp6/blog-single.php new file mode 100644 index 00000000..cfd619bd --- /dev/null +++ b/practicas/pp6/blog-single.php @@ -0,0 +1,340 @@ + + + + + + + + + Agen | Bootstrap Agency Template + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Blog Details

+
+
+
+
+ + +
+
+
+
+

What should be the proper purpose of UI and UX design?

+ post-thumb +

Post by Themefisher

+

May 26, 2017

+
+

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et + dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex + ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat + nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit + anim id est laborum. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque + laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae + dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia + consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est.

+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore + et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip + ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu + fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt + mollit anim id est laborum. +

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et + dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex + ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat + nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit + anim id est laborum. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque + laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae + dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia + consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem + ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut + labore et dolore magnam aliquam quaerat voluptatem.

+
Dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi + tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.
+

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et + dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex + ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat + nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit + anim id est laborum. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque + laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae + dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia + consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem + ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut + labore et dolore magnam aliquam quaerat voluptatem.

+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
Carole Marvin.
+ 15 january 2015 At 10:30 pm + Reply +

Ne erat velit invidunt his. Eum in dicta veniam interesset, harum fuisset te nam ea cu lupta + definitionem.

+
+ +
+
Jaquan Rolfson.
+ 15 january 2015 At 10:30 pm + Reply +

Ne erat velit invidunt his. Eum in dicta veniam interesset, harum fuisset te nam ea cu lupta + definitionem.

+
+
+
+
+
+ +
+
Bruce Bernier.
+ 15 january 2015 At 10:30 pm + Reply +

Ne erat velit invidunt his. Eum in dicta veniam interesset, harum fuisset te nam ea cu lupta + definitionem.

+
+
+
+

Leave a Comment

+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+ + +
+
+
+
+

Latest News

+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/practicas/pp6/blog.php b/practicas/pp6/blog.php new file mode 100644 index 00000000..3f57984f --- /dev/null +++ b/practicas/pp6/blog.php @@ -0,0 +1,183 @@ + + +<query("SELECT COUNT(*) as total FROM noticias WHERE activa = TRUE"); +$total_noticias = $result->fetch_assoc()['total']; +$total_paginas = ceil($total_noticias / $noticias_por_pagina); + +// Obtener noticias de la página actual +$noticias = []; +$result = $mysqli->query("SELECT n.*, u.nombre as autor_nombre + FROM noticias n + LEFT JOIN users u ON n.autor_id = u.id + WHERE n.activa = TRUE + ORDER BY n.fecha_publicacion DESC + LIMIT $noticias_por_pagina OFFSET $offset"); +if ($result) { + while ($row = $result->fetch_assoc()) { + $noticias[] = $row; + } +} + +closeDBConnection($mysqli); + +include 'includes/header.php'; +?> + + +
+
+
+
+

Nuestro Blog

+
+
+
+
+ + +
+
+
+
+
+

Últimas Noticias y Artículos

+

+ Mantente informado sobre las últimas tendencias en tecnología +

+
+
+
+ + 0): ?> +
+ +
+
+ + <?php echo htmlspecialchars($noticia['titulo']); ?> + + <?php echo htmlspecialchars($noticia['titulo']); ?> + + +
+ + + + + + +
+ + + +
+ + +

+ +

+ + +

+ +

+ + +
+
+
+ +
+ + + 1): ?> +
+
+ +
+
+ + + +
+
+
+ No hay noticias disponibles en este momento. +
+
+
+ +
+
+ + \ No newline at end of file diff --git a/practicas/pp6/contact.php b/practicas/pp6/contact.php new file mode 100644 index 00000000..c3f20dad --- /dev/null +++ b/practicas/pp6/contact.php @@ -0,0 +1,187 @@ +prepare( + "INSERT INTO mensajes_contacto (nombre, email, asunto, mensaje, fecha_envio) + VALUES (?, ?, ?, ?, NOW())" + ); + + if ($stmt) { + $stmt->bind_param("ssss", $nombre, $email, $asunto, $mensaje); + + if ($stmt->execute()) { + $success = "¡Mensaje enviado correctamente! Te contactaremos pronto."; + // Limpiar variables + $nombre = $email = $asunto = $mensaje = ''; + } else { + $error = "Error al enviar el mensaje. Inténtalo de nuevo."; + } + + $stmt->close(); + } + } + + $mysqli->close(); +} + +include 'includes/header.php'; +?> + + +
+
+
+
+

Contacto

+
+
+
+
+ + +
+
+
+
+
+

Ponte en Contacto

+

+ ¿Tienes alguna pregunta o proyecto en mente? Escríbenos y te responderemos lo antes posible +

+
+
+
+ +
+ +
+
+
+ +
+
+
Dirección
+

+
+
+ +
+
+ +
+
+
Teléfono
+

+
+
+ +
+
+ +
+
+
Email
+

+
+
+
+ + +
+
+

+ Envíanos un Mensaje +

+ + +
+ + +
+ + + +
+ + +
+ + +
+
+
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+ +
+
+
+
+
+
+
+
+ + \ No newline at end of file diff --git a/practicas/pp6/css/style.css b/practicas/pp6/css/style.css new file mode 100644 index 00000000..222a5fd5 --- /dev/null +++ b/practicas/pp6/css/style.css @@ -0,0 +1,960 @@ +/** + * WEBSITE: https://themefisher.com + * TWITTER: https://twitter.com/themefisher + * FACEBOOK: https://www.facebook.com/themefisher + * GITHUB: https://github.com/themefisher/ + */ + +/*!------------------------------------------------------------------ +[MAIN STYLESHEET] + +PROJECT: Project Name +VERSION: Versoin Number +-------------------------------------------------------------------*/ +/*------------------------------------------------------------------ +[TABLE OF CONTENTS] +-------------------------------------------------------------------*/ +/* typography */ +@import url("https://fonts.googleapis.com/css?family=Noto+Sans:400,700|Poppins:300,400,500,600,700&display=swap"); +body { + line-height: 1.2; + font-family: "Poppins", sans-serif; + -webkit-font-smoothing: antialiased; + font-size: 15px; + color: #6c6c86; +} + +p { + font-weight: 400; + color: #6c6c86; + font-size: 15px; + line-height: 1.7; + font-family: "Poppins", sans-serif; +} + +.lead { + font-size: 18px; +} + +.display-1 { + font-size: 100px; +} +@media (max-width: 575px) { + .display-1 { + font-size: 50px; + } +} + +h1, h2, h3, h4, h5, h6 { + color: #000; + font-family: "Noto Sans", sans-serif; + font-weight: 700; + line-height: 1.2; +} + +h1, .h1 { + font-size: 60px; +} +@media (max-width: 575px) { + h1, .h1 { + font-size: 40px; + } +} + +h2, .h2 { + font-size: 44px; +} +@media (max-width: 575px) { + h2, .h2 { + font-size: 30px; + } +} + +h3, .h3 { + font-size: 36px; +} +@media (max-width: 575px) { + h3, .h3 { + font-size: 28px; + } +} + +h4, .h4 { + font-size: 24px; +} + +h5, .h5 { + font-size: 18px; +} + +h6, .h6 { + font-size: 14px; +} + +.icon-lg { + font-size: 50px; +} + +.icon { + font-size: 40px; +} + +.icon-sm { + font-size: 30px; +} + +.icon-xs { + font-size: 20px; +} + +/* Button style */ +.btn { + font-size: 15px; + font-family: "Poppins", sans-serif; + text-transform: capitalize; + padding: 13px 45px; + border-radius: 35px; + font-weight: 600; + border: 1px solid; + position: relative; + z-index: 1; + transition: 0.2s ease; +} +.btn:hover, .btn:active, .btn:focus { + outline: 0; + box-shadow: none !important; + box-shadow: 0px 18px 18px 0px rgba(20, 28, 91, 0.19); +} + +.btn-lg { + font-size: 20px; + padding: 20px 90px; +} + +.btn-primary { + background: linear-gradient(37deg, rgb(180, 62, 121) 1%, rgb(247, 70, 58) 100%); + color: #fff; + border: 0; +} +.btn-primary:active, .btn-primary:hover, .btn-primary.focus, .btn-primary.active { + background: linear-gradient(37deg, rgb(180, 62, 121) 1%, rgb(247, 70, 58) 100%) !important; + color: #fff; + border: 0; +} + +.btn-outline-primary { + background: transparent; + color: #f7463a; + border-color: #f7463a; +} +.btn-outline-primary:active, .btn-outline-primary:hover, .btn-outline-primary.focus, .btn-outline-primary.active { + background: linear-gradient(37deg, rgb(180, 62, 121) 1%, rgb(247, 70, 58) 100%) !important; + color: #fff; + border-color: #f7463a; +} + +.btn-secondary { + background: #07085d; + color: #fff; + border: 0; +} +.btn-secondary:active, .btn-secondary:hover, .btn-secondary.focus, .btn-secondary.active { + background: #07085d !important; + color: #fff; + border: 0; +} + +.btn-outline-light { + background: transparent; + color: #fff; + border-color: #fff; +} +.btn-outline-light:active, .btn-outline-light:hover, .btn-outline-light.focus, .btn-outline-light.active { + background: #fff !important; + color: #000; + border-color: #fff; +} + +.btn-transparent { + color: #f7463a; + border: 0; + padding-left: 0; + background: linear-gradient(37deg, rgb(180, 62, 121) 1%, rgb(247, 70, 58) 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} +.btn-transparent:active, .btn-transparent:hover, .btn-transparent.focus, .btn-transparent.active { + color: #f7463a; + border: 0; + padding-left: 0; + background: linear-gradient(37deg, rgb(180, 62, 121) 1%, rgb(247, 70, 58) 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + box-shadow: none; + text-decoration: underline; +} + +body { + background-color: #fff; + overflow-x: hidden; +} + +::-moz-selection { + background: #f9746b; + color: #fff; +} + +::selection { + background: #f9746b; + color: #fff; +} + +/* preloader */ +.preloader { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #fff; + z-index: 999; + display: flex; + align-items: center; + justify-content: center; +} + +ol, +ul { + list-style-type: none; + margin: 0px; +} + +img { + vertical-align: middle; + border: 0; +} + +a { + color: #f7463a; +} + +a, +a:hover, +a:focus { + text-decoration: none; +} + +.hover-text-underline:hover { + text-decoration: underline; +} + +a, +button, +select { + cursor: pointer; + transition: 0.2s ease; +} +a:focus, +button:focus, +select:focus { + outline: 0; +} + +a:hover { + color: #f7463a; +} + +.slick-slide { + outline: 0; +} + +.section { + padding-top: 110px; + padding-bottom: 100px; +} +.section-sm { + padding-top: 60px; + padding-bottom: 60px; +} +.section-lg { + padding-top: 170px; + padding-bottom: 170px; +} + +.section-border { + height: 9px; + width: 220px; + background: linear-gradient(37deg, rgb(180, 62, 121) 1%, rgb(247, 70, 58) 100%); + border-radius: 5px; + margin: 40px auto 90px; +} + +.bg-cover { + background-size: cover; + background-position: center center; + background-repeat: no-repeat; +} + +.bg-contain { + background-size: contain; + background-position: center right; + background-repeat: no-repeat; +} + +.border-primary { + border-color: #d2d2e2 !important; +} + +/* overlay */ +.overlay { + position: relative; +} +.overlay::before { + position: absolute; + content: ""; + height: 100%; + width: 100%; + top: 0; + left: 0; + background: #000; + opacity: 0.8; +} +.overlay-primary { + position: relative; +} +.overlay-primary::before { + position: absolute; + content: ""; + height: 100%; + width: 100%; + top: 0; + left: 0; + background: #f7463a; + opacity: 0.8; +} +.overlay-secondary { + position: relative; +} +.overlay-secondary::before { + position: absolute; + content: ""; + height: 100%; + width: 100%; + top: 0; + left: 0; + background: #07085d; + opacity: 0.8; +} +.overlay-secondary-half { + position: relative; +} +.overlay-secondary-half::before { + position: absolute; + content: ""; + height: 100%; + width: 100%; + top: 0; + left: 0; + background: linear-gradient(to right, #07085d 60%, transparent); +} +.overlay-image { + position: absolute; + height: 100%; + width: 100%; + left: 0; + top: 0; +} + +.outline-0 { + outline: 0 !important; +} + +.d-unset { + display: unset !important; +} + +.bg-primary { + background: #f7463a !important; +} + +.bg-secondary { + background: #07085d !important; +} + +.text-primary { + color: #f7463a !important; +} + +.text-secondary { + color: #07085d !important; +} + +.text-gradient-primary { + background: linear-gradient(37deg, rgb(180, 62, 121) 1%, rgb(247, 70, 58) 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.text-light { + color: #b7b8f1 !important; +} + +.text-color { + color: #6c6c86 !important; +} + +.mb-10 { + margin-bottom: 10px !important; +} + +.mb-20 { + margin-bottom: 20px !important; +} + +.mb-30 { + margin-bottom: 30px !important; +} + +.mb-40 { + margin-bottom: 40px !important; +} + +.mb-50 { + margin-bottom: 50px !important; +} + +.mb-60 { + margin-bottom: 60px !important; +} + +.mb-70 { + margin-bottom: 70px !important; +} + +.mb-80 { + margin-bottom: 80px !important; +} + +.mb-90 { + margin-bottom: 90px !important; +} + +.mb-100 { + margin-bottom: 100px !important; +} + +.zindex-1 { + z-index: 1; +} + +.top-100 { + top: 100px; +} + +.overflow-hidden { + overflow: hidden !important; +} + +.font-primary { + font-family: "Poppins", sans-serif !important; +} + +.font-secondary { + font-family: "Noto Sans", sans-serif !important; +} + +.shadow { + box-shadow: 0px 46px 65px 0px rgba(181, 188, 236, 0.16) !important; +} + +.bg-gradient-primary { + background: linear-gradient(37deg, rgb(180, 62, 121) 1%, rgb(247, 70, 58) 100%) !important; +} + +.transition { + transition: 0.3s ease; +} + +.vertical-align-middle { + vertical-align: middle; +} + +/* form control */ +.form-control { + height: 50px; + border-radius: 0; + border: 0; + border-bottom: 1px solid #d2d2e2; +} +.form-control:focus { + box-shadow: none !important; + border-color: #f7463a; +} + +textarea.form-control { + height: 150px; +} + +/* /form control */ +/* page-title */ +.page-title { + padding: 170px 0 190px; +} + +/* /page-title */ +/* list style */ +.list-styled { + padding-left: 0; +} +.list-styled li { + position: relative; + padding-left: 25px; + list-style-type: none; +} +.list-styled li::before { + position: absolute; + content: "\e65d"; + font-family: "themify"; + font-size: 14px; + left: 0; + top: 0px; + color: #07085d; + transition: 0.3s ease; +} + +/* social icons */ +.social-icons a { + display: block; + height: 50px; + width: 50px; + border-radius: 50%; + line-height: 50px; + background: #07085d; + color: #fff; + text-align: center; +} + +/* /social icons */ +.navigation { + padding: 20px 100px; + transition: 0.3s ease; +} +.navigation.nav-bg { + background-color: #07085d; + padding: 15px 100px; +} +@media (max-width: 991px) { + .navigation.nav-bg { + padding: 15px 20px; + } +} +@media (max-width: 991px) { + .navigation { + padding: 20px; + background: #07085d; + } +} + +.navbar .nav-item .nav-link { + font-family: "Poppins", sans-serif; + padding: 15px; + font-size: 18px; +} +.navbar .nav-item.active { + font-weight: bold; +} +.navbar .dropdown-menu { + box-shadow: 0px 3px 9px 0px rgba(0, 0, 0, 0.12); + padding: 15px; + border: 0; + top: calc(100% - 2px); + left: -10px; + border-radius: 0; + background: #fff; +} +.navbar .dropdown-menu.show { + display: block !important; +} +.navbar .dropdown-item { + position: relative; + color: #000; + transition: 0.2s ease; + font-family: "Poppins", sans-serif; + padding: 10px; + text-decoration: none; + margin-bottom: 0 !important; +} +.navbar .dropdown-item:not(:last-child) { + margin-bottom: 10px; +} + +.navbar-dark .navbar-nav .nav-link { + color: #fff; +} + +.banner { + min-height: 100vh; +} + +.content-center { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + +.hover-bg-secondary { + transition: 0.2s ease; +} +.hover-bg-secondary * { + transition: inherit; +} +.hover-bg-secondary:hover { + background: #07085d; +} +.hover-bg-secondary:hover * { + color: #fff; +} +.hover-bg-secondary.active { + background: #07085d; +} +.hover-bg-secondary.active * { + color: #fff; +} + +.hover-bg-primary { + transition: 0.2s ease; +} +.hover-bg-primary * { + transition: inherit; +} +.hover-bg-primary:hover { + background: #f7463a; +} +.hover-bg-primary:hover * { + color: #fff; +} +.hover-bg-primary.active { + background: #f7463a; +} +.hover-bg-primary.active * { + color: #fff; +} + +.icon-box { + height: 100px; + width: 100px; + line-height: 100px; +} + +.icon-box-sm { + height: 80px; + width: 80px; + line-height: 80px; +} + +.icon-watermark { + position: absolute; + left: 50%; + top: 32%; + transform: translate(-50%, -50%); + opacity: 0.1; + transition: inherit; +} + +.card:hover .icon-watermark { + transform: translate(-50%, -50%) scale(1.5); +} + +.bg-image { + position: absolute; + left: 0; + top: 0; + height: 100%; + width: auto; +} +.bg-image img { + height: 100%; + max-width: 100%; +} +@media (max-width: 991px) { + .bg-image img { + display: none; + } +} +@media (max-width: 767px) { + .bg-image img { + display: block; + height: auto; + } +} + +.hover-shadow::before { + transition: 0.3s ease; + position: absolute; + height: 100%; + box-shadow: 0px 33px 49px 0px rgba(190, 193, 228, 0.31); + width: 100%; + left: 0; + right: 0; + z-index: 1; + content: ""; + opacity: 0; +} +.hover-shadow:hover::before { + opacity: 1; +} + +/* pricing */ +.bottom-shape { + position: relative; + overflow: hidden; +} +.bottom-shape * { + position: relative; + z-index: 1; +} +.bottom-shape::before { + position: absolute; + content: ""; + height: 100%; + width: 100%; + transform: rotate(40deg); + background: linear-gradient(37deg, rgb(180, 62, 121) 1%, rgb(247, 70, 58) 100%); + left: 0; + top: 60%; + opacity: 0.5; +} +.bottom-shape::after { + position: absolute; + content: ""; + height: 100%; + width: 100%; + transform: rotate(40deg); + background: linear-gradient(37deg, rgb(180, 62, 121) 1%, rgb(247, 70, 58) 100%); + left: 20%; + top: 55%; +} + +/* /pricing */ +/* project */ +.project-item { + position: relative; +} +.project-item:hover .project-hover { + visibility: visible; + opacity: 1; + transform: rotateX(0deg); +} + +.project-hover { + position: absolute; + width: 80%; + left: 10%; + bottom: 10%; + display: flex; + justify-content: space-between; + align-items: center; + visibility: hidden; + opacity: 0; + transform: rotateX(90deg); + transition: 0.3s ease; + transform-origin: bottom; +} +.project-hover i { + height: 55px; + width: 55px; + line-height: 55px; + border: 1px solid #fff; + border-radius: 50%; + text-align: center; + display: block; +} +.project-hover i:hover { + border-color: #f7463a; +} + +/* /project */ +/* footer */ +footer .overlay-image { + height: 80%; + width: 80%; + left: 10%; + top: 10%; +} + +/* progressbar */ +.progress-block .progress { + height: 8px; + border-radius: 10px; + margin-bottom: 40px; + overflow: visible; + position: relative; + box-shadow: 0px 9px 24px 0px rgba(19, 5, 44, 0.21); +} +.progress-block .progress-bar { + background: linear-gradient(37deg, rgb(180, 62, 121) 1%, rgb(247, 70, 58) 100%); + width: 0; + transition: all 3s ease-in-out; + top: 0; + left: 0; + height: 100%; + border-radius: 10px; +} +.progress-block .progress-bar .skill-number { + position: absolute; + top: -22px; + right: 0px; +} + +/* /progressbar */ +/* video */ +.video-player iframe { + width: 100%; + height: 100%; +} +.video-player .play-icon { + position: absolute; + left: 0; + top: 0; + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + text-align: center; +} + +/* ripple animation */ +.ripple { + border-radius: 50%; + position: absolute; + height: 130%; + width: 130%; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); +} +.ripple::after { + opacity: 0; + position: absolute; + right: 0; + bottom: 0; + content: ""; + height: 100%; + width: 100%; + border: 1px solid #d2d2e2; + border-radius: 100%; + -webkit-animation-name: ripple; + animation-name: ripple; + -webkit-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-delay: 0s; + animation-delay: 0s; + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -webkit-animation-timing-function: cubic-bezier(0.65, 0, 0.34, 1); + animation-timing-function: cubic-bezier(0.65, 0, 0.34, 1); + z-index: -1; +} +.ripple::before { + opacity: 0; + position: absolute; + right: 0; + bottom: 0; + content: ""; + height: 100%; + width: 100%; + border: 1px solid #d2d2e2; + border-radius: 100%; + -webkit-animation-name: ripple; + animation-name: ripple; + -webkit-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-delay: 0.5s; + animation-delay: 0.5s; + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -webkit-animation-timing-function: cubic-bezier(0.65, 0, 0.34, 1); + animation-timing-function: cubic-bezier(0.65, 0, 0.34, 1); + z-index: -1; +} + +@-webkit-keyframes ripple { + from { + opacity: 1; + transform: scale3d(0.75, 0.75, 1); + } + to { + opacity: 0; + transform: scale3d(1.5, 1.5, 1); + } +} + +@keyframes ripple { + from { + opacity: 1; + transform: scale3d(0.75, 0.75, 1); + } + to { + opacity: 0; + transform: scale3d(1.5, 1.5, 1); + } +} +/* /video */ +/* card slider */ +@media (max-width: 991px) { + .ui-card-slider .left-slide::before { + left: -100px; + } +} +@media (max-width: 767px) { + .ui-card-slider .left-slide::before { + display: none; + } +} + +@media (max-width: 991px) { + .ui-card-slider .right-slide::before { + right: -100px; + } +} +@media (max-width: 767px) { + .ui-card-slider .right-slide::before { + display: none; + } +} + +/* /card slider */ +/* google map */ +.map { + height: 750px; +} + +/* /google map */ +/* team */ +.img-thumb-circle { + border-radius: 50%; + overflow: hidden; + max-height: 260px; + max-width: 260px; +} + +.card { + border: 0; + border-radius: 0; +} +.card-img-top { + border-radius: 0; +} +.card-header { + border: 0; +} +.card-body { + border: 0; + border-radius: 0; +} +.card-footer { + border: 0; +} +/*# sourceMappingURL=style.css.map */ diff --git a/practicas/pp6/css/style.css.map b/practicas/pp6/css/style.css.map new file mode 100644 index 00000000..aba1dc30 --- /dev/null +++ b/practicas/pp6/css/style.css.map @@ -0,0 +1,8 @@ +/** + * WEBSITE: https://themefisher.com + * TWITTER: https://twitter.com/themefisher + * FACEBOOK: https://www.facebook.com/themefisher + * GITHUB: https://github.com/themefisher/ + */ + +{"version":3,"sources":["style.scss","_typography.scss","_variables.scss","style.css","_mixins.scss","_buttons.scss","_common.scss","templates/_navigation.scss","templates/_homepage.scss","templates/_otherspage.scss","templates/_cards.scss"],"names":[],"mappings":"AAAA;;;;;oEAAA;AAOA;;oEAAA;ACPA,gBAAA;AACQ,iHAAA;AAER;EACE,gBAAA;EACA,kCCQa;EDPb,mCAAA;EACA,eAAA;EACA,cCLW;ACcb;;AFNA;EACE,gBAAA;EACA,cCVW;EDWX,eAAA;EACA,gBAAA;EACA,kCCHa;ACYf;;AFNA;EACE,eAAA;AESF;;AFNA;EACE,gBAAA;AESF;AC3BE;EHiBF;IAGI,eAAA;EEWF;AACF;;AFRA;EACE,WC3BgB;ED4BhB,oCClBe;EDmBf,gBAAA;EACA,gBAAA;AEWF;;AFRA;EACE,eAAA;AEWF;AC3CE;EH+BF;IAGI,eAAA;EEaF;AACF;;AFVA;EACE,eAAA;AEaF;ACpDE;EHsCF;IAGI,eAAA;EEeF;AACF;;AFZA;EACE,eAAA;AEeF;AC7DE;EH6CF;IAGI,eAAA;EEiBF;AACF;;AFdA;EACE,eAAA;AEiBF;;AFdA;EACE,eAAA;AEiBF;;AFdA;EACE,eAAA;AEiBF;;AFdA;EACE,eAAA;AEiBF;;AFdA;EACE,eAAA;AEiBF;;AFdA;EACE,eAAA;AEiBF;;AFdA;EACE,eAAA;AEiBF;;AEpGA,iBAAA;AACA;EACE,eAAA;EACA,kCHUa;EGTb,0BAAA;EACA,kBAAA;EACA,mBAAA;EACA,gBAAA;EACA,iBAAA;EACA,kBAAA;EACA,UAAA;EACA,qBAAA;AFuGF;AErGE;EAGE,UAAA;EACA,2BAAA;EACA,oDAAA;AFqGJ;;AEjGA;EACE,eAAA;EACA,kBAAA;AFoGF;;AEjGA;EACE,+EHnBiB;EGoBjB,WHrBM;EGsBN,SAAA;AFoGF;AElGE;EAIE,0FAAA;EACA,WH7BI;EG8BJ,SAAA;AFiGJ;;AE5FA;EACE,uBAAA;EACA,cH5Cc;EG6Cd,qBH7Cc;AC4IhB;AE7FE;EAIE,0FAAA;EACA,WH7CI;EG8CJ,qBHrDY;ACiJhB;;AEvFA;EACE,mBH1DgB;EG2DhB,WHrDM;EGsDN,SAAA;AF0FF;AExFE;EAIE,8BAAA;EACA,WH7DI;EG8DJ,SAAA;AFuFJ;;AElFA;EACE,uBAAA;EACA,WHrEM;EGsEN,kBHtEM;AC2JR;AEnFE;EAIE,2BAAA;EACA,WHjFc;EGkFd,kBH9EI;ACgKR;;AE7EA;EACE,cH3Fc;EG4Fd,SAAA;EACA,eAAA;EACA,+EHtFiB;EGuFjB,6BAAA;EACA,oCAAA;AFgFF;AE9EE;EAIE,cHtGY;EGuGZ,SAAA;EACA,eAAA;EACA,+EHjGe;EGkGf,6BAAA;EACA,oCAAA;EACA,gBAAA;EACA,0BAAA;AF6EJ;;AG3LA;EACE,sBJIW;EIHX,kBAAA;AH8LF;;AG3LA;EACE,mBAAA;EACA,WJCM;AC6LR;;AGhMA;EACE,mBAAA;EACA,WJCM;AC6LR;;AG3LA,cAAA;AAEA;EACE,eAAA;EACA,MAAA;EACA,OAAA;EACA,QAAA;EACA,SAAA;EACA,sBAAA;EACA,YAAA;EACA,aAAA;EACA,mBAAA;EACA,uBAAA;AH6LF;;AG1LA;;EAEE,qBAAA;EACA,WAAA;AH6LF;;AG1LA;EACE,sBAAA;EACA,SAAA;AH6LF;;AG1LA;EACE,cJpCc;ACiOhB;;AG1LA;;;EAGE,qBAAA;AH6LF;;AG1LA;EACE,0BAAA;AH6LF;;AG1LA;;;EAGE,eAAA;EACA,qBAAA;AH6LF;AG3LE;;;EACE,UAAA;AH+LJ;;AG3LA;EACE,cJ7Dc;AC2PhB;;AG3LA;EACE,UAAA;AH8LF;;AG3LA;EACE,kBAAA;EACA,qBAAA;AH8LF;AG5LE;EACE,iBAAA;EACA,oBAAA;AH8LJ;AG3LE;EACE,kBAAA;EACA,qBAAA;AH6LJ;;AGzLA;EACE,WAAA;EACA,YAAA;EACA,+EJ9EiB;EI+EjB,kBAAA;EACA,sBAAA;AH4LF;;AGzLA;EACE,sBAAA;EACA,kCAAA;EACA,4BAAA;AH4LF;;AGzLA;EACE,wBAAA;EACA,iCAAA;EACA,4BAAA;AH4LF;;AGzLA;EACE,gCAAA;AH4LF;;AGzLA,YAAA;AAEA;EACE,kBAAA;AH2LF;AGzLE;EACE,kBAAA;EACA,WAAA;EACA,YAAA;EACA,WAAA;EACA,MAAA;EACA,OAAA;EACA,gBJjHI;EIkHJ,YAAA;AH2LJ;AGxLE;EACE,kBAAA;AH0LJ;AGxLI;EACE,kBAAA;EACA,WAAA;EACA,YAAA;EACA,WAAA;EACA,MAAA;EACA,OAAA;EACA,mBJrIU;EIsIV,YAAA;AH0LN;AGtLE;EACE,kBAAA;AHwLJ;AGtLI;EACE,kBAAA;EACA,WAAA;EACA,YAAA;EACA,WAAA;EACA,MAAA;EACA,OAAA;EACA,mBJnJY;EIoJZ,YAAA;AHwLN;AGpLE;EACE,kBAAA;AHsLJ;AGpLI;EACE,kBAAA;EACA,WAAA;EACA,YAAA;EACA,WAAA;EACA,MAAA;EACA,OAAA;EACA,+DAAA;AHsLN;AGlLE;EACE,kBAAA;EACA,YAAA;EACA,WAAA;EACA,OAAA;EACA,MAAA;AHoLJ;;AGhLA;EACE,qBAAA;AHmLF;;AGhLA;EACE,yBAAA;AHmLF;;AGhLA;EACE,8BAAA;AHmLF;;AGhLA;EACE,8BAAA;AHmLF;;AGhLA;EACE,yBAAA;AHmLF;;AGhLA;EACE,yBAAA;AHmLF;;AGhLA;EACE,+EJjMiB;EIkMjB,6BAAA;EACA,oCAAA;AHmLF;;AGhLA;EACE,yBAAA;AHmLF;;AGhLA;EACE,yBAAA;AHmLF;;AGhLA;EACE,8BAAA;AHmLF;;AGhLA;EACE,8BAAA;AHmLF;;AGhLA;EACE,8BAAA;AHmLF;;AGhLA;EACE,8BAAA;AHmLF;;AGhLA;EACE,8BAAA;AHmLF;;AGhLA;EACE,8BAAA;AHmLF;;AGhLA;EACE,8BAAA;AHmLF;;AGhLA;EACE,8BAAA;AHmLF;;AGhLA;EACE,8BAAA;AHmLF;;AGhLA;EACE,+BAAA;AHmLF;;AGhLA;EACE,UAAA;AHmLF;;AGhLA;EACE,UAAA;AHmLF;;AGhLA;EACE,2BAAA;AHmLF;;AGhLA;EACE,6CAAA;AHmLF;;AGhLA;EACE,+CAAA;AHmLF;;AGhLA;EACE,kEAAA;AHmLF;;AGhLA;EACE,0FAAA;AHmLF;;AGhLA;EACE,qBAAA;AHmLF;;AGhLA;EACE,sBAAA;AHmLF;;AGhLA,iBAAA;AACA;EACE,YAAA;EACA,gBAAA;EACA,SAAA;EACA,gCAAA;AHmLF;AGjLE;EACE,2BAAA;EACA,qBJ3SY;AC8dhB;;AG/KA;EACE,aAAA;AHkLF;;AG/KA,kBAAA;AAEA,eAAA;AACA;EACE,sBAAA;AHiLF;;AG9KA,gBAAA;AAGA,eAAA;AACA;EACE,eAAA;AH+KF;AG7KE;EACE,kBAAA;EACA,kBAAA;EACA,qBAAA;AH+KJ;AG7KI;EACE,kBAAA;EACA,gBAAA;EACA,sBJ3TM;EI4TN,eAAA;EACA,OAAA;EACA,QAAA;EACA,cJ5UY;EI6UZ,qBAAA;AH+KN;;AG1KA,iBAAA;AAEE;EACE,cAAA;EACA,YAAA;EACA,WAAA;EACA,kBAAA;EACA,iBAAA;EACA,mBJ1Vc;EI2Vd,WJrVI;EIsVJ,kBAAA;AH4KJ;;AGxKA,kBAAA;AClWA;EACE,mBAAA;EACA,qBAAA;AJ8gBF;AI5gBE;EACE,yBLHc;EKId,mBAAA;AJ8gBJ;ACpgBE;EGZA;IAKI,kBAAA;EJ+gBJ;AACF;ACzgBE;EGhBF;IAcI,aAAA;IACA,mBLbc;EC4hBhB;AACF;;AI1gBI;EACE,kCLTS;EKUT,aAAA;EACA,eAAA;AJ6gBN;AI1gBI;EACE,iBAAA;AJ4gBN;AItgBI;EACE,+CAAA;EACA,aAAA;EACA,SAAA;EACA,qBAAA;EACA,WAAA;EACA,gBAAA;EACA,gBLjCE;ACyiBR;AIvgBM;EACE,yBAAA;AJygBR;AIrgBI;EACE,kBAAA;EACA,WL7CY;EK8CZ,qBAAA;EACA,kCLtCS;EKuCT,aAAA;EACA,qBAAA;EACA,2BAAA;AJugBN;AItgBM;EACE,mBAAA;AJwgBR;;AIlgBA;EACE,WLvDM;AC4jBR;;AKpkBA;EACE,iBAAA;ALukBF;;AKpkBA;EACE,kBAAA;EACA,QAAA;EACA,SAAA;EACA,gCAAA;ALukBF;;AKpkBA;EACE,qBAAA;ALukBF;AKrkBE;EACE,mBAAA;ALukBJ;AKpkBE;EACE,mBNjBc;ACulBlB;AKpkBI;EACE,WNdE;AColBR;AKlkBE;EACE,mBNzBc;AC6lBlB;AKlkBI;EACE,WNtBE;AC0lBR;;AK/jBA;EACE,qBAAA;ALkkBF;AKhkBE;EACE,mBAAA;ALkkBJ;AK/jBE;EACE,mBN1CY;AC2mBhB;AK/jBI;EACE,WNtCE;ACumBR;AK7jBE;EACE,mBNlDY;ACinBhB;AK7jBI;EACE,WN9CE;AC6mBR;;AK1jBA;EACE,aAAA;EACA,YAAA;EACA,kBAAA;AL6jBF;;AK1jBA;EACE,YAAA;EACA,WAAA;EACA,iBAAA;AL6jBF;;AK1jBA;EACE,kBAAA;EACA,SAAA;EACA,QAAA;EACA,gCAAA;EACA,YAAA;EACA,mBAAA;AL6jBF;;AKzjBE;EACE,2CAAA;AL4jBJ;;AKxjBA;EACE,kBAAA;EACA,OAAA;EACA,MAAA;EACA,YAAA;EACA,WAAA;AL2jBF;AKzjBE;EACE,YAAA;EACA,eAAA;AL2jBJ;AC1oBE;EI6EA;IAII,aAAA;EL6jBJ;AACF;ACppBE;EIkFA;IAOI,cAAA;IACA,YAAA;EL+jBJ;AACF;;AK1jBE;EACE,qBAAA;EACA,kBAAA;EACA,YAAA;EACA,uDAAA;EACA,WAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,WAAA;EACA,UAAA;AL6jBJ;AKzjBI;EACE,UAAA;AL2jBN;;AKtjBA,YAAA;AACA;EACE,kBAAA;EACA,gBAAA;ALyjBF;AKvjBE;EACE,kBAAA;EACA,UAAA;ALyjBJ;AKtjBE;EACE,kBAAA;EACA,WAAA;EACA,YAAA;EACA,WAAA;EACA,wBAAA;EACA,+ENtIe;EMuIf,OAAA;EACA,QAAA;EACA,YAAA;ALwjBJ;AKrjBE;EACE,kBAAA;EACA,WAAA;EACA,YAAA;EACA,WAAA;EACA,wBAAA;EACA,+ENlJe;EMmJf,SAAA;EACA,QAAA;ALujBJ;;AKnjBA,aAAA;AAEA,YAAA;AACA;EACE,kBAAA;ALqjBF;AKljBI;EACE,mBAAA;EACA,UAAA;EACA,wBAAA;ALojBN;;AK/iBA;EACE,kBAAA;EACA,UAAA;EACA,SAAA;EACA,WAAA;EACA,aAAA;EACA,8BAAA;EACA,mBAAA;EACA,kBAAA;EACA,UAAA;EACA,yBAAA;EACA,qBAAA;EACA,wBAAA;ALkjBF;AKhjBE;EACE,YAAA;EACA,WAAA;EACA,iBAAA;EACA,sBAAA;EACA,kBAAA;EACA,kBAAA;EACA,cAAA;ALkjBJ;AKhjBI;EACE,qBNvMU;ACyvBhB;;AK7iBA,aAAA;AAEA,WAAA;AAEE;EACE,WAAA;EACA,UAAA;EACA,SAAA;EACA,QAAA;AL8iBJ;;AMnwBA,gBAAA;AAEE;EACE,WAAA;EACA,mBAAA;EACA,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,kDAAA;ANqwBJ;AMlwBE;EACE,+EPHe;EOIf,QAAA;EACA,8BAAA;EACA,MAAA;EACA,OAAA;EACA,YAAA;EACA,mBAAA;ANowBJ;AMlwBI;EACE,kBAAA;EACA,UAAA;EACA,UAAA;ANowBN;;AM/vBA,iBAAA;AAEA,UAAA;AAEE;EACE,WAAA;EACA,YAAA;ANgwBJ;AM7vBE;EACE,kBAAA;EACA,OAAA;EACA,MAAA;EACA,aAAA;EACA,uBAAA;EACA,mBAAA;EACA,WAAA;EACA,YAAA;EACA,kBAAA;AN+vBJ;;AM1vBA,qBAAA;AAmBA;EACE,kBAAA;EACA,kBAAA;EACA,YAAA;EACA,WAAA;EACA,SAAA;EACA,QAAA;EACA,gCAAA;AN2uBF;AMzuBE;EA1BA,UAAA;EACA,kBAAA;EACA,QAAA;EACA,SAAA;EACA,WAAA;EACA,YAAA;EACA,WAAA;EACA,yBAAA;EACA,mBAAA;EACA,8BAAA;UAAA,sBAAA;EACA,8BAiBiB;UAjBjB,sBAiBiB;EAhBjB,2BAgBqB;UAhBrB,mBAgBqB;EAfrB,2CAAA;UAAA,mCAAA;EACA,iEAAA;UAAA,yDAAA;EACA,WAAA;ANswBF;AMtvBE;EA9BA,UAAA;EACA,kBAAA;EACA,QAAA;EACA,SAAA;EACA,WAAA;EACA,YAAA;EACA,WAAA;EACA,yBAAA;EACA,mBAAA;EACA,8BAAA;UAAA,sBAAA;EACA,8BAqBiB;UArBjB,sBAqBiB;EApBjB,6BAoBqB;UApBrB,qBAoBqB;EAnBrB,2CAAA;UAAA,mCAAA;EACA,iEAAA;UAAA,yDAAA;EACA,WAAA;ANuxBF;;AMjwBA;EACE;IACE,UAAA;IACA,iCAAA;ENowBF;EMjwBA;IACE,UAAA;IACA,+BAAA;ENmwBF;AACF;;AM5wBA;EACE;IACE,UAAA;IACA,iCAAA;ENowBF;EMjwBA;IACE,UAAA;IACA,+BAAA;ENmwBF;AACF;AM/vBA,WAAA;AAEA,gBAAA;ALxFE;EKyFF;IAEI,YAAA;ENgwBF;AACF;ACj2BE;EK8FF;IAKI,aAAA;ENkwBF;AACF;;ACj2BE;EKiGF;IAEI,aAAA;ENmwBF;AACF;AC52BE;EKsGF;IAKI,aAAA;ENqwBF;AACF;;AMnwBA,iBAAA;AAEA,eAAA;AACA;EACE,aAAA;ANqwBF;;AMnwBA,gBAAA;AAEA,SAAA;AACA;EACE,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;ANqwBF;;AO34BA;EACE,SAAA;EACA,gBAAA;AP84BF;AO74BE;EACE,gBAAA;AP+4BJ;AO74BE;EACE,SAAA;AP+4BJ;AO74BE;EACE,SAAA;EACA,gBAAA;AP+4BJ;AO74BE;EACE,SAAA;AP+4BJ","file":"style.css","sourcesContent":["/*!------------------------------------------------------------------\n[MAIN STYLESHEET]\n\nPROJECT:\tProject Name\nVERSION:\tVersoin Number\n-------------------------------------------------------------------*/\n\n/*------------------------------------------------------------------\n[TABLE OF CONTENTS]\n-------------------------------------------------------------------*/\n\n@import 'variables';\n\n@import 'mixins';\n\n@import 'typography';\n\n@import 'buttons';\n\n@import 'common';\n\n@import 'templates/navigation';\n\n@import 'templates/homepage';\n\n@import 'templates/otherspage';\n\n@import 'templates/cards';","/* typography */\n@import url('https://fonts.googleapis.com/css?family=Noto+Sans:400,700|Poppins:300,400,500,600,700&display=swap');\n\nbody {\n line-height: 1.2;\n font-family: $primary-font;\n -webkit-font-smoothing: antialiased;\n font-size: 15px;\n color: $text-color;\n}\n\np {\n font-weight: 400;\n color: $text-color;\n font-size: 15px;\n line-height: 1.7;\n font-family: $primary-font;\n}\n\n.lead{\n font-size: 18px;\n}\n\n.display-1{\n font-size: 100px;\n @include mobile {\n font-size: 50px;\n }\n}\n\nh1,h2,h3,h4,h5,h6 {\n color: $text-color-dark;\n font-family: $secondary-font;\n font-weight: 700;\n line-height: 1.2;\n}\n\nh1, .h1{\n font-size: 60px;\n @include mobile {\n font-size: 40px;\n }\n}\n\nh2, .h2{\n font-size: 44px;\n @include mobile {\n font-size: 30px;\n }\n}\n\nh3, .h3{\n font-size: 36px;\n @include mobile {\n font-size: 28px;\n }\n}\n\nh4, .h4{\n font-size: 24px;\n}\n\nh5, .h5{\n font-size: 18px;\n}\n\nh6, .h6{\n font-size: 14px;\n}\n\n.icon-lg{\n font-size: 50px;\n}\n\n.icon{\n font-size: 40px;\n}\n\n.icon-sm{\n font-size: 30px;\n}\n\n.icon-xs{\n font-size: 20px;\n}","// Color Variables\n$primary-color: #f7463a;\n$secondary-color: #07085d;\n$text-color: #6c6c86;\n$text-color-dark: #000;\n$body-color: #fff;\n$border-color: #d2d2e2;\n$black: #000;\n$white: #fff;\n$primary-gradient: linear-gradient( 37deg, rgb(180,62,121) 1%, rgb(247,70,58) 100%);\n\n\n// Font Variables\n$primary-font: 'Poppins', sans-serif;\n$secondary-font: 'Noto Sans', sans-serif;\n$icon-font: 'themify';","/*!------------------------------------------------------------------\n[MAIN STYLESHEET]\n\nPROJECT:\tProject Name\nVERSION:\tVersoin Number\n-------------------------------------------------------------------*/\n/*------------------------------------------------------------------\n[TABLE OF CONTENTS]\n-------------------------------------------------------------------*/\n/* typography */\n@import url(\"https://fonts.googleapis.com/css?family=Noto+Sans:400,700|Poppins:300,400,500,600,700&display=swap\");\nbody {\n line-height: 1.2;\n font-family: \"Poppins\", sans-serif;\n -webkit-font-smoothing: antialiased;\n font-size: 15px;\n color: #6c6c86;\n}\n\np {\n font-weight: 400;\n color: #6c6c86;\n font-size: 15px;\n line-height: 1.7;\n font-family: \"Poppins\", sans-serif;\n}\n\n.lead {\n font-size: 18px;\n}\n\n.display-1 {\n font-size: 100px;\n}\n@media (max-width: 575px) {\n .display-1 {\n font-size: 50px;\n }\n}\n\nh1, h2, h3, h4, h5, h6 {\n color: #000;\n font-family: \"Noto Sans\", sans-serif;\n font-weight: 700;\n line-height: 1.2;\n}\n\nh1, .h1 {\n font-size: 60px;\n}\n@media (max-width: 575px) {\n h1, .h1 {\n font-size: 40px;\n }\n}\n\nh2, .h2 {\n font-size: 44px;\n}\n@media (max-width: 575px) {\n h2, .h2 {\n font-size: 30px;\n }\n}\n\nh3, .h3 {\n font-size: 36px;\n}\n@media (max-width: 575px) {\n h3, .h3 {\n font-size: 28px;\n }\n}\n\nh4, .h4 {\n font-size: 24px;\n}\n\nh5, .h5 {\n font-size: 18px;\n}\n\nh6, .h6 {\n font-size: 14px;\n}\n\n.icon-lg {\n font-size: 50px;\n}\n\n.icon {\n font-size: 40px;\n}\n\n.icon-sm {\n font-size: 30px;\n}\n\n.icon-xs {\n font-size: 20px;\n}\n\n/* Button style */\n.btn {\n font-size: 15px;\n font-family: \"Poppins\", sans-serif;\n text-transform: capitalize;\n padding: 13px 45px;\n border-radius: 35px;\n font-weight: 600;\n border: 1px solid;\n position: relative;\n z-index: 1;\n transition: 0.2s ease;\n}\n.btn:hover, .btn:active, .btn:focus {\n outline: 0;\n box-shadow: none !important;\n box-shadow: 0px 18px 18px 0px rgba(20, 28, 91, 0.19);\n}\n\n.btn-lg {\n font-size: 20px;\n padding: 20px 90px;\n}\n\n.btn-primary {\n background: linear-gradient(37deg, rgb(180, 62, 121) 1%, rgb(247, 70, 58) 100%);\n color: #fff;\n border: 0;\n}\n.btn-primary:active, .btn-primary:hover, .btn-primary.focus, .btn-primary.active {\n background: linear-gradient(37deg, rgb(180, 62, 121) 1%, rgb(247, 70, 58) 100%) !important;\n color: #fff;\n border: 0;\n}\n\n.btn-outline-primary {\n background: transparent;\n color: #f7463a;\n border-color: #f7463a;\n}\n.btn-outline-primary:active, .btn-outline-primary:hover, .btn-outline-primary.focus, .btn-outline-primary.active {\n background: linear-gradient(37deg, rgb(180, 62, 121) 1%, rgb(247, 70, 58) 100%) !important;\n color: #fff;\n border-color: #f7463a;\n}\n\n.btn-secondary {\n background: #07085d;\n color: #fff;\n border: 0;\n}\n.btn-secondary:active, .btn-secondary:hover, .btn-secondary.focus, .btn-secondary.active {\n background: #07085d !important;\n color: #fff;\n border: 0;\n}\n\n.btn-outline-light {\n background: transparent;\n color: #fff;\n border-color: #fff;\n}\n.btn-outline-light:active, .btn-outline-light:hover, .btn-outline-light.focus, .btn-outline-light.active {\n background: #fff !important;\n color: #000;\n border-color: #fff;\n}\n\n.btn-transparent {\n color: #f7463a;\n border: 0;\n padding-left: 0;\n background: linear-gradient(37deg, rgb(180, 62, 121) 1%, rgb(247, 70, 58) 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n}\n.btn-transparent:active, .btn-transparent:hover, .btn-transparent.focus, .btn-transparent.active {\n color: #f7463a;\n border: 0;\n padding-left: 0;\n background: linear-gradient(37deg, rgb(180, 62, 121) 1%, rgb(247, 70, 58) 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n box-shadow: none;\n text-decoration: underline;\n}\n\nbody {\n background-color: #fff;\n overflow-x: hidden;\n}\n\n::selection {\n background: #f9746b;\n color: #fff;\n}\n\n/* preloader */\n.preloader {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: #fff;\n z-index: 999;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\nol,\nul {\n list-style-type: none;\n margin: 0px;\n}\n\nimg {\n vertical-align: middle;\n border: 0;\n}\n\na {\n color: #f7463a;\n}\n\na,\na:hover,\na:focus {\n text-decoration: none;\n}\n\n.hover-text-underline:hover {\n text-decoration: underline;\n}\n\na,\nbutton,\nselect {\n cursor: pointer;\n transition: 0.2s ease;\n}\na:focus,\nbutton:focus,\nselect:focus {\n outline: 0;\n}\n\na:hover {\n color: #f7463a;\n}\n\n.slick-slide {\n outline: 0;\n}\n\n.section {\n padding-top: 110px;\n padding-bottom: 100px;\n}\n.section-sm {\n padding-top: 60px;\n padding-bottom: 60px;\n}\n.section-lg {\n padding-top: 170px;\n padding-bottom: 170px;\n}\n\n.section-border {\n height: 9px;\n width: 220px;\n background: linear-gradient(37deg, rgb(180, 62, 121) 1%, rgb(247, 70, 58) 100%);\n border-radius: 5px;\n margin: 40px auto 90px;\n}\n\n.bg-cover {\n background-size: cover;\n background-position: center center;\n background-repeat: no-repeat;\n}\n\n.bg-contain {\n background-size: contain;\n background-position: center right;\n background-repeat: no-repeat;\n}\n\n.border-primary {\n border-color: #d2d2e2 !important;\n}\n\n/* overlay */\n.overlay {\n position: relative;\n}\n.overlay::before {\n position: absolute;\n content: \"\";\n height: 100%;\n width: 100%;\n top: 0;\n left: 0;\n background: #000;\n opacity: 0.8;\n}\n.overlay-primary {\n position: relative;\n}\n.overlay-primary::before {\n position: absolute;\n content: \"\";\n height: 100%;\n width: 100%;\n top: 0;\n left: 0;\n background: #f7463a;\n opacity: 0.8;\n}\n.overlay-secondary {\n position: relative;\n}\n.overlay-secondary::before {\n position: absolute;\n content: \"\";\n height: 100%;\n width: 100%;\n top: 0;\n left: 0;\n background: #07085d;\n opacity: 0.8;\n}\n.overlay-secondary-half {\n position: relative;\n}\n.overlay-secondary-half::before {\n position: absolute;\n content: \"\";\n height: 100%;\n width: 100%;\n top: 0;\n left: 0;\n background: linear-gradient(to right, #07085d 60%, transparent);\n}\n.overlay-image {\n position: absolute;\n height: 100%;\n width: 100%;\n left: 0;\n top: 0;\n}\n\n.outline-0 {\n outline: 0 !important;\n}\n\n.d-unset {\n display: unset !important;\n}\n\n.bg-primary {\n background: #f7463a !important;\n}\n\n.bg-secondary {\n background: #07085d !important;\n}\n\n.text-primary {\n color: #f7463a !important;\n}\n\n.text-secondary {\n color: #07085d !important;\n}\n\n.text-gradient-primary {\n background: linear-gradient(37deg, rgb(180, 62, 121) 1%, rgb(247, 70, 58) 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n}\n\n.text-light {\n color: #b7b8f1 !important;\n}\n\n.text-color {\n color: #6c6c86 !important;\n}\n\n.mb-10 {\n margin-bottom: 10px !important;\n}\n\n.mb-20 {\n margin-bottom: 20px !important;\n}\n\n.mb-30 {\n margin-bottom: 30px !important;\n}\n\n.mb-40 {\n margin-bottom: 40px !important;\n}\n\n.mb-50 {\n margin-bottom: 50px !important;\n}\n\n.mb-60 {\n margin-bottom: 60px !important;\n}\n\n.mb-70 {\n margin-bottom: 70px !important;\n}\n\n.mb-80 {\n margin-bottom: 80px !important;\n}\n\n.mb-90 {\n margin-bottom: 90px !important;\n}\n\n.mb-100 {\n margin-bottom: 100px !important;\n}\n\n.zindex-1 {\n z-index: 1;\n}\n\n.top-100 {\n top: 100px;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.font-primary {\n font-family: \"Poppins\", sans-serif !important;\n}\n\n.font-secondary {\n font-family: \"Noto Sans\", sans-serif !important;\n}\n\n.shadow {\n box-shadow: 0px 46px 65px 0px rgba(181, 188, 236, 0.16) !important;\n}\n\n.bg-gradient-primary {\n background: linear-gradient(37deg, rgb(180, 62, 121) 1%, rgb(247, 70, 58) 100%) !important;\n}\n\n.transition {\n transition: 0.3s ease;\n}\n\n.vertical-align-middle {\n vertical-align: middle;\n}\n\n/* form control */\n.form-control {\n height: 50px;\n border-radius: 0;\n border: 0;\n border-bottom: 1px solid #d2d2e2;\n}\n.form-control:focus {\n box-shadow: none !important;\n border-color: #f7463a;\n}\n\ntextarea.form-control {\n height: 150px;\n}\n\n/* /form control */\n/* page-title */\n.page-title {\n padding: 170px 0 190px;\n}\n\n/* /page-title */\n/* list style */\n.list-styled {\n padding-left: 0;\n}\n.list-styled li {\n position: relative;\n padding-left: 25px;\n list-style-type: none;\n}\n.list-styled li::before {\n position: absolute;\n content: \"\\e65d\";\n font-family: \"themify\";\n font-size: 14px;\n left: 0;\n top: 0px;\n color: #07085d;\n transition: 0.3s ease;\n}\n\n/* social icons */\n.social-icons a {\n display: block;\n height: 50px;\n width: 50px;\n border-radius: 50%;\n line-height: 50px;\n background: #07085d;\n color: #fff;\n text-align: center;\n}\n\n/* /social icons */\n.navigation {\n padding: 20px 100px;\n transition: 0.3s ease;\n}\n.navigation.nav-bg {\n background-color: #07085d;\n padding: 15px 100px;\n}\n@media (max-width: 991px) {\n .navigation.nav-bg {\n padding: 15px 20px;\n }\n}\n@media (max-width: 991px) {\n .navigation {\n padding: 20px;\n background: #07085d;\n }\n}\n\n.navbar .nav-item .nav-link {\n font-family: \"Poppins\", sans-serif;\n padding: 15px;\n font-size: 18px;\n}\n.navbar .nav-item.active {\n font-weight: bold;\n}\n.navbar .dropdown-menu {\n box-shadow: 0px 3px 9px 0px rgba(0, 0, 0, 0.12);\n padding: 15px;\n border: 0;\n top: calc(100% - 2px);\n left: -10px;\n border-radius: 0;\n background: #fff;\n}\n.navbar .dropdown-menu.show {\n display: block !important;\n}\n.navbar .dropdown-item {\n position: relative;\n color: #000;\n transition: 0.2s ease;\n font-family: \"Poppins\", sans-serif;\n padding: 10px;\n text-decoration: none;\n margin-bottom: 0 !important;\n}\n.navbar .dropdown-item:not(:last-child) {\n margin-bottom: 10px;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n color: #fff;\n}\n\n.banner {\n min-height: 100vh;\n}\n\n.content-center {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n}\n\n.hover-bg-secondary {\n transition: 0.2s ease;\n}\n.hover-bg-secondary * {\n transition: inherit;\n}\n.hover-bg-secondary:hover {\n background: #07085d;\n}\n.hover-bg-secondary:hover * {\n color: #fff;\n}\n.hover-bg-secondary.active {\n background: #07085d;\n}\n.hover-bg-secondary.active * {\n color: #fff;\n}\n\n.hover-bg-primary {\n transition: 0.2s ease;\n}\n.hover-bg-primary * {\n transition: inherit;\n}\n.hover-bg-primary:hover {\n background: #f7463a;\n}\n.hover-bg-primary:hover * {\n color: #fff;\n}\n.hover-bg-primary.active {\n background: #f7463a;\n}\n.hover-bg-primary.active * {\n color: #fff;\n}\n\n.icon-box {\n height: 100px;\n width: 100px;\n line-height: 100px;\n}\n\n.icon-box-sm {\n height: 80px;\n width: 80px;\n line-height: 80px;\n}\n\n.icon-watermark {\n position: absolute;\n left: 50%;\n top: 32%;\n transform: translate(-50%, -50%);\n opacity: 0.1;\n transition: inherit;\n}\n\n.card:hover .icon-watermark {\n transform: translate(-50%, -50%) scale(1.5);\n}\n\n.bg-image {\n position: absolute;\n left: 0;\n top: 0;\n height: 100%;\n width: auto;\n}\n.bg-image img {\n height: 100%;\n max-width: 100%;\n}\n@media (max-width: 991px) {\n .bg-image img {\n display: none;\n }\n}\n@media (max-width: 767px) {\n .bg-image img {\n display: block;\n height: auto;\n }\n}\n\n.hover-shadow::before {\n transition: 0.3s ease;\n position: absolute;\n height: 100%;\n box-shadow: 0px 33px 49px 0px rgba(190, 193, 228, 0.31);\n width: 100%;\n left: 0;\n right: 0;\n z-index: 1;\n content: \"\";\n opacity: 0;\n}\n.hover-shadow:hover::before {\n opacity: 1;\n}\n\n/* pricing */\n.bottom-shape {\n position: relative;\n overflow: hidden;\n}\n.bottom-shape * {\n position: relative;\n z-index: 1;\n}\n.bottom-shape::before {\n position: absolute;\n content: \"\";\n height: 100%;\n width: 100%;\n transform: rotate(40deg);\n background: linear-gradient(37deg, rgb(180, 62, 121) 1%, rgb(247, 70, 58) 100%);\n left: 0;\n top: 60%;\n opacity: 0.5;\n}\n.bottom-shape::after {\n position: absolute;\n content: \"\";\n height: 100%;\n width: 100%;\n transform: rotate(40deg);\n background: linear-gradient(37deg, rgb(180, 62, 121) 1%, rgb(247, 70, 58) 100%);\n left: 20%;\n top: 55%;\n}\n\n/* /pricing */\n/* project */\n.project-item {\n position: relative;\n}\n.project-item:hover .project-hover {\n visibility: visible;\n opacity: 1;\n transform: rotateX(0deg);\n}\n\n.project-hover {\n position: absolute;\n width: 80%;\n left: 10%;\n bottom: 10%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n visibility: hidden;\n opacity: 0;\n transform: rotateX(90deg);\n transition: 0.3s ease;\n transform-origin: bottom;\n}\n.project-hover i {\n height: 55px;\n width: 55px;\n line-height: 55px;\n border: 1px solid #fff;\n border-radius: 50%;\n text-align: center;\n display: block;\n}\n.project-hover i:hover {\n border-color: #f7463a;\n}\n\n/* /project */\n/* footer */\nfooter .overlay-image {\n height: 80%;\n width: 80%;\n left: 10%;\n top: 10%;\n}\n\n/* progressbar */\n.progress-block .progress {\n height: 8px;\n border-radius: 10px;\n margin-bottom: 40px;\n overflow: visible;\n position: relative;\n box-shadow: 0px 9px 24px 0px rgba(19, 5, 44, 0.21);\n}\n.progress-block .progress-bar {\n background: linear-gradient(37deg, rgb(180, 62, 121) 1%, rgb(247, 70, 58) 100%);\n width: 0;\n transition: all 3s ease-in-out;\n top: 0;\n left: 0;\n height: 100%;\n border-radius: 10px;\n}\n.progress-block .progress-bar .skill-number {\n position: absolute;\n top: -22px;\n right: 0px;\n}\n\n/* /progressbar */\n/* video */\n.video-player iframe {\n width: 100%;\n height: 100%;\n}\n.video-player .play-icon {\n position: absolute;\n left: 0;\n top: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n width: 100%;\n height: 100%;\n text-align: center;\n}\n\n/* ripple animation */\n.ripple {\n border-radius: 50%;\n position: absolute;\n height: 130%;\n width: 130%;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n}\n.ripple::after {\n opacity: 0;\n position: absolute;\n right: 0;\n bottom: 0;\n content: \"\";\n height: 100%;\n width: 100%;\n border: 1px solid #d2d2e2;\n border-radius: 100%;\n animation-name: ripple;\n animation-duration: 3s;\n animation-delay: 0s;\n animation-iteration-count: infinite;\n animation-timing-function: cubic-bezier(0.65, 0, 0.34, 1);\n z-index: -1;\n}\n.ripple::before {\n opacity: 0;\n position: absolute;\n right: 0;\n bottom: 0;\n content: \"\";\n height: 100%;\n width: 100%;\n border: 1px solid #d2d2e2;\n border-radius: 100%;\n animation-name: ripple;\n animation-duration: 3s;\n animation-delay: 0.5s;\n animation-iteration-count: infinite;\n animation-timing-function: cubic-bezier(0.65, 0, 0.34, 1);\n z-index: -1;\n}\n\n@keyframes ripple {\n from {\n opacity: 1;\n transform: scale3d(0.75, 0.75, 1);\n }\n to {\n opacity: 0;\n transform: scale3d(1.5, 1.5, 1);\n }\n}\n/* /video */\n/* card slider */\n@media (max-width: 991px) {\n .ui-card-slider .left-slide::before {\n left: -100px;\n }\n}\n@media (max-width: 767px) {\n .ui-card-slider .left-slide::before {\n display: none;\n }\n}\n\n@media (max-width: 991px) {\n .ui-card-slider .right-slide::before {\n right: -100px;\n }\n}\n@media (max-width: 767px) {\n .ui-card-slider .right-slide::before {\n display: none;\n }\n}\n\n/* /card slider */\n/* google map */\n.map {\n height: 750px;\n}\n\n/* /google map */\n/* team */\n.img-thumb-circle {\n border-radius: 50%;\n overflow: hidden;\n max-height: 260px;\n max-width: 260px;\n}\n\n.card {\n border: 0;\n border-radius: 0;\n}\n.card-img-top {\n border-radius: 0;\n}\n.card-header {\n border: 0;\n}\n.card-body {\n border: 0;\n border-radius: 0;\n}\n.card-footer {\n border: 0;\n}","@mixin mobile-xs{\n @media(max-width:400px){\n @content;\n }\n}\n@mixin mobile{\n @media(max-width:575px){\n @content;\n }\n}\n@mixin tablet{\n @media(max-width:767px){\n @content;\n }\n}\n@mixin desktop{\n @media(max-width:991px){\n @content;\n }\n}\n@mixin desktop-lg{\n @media(max-width:1200px){\n @content;\n }\n}\n\n@mixin size($size){\n width: $size; height: $size;\n}","/* Button style */\n.btn {\n font-size: 15px;\n font-family: $primary-font;\n text-transform: capitalize;\n padding: 13px 45px;\n border-radius: 35px;\n font-weight: 600;\n border: 1px solid;\n position: relative;\n z-index: 1;\n transition: .2s ease;\n\n &:hover,\n &:active,\n &:focus {\n outline: 0;\n box-shadow: none !important;\n box-shadow: 0px 18px 18px 0px rgba(20, 28, 91, 0.19);\n }\n}\n\n.btn-lg {\n font-size: 20px;\n padding: 20px 90px;\n}\n\n.btn-primary {\n background: $primary-gradient;\n color: $white;\n border: 0;\n\n &:active,\n &:hover,\n &.focus,\n &.active {\n background: $primary-gradient !important;\n color: $white;\n border: 0;\n }\n}\n\n\n.btn-outline-primary {\n background: transparent;\n color: $primary-color;\n border-color: $primary-color;\n\n &:active,\n &:hover,\n &.focus,\n &.active {\n background: $primary-gradient !important;\n color: $white;\n border-color: $primary-color;\n }\n}\n\n\n.btn-secondary {\n background: $secondary-color;\n color: $white;\n border: 0;\n\n &:active,\n &:hover,\n &.focus,\n &.active {\n background: $secondary-color !important;\n color: $white;\n border: 0;\n }\n}\n\n\n.btn-outline-light {\n background: transparent;\n color: $white;\n border-color: $white;\n\n &:active,\n &:hover,\n &.focus,\n &.active {\n background: $white !important;\n color: $text-color-dark;\n border-color: $white;\n }\n}\n\n\n.btn-transparent {\n color: $primary-color;\n border: 0;\n padding-left: 0;\n background: $primary-gradient;\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n\n &:active,\n &:hover,\n &.focus,\n &.active {\n color: $primary-color;\n border: 0;\n padding-left: 0;\n background: $primary-gradient;\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n box-shadow: none;\n text-decoration: underline;\n }\n}","body {\n background-color: $body-color;\n overflow-x: hidden;\n}\n\n::selection {\n background: lighten($color: $primary-color, $amount: 10);\n color: $white;\n}\n\n/* preloader */\n\n.preloader {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: #fff;\n z-index: 999;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\nol,\nul {\n list-style-type: none;\n margin: 0px;\n}\n\nimg {\n vertical-align: middle;\n border: 0;\n}\n\na {\n color: $primary-color;\n}\n\na,\na:hover,\na:focus {\n text-decoration: none;\n}\n\n.hover-text-underline:hover {\n text-decoration: underline;\n}\n\na,\nbutton,\nselect {\n cursor: pointer;\n transition: .2s ease;\n\n &:focus {\n outline: 0;\n }\n}\n\na:hover {\n color: $primary-color;\n}\n\n.slick-slide {\n outline: 0;\n}\n\n.section {\n padding-top: 110px;\n padding-bottom: 100px;\n\n &-sm {\n padding-top: 60px;\n padding-bottom: 60px;\n }\n\n &-lg {\n padding-top: 170px;\n padding-bottom: 170px;\n }\n}\n\n.section-border {\n height: 9px;\n width: 220px;\n background: $primary-gradient;\n border-radius: 5px;\n margin: 40px auto 90px;\n}\n\n.bg-cover {\n background-size: cover;\n background-position: center center;\n background-repeat: no-repeat;\n}\n\n.bg-contain {\n background-size: contain;\n background-position: center right;\n background-repeat: no-repeat;\n}\n\n.border-primary {\n border-color: $border-color !important;\n}\n\n/* overlay */\n\n.overlay {\n position: relative;\n\n &::before {\n position: absolute;\n content: '';\n height: 100%;\n width: 100%;\n top: 0;\n left: 0;\n background: $black;\n opacity: .8;\n }\n\n &-primary {\n position: relative;\n\n &::before {\n position: absolute;\n content: '';\n height: 100%;\n width: 100%;\n top: 0;\n left: 0;\n background: $primary-color;\n opacity: .8;\n }\n }\n\n &-secondary {\n position: relative;\n\n &::before {\n position: absolute;\n content: '';\n height: 100%;\n width: 100%;\n top: 0;\n left: 0;\n background: $secondary-color;\n opacity: .8;\n }\n }\n\n &-secondary-half {\n position: relative;\n\n &::before {\n position: absolute;\n content: '';\n height: 100%;\n width: 100%;\n top: 0;\n left: 0;\n background: linear-gradient(to right, $secondary-color 60%, transparent);\n }\n }\n\n &-image {\n position: absolute;\n height: 100%;\n width: 100%;\n left: 0;\n top: 0;\n }\n}\n\n.outline-0 {\n outline: 0 !important;\n}\n\n.d-unset {\n display: unset !important;\n}\n\n.bg-primary {\n background: $primary-color !important;\n}\n\n.bg-secondary {\n background: $secondary-color !important;\n}\n\n.text-primary {\n color: $primary-color !important;\n}\n\n.text-secondary {\n color: $secondary-color !important;\n}\n\n.text-gradient-primary {\n background: $primary-gradient;\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n}\n\n.text-light {\n color: #b7b8f1 !important;\n}\n\n.text-color {\n color: $text-color !important;\n}\n\n.mb-10 {\n margin-bottom: 10px !important;\n}\n\n.mb-20 {\n margin-bottom: 20px !important;\n}\n\n.mb-30 {\n margin-bottom: 30px !important;\n}\n\n.mb-40 {\n margin-bottom: 40px !important;\n}\n\n.mb-50 {\n margin-bottom: 50px !important;\n}\n\n.mb-60 {\n margin-bottom: 60px !important;\n}\n\n.mb-70 {\n margin-bottom: 70px !important;\n}\n\n.mb-80 {\n margin-bottom: 80px !important;\n}\n\n.mb-90 {\n margin-bottom: 90px !important;\n}\n\n.mb-100 {\n margin-bottom: 100px !important;\n}\n\n.zindex-1 {\n z-index: 1;\n}\n\n.top-100 {\n top: 100px;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.font-primary {\n font-family: $primary-font !important;\n}\n\n.font-secondary {\n font-family: $secondary-font !important;\n}\n\n.shadow {\n box-shadow: 0px 46px 65px 0px rgba(181, 188, 236, 0.16) !important;\n}\n\n.bg-gradient-primary {\n background: $primary-gradient !important;\n}\n\n.transition {\n transition: .3s ease;\n}\n\n.vertical-align-middle {\n vertical-align: middle;\n}\n\n/* form control */\n.form-control {\n height: 50px;\n border-radius: 0;\n border: 0;\n border-bottom: 1px solid $border-color;\n\n &:focus {\n box-shadow: none !important;\n border-color: $primary-color;\n }\n}\n\ntextarea.form-control {\n height: 150px;\n}\n\n/* /form control */\n\n/* page-title */\n.page-title {\n padding: 170px 0 190px;\n}\n\n/* /page-title */\n\n\n/* list style */\n.list-styled {\n padding-left: 0;\n\n li {\n position: relative;\n padding-left: 25px;\n list-style-type: none;\n\n &::before {\n position: absolute;\n content: \"\\e65d\";\n font-family: $icon-font;\n font-size: 14px;\n left: 0;\n top: 0px;\n color: $secondary-color;\n transition: .3s ease;\n }\n }\n}\n\n/* social icons */\n.social-icons {\n a {\n display: block;\n height: 50px;\n width: 50px;\n border-radius: 50%;\n line-height: 50px;\n background: $secondary-color;\n color: $white;\n text-align: center;\n }\n}\n\n/* /social icons */",".navigation {\n padding: 20px 100px;\n transition: .3s ease;\n\n &.nav-bg {\n background-color: $secondary-color;\n padding: 15px 100px;\n\n @include desktop {\n padding: 15px 20px;\n }\n }\n\n @include desktop {\n padding: 20px;\n background: $secondary-color;\n }\n}\n\n.navbar {\n .nav-item {\n .nav-link {\n font-family: $primary-font;\n padding: 15px;\n font-size: 18px;\n }\n\n &.active {\n font-weight: bold;\n }\n }\n\n .dropdown {\n\n &-menu {\n box-shadow: 0px 3px 9px 0px rgba(0, 0, 0, 0.12);\n padding: 15px;\n border: 0;\n top: calc(100% - 2px);\n left: -10px;\n border-radius: 0;\n background: $white;\n &.show{\n display: block !important;\n }\n }\n\n &-item {\n position: relative;\n color: $text-color-dark;\n transition: .2s ease;\n font-family: $primary-font;\n padding: 10px;\n text-decoration: none;\n margin-bottom: 0 !important;\n &:not(:last-child) {\n margin-bottom: 10px;\n }\n }\n }\n}\n\n.navbar-dark .navbar-nav .nav-link {\n color: $white;\n}",".banner {\n min-height: 100vh;\n}\n\n.content-center {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n}\n\n.hover-bg-secondary {\n transition: .2s ease;\n\n * {\n transition: inherit;\n }\n\n &:hover {\n background: $secondary-color;\n\n * {\n color: $white;\n }\n }\n\n &.active {\n background: $secondary-color;\n\n * {\n color: $white;\n }\n }\n}\n\n.hover-bg-primary {\n transition: .2s ease;\n\n * {\n transition: inherit;\n }\n\n &:hover {\n background: $primary-color;\n\n * {\n color: $white;\n }\n }\n\n &.active {\n background: $primary-color;\n\n * {\n color: $white;\n }\n }\n}\n\n.icon-box {\n height: 100px;\n width: 100px;\n line-height: 100px;\n}\n\n.icon-box-sm {\n height: 80px;\n width: 80px;\n line-height: 80px;\n}\n\n.icon-watermark {\n position: absolute;\n left: 50%;\n top: 32%;\n transform: translate(-50%, -50%);\n opacity: .1;\n transition: inherit;\n}\n\n.card:hover {\n .icon-watermark {\n transform: translate(-50%, -50%) scale(1.5);\n }\n}\n\n.bg-image {\n position: absolute;\n left: 0;\n top: 0;\n height: 100%;\n width: auto;\n\n img {\n height: 100%;\n max-width: 100%;\n @include desktop {\n display: none;\n }\n @include tablet {\n display: block;\n height: auto;\n }\n }\n}\n\n.hover-shadow {\n &::before {\n transition: .3s ease;\n position: absolute;\n height: 100%;\n box-shadow: 0px 33px 49px 0px rgba(190, 193, 228, 0.31);\n width: 100%;\n left: 0;\n right: 0;\n z-index: 1;\n content: \"\";\n opacity: 0;\n }\n\n &:hover {\n &::before {\n opacity: 1;\n }\n }\n}\n\n/* pricing */\n.bottom-shape {\n position: relative;\n overflow: hidden;\n\n * {\n position: relative;\n z-index: 1;\n }\n\n &::before {\n position: absolute;\n content: \"\";\n height: 100%;\n width: 100%;\n transform: rotate(40deg);\n background: $primary-gradient;\n left: 0;\n top: 60%;\n opacity: .5;\n }\n\n &::after {\n position: absolute;\n content: \"\";\n height: 100%;\n width: 100%;\n transform: rotate(40deg);\n background: $primary-gradient;\n left: 20%;\n top: 55%;\n }\n}\n\n/* /pricing */\n\n/* project */\n.project-item {\n position: relative;\n\n &:hover {\n .project-hover {\n visibility: visible;\n opacity: 1;\n transform: rotateX(0deg);\n }\n }\n}\n\n.project-hover {\n position: absolute;\n width: 80%;\n left: 10%;\n bottom: 10%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n visibility: hidden;\n opacity: 0;\n transform: rotateX(90deg);\n transition: .3s ease;\n transform-origin: bottom;\n\n i {\n height: 55px;\n width: 55px;\n line-height: 55px;\n border: 1px solid $white;\n border-radius: 50%;\n text-align: center;\n display: block;\n\n &:hover {\n border-color: $primary-color;\n }\n }\n}\n\n/* /project */\n\n/* footer */\nfooter {\n .overlay-image {\n height: 80%;\n width: 80%;\n left: 10%;\n top: 10%;\n }\n}","/* progressbar */\n.progress-block {\n .progress {\n height: 8px;\n border-radius: 10px;\n margin-bottom: 40px;\n overflow: visible;\n position: relative;\n box-shadow: 0px 9px 24px 0px rgba(19, 5, 44, 0.21);\n }\n\n .progress-bar {\n background: $primary-gradient;\n width: 0;\n transition: all 3s ease-in-out;\n top: 0;\n left: 0;\n height: 100%;\n border-radius: 10px;\n\n .skill-number {\n position: absolute;\n top: -22px;\n right: 0px;\n }\n }\n}\n\n/* /progressbar */\n\n/* video */\n.video-player {\n iframe {\n width: 100%;\n height: 100%;\n }\n\n .play-icon {\n position: absolute;\n left: 0;\n top: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n width: 100%;\n height: 100%;\n text-align: center;\n }\n}\n\n\n/* ripple animation */\n@mixin rings($duration, $delay) {\n opacity: 0;\n position: absolute;\n right: 0;\n bottom: 0;\n content: '';\n height: 100%;\n width: 100%;\n border: 1px solid rgba($color: $border-color, $alpha: 1.0);\n border-radius: 100%;\n animation-name: ripple;\n animation-duration: $duration;\n animation-delay: $delay;\n animation-iteration-count: infinite;\n animation-timing-function: cubic-bezier(.65, 0, .34, 1);\n z-index: -1;\n}\n\n.ripple {\n border-radius: 50%;\n position: absolute;\n height: 130%;\n width: 130%;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n\n &::after {\n @include rings(3s, 0s);\n }\n\n &::before {\n @include rings(3s, 0.5s);\n }\n}\n\n\n@keyframes ripple {\n from {\n opacity: 1;\n transform: scale3d(0.75, 0.75, 1);\n }\n\n to {\n opacity: 0;\n transform: scale3d(1.5, 1.5, 1);\n }\n}\n\n\n/* /video */\n\n/* card slider */\n.ui-card-slider .left-slide::before {\n @include desktop {\n left: -100px;\n }\n @include tablet {\n display: none;\n }\n}\n.ui-card-slider .right-slide::before {\n @include desktop {\n right: -100px;\n }\n @include tablet {\n display: none;\n }\n}\n/* /card slider */\n\n/* google map */\n.map{\n height: 750px;\n}\n/* /google map */\n\n/* team */\n.img-thumb-circle{\n border-radius: 50%;\n overflow: hidden;\n max-height: 260px;\n max-width: 260px;\n}",".card{\n border: 0;\n border-radius: 0;\n &-img-top{\n border-radius: 0;\n }\n &-header{\n border: 0;\n }\n &-body{\n border: 0;\n border-radius: 0;\n }\n &-footer{\n border: 0;\n }\n}"]} \ No newline at end of file diff --git a/practicas/pp6/footer.php b/practicas/pp6/footer.php new file mode 100644 index 00000000..61ce4af4 --- /dev/null +++ b/practicas/pp6/footer.php @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/practicas/pp6/images/about/about-us.png b/practicas/pp6/images/about/about-us.png new file mode 100644 index 00000000..e8963403 Binary files /dev/null and b/practicas/pp6/images/about/about-us.png differ diff --git a/practicas/pp6/images/about/video-thumb.jpg b/practicas/pp6/images/about/video-thumb.jpg new file mode 100644 index 00000000..935ad753 Binary files /dev/null and b/practicas/pp6/images/about/video-thumb.jpg differ diff --git a/practicas/pp6/images/backgrounds/about-bg-overlay.png b/practicas/pp6/images/backgrounds/about-bg-overlay.png new file mode 100644 index 00000000..38229f1f Binary files /dev/null and b/practicas/pp6/images/backgrounds/about-bg-overlay.png differ diff --git a/practicas/pp6/images/backgrounds/about-bg.jpg b/practicas/pp6/images/backgrounds/about-bg.jpg new file mode 100644 index 00000000..b6e32e8d Binary files /dev/null and b/practicas/pp6/images/backgrounds/about-bg.jpg differ diff --git a/practicas/pp6/images/backgrounds/cta-bg.jpg b/practicas/pp6/images/backgrounds/cta-bg.jpg new file mode 100644 index 00000000..382113f9 Binary files /dev/null and b/practicas/pp6/images/backgrounds/cta-bg.jpg differ diff --git a/practicas/pp6/images/backgrounds/map.png b/practicas/pp6/images/backgrounds/map.png new file mode 100644 index 00000000..d420eda7 Binary files /dev/null and b/practicas/pp6/images/backgrounds/map.png differ diff --git a/practicas/pp6/images/backgrounds/page-title.jpg b/practicas/pp6/images/backgrounds/page-title.jpg new file mode 100644 index 00000000..34f45928 Binary files /dev/null and b/practicas/pp6/images/backgrounds/page-title.jpg differ diff --git a/practicas/pp6/images/banner/banner-overlay.png b/practicas/pp6/images/banner/banner-overlay.png new file mode 100644 index 00000000..a093e4e2 Binary files /dev/null and b/practicas/pp6/images/banner/banner-overlay.png differ diff --git a/practicas/pp6/images/banner/banner.jpg b/practicas/pp6/images/banner/banner.jpg new file mode 100644 index 00000000..26873bfc Binary files /dev/null and b/practicas/pp6/images/banner/banner.jpg differ diff --git a/practicas/pp6/images/banner/banner2.jpg b/practicas/pp6/images/banner/banner2.jpg new file mode 100644 index 00000000..608fde8c Binary files /dev/null and b/practicas/pp6/images/banner/banner2.jpg differ diff --git a/practicas/pp6/images/banner/banner3.jpg b/practicas/pp6/images/banner/banner3.jpg new file mode 100644 index 00000000..d20b1f1a Binary files /dev/null and b/practicas/pp6/images/banner/banner3.jpg differ diff --git a/practicas/pp6/images/banner/brush.png b/practicas/pp6/images/banner/brush.png new file mode 100644 index 00000000..66bda61a Binary files /dev/null and b/practicas/pp6/images/banner/brush.png differ diff --git a/practicas/pp6/images/blog/post-1.jpg b/practicas/pp6/images/blog/post-1.jpg new file mode 100644 index 00000000..b5ee586d Binary files /dev/null and b/practicas/pp6/images/blog/post-1.jpg differ diff --git a/practicas/pp6/images/blog/post-2.jpg b/practicas/pp6/images/blog/post-2.jpg new file mode 100644 index 00000000..de047921 Binary files /dev/null and b/practicas/pp6/images/blog/post-2.jpg differ diff --git a/practicas/pp6/images/blog/post-3.jpg b/practicas/pp6/images/blog/post-3.jpg new file mode 100644 index 00000000..f5e67f61 Binary files /dev/null and b/practicas/pp6/images/blog/post-3.jpg differ diff --git a/practicas/pp6/images/clients-logo/clients-logo-1.png b/practicas/pp6/images/clients-logo/clients-logo-1.png new file mode 100644 index 00000000..3ba1efc1 Binary files /dev/null and b/practicas/pp6/images/clients-logo/clients-logo-1.png differ diff --git a/practicas/pp6/images/clients-logo/clients-logo-2.png b/practicas/pp6/images/clients-logo/clients-logo-2.png new file mode 100644 index 00000000..3333e3c8 Binary files /dev/null and b/practicas/pp6/images/clients-logo/clients-logo-2.png differ diff --git a/practicas/pp6/images/clients-logo/clients-logo-3.png b/practicas/pp6/images/clients-logo/clients-logo-3.png new file mode 100644 index 00000000..090738be Binary files /dev/null and b/practicas/pp6/images/clients-logo/clients-logo-3.png differ diff --git a/practicas/pp6/images/clients-logo/clients-logo-4.png b/practicas/pp6/images/clients-logo/clients-logo-4.png new file mode 100644 index 00000000..bf6a1bf4 Binary files /dev/null and b/practicas/pp6/images/clients-logo/clients-logo-4.png differ diff --git a/practicas/pp6/images/clients-logo/clients-logo-5.png b/practicas/pp6/images/clients-logo/clients-logo-5.png new file mode 100644 index 00000000..51bb656c Binary files /dev/null and b/practicas/pp6/images/clients-logo/clients-logo-5.png differ diff --git a/practicas/pp6/images/feature.jpg b/practicas/pp6/images/feature.jpg new file mode 100644 index 00000000..bd44493b Binary files /dev/null and b/practicas/pp6/images/feature.jpg differ diff --git a/practicas/pp6/images/logo.png b/practicas/pp6/images/logo.png new file mode 100644 index 00000000..c5dc7322 Binary files /dev/null and b/practicas/pp6/images/logo.png differ diff --git a/practicas/pp6/images/marker.png b/practicas/pp6/images/marker.png new file mode 100644 index 00000000..c183f322 Binary files /dev/null and b/practicas/pp6/images/marker.png differ diff --git a/practicas/pp6/images/project/project-1.jpg b/practicas/pp6/images/project/project-1.jpg new file mode 100644 index 00000000..ea3299d8 Binary files /dev/null and b/practicas/pp6/images/project/project-1.jpg differ diff --git a/practicas/pp6/images/project/project-2.jpg b/practicas/pp6/images/project/project-2.jpg new file mode 100644 index 00000000..03f1d0b8 Binary files /dev/null and b/practicas/pp6/images/project/project-2.jpg differ diff --git a/practicas/pp6/images/project/project-3.jpg b/practicas/pp6/images/project/project-3.jpg new file mode 100644 index 00000000..cf592624 Binary files /dev/null and b/practicas/pp6/images/project/project-3.jpg differ diff --git a/practicas/pp6/images/project/project-4.jpg b/practicas/pp6/images/project/project-4.jpg new file mode 100644 index 00000000..f778e145 Binary files /dev/null and b/practicas/pp6/images/project/project-4.jpg differ diff --git a/practicas/pp6/images/project/project-5.jpg b/practicas/pp6/images/project/project-5.jpg new file mode 100644 index 00000000..6206bf1a Binary files /dev/null and b/practicas/pp6/images/project/project-5.jpg differ diff --git a/practicas/pp6/images/project/project-6.jpg b/practicas/pp6/images/project/project-6.jpg new file mode 100644 index 00000000..6dc9267b Binary files /dev/null and b/practicas/pp6/images/project/project-6.jpg differ diff --git a/practicas/pp6/images/project/project-7.jpg b/practicas/pp6/images/project/project-7.jpg new file mode 100644 index 00000000..4d9c7e5d Binary files /dev/null and b/practicas/pp6/images/project/project-7.jpg differ diff --git a/practicas/pp6/images/team/member-1.jpg b/practicas/pp6/images/team/member-1.jpg new file mode 100644 index 00000000..cb5e645f Binary files /dev/null and b/practicas/pp6/images/team/member-1.jpg differ diff --git a/practicas/pp6/images/team/member-2.jpg b/practicas/pp6/images/team/member-2.jpg new file mode 100644 index 00000000..6dc04512 Binary files /dev/null and b/practicas/pp6/images/team/member-2.jpg differ diff --git a/practicas/pp6/images/team/member-3.jpg b/practicas/pp6/images/team/member-3.jpg new file mode 100644 index 00000000..52618f22 Binary files /dev/null and b/practicas/pp6/images/team/member-3.jpg differ diff --git a/practicas/pp6/images/team/member-4.jpg b/practicas/pp6/images/team/member-4.jpg new file mode 100644 index 00000000..5573e3e8 Binary files /dev/null and b/practicas/pp6/images/team/member-4.jpg differ diff --git a/practicas/pp6/images/testimonial/user-1.jpg b/practicas/pp6/images/testimonial/user-1.jpg new file mode 100644 index 00000000..03df5b9c Binary files /dev/null and b/practicas/pp6/images/testimonial/user-1.jpg differ diff --git a/practicas/pp6/images/user-1.jpg b/practicas/pp6/images/user-1.jpg new file mode 100644 index 00000000..7650d0e0 Binary files /dev/null and b/practicas/pp6/images/user-1.jpg differ diff --git a/practicas/pp6/images/user-2.jpg b/practicas/pp6/images/user-2.jpg new file mode 100644 index 00000000..46cb4b21 Binary files /dev/null and b/practicas/pp6/images/user-2.jpg differ diff --git a/practicas/pp6/includes/config.php b/practicas/pp6/includes/config.php new file mode 100644 index 00000000..4657ecaa --- /dev/null +++ b/practicas/pp6/includes/config.php @@ -0,0 +1,79 @@ +connect_errno) { + if (DEBUG_MODE) { + die("Error de conexión (" . $mysqli->connect_errno . "): " . $mysqli->connect_error); + } else { + die("Error de conexión a la base de datos."); + } + } + + if (!$mysqli->set_charset(DB_CHARSET)) { + die("Error al establecer charset: " . $mysqli->error); + } + + return $mysqli; +} + +function closeDBConnection($mysqli) { + if ($mysqli) { + $mysqli->close(); + } +} + +define('SITE_NAME', 'TechSolutions Pro'); +define('SITE_SLOGAN', 'Transformamos ideas en soluciones digitales'); +define('SITE_EMAIL', 'info@techsolutions.com'); +define('SITE_PHONE', '+34 123 456 789'); +define('SITE_ADDRESS', 'Barcelona, España'); + +define('COLOR_PRIMARY', '#2C3E50'); +define('COLOR_SECONDARY', '#E67E22'); + +define('UPLOAD_DIR', __DIR__ . '/../uploads/'); +define('MAX_FILE_SIZE', 5242880); +define('ALLOWED_IMAGE_TYPES', ['image/jpeg', 'image/png', 'image/gif', 'image/webp']); + +ini_set('session.cookie_httponly', 1); +ini_set('session.use_only_cookies', 1); +ini_set('session.cookie_secure', 1); // HTTPS en Alwaysdata +ini_set('session.cookie_samesite', 'Lax'); + +define('SESSION_TIMEOUT', 1800); +define('ENVIRONMENT', 'production'); +define('DEBUG_MODE', false); + +if (DEBUG_MODE) { + error_reporting(E_ALL); + ini_set('display_errors', 1); +} else { + error_reporting(0); + ini_set('display_errors', 0); +} + +function dd($data) { + if (DEBUG_MODE) { + echo '
';
+        var_dump($data);
+        echo '
'; + die(); + } +} + +if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)) { + die('Acceso directo no permitido'); +} +?> \ No newline at end of file diff --git a/practicas/pp6/includes/footer.php b/practicas/pp6/includes/footer.php new file mode 100644 index 00000000..61ce4af4 --- /dev/null +++ b/practicas/pp6/includes/footer.php @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/practicas/pp6/includes/functions.php b/practicas/pp6/includes/functions.php new file mode 100644 index 00000000..d037902b --- /dev/null +++ b/practicas/pp6/includes/functions.php @@ -0,0 +1,135 @@ +real_escape_string($data); + } + return $data; +} + +function validar_email($email) { + return filter_var($email, FILTER_VALIDATE_EMAIL); +} + +function validar_longitud($texto, $min, $max) { + return (strlen($texto) >= $min && strlen($texto) <= $max); +} + +// ==================================== +// FUNCIONES DE SESIÓN +// ==================================== + +function iniciar_sesion_segura() { + if (session_status() == PHP_SESSION_NONE) { + session_start(); + } + + if (!isset($_SESSION['last_regeneration'])) { + $_SESSION['last_regeneration'] = time(); + } elseif (time() - $_SESSION['last_regeneration'] > 300) { + session_regenerate_id(true); + $_SESSION['last_regeneration'] = time(); + } + + if (isset($_SESSION['last_activity']) && (time() - $_SESSION['last_activity'] > SESSION_TIMEOUT)) { + cerrar_sesion(); + header('Location: login.php?timeout=1'); + exit(); + } + $_SESSION['last_activity'] = time(); +} + +function esta_logueado() { + return isset($_SESSION['user_id']) && !empty($_SESSION['user_id']); +} + +function es_admin() { + return isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'admin'; +} + +function cerrar_sesion() { + $_SESSION = array(); + if (ini_get("session.use_cookies")) { + $params = session_get_cookie_params(); + setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"]); + } + session_destroy(); +} + +// ==================================== +// FUNCIONES DE FORMATO +// ==================================== + +function formatear_fecha($fecha, $formato = 'medio') { + $timestamp = strtotime($fecha); + $meses = array(1 => 'enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'); + + if ($formato == 'corto') { + return date('d/m/Y', $timestamp); + } + + $dia = date('d', $timestamp); + $mes = $meses[date('n', $timestamp)]; + $anio = date('Y', $timestamp); + return $dia . ' de ' . $mes . ' de ' . $anio; +} + +function recortar_texto($texto, $longitud = 100) { + if (strlen($texto) <= $longitud) return $texto; + return substr($texto, 0, $longitud) . '...'; +} + +// ==================================== +// FUNCIONES DE ARCHIVOS +// ==================================== + +function subir_imagen($file, $carpeta = 'general') { + if (!isset($file) || $file['error'] !== UPLOAD_ERR_OK) { + return ['success' => false, 'message' => 'Error al subir el archivo']; + } + + if ($file['size'] > MAX_FILE_SIZE) { + return ['success' => false, 'message' => 'Archivo demasiado grande (máx 5MB)']; + } + + $finfo = finfo_open(FILEINFO_MIME_TYPE); + $mime = finfo_file($finfo, $file['tmp_name']); + finfo_close($finfo); + + if (!in_array($mime, ALLOWED_IMAGE_TYPES)) { + return ['success' => false, 'message' => 'Tipo de archivo no permitido']; + } + + $extension = pathinfo($file['name'], PATHINFO_EXTENSION); + $nombre_archivo = uniqid() . '_' . time() . '.' . $extension; + + $ruta_carpeta = UPLOAD_DIR . $carpeta . '/'; + if (!file_exists($ruta_carpeta)) { + mkdir($ruta_carpeta, 0755, true); + } + + $ruta_completa = $ruta_carpeta . $nombre_archivo; + if (move_uploaded_file($file['tmp_name'], $ruta_completa)) { + return ['success' => true, 'path' => 'uploads/' . $carpeta . '/' . $nombre_archivo]; + } + + return ['success' => false, 'message' => 'Error al mover el archivo']; +} + +function subir_avatar($file) { + return subir_imagen($file, 'avatars'); +} +?> \ No newline at end of file diff --git a/practicas/pp6/includes/header.php b/practicas/pp6/includes/header.php new file mode 100644 index 00000000..8f5341e5 --- /dev/null +++ b/practicas/pp6/includes/header.php @@ -0,0 +1,131 @@ + + + + + + <?php echo isset($page_title) ? $page_title : 'TechSolutions Pro - Transformamos ideas en soluciones digitales'; ?> + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/practicas/pp6/index.php b/practicas/pp6/index.php new file mode 100644 index 00000000..2489ddf4 --- /dev/null +++ b/practicas/pp6/index.php @@ -0,0 +1,416 @@ +query( + "SELECT n.*, u.nombre as autor_nombre + FROM noticias n + LEFT JOIN users u ON n.autor_id = u.id + WHERE n.activa = TRUE + ORDER BY n.fecha_publicacion DESC + LIMIT 3" +); +if ($result) { + while ($row = $result->fetch_assoc()) { + $ultimas_noticias[] = $row; + } +} + +// Obtener proyectos del portfolio (máximo 6) +$proyectos = []; +$result = $mysqli->query( + "SELECT * FROM proyectos + WHERE activo = TRUE + ORDER BY fecha_creacion DESC + LIMIT 6" +); +if ($result) { + while ($row = $result->fetch_assoc()) { + $proyectos[] = $row; + } +} + +// Obtener testimonios +$testimonios = []; +$result = $mysqli->query( + "SELECT * FROM testimonios + WHERE activo = TRUE + ORDER BY fecha_creacion DESC + LIMIT 3" +); +if ($result) { + while ($row = $result->fetch_assoc()) { + $testimonios[] = $row; + } +} + +closeDBConnection($mysqli); + +include 'includes/header.php'; +?> + + + + + +
+
+
+
+
+ TechSolutions +
+
+
+
+

+ Sobre TechSolutions Pro +

+

+ Somos una empresa líder en desarrollo de soluciones tecnológicas innovadoras. + Con más de 10 años de experiencia, transformamos las ideas de nuestros clientes + en realidades digitales que impulsan el crecimiento de sus negocios. +

+

+ Nuestro equipo está compuesto por profesionales altamente cualificados en + desarrollo web, aplicaciones móviles, diseño UX/UI y consultoría tecnológica. +

+ Ver Nuestros Proyectos +
+
+
+
+
+ + +
+
+
+
+
+

Nuestros Servicios

+

+ Ofrecemos soluciones tecnológicas completas y personalizadas +

+
+
+
+ +
+
+
+ +

Desarrollo Web

+

Creamos sitios web modernos, responsivos y optimizados para SEO que convierten visitantes en clientes.

+
+
+ +
+
+ +

Apps Móviles

+

Desarrollamos aplicaciones nativas e híbridas para iOS y Android con experiencias de usuario excepcionales.

+
+
+ +
+
+ +

Diseño UX/UI

+

Diseñamos interfaces intuitivas y atractivas que mejoran la experiencia del usuario y la conversión.

+
+
+ +
+
+ +

Cloud & DevOps

+

Implementamos soluciones en la nube y automatizamos procesos para optimizar la infraestructura IT.

+
+
+ +
+
+ +

Seguridad

+

Protegemos tus sistemas con las mejores prácticas de ciberseguridad y auditorías especializadas.

+
+
+ +
+
+ +

Consultoría

+

Asesoramos en la transformación digital de tu empresa con estrategias tecnológicas efectivas.

+
+
+
+
+
+ + + 0): ?> +
+
+
+
+
+

Nuestro Portfolio

+

+ Proyectos recientes que hemos desarrollado con éxito +

+
+
+
+ +
+ +
+
+ + <?php echo htmlspecialchars($proyecto['titulo']); ?> + + Proyecto + + +
+ + + + + + +
+ +
+ +

+ +

+ + + Ver Detalles + +
+
+
+ +
+ + +
+
+ + + + 0): ?> +
+
+
+
+
+

Lo Que Dicen Nuestros Clientes

+

+ La satisfacción de nuestros clientes es nuestra mejor carta de presentación +

+
+
+
+ +
+ +
+
+
+ + <?php echo htmlspecialchars($testimonio['nombre']); ?> + +
+ +
+ + +
+
+ +
+ + + + + +
+
+ +

+ + + +

+ + +
+ + + + +
+
+ +
+
+
+ + + + 0): ?> +
+
+
+
+
+

Últimas Noticias

+

+ Mantente al día con las últimas tendencias y novedades tecnológicas +

+
+
+
+ +
+ +
+
+ + <?php echo htmlspecialchars($noticia['titulo']); ?> + + Noticia + + +
+ + + + + + +
+ + + +
+ + +

+ +

+ + + +
+
+
+ +
+ + +
+
+ + + +
+
+
+
+

¿Listo para Transformar tu Negocio?

+

+ Contacta con nosotros y descubre cómo podemos ayudarte a alcanzar tus objetivos digitales +

+ + Contáctanos Ahora + +
+
+
+
+ + \ No newline at end of file diff --git a/practicas/pp6/js/script.js b/practicas/pp6/js/script.js new file mode 100644 index 00000000..bb3d0b25 --- /dev/null +++ b/practicas/pp6/js/script.js @@ -0,0 +1,143 @@ +/** + * WEBSITE: https://themefisher.com + * TWITTER: https://twitter.com/themefisher + * FACEBOOK: https://www.facebook.com/themefisher + * GITHUB: https://github.com/themefisher/ + */ + +(function ($) { + 'use strict'; + + // Sticky Menu + $(window).scroll(function () { + if ($('.navigation').offset().top > 100) { + $('.navigation').addClass('nav-bg'); + } else { + $('.navigation').removeClass('nav-bg'); + } + }); + + // Background-images + $('[data-background]').each(function () { + $(this).css({ + 'background-image': 'url(' + $(this).data('background') + ')' + }); + }); + + // venobox popup + $('.venobox').venobox(); + + // dropdown menu + var mobileWidth = 992; + var navcollapse = $('.navbar .dropdown'); + $(window).on('resize', function () { + navcollapse.children('.dropdown-menu').hide(); + }); + navcollapse.hover(function () { + if ($(window).innerWidth() >= mobileWidth) { + $(this).children('.dropdown-menu').stop(true, false, true).slideToggle(250); + } + }); + + // Progress Bar + $(window).on('load', function () { + $('.progress-bar').each(function () { + var width = $(this).data('percent'); + $(this).css({ + 'transition': 'width 3s' + }); + $(this).appear(function () { + $(this).css('width', width + '%'); + $(this).find('.count').countTo({ + from: 0, + to: width, + speed: 3000, + refreshInterval: 50 + }); + }); + }); + }); + + // Shuffle js filter and masonry + var containerEl = document.querySelector('.shuffle-wrapper'); + if (containerEl) { + var Shuffle = window.Shuffle; + var myShuffle = new Shuffle(document.querySelector('.shuffle-wrapper'), { + itemSelector: '.shuffle-item', + buffer: 1 + }); + + jQuery('input[name="shuffle-filter"]').on('change', function (evt) { + var input = evt.currentTarget; + if (input.checked) { + myShuffle.filter(input.value); + } + }); + } + + // video iframe load + $('.play-icon i').on('click', function () { + var video = ''; + $(this).replaceWith(video); + }); + + + // Accordions + $('.collapse').on('shown.bs.collapse', function () { + $(this).parent().find('.ti-plus').removeClass('ti-plus').addClass('ti-minus'); + }).on('hidden.bs.collapse', function () { + $(this).parent().find('.ti-minus').removeClass('ti-minus').addClass('ti-plus'); + }); + + + // clients logo slider + $('.client-logo-slider').slick({ + infinite: true, + slidesToShow: 5, + slidesToScroll: 1, + autoplay: true, + dots: false, + arrows: false, + responsive: [{ + breakpoint: 1024, + settings: { + slidesToShow: 3, + slidesToScroll: 1 + } + }, + { + breakpoint: 600, + settings: { + slidesToShow: 3, + slidesToScroll: 1 + } + }, + { + breakpoint: 480, + settings: { + slidesToShow: 2, + slidesToScroll: 1 + } + }, + { + breakpoint: 400, + settings: { + slidesToShow: 1, + slidesToScroll: 1 + } + } + ] + }); + + // testimonial slider + var containerEl2 = document.querySelector('#slider'); + if (containerEl2) { + window.slider = $('#slider').cardSlider({ + slideClass: 'slide', + delay: 300, + transition: 'ease' + }); + } + + +})(jQuery); \ No newline at end of file diff --git a/practicas/pp6/login.php b/practicas/pp6/login.php new file mode 100644 index 00000000..15e76fe9 --- /dev/null +++ b/practicas/pp6/login.php @@ -0,0 +1,134 @@ +real_escape_string($email); + $result = $mysqli->query( + "SELECT * FROM users WHERE email = '$email_escapado' AND activo = TRUE LIMIT 1" + ); + + if ($result && $result->num_rows > 0) { + $user = $result->fetch_assoc(); + + // Verificar contraseña + if (password_verify($password, $user['password'])) { + // Login exitoso - crear sesión + $_SESSION['user_id'] = $user['id']; + $_SESSION['user_name'] = $user['nombre']; + $_SESSION['user_email'] = $user['email']; + $_SESSION['user_role'] = $user['role']; + $_SESSION['user_foto'] = $user['foto']; + $_SESSION['last_activity'] = time(); + + // Redirigir según rol + if ($user['role'] === 'admin') { + header("Location: admin/index.php"); + } else { + header("Location: index.php"); + } + exit(); + + } else { + $error = "Email o contraseña incorrectos"; + } + } else { + $error = "Email o contraseña incorrectos"; + } + + $mysqli->close(); +} + +include 'includes/header.php'; +?> + +
+
+
+
+
+
+ +
+ +

Iniciar Sesión

+
+ + +
+ + +
+ + + +
+ Tu sesión ha expirado por inactividad. + Inicia sesión de nuevo. +
+ + +
+
+ + +
+ +
+ + +
+ + + +
+ +

+ ¿No tienes cuenta? + Regístrate aquí +

+
+ +
+
+
+
+
+
+ + \ No newline at end of file diff --git a/practicas/pp6/logout.php b/practicas/pp6/logout.php new file mode 100644 index 00000000..0ef78b54 --- /dev/null +++ b/practicas/pp6/logout.php @@ -0,0 +1,23 @@ + \ No newline at end of file diff --git a/practicas/pp6/noticia.php b/practicas/pp6/noticia.php new file mode 100644 index 00000000..e755af5e --- /dev/null +++ b/practicas/pp6/noticia.php @@ -0,0 +1,216 @@ +prepare( + "SELECT n.*, u.nombre as autor_nombre, u.foto as autor_foto + FROM noticias n + LEFT JOIN users u ON n.autor_id = u.id + WHERE n.id = ? AND n.activa = TRUE" +); +$stmt->bind_param("i", $noticia_id); +$stmt->execute(); +$result = $stmt->get_result(); +$noticia = $result->fetch_assoc(); +$stmt->close(); + +if (!$noticia) { + header('Location: blog.php'); + exit(); +} + +$page_title = $noticia['titulo'] . " - " . SITE_NAME; + +// Obtener comentarios de la noticia +$comentarios = []; +$result = $mysqli->query( + "SELECT c.*, u.nombre as usuario_nombre, u.foto as usuario_foto + FROM comentarios c + LEFT JOIN users u ON c.usuario_id = u.id + WHERE c.noticia_id = $noticia_id AND c.activo = TRUE + ORDER BY c.fecha_comentario DESC" +); +if ($result) { + while ($row = $result->fetch_assoc()) { + $comentarios[] = $row; + } +} + +closeDBConnection($mysqli); + +include 'includes/header.php'; +?> + + +
+
+
+
+

Blog

+
+
+
+
+ + +
+
+
+ +
+
+ + <?php echo htmlspecialchars($noticia['titulo']); ?> + + +
+ + + + + + +

+ +

+ + +
+ +
+ + + + +
+ +
+
+
+ + +
+

+ Comentarios () +

+ + 0): ?> + +
+ + + + + + +
+
+ +
+ + + +

+ +

+
+
+ + +

No hay comentarios aún. ¡Sé el primero en comentar!

+ + + +
+ El sistema de comentarios estará disponible próximamente. +
+ +
+ + Inicia sesión + para dejar un comentario. +
+ +
+
+ + +
+
+
Sobre el Autor
+
+ + + +
+ +
+
+
+ +
+
Compartir
+ +
+ + +
+
+
+
+ + \ No newline at end of file diff --git a/practicas/pp6/plugins/bootstrap/bootstrap.min.css b/practicas/pp6/plugins/bootstrap/bootstrap.min.css new file mode 100644 index 00000000..a63d963e --- /dev/null +++ b/practicas/pp6/plugins/bootstrap/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v4.1.1 (https://getbootstrap.com/) + * Copyright 2011-2018 The Bootstrap Authors + * Copyright 2011-2018 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */dl,h1,h2,h3,h4,h5,h6,ol,p,pre,ul{margin-top:0}address,dl,ol,p,pre,ul{margin-bottom:1rem}body,caption{text-align:left}dd,h1,h2,h3,h4,h5,h6,label{margin-bottom:.5rem}pre,textarea{overflow:auto}article,aside,figcaption,figure,footer,header,hgroup,legend,main,nav,section{display:block}address,legend{line-height:inherit}.badge,progress,sub,sup{vertical-align:baseline}label,output{display:inline-block}button,hr,input{overflow:visible}.btn-outline-danger,.btn-outline-dark,.btn-outline-info,.btn-outline-light,.btn-outline-primary,.btn-outline-success,.btn-outline-warning,.btn:not(:disabled):not(.disabled).active,.btn:not(:disabled):not(.disabled):active{background-image:none}.dropdown-menu,.form-control,.modal-content,.popover{background-clip:padding-box}.dropdown-menu,.nav,.navbar-nav{list-style:none}:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff}.text-monospace,code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}[tabindex="-1"]:focus{outline:0!important}abbr[data-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}.btn:not(:disabled):not(.disabled),.close:not(:disabled):not(.disabled),.navbar-toggler:not(:disabled):not(.disabled),.page-link:not(:disabled):not(.disabled),summary{cursor:pointer}address{font-style:normal}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-left:0}blockquote,figure{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]),a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-size:1em}pre{-ms-overflow-style:scrollbar}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;caption-side:bottom}th{text-align:inherit}button{border-radius:0}button:focus{outline:dotted 1px;outline:-webkit-focus-ring-color auto 5px}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;color:inherit;white-space:normal}.badge,.btn,.dropdown-header,.dropdown-item,.input-group-text,.navbar-brand,.progress-bar{white-space:nowrap}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}.display-1,.display-2,.display-3,.display-4{line-height:1.2}summary{display:list-item}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.blockquote,hr{margin-bottom:1rem}.display-1,.display-2,.display-3,.display-4,.lead{font-weight:300}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem}.display-1{font-size:6rem}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-4{font-size:3.5rem}hr{box-sizing:content-box;height:0;margin-top:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.img-fluid,.img-thumbnail{max-width:100%;height:auto}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014 \00A0"}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code,kbd{font-size:87.5%}a>code,pre code{color:inherit}code{color:#e83e8c;word-break:break-word}kbd{padding:.2rem .4rem;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}.container,.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto;width:100%}.btn,.btn-link,.dropdown-item{font-weight:400}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover,.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover,.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover,.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover,.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover,.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover,.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th,.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered,.table-responsive>.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.collapsing,.modal,.modal-open,.progress{overflow:hidden}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.custom-file-input.is-valid~.custom-file-label,.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-file-input:valid~.custom-file-label,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.input-group-append>.form-control-plaintext.btn,.input-group-lg>.input-group-append>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-prepend>.form-control-plaintext.btn,.input-group-lg>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.input-group-append>.form-control-plaintext.btn,.input-group-sm>.input-group-append>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-prepend>.form-control-plaintext.btn,.input-group-sm>.input-group-prepend>.form-control-plaintext.input-group-text{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-sm>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:calc(1.8125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-lg>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:calc(2.875rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.invalid-tooltip,.valid-tooltip{position:absolute;z-index:5;max-width:100%;padding:.5rem;line-height:1;border-radius:.2rem;top:100%}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{display:none;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(40,167,69,.8)}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.form-check-input.is-valid~.form-check-label,.was-validated .custom-control-input:valid~.custom-control-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{background-color:#71dd8a}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(40,167,69,.25)}.custom-file-input.is-valid~.custom-file-label::before,.was-validated .custom-file-input:valid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-invalid~.custom-file-label,.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-file-input:invalid~.custom-file-label,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{display:none;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.8)}.collapsing,.dropdown,.dropleft,.dropright,.dropup{position:relative}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.form-check-input.is-invalid~.form-check-label,.was-validated .custom-control-input:invalid~.custom-control-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{background-color:#efa2a9}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(220,53,69,.25)}.custom-file-input.is-invalid~.custom-file-label::before,.was-validated .custom-file-input:invalid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn-block,input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.btn{display:inline-block;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn-primary.focus,.btn-primary:focus,.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-secondary.focus,.btn-secondary:focus,.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-success.focus,.btn-success:focus,.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-info.focus,.btn-info:focus,.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-warning.focus,.btn-warning:focus,.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-danger.focus,.btn-danger:focus,.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-light.focus,.btn-light:focus,.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-dark.focus,.btn-dark:focus,.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-outline-primary.focus,.btn-outline-primary:focus,.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary{color:#007bff;background-color:transparent;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-secondary.focus,.btn-outline-secondary:focus,.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-success.focus,.btn-outline-success:focus,.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success{color:#28a745;background-color:transparent;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-info.focus,.btn-outline-info:focus,.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-warning.focus,.btn-outline-warning:focus,.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-danger.focus,.btn-outline-danger:focus,.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-light.focus,.btn-outline-light:focus,.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-dark.focus,.btn-outline-dark:focus,.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-link,.btn-link:hover{background-color:transparent}.btn-link.focus,.btn-link:focus,.btn-link:hover{text-decoration:underline;border-color:transparent}.btn-link{color:#007bff}.btn-link:hover{color:#0056b3}.btn-link.focus,.btn-link:focus{box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block}.btn-block+.btn-block{margin-top:.5rem}.dropdown-toggle::after,.dropup .dropdown-toggle::after{width:0;height:0;vertical-align:.255em;content:""}.fade{transition:opacity .15s linear}@media screen and (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;transition:height .35s ease}@media screen and (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown-toggle::after{display:inline-block;margin-left:.255em;border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;background-color:#fff;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-right{right:0;left:auto}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropleft .dropdown-toggle::before,.dropright .dropdown-toggle::after{width:0;content:"";border-top:.3em solid transparent;border-bottom:.3em solid transparent;height:0}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;border-right:0;border-left:.3em solid;vertical-align:0}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;border-right:.3em solid;vertical-align:0}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn,.custom-control-label,.custom-file,.dropdown-header,.input-group-text,.nav{margin-bottom:0}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;color:#212529;text-align:inherit;background-color:transparent;border:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after,.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child),.input-group>.custom-file:not(:first-child) .custom-file-label,.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;font-size:.875rem;color:#6c757d}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-group>.btn:first-child,.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.input-group-append,.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text,.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file:focus,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-prepend{margin-right:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:active~.custom-control-label::before{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative}.custom-control-label::after,.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:""}.custom-control-label::before{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-checkbox .custom-control-input:checked~.custom-control-label::before,.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{background-color:#007bff}.custom-control-label::after{background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-file-input:lang(en)~.custom-file-label::after,.custom-file-label::after{content:"Browse"}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before,.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center no-repeat #fff;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select-lg,.custom-select-sm{padding-top:.375rem;padding-bottom:.375rem}.custom-file-input:focus~.custom-file-label::after,.custom-select:focus{border-color:#80bdff}.custom-select:focus{outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.075),0 0 5px rgba(128,189,255,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);font-size:125%}.custom-file,.custom-file-input,.custom-file-label{height:calc(2.25rem + 2px)}.custom-file{position:relative;display:inline-block;width:100%}.custom-file-input{position:relative;z-index:2;width:100%;margin:0;opacity:0}.custom-file-label,.custom-file-label::after{position:absolute;padding:.375rem .75rem;line-height:1.5;color:#495057;top:0;right:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-label{left:0;z-index:1;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{bottom:0;z-index:3;display:block;height:2.25rem;background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.nav,.navbar{display:-ms-flexbox;-ms-flex-wrap:wrap}.custom-range{width:100%;padding-left:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;-webkit-appearance:none;appearance:none}.custom-range::-webkit-slider-thumb:focus{outline:0;box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;-moz-appearance:none;appearance:none}.custom-range::-moz-range-thumb:focus{outline:0;box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;appearance:none}.custom-range::-ms-thumb:focus{outline:0;box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.nav{display:flex;flex-wrap:wrap;padding-left:0}.nav-link,.navbar{padding:.5rem 1rem}.nav-link{display:block}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit}.card,.navbar-nav{display:-ms-flexbox}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:center center no-repeat;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-footer,.card-header{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03)}.card-title{margin-bottom:.75rem}.card-header,.card-subtitle,.card-text:last-child{margin-bottom:0}.card-subtitle{margin-top:-.375rem}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header-pills,.card-header-tabs{margin-right:-.625rem;margin-left:-.625rem}.card-header{border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-bottom:-.75rem;border-bottom:0}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.alert,.btn .badge,.page-link{position:relative}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child),.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.card-columns .card{margin-bottom:.75rem}.accordion .card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion .card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion .card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion .card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.breadcrumb,.pagination{border-radius:.25rem;list-style:none}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;background-color:#e9ecef}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0}.page-link,.popover-body,.popover-header{padding:.5rem .75rem}.page-link{display:block;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.badge,.close{font-weight:700;line-height:1}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;text-align:center;border-radius:.25rem}.badge:empty{display:none}.btn .badge{top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#212529;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;background-color:#007bff;transition:width .6s ease}@media screen and (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.popover,.tooltip{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;text-decoration:none}.modal-title,.popover,.tooltip{line-height:1.5}.popover,.text-hide,.tooltip{text-shadow:none}.close:focus,.close:hover{color:#000;text-decoration:none;opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;outline:0}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}@media screen and (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.popover,.popover .arrow,.popover .arrow::after,.popover .arrow::before,.tooltip,.tooltip .arrow{position:absolute;display:block}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{z-index:1070;margin:0;text-align:left;text-align:start;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{top:0;left:0;z-index:1060;max-width:276px;text-align:left;text-align:start;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-top .arrow::before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-top .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-right .arrow::before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-right .arrow::after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-bottom .arrow::before{border-width:0 .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-bottom .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.carousel,.carousel-inner,.carousel-item{position:relative}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-left .arrow::before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-left .arrow::after{right:1px;border-left-color:#fff}.popover-header{margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{color:#212529}.carousel-inner{width:100%;overflow:hidden}.carousel-item{display:none;-ms-flex-align:center;align-items:center;width:100%;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}@media screen and (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-fade .carousel-item{opacity:0;transition-duration:.6s;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:center center no-repeat;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:rgba(255,255,255,.5)}.carousel-indicators li::after,.carousel-indicators li::before{left:0;display:inline-block;height:10px;position:absolute;content:"";width:100%}.carousel-indicators li::before{top:-10px}.carousel-indicators li::after{bottom:-10px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-left,.rounded-top{border-top-left-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-bottom,.fixed-top{position:fixed;right:0;left:0;z-index:1030}.fixed-top{top:0}.fixed-bottom{bottom:0}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#545b62!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#1e7e34!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#d39e00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#bd2130!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{blockquote,img,pre,tr{page-break-inside:avoid}*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd}thead{display:table-header-group}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}.container,body{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} \ No newline at end of file diff --git a/practicas/pp6/plugins/bootstrap/bootstrap.min.js b/practicas/pp6/plugins/bootstrap/bootstrap.min.js new file mode 100644 index 00000000..3eb18a3c --- /dev/null +++ b/practicas/pp6/plugins/bootstrap/bootstrap.min.js @@ -0,0 +1 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.Popper=e()}(this,function(){"use strict";function t(t){return t&&"[object Function]"==={}.toString.call(t)}function e(t,e){if(1!==t.nodeType)return[];var n=getComputedStyle(t,null);return e?n[e]:n}function n(t){return"HTML"===t.nodeName?t:t.parentNode||t.host}function i(t){if(!t)return document.body;switch(t.nodeName){case"HTML":case"BODY":return t.ownerDocument.body;case"#document":return t.body}var r=e(t),o=r.overflow,s=r.overflowX,a=r.overflowY;return/(auto|scroll|overlay)/.test(o+a+s)?t:i(n(t))}function r(t){return 11===t?K:10===t?V:K||V}function o(t){if(!t)return document.documentElement;for(var n=r(10)?document.body:null,i=t.offsetParent;i===n&&t.nextElementSibling;)i=(t=t.nextElementSibling).offsetParent;var s=i&&i.nodeName;return s&&"BODY"!==s&&"HTML"!==s?-1!==["TD","TABLE"].indexOf(i.nodeName)&&"static"===e(i,"position")?o(i):i:t?t.ownerDocument.documentElement:document.documentElement}function s(t){return null===t.parentNode?t:s(t.parentNode)}function a(t,e){if(!(t&&t.nodeType&&e&&e.nodeType))return document.documentElement;var n=t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_FOLLOWING,i=n?t:e,r=n?e:t,l=document.createRange();l.setStart(i,0),l.setEnd(r,0);var c,h,f=l.commonAncestorContainer;if(t!==f&&e!==f||i.contains(r))return c=f,h=c.nodeName,"BODY"===h||"HTML"!==h&&o(c.firstElementChild)!==c?o(f):f;var u=s(t);return u.host?a(u.host,e):a(t,s(e).host)}function l(t){var e="top"===(1=n.clientWidth&&i>=n.clientHeight}),h=0c[t]&&!e.escapeWithReference&&(i=x(f[n],c[t]-("right"===t?f.width:f.height))),G({},n,i)}};return h.forEach(function(t){var e=-1===["left","top"].indexOf(t)?"secondary":"primary";f=q({},f,u[e](t))}),t.offsets.popper=f,t},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(t){var e=t.offsets,n=e.popper,i=e.reference,r=t.placement.split("-")[0],o=R,s=-1!==["top","bottom"].indexOf(r),a=s?"right":"bottom",l=s?"left":"top",c=s?"width":"height";return n[a]o(i[a])&&(t.offsets.popper[l]=o(i[a])),t}},arrow:{order:500,enabled:!0,fn:function(t,n){var i;if(!k(t.instance.modifiers,"arrow","keepTogether"))return t;var r=n.element;if("string"==typeof r){if(!(r=t.instance.popper.querySelector(r)))return t}else if(!t.instance.popper.contains(r))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),t;var o=t.placement.split("-")[0],s=t.offsets,a=s.popper,l=s.reference,c=-1!==["left","right"].indexOf(o),h=c?"height":"width",f=c?"Top":"Left",d=f.toLowerCase(),p=c?"left":"top",g=c?"bottom":"right",m=E(r)[h];l[g]-ma[g]&&(t.offsets.popper[d]+=l[d]+m-a[g]),t.offsets.popper=u(t.offsets.popper);var _=l[d]+l[h]/2-m/2,v=e(t.instance.popper),y=parseFloat(v["margin"+f],10),b=parseFloat(v["border"+f+"Width"],10),T=_-t.offsets.popper[d]-y-b;return T=H(x(a[h]-m,T),0),t.arrowElement=r,t.offsets.arrow=(G(i={},d,j(T)),G(i,p,""),i),t},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(t,e){if(w(t.instance.modifiers,"inner"))return t;if(t.flipped&&t.placement===t.originalPlacement)return t;var n=m(t.instance.popper,t.instance.reference,e.padding,e.boundariesElement,t.positionFixed),i=t.placement.split("-")[0],r=y(i),o=t.placement.split("-")[1]||"",s=[];switch(e.behavior){case J:s=[i,r];break;case Z:s=L(i);break;case $:s=L(i,!0);break;default:s=e.behavior}return s.forEach(function(a,l){if(i!==a||s.length===l+1)return t;i=t.placement.split("-")[0],r=y(i);var c,h=t.offsets.popper,f=t.offsets.reference,u=R,d="left"===i&&u(h.right)>u(f.left)||"right"===i&&u(h.left)u(f.top)||"bottom"===i&&u(h.top)u(n.right),m=u(h.top)u(n.bottom),v="left"===i&&p||"right"===i&&g||"top"===i&&m||"bottom"===i&&_,E=-1!==["top","bottom"].indexOf(i),T=!!e.flipVariations&&(E&&"start"===o&&p||E&&"end"===o&&g||!E&&"start"===o&&m||!E&&"end"===o&&_);(d||v||T)&&(t.flipped=!0,(d||v)&&(i=s[l+1]),T&&(o="end"===(c=o)?"start":"start"===c?"end":c),t.placement=i+(o?"-"+o:""),t.offsets.popper=q({},t.offsets.popper,b(t.instance.popper,t.offsets.reference,t.placement)),t=C(t.instance.modifiers,t,"flip"))}),t},behavior:"flip",padding:5,boundariesElement:"viewport"},inner:{order:700,enabled:!1,fn:function(t){var e=t.placement,n=e.split("-")[0],i=t.offsets,r=i.popper,o=i.reference,s=-1!==["left","right"].indexOf(n),a=-1===["top","left"].indexOf(n);return r[s?"left":"top"]=o[n]-(a?r[s?"width":"height"]:0),t.placement=y(e),t.offsets.popper=u(r),t}},hide:{order:800,enabled:!0,fn:function(t){if(!k(t.instance.modifiers,"hide","preventOverflow"))return t;var e=t.offsets.reference,n=T(t.instance.modifiers,function(t){return"preventOverflow"===t.name}).boundaries;if(e.bottomn.right||e.top>n.bottom||e.rightthis._items.length-1||t<0))if(this._isSliding)D(this._element).one(R.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=ndocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},e._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},e._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right
',trigger:"hover focus",title:"",delay:0,html:!(ie={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"}),selector:!(ne={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)"}),placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent"},se="out",ae={HIDE:"hide"+Zt,HIDDEN:"hidden"+Zt,SHOW:(oe="show")+Zt,SHOWN:"shown"+Zt,INSERTED:"inserted"+Zt,CLICK:"click"+Zt,FOCUSIN:"focusin"+Zt,FOCUSOUT:"focusout"+Zt,MOUSEENTER:"mouseenter"+Zt,MOUSELEAVE:"mouseleave"+Zt},le="fade",ce="show",he=".tooltip-inner",".arrow",fe="hover",ue="focus","click","manual",de=function(){function t(t,e){if(void 0===n)throw new TypeError("Bootstrap tooltips require Popper.js (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var e=t.prototype;return e.enable=function(){this._isEnabled=!0},e.disable=function(){this._isEnabled=!1},e.toggleEnabled=function(){this._isEnabled=!this._isEnabled},e.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=zt(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),zt(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(zt(this.getTipElement()).hasClass(ce))return void this._leave(null,this);this._enter(null,this)}},e.dispose=function(){clearTimeout(this._timeout),zt.removeData(this.element,this.constructor.DATA_KEY),zt(this.element).off(this.constructor.EVENT_KEY),zt(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&zt(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},e.show=function(){var t=this;if("none"===zt(this.element).css("display"))throw new Error("Please use show on visible elements");var e=zt.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){zt(this.element).trigger(e);var i=zt.contains(this.element.ownerDocument.documentElement,this.element);if(e.isDefaultPrevented()||!i)return;var r=this.getTipElement(),o=rn.getUID(this.constructor.NAME);r.setAttribute("id",o),this.element.setAttribute("aria-describedby",o),this.setContent(),this.config.animation&&zt(r).addClass(le);var s="function"==typeof this.config.placement?this.config.placement.call(this,r,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=!1===this.config.container?document.body:zt(this.config.container);zt(r).data(this.constructor.DATA_KEY,this),zt.contains(this.element.ownerDocument.documentElement,this.tip)||zt(r).appendTo(l),zt(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new n(this.element,r,{placement:a,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:".arrow"},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(e){e.originalPlacement!==e.placement&&t._handlePopperPlacementChange(e)},onUpdate:function(e){t._handlePopperPlacementChange(e)}}),zt(r).addClass(ce),"ontouchstart"in document.documentElement&&zt(document.body).children().on("mouseover",null,zt.noop);var c=function(){t.config.animation&&t._fixTransition();var e=t._hoverState;t._hoverState=null,zt(t.element).trigger(t.constructor.Event.SHOWN),e===se&&t._leave(null,t)};if(zt(this.tip).hasClass(le)){var h=rn.getTransitionDurationFromElement(this.tip);zt(this.tip).one(rn.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},e.hide=function(t){var e=this,n=this.getTipElement(),i=zt.Event(this.constructor.Event.HIDE),r=function(){e._hoverState!==oe&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),zt(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(zt(this.element).trigger(i),!i.isDefaultPrevented()){if(zt(n).removeClass(ce),"ontouchstart"in document.documentElement&&zt(document.body).children().off("mouseover",null,zt.noop),this._activeTrigger.click=!1,this._activeTrigger[ue]=!1,this._activeTrigger[fe]=!1,zt(this.tip).hasClass(le)){var o=rn.getTransitionDurationFromElement(n);zt(n).one(rn.TRANSITION_END,r).emulateTransitionEnd(o)}else r();this._hoverState=""}},e.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},e.isWithContent=function(){return Boolean(this.getTitle())},e.addAttachmentClass=function(t){zt(this.getTipElement()).addClass(te+"-"+t)},e.getTipElement=function(){return this.tip=this.tip||zt(this.config.template)[0],this.tip},e.setContent=function(){var t=zt(this.getTipElement());this.setElementContent(t.find(he),this.getTitle()),t.removeClass(le+" "+ce)},e.setElementContent=function(t,e){var n=this.config.html;"object"==typeof e&&(e.nodeType||e.jquery)?n?zt(e).parent().is(t)||t.empty().append(e):t.text(zt(e).text()):t[n?"html":"text"](e)},e.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},e._getAttachment=function(t){return ie[t.toUpperCase()]},e._setListeners=function(){var t=this;this.config.trigger.split(" ").forEach(function(e){if("click"===e)zt(t.element).on(t.constructor.Event.CLICK,t.config.selector,function(e){return t.toggle(e)});else if("manual"!==e){var n=e===fe?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,i=e===fe?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;zt(t.element).on(n,t.config.selector,function(e){return t._enter(e)}).on(i,t.config.selector,function(e){return t._leave(e)})}zt(t.element).closest(".modal").on("hide.bs.modal",function(){return t.hide()})}),this.config.selector?this.config=o({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},e._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},e._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||zt(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),zt(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?ue:fe]=!0),zt(e.getTipElement()).hasClass(ce)||e._hoverState===oe?e._hoverState=oe:(clearTimeout(e._timeout),e._hoverState=oe,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===oe&&e.show()},e.config.delay.show):e.show())},e._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||zt(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),zt(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?ue:fe]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=se,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===se&&e.hide()},e.config.delay.hide):e.hide())},e._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},e._getConfig=function(t){return"number"==typeof(t=o({},this.constructor.Default,zt(this.element).data(),"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),rn.typeCheckConfig(Xt,t,this.constructor.DefaultType),t},e._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},e._cleanTipClass=function(){var t=zt(this.getTipElement()),e=t.attr("class").match(ee);null!==e&&0

'}),Te=o({},fn.DefaultType,{content:"(string|element|function)"}),"fade",Ce=".popover-header",we=".popover-body",Ie={HIDE:"hide"+_e,HIDDEN:"hidden"+_e,SHOW:"show"+_e,SHOWN:"shown"+_e,INSERTED:"inserted"+_e,CLICK:"click"+_e,FOCUSIN:"focusin"+_e,FOCUSOUT:"focusout"+_e,MOUSEENTER:"mouseenter"+_e,MOUSELEAVE:"mouseleave"+_e},De=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){pe(this.getTipElement()).addClass(Ee+"-"+t)},o.getTipElement=function(){return this.tip=this.tip||pe(this.config.template)[0],this.tip},o.setContent=function(){var t=pe(this.getTipElement());this.setElementContent(t.find(Ce),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(we),e),t.removeClass("fade show")},o._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},o._cleanTipClass=function(){var t=pe(this.getTipElement()),e=t.attr("class").match(ye);null!==e&&0=this._offsets[r]&&(void 0===this._offsets[r+1]||tthis.count)){var n=i[s],e=this.getSlidePosition(s);e&&e.addClass(n).removeClass("hidden-slide"),t++}},this.setSlidesTransition=function(){if(!this.slides||!this.slides.length)throw new Error("Slides is missing");null!==this.params.delay&&this.slides.each(function(){i(this).css({transitionDuration:n.params.delay+"ms",webkitTransitionDuration:n.params.delay+"ms"})}),null!==this.params.transition&&this.slides.each(function(){i(this).css({transitionTimingFunction:n.params.transition,webkitTransitionTimingFunction:n.params.transition})})},this.getIndexPosition=function(i){var t=parseInt(this.current)+parseInt(i);return t>=this.count?t-=this.count:t<=0&&(t=this.count+t),t},this.getSlidePosition=function(i){var t=this.getIndexPosition(i),s=this.getIndex(t),n=this.getSlideByIndex(s);return n},this.setWheeling=function(){if(1==this.count||this.count>5)return!1;var i=this.getSlideByIndex(this.getIndex(1));if(i){var t=i.clone(!0);this.slider.append(t)}var i=this.getSlideByIndex(this.getIndex(2));if(i){var t=i.clone(!0);this.slider.append(t)}if(2==this.count){var i=this.getSlideByIndex(this.getIndex(1));if(i){var t=i.clone(!0);this.slider.append(t)}var i=this.getSlideByIndex(this.getIndex(2));if(i){var t=i.clone(!0);this.slider.append(t)}}if(this.count>=3){var i=this.getSlideByIndex(this.getIndex(3));if(i){var t=i.clone(!0);this.slider.append(t)}if(this.count>=4){var i=this.getSlideByIndex(this.getIndex(4));if(i){var t=i.clone(!0);this.slider.append(t)}}if(this.count>=5){var i=this.getSlideByIndex(this.getIndex(5));if(i){var t=i.clone(!0);this.slider.append(t)}}}this.setSlides()},this.getSlideByIndex=function(t){if(!this.slides||!this.slides.length)throw new Error("Slides is missing");var s=i(this.slides.get(t));return s&&s.length?s:null},this.getCurrentSlide=function(){return this.getSlideByIndex(this.getIndex(this.current))},this.afterMoveHandler=function(){n.callFunction(n.params.onAfterMove)},this.moveHandler=function(){if(n.setSlideClasses(),n.hasFunction(n.params.onMove)?n.callFunction(n.params.onMove,n.afterMoveHandler):n.afterMoveHandler(),n.hasFunction(n.params.onAfterTransition)){var i=n.getCurrentSlide();i.one(n.transitionEvent,function(i){n.callFunction(n.params.onAfterTransition)})}n.followContent()},this.move=function(){0==this.current?this.current=this.count:this.current>this.count&&(this.current=1),this.hasFunction(this.params.onBeforeMove)?this.callFunction(this.params.onBeforeMove,this.moveHandler):this.moveHandler()},this.next=function(){this.current++,this.move()},this.prev=function(){this.current--,this.move()},this.followContent=function(){if(this.params.followingClass){i("."+this.params.followingClass).hide();var t=this.getSlideByIndex(this.getIndex(this.current));if(t){var s=t.data("index");i("."+this.params.followingClass+'[data-index="'+s+'"]').show()}}},this.hasFunction=function(i){return!(!i||"function"!=typeof i)},this.callFunction=function(i,t){this.hasFunction(i)&&i(this,t)},this.getIndex=function(i){var i=i-1;return i},this.getPercent=function(i,t){var i=parseFloat(i);return parseFloat(i)/100*t},this.whichTransitionEvent=function(){var i,t=document.createElement("transitionCheckElement"),s={transition:"transitionend",OTransition:"oTransitionEnd",MozTransition:"transitionend",WebkitTransition:"webkitTransitionEnd"};for(i in s)if(void 0!==t.style[i])return s[i]},this.init(),this}}(jQuery)}catch(i){console.log(i)}finally{} diff --git a/practicas/pp6/plugins/counto/apear.js b/practicas/pp6/plugins/counto/apear.js new file mode 100644 index 00000000..9739280a --- /dev/null +++ b/practicas/pp6/plugins/counto/apear.js @@ -0,0 +1,8 @@ +/* + * jQuery.appear + * http://code.google.com/p/jquery-appear/ + * + * Copyright (c) 2009 Michael Hixson + * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php) +*/ +(function($){$.fn.appear=function(f,o){var s=$.extend({one:true},o);return this.each(function(){var t=$(this);t.appeared=false;if(!f){t.trigger('appear',s.data);return;}var w=$(window);var c=function(){if(!t.is(':visible')){t.appeared=false;return;}var a=w.scrollLeft();var b=w.scrollTop();var o=t.offset();var x=o.left;var y=o.top;if(y+t.height()>=b&&y<=b+w.height()&&x+t.width()>=a&&x<=a+w.width()){if(!t.appeared)t.trigger('appear',s.data);}else{t.appeared=false;}};var m=function(){t.appeared=true;if(s.one){w.unbind('scroll',c);var i=$.inArray(c,$.fn.appear.checks);if(i>=0)$.fn.appear.checks.splice(i,1);}f.apply(this,arguments);};if(s.one)t.one('appear',s.data,m);else t.bind('appear',s.data,m);w.scroll(c);$.fn.appear.checks.push(c);(c)();});};$.extend($.fn.appear,{checks:[],timeout:null,checkAll:function(){var l=$.fn.appear.checks.length;if(l>0)while(l--)($.fn.appear.checks[l])();},run:function(){if($.fn.appear.timeout)clearTimeout($.fn.appear.timeout);$.fn.appear.timeout=setTimeout($.fn.appear.checkAll,20);}});$.each(['append','prepend','after','before','attr','removeAttr','addClass','removeClass','toggleClass','remove','css','show','hide'],function(i,n){var u=$.fn[n];if(u){$.fn[n]=function(){var r=u.apply(this,arguments);$.fn.appear.run();return r;}}});})(jQuery); \ No newline at end of file diff --git a/practicas/pp6/plugins/counto/counTo.js b/practicas/pp6/plugins/counto/counTo.js new file mode 100644 index 00000000..db7a1498 --- /dev/null +++ b/practicas/pp6/plugins/counto/counTo.js @@ -0,0 +1,119 @@ +(function ($) { + var CountTo = function (element, options) { + this.$element = $(element); + this.options = $.extend({}, CountTo.DEFAULTS, this.dataOptions(), options); + this.init(); + }; + + CountTo.DEFAULTS = { + from: 0, // the number the element should start at + to: 0, // the number the element should end at + speed: 1000, // how long it should take to count between the target numbers + refreshInterval: 100, // how often the element should be updated + decimals: 0, // the number of decimal places to show + formatter: formatter, // handler for formatting the value before rendering + onUpdate: null, // callback method for every time the element is updated + onComplete: null // callback method for when the element finishes updating + }; + + CountTo.prototype.init = function () { + this.value = this.options.from; + this.loops = Math.ceil(this.options.speed / this.options.refreshInterval); + this.loopCount = 0; + this.increment = (this.options.to - this.options.from) / this.loops; + }; + + CountTo.prototype.dataOptions = function () { + var options = { + from: this.$element.data('from'), + to: this.$element.data('to'), + speed: this.$element.data('speed'), + refreshInterval: this.$element.data('refresh-interval'), + decimals: this.$element.data('decimals') + }; + + var keys = Object.keys(options); + + for (var i in keys) { + var key = keys[i]; + + if (typeof(options[key]) === 'undefined') { + delete options[key]; + } + } + + return options; + }; + + CountTo.prototype.update = function () { + this.value += this.increment; + this.loopCount++; + + this.render(); + + if (typeof(this.options.onUpdate) == 'function') { + this.options.onUpdate.call(this.$element, this.value); + } + + if (this.loopCount >= this.loops) { + clearInterval(this.interval); + this.value = this.options.to; + + if (typeof(this.options.onComplete) == 'function') { + this.options.onComplete.call(this.$element, this.value); + } + } + }; + + CountTo.prototype.render = function () { + var formattedValue = this.options.formatter.call(this.$element, this.value, this.options); + this.$element.text(formattedValue); + }; + + CountTo.prototype.restart = function () { + this.stop(); + this.init(); + this.start(); + }; + + CountTo.prototype.start = function () { + this.stop(); + this.render(); + this.interval = setInterval(this.update.bind(this), this.options.refreshInterval); + }; + + CountTo.prototype.stop = function () { + if (this.interval) { + clearInterval(this.interval); + } + }; + + CountTo.prototype.toggle = function () { + if (this.interval) { + this.stop(); + } else { + this.start(); + } + }; + + function formatter(value, options) { + return value.toFixed(options.decimals); + } + + $.fn.countTo = function (option) { + return this.each(function () { + var $this = $(this); + var data = $this.data('countTo'); + var init = !data || typeof(option) === 'object'; + var options = typeof(option) === 'object' ? option : {}; + var method = typeof(option) === 'string' ? option : 'start'; + + if (init) { + if (data) data.stop(); + $this.data('countTo', data = new CountTo(this, options)); + } + + data[method].call(data); + }); + }; +}(jQuery)); diff --git a/practicas/pp6/plugins/google-map/gmap.js b/practicas/pp6/plugins/google-map/gmap.js new file mode 100644 index 00000000..57218e30 --- /dev/null +++ b/practicas/pp6/plugins/google-map/gmap.js @@ -0,0 +1,75 @@ +window.marker = null; + +function initialize() { + var map; + var latitude = $('#map_canvas').attr('data-latitude'); + var longitude = $('#map_canvas').attr('data-longitude'); + var mapMarker = $('#map_canvas').attr('data-marker'); + var nottingham = new google.maps.LatLng(latitude, longitude); + var style = [{ + "featureType": "administrative", + "elementType": "labels.text", + "stylers": [{ + "visibility": "on" + }] + }, + { + "featureType": "poi", + "elementType": "all", + "stylers": [{ + "visibility": "off" + }] + }, + { + "featureType": "transit.station.rail", + "elementType": "all", + "stylers": [{ + "visibility": "simplified" + }, + { + "saturation": "-100" + } + ] + }, + { + "featureType": "water", + "elementType": "all", + "stylers": [{ + "visibility": "on" + }] + } + ]; + var mapOptions = { + center: nottingham, + mapTypeId: google.maps.MapTypeId.ROADMAP, + backgroundColor: "#000", + zoom: 15, + panControl: false, + zoomControl: true, + mapTypeControl: false, + scaleControl: false, + streetViewControl: false, + overviewMapControl: false, + zoomControlOptions: { + style: google.maps.ZoomControlStyle.LARGE + } + } + map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions); + var mapType = new google.maps.StyledMapType(style, { + name: "Grayscale" + }); + map.mapTypes.set('grey', mapType); + map.setMapTypeId('grey'); + var marker_image = mapMarker; + var pinIcon = new google.maps.MarkerImage(marker_image, null, null, null, new google.maps.Size(60, 88)); + marker = new google.maps.Marker({ + position: nottingham, + map: map, + icon: pinIcon, + title: 'Agen' + }); +} +var map = document.getElementById('map_canvas'); +if (map != null) { + google.maps.event.addDomListener(window, 'load', initialize); +} \ No newline at end of file diff --git a/practicas/pp6/plugins/jQuery/jquery.min.js b/practicas/pp6/plugins/jQuery/jquery.min.js new file mode 100644 index 00000000..2ce938cc --- /dev/null +++ b/practicas/pp6/plugins/jQuery/jquery.min.js @@ -0,0 +1 @@ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},v=function(e){return null!=e&&e===e.window},y={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n)for(i in y)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var b=function(e,t){return new b.fn.init(e,t)},w=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function T(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!g(e)&&!v(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}b.fn=b.prototype={jquery:"3.3.1",constructor:b,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return b.each(this,e)},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,y,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!v||!v.test(e))){if(1!==T)m=t,y=e;else if("object"!==t.nodeName.toLowerCase()){for((c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;s--;)h[s]="#"+c+" "+ye(h[s]);y=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(y)try{return L.apply(r,m.querySelectorAll(y)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];return function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){for(var n=e.split("|"),i=n.length;i--;)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&void 0!==e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(h=(d=a).documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if(void 0!==t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if(void 0!==t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];for(i=t.getElementsByName(e),r=0;o=i[r++];)if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&g)return t.getElementsByClassName(e)},y=[],v=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||v.push(".#.+[+~]")}),ue(function(e){e.innerHTML="";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),y.push("!=",W)}),v=v.length&&new RegExp(v.join("|")),y=y.length&&new RegExp(y.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)s.unshift(n);for(;a[r]===s[r];)r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!y||!y.test(t))&&(!v||!v.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){for(;t=e[o++];)t===e[o]&&(i=r.push(o));for(;i--;)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r++];)n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",v=t.parentNode,y=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(v){if(o){for(;g;){for(p=t;p=p[g];)if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?v.firstChild:v.lastChild],a&&m){for(x=(d=(l=(c=(f=(p=v)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&v.childNodes[d];p=++d&&p&&p[g]||(x=d=0)||h.pop();)if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)for(;(p=++d&&p&&p[g]||(x=d=0)||h.pop())&&((s?p.nodeName.toLowerCase()!==y:1!==p.nodeType)||!++x||(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p!==t)););return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){for(var r,o=i(e,t),a=o.length;a--;)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){for(var o,a=r(e,null,i,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s-1&&(o[l]=!(a[l]=f))}}else y=be(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):L.apply(a,y)})}function Te(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u1&&xe(p),u>1&&ye(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u0,u=i.length>0,c=function(e,t,n,a,c){var f,h,v,y=0,m="0",x=e&&[],b=[],w=l,C=e||u&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=t===d||t||c);m!==k&&null!=(f=C[m]);m++){if(u&&f){for(h=0,t||f.ownerDocument===d||(p(f),n=!g);v=i[h++];)if(v(f,t||d,n)){a.push(f);break}c&&(T=E)}s&&((f=!v&&f)&&y--,e&&x.push(f))}if(y+=m,s&&m!==y){for(h=0;v=o[h++];)v(x,b,t,n);if(e){if(y>0)for(;m--;)x[m]||b[m]||(b[m]=j.call(a));b=be(b)}L.apply(a,b),c&&!e&&b.length>0&&y+o.length>1&&oe.uniqueSort(a)}return c&&(T=E,l=w),x},s?se(c):c))).selector=e}return v},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}for(o=V.needsContext.test(e)?0:u.length;o--&&(l=u[o],!r.relative[c=l.type]);)if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ye(u)))return L.apply(n,i),n;break}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);b.find=C,b.expr=C.selectors,b.expr[":"]=b.expr.pseudos,b.uniqueSort=b.unique=C.uniqueSort,b.text=C.getText,b.isXMLDoc=C.isXML,b.contains=C.contains,b.escapeSelector=C.escape;var E=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&b(e).is(n))break;r.push(e)}return r},k=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},S=b.expr.match.needsContext;function D(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function A(e,t,n){return g(t)?b.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?b.grep(e,function(e){return e===t!==n}):"string"!=typeof t?b.grep(e,function(e){return u.call(t,e)>-1!==n}):b.filter(t,e,n)}b.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?b.find.matchesSelector(r,e)?[r]:[]:b.find.matches(e,b.grep(t,function(e){return 1===e.nodeType}))},b.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(b(e).filter(function(){for(t=0;t1?b.uniqueSort(n):n},filter:function(e){return this.pushStack(A(this,e||[],!1))},not:function(e){return this.pushStack(A(this,e||[],!0))},is:function(e){return!!A(this,"string"==typeof e&&S.test(e)?b(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(b.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:q.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof b?t[0]:t,b.merge(this,b.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),N.test(i[1])&&b.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(b):b.makeArray(e,this)}).prototype=b.fn,j=b(r);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}b.fn.extend({has:function(e){var t=b(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&b.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?b.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(b(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(b.uniqueSort(b.merge(this.get(),b(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return E(e,"parentNode")},parentsUntil:function(e,t,n){return E(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return E(e,"nextSibling")},prevAll:function(e){return E(e,"previousSibling")},nextUntil:function(e,t,n){return E(e,"nextSibling",n)},prevUntil:function(e,t,n){return E(e,"previousSibling",n)},siblings:function(e){return k((e.parentNode||{}).firstChild,e)},children:function(e){return k(e.firstChild)},contents:function(e){return D(e,"iframe")?e.contentDocument:(D(e,"template")&&(e=e.content||e),b.merge([],e.childNodes))}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),this.length>1&&(H[e]||b.uniqueSort(i),L.test(e)&&i.reverse()),this.pushStack(i)}});var P=/[^\x20\t\r\n\f]+/g;function M(e){return e}function R(e){throw e}function I(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}b.Callbacks=function(e){var t,n;e="string"==typeof e?(t=e,n={},b.each(t.match(P)||[],function(e,t){n[t]=!0}),n):b.extend({},e);var r,i,o,a,s=[],u=[],l=-1,c=function(){for(a=a||e.once,o=r=!0;u.length;l=-1)for(i=u.shift();++l-1;)s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?b.inArray(e,s)>-1:s.length>0},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=i="",this},disabled:function(){return!s},lock:function(){return a=u=[],i||r||(s=i=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),r||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},b.extend({Deferred:function(t){var n=[["notify","progress",b.Callbacks("memory"),b.Callbacks("memory"),2],["resolve","done",b.Callbacks("once memory"),b.Callbacks("once memory"),0,"resolved"],["reject","fail",b.Callbacks("once memory"),b.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},catch:function(e){return i.then(null,e)},pipe:function(){var e=arguments;return b.Deferred(function(t){b.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t=o&&(r!==R&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(b.Deferred.getStackHook&&(c.stackTrace=b.Deferred.getStackHook()),e.setTimeout(c))}}return b.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:M,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:M)),n[2][3].add(a(0,e,g(r)?r:R))}).promise()},promise:function(e){return null!=e?b.extend(e,i):i}},o={};return b.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=b.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&(I(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();for(;n--;)I(i[n],s(n),a.reject);return a.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;b.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&W.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},b.readyException=function(t){e.setTimeout(function(){throw t})};var $=b.Deferred();function B(){r.removeEventListener("DOMContentLoaded",B),e.removeEventListener("load",B),b.ready()}b.fn.ready=function(e){return $.then(e).catch(function(e){b.readyException(e)}),this},b.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--b.readyWait:b.isReady)||(b.isReady=!0,!0!==e&&--b.readyWait>0||$.resolveWith(r,[b]))}}),b.ready.then=$.then,"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(b.ready):(r.addEventListener("DOMContentLoaded",B),e.addEventListener("load",B));var F=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)F(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(b(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),b.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,b.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){b.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:b.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),b.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,ce=/^$|^module$|\/(?:java|ecma)script/i,fe={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function pe(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&D(e,t)?b.merge([e],n):n}function de(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=b.contains(o.ownerDocument,o),a=pe(f.appendChild(o),"script"),l&&de(a),n)for(c=0;o=a[c++];)ce.test(o.type||"")&&n.push(o);return f}he=r.createDocumentFragment().appendChild(r.createElement("div")),(ge=r.createElement("input")).setAttribute("type","radio"),ge.setAttribute("checked","checked"),ge.setAttribute("name","t"),he.appendChild(ge),h.checkClone=he.cloneNode(!0).cloneNode(!0).lastChild.checked,he.innerHTML="",h.noCloneChecked=!!he.cloneNode(!0).lastChild.defaultValue;var me=r.documentElement,xe=/^key/,be=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,we=/^([^.]*)(?:\.(.+)|)/;function Te(){return!0}function Ce(){return!1}function Ee(){try{return r.activeElement}catch(e){}}function ke(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)ke(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ce;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return b().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=b.guid++)),e.each(function(){b.event.add(this,t,i,r,n)})}b.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(e);if(v)for(n.handler&&(n=(o=n).handler,i=o.selector),i&&b.find.matchesSelector(me,i),n.guid||(n.guid=b.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(t){return void 0!==b&&b.event.triggered!==t.type?b.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(P)||[""]).length;l--;)d=g=(s=we.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=b.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=b.event.special[d]||{},c=b.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&b.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),b.event.global[d]=!0)},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){for(l=(t=(t||"").match(P)||[""]).length;l--;)if(s=we.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){for(f=b.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;o--;)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||b.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=b.event.fix(e),u=new Array(arguments.length),l=(Y.get(this,"events")||{})[s.type]||[],c=b.event.special[s.type]||{};for(u[0]=s,t=1;t=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:b.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,De=/\s*$/g;function je(e,t){return D(e,"table")&&D(11!==t.nodeType?t:t.firstChild,"tr")&&b(e).children("tbody")[0]||e}function qe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Le(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function He(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Y.hasData(e)&&(o=Y.access(e),a=Y.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof v&&!h.checkClone&&Ne.test(v))return e.each(function(i){var o=e.eq(i);y&&(t[0]=v.call(this,i,o.html())),Oe(o,t,n,r)});if(p&&(o=(i=ye(t,e[0].ownerDocument,!1,e,r)).firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=b.map(pe(i,"script"),qe)).length;f")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=b.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(a=pe(c),r=0,i=(o=pe(e)).length;r0&&de(a,!f&&pe(e,"script")),c},cleanData:function(e){for(var t,n,r,i=b.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?b.event.remove(n,r):b.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),b.fn.extend({detach:function(e){return Pe(this,e,!0)},remove:function(e){return Pe(this,e)},text:function(e){return F(this,function(e){return void 0===e?b.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Oe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return Oe(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Oe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Oe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(b.cleanData(pe(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return F(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!De.test(e)&&!fe[(le.exec(e)||["",""])[1].toLowerCase()]){e=b.htmlPrefilter(e);try{for(;n=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function Qe(e,t,n){var r=Re(e),i=We(e,t,r),o="border-box"===b.css(e,"boxSizing",!1,r),a=o;if(Me.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===b.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ye(e,t,n||(o?"border":"content"),a,r,i)+"px"}function Je(e,t,n,r,i){return new Je.prototype.init(e,t,n,r,i)}b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=U(t),u=Fe.test(t),l=e.style;if(u||(t=Ve(s)),a=b.cssHooks[t]||b.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=oe(e,t,i),o="number"),null!=n&&n==n&&("number"===o&&(n+=i&&i[3]||(b.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=U(t);return Fe.test(t)||(t=Ve(s)),(a=b.cssHooks[t]||b.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in ze&&(i=ze[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),b.each(["height","width"],function(e,t){b.cssHooks[t]={get:function(e,n,r){if(n)return!Be.test(b.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Qe(e,t,r):ie(e,_e,function(){return Qe(e,t,r)})},set:function(e,n,r){var i,o=Re(e),a="border-box"===b.css(e,"boxSizing",!1,o),s=r&&Ye(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ye(e,t,"border",!1,o)-.5)),s&&(i=te.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=b.css(e,t)),Ge(0,n,s)}}}),b.cssHooks.marginLeft=$e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-ie(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),b.each({margin:"",padding:"",border:"Width"},function(e,t){b.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+ne[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(b.cssHooks[e+t].set=Ge)}),b.fn.extend({css:function(e,t){return F(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a1)}}),b.Tween=Je,Je.prototype={constructor:Je,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||b.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(b.cssNumber[n]?"":"px")},cur:function(){var e=Je.propHooks[this.prop];return e&&e.get?e.get(this):Je.propHooks._default.get(this)},run:function(e){var t,n=Je.propHooks[this.prop];return this.options.duration?this.pos=t=b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Je.propHooks._default.set(this),this}},Je.prototype.init.prototype=Je.prototype,Je.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=b.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[b.cssProps[e.prop]]&&!b.cssHooks[e.prop]?e.elem[e.prop]=e.now:b.style(e.elem,e.prop,e.now+e.unit)}}},Je.propHooks.scrollTop=Je.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},b.fx=Je.prototype.init,b.fx.step={};var Ke,Ze,et,tt,nt=/^(?:toggle|show|hide)$/,rt=/queueHooks$/;function it(){Ze&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(it):e.setTimeout(it,b.fx.interval),b.fx.tick())}function ot(){return e.setTimeout(function(){Ke=void 0}),Ke=Date.now()}function at(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function st(e,t,n){for(var r,i=(ut.tweeners[t]||[]).concat(ut.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})}}),b.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return void 0===e.getAttribute?b.prop(e,t,n):(1===o&&b.isXMLDoc(e)||(i=b.attrHooks[t.toLowerCase()]||(b.expr.match.bool.test(t)?lt:void 0)),void 0!==n?null===n?void b.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=b.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&D(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)for(;n=i[r++];)e.removeAttribute(n)}}),lt={set:function(e,t,n){return!1===t?b.removeAttr(e,n):e.setAttribute(n,n),n}},b.each(b.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ct[t]||b.find.attr;ct[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ct[a],ct[a]=i,i=null!=n(e,t,r)?a:null,ct[a]=o),i}});var ft=/^(?:input|select|textarea|button)$/i,pt=/^(?:a|area)$/i;function dt(e){return(e.match(P)||[]).join(" ")}function ht(e){return e.getAttribute&&e.getAttribute("class")||""}function gt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}b.fn.extend({prop:function(e,t){return F(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[b.propFix[e]||e]})}}),b.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&b.isXMLDoc(e)||(t=b.propFix[t]||t,i=b.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=b.find.attr(e,"tabindex");return t?parseInt(t,10):ft.test(e.nodeName)||pt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),h.optSelected||(b.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),b.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){b.propFix[this.toLowerCase()]=this}),b.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){b(this).addClass(e.call(this,t,ht(this)))});if((t=gt(e)).length)for(;n=this[u++];)if(i=ht(n),r=1===n.nodeType&&" "+dt(i)+" "){for(a=0;o=t[a++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=dt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){b(this).removeClass(e.call(this,t,ht(this)))});if(!arguments.length)return this.attr("class","");if((t=gt(e)).length)for(;n=this[u++];)if(i=ht(n),r=1===n.nodeType&&" "+dt(i)+" "){for(a=0;o=t[a++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");i!==(s=dt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,ht(this),t),t)}):this.each(function(){var t,i,o,a;if(r)for(i=0,o=b(this),a=gt(e);t=a[i++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else void 0!==e&&"boolean"!==n||((t=ht(this))&&Y.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+dt(ht(n))+" ").indexOf(t)>-1)return!0;return!1}});var vt=/\r/g;b.fn.extend({val:function(e){var t,n,r,i=this[0];return arguments.length?(r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,b(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=b.map(i,function(e){return null==e?"":e+""})),(t=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))})):i?(t=b.valHooks[i.type]||b.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(vt,""):null==n?"":n:void 0}}),b.extend({valHooks:{option:{get:function(e){var t=b.find.attr(e,"value");return null!=t?t:dt(b.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=b.inArray(b(e).val(),t)>-1}},h.checkOn||(b.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var yt=/^(?:focusinfocus|focusoutblur)$/,mt=function(e){e.stopPropagation()};b.extend(b.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,y=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!yt.test(m+b.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,(t=t[b.expando]?t:new b.Event(m,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:b.makeArray(n,[t]),d=b.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!v(i)){for(l=d.delegateType||m,yt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)y.push(s),u=s;u===(i.ownerDocument||r)&&y.push(u.defaultView||u.parentWindow||e)}for(a=0;(s=y[a++])&&!t.isPropagationStopped();)h=s,t.type=a>1?l:d.bindType||m,(p=(Y.get(s,"events")||{})[t.type]&&Y.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&V(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(y.pop(),n)||!V(i)||c&&g(i[m])&&!v(i)&&((u=i[c])&&(i[c]=null),b.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,mt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,mt),b.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=b.extend(new b.Event,n,{type:e,isSimulated:!0});b.event.trigger(r,null,t)}}),b.fn.extend({trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return b.event.trigger(e,t,n,!0)}}),h.focusin||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){b.event.simulate(t,e.target,b.event.fix(e))};b.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=Y.access(r,t);i||r.addEventListener(e,n,!0),Y.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=Y.access(r,t)-1;i?Y.access(r,t,i):(r.removeEventListener(e,n,!0),Y.remove(r,t))}}});var xt=e.location,bt=Date.now(),wt=/\?/;b.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+t),n};var Tt=/\[\]$/,Ct=/\r?\n/g,Et=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function St(e,t,n,r){var i;if(Array.isArray(t))b.each(t,function(t,i){n||Tt.test(e)?r(e,i):St(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)St(e+"["+i+"]",t[i],n,r)}b.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!b.isPlainObject(e))b.each(e,function(){i(this.name,this.value)});else for(n in e)St(n,e[n],t,i);return r.join("&")},b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=b.prop(this,"elements");return e?b.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!b(this).is(":disabled")&&kt.test(this.nodeName)&&!Et.test(e)&&(this.checked||!ue.test(e))}).map(function(e,t){var n=b(this).val();return null==n?null:Array.isArray(n)?b.map(n,function(e){return{name:t.name,value:e.replace(Ct,"\r\n")}}):{name:t.name,value:n.replace(Ct,"\r\n")}}).get()}});var Dt=/%20/g,Nt=/#.*$/,At=/([?&])_=[^&]*/,jt=/^(.*?):[ \t]*([^\r\n]*)$/gm,qt=/^(?:GET|HEAD)$/,Lt=/^\/\//,Ht={},Ot={},Pt="*/".concat("*"),Mt=r.createElement("a");function Rt(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(P)||[];if(g(n))for(;r=o[i++];)"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function It(e,t,n,r){var i={},o=e===Ot;function a(s){var u;return i[s]=!0,b.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function Wt(e,t){var n,r,i=b.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&b.extend(!0,e,r),e}Mt.href=xt.href,b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:xt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(xt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Pt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Wt(Wt(e,b.ajaxSettings),t):Wt(b.ajaxSettings,e)},ajaxPrefilter:Rt(Ht),ajaxTransport:Rt(Ot),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=b.ajaxSetup({},n),g=h.context||h,v=h.context&&(g.nodeType||g.jquery)?b(g):b.event,y=b.Deferred(),m=b.Callbacks("once memory"),x=h.statusCode||{},w={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s)for(s={};t=jt.exec(a);)s[t[1].toLowerCase()]=t[2];t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,w[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(y.promise(E),h.url=((t||h.url||xt.href)+"").replace(Lt,xt.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(P)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Mt.protocol+"//"+Mt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=b.param(h.data,h.traditional)),It(Ht,h,n,E),c)return E;(f=b.event&&h.global)&&0==b.active++&&b.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!qt.test(h.type),o=h.url.replace(Nt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(Dt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(wt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(At,"$1"),d=(wt.test(o)?"&":"?")+"_="+bt+++d),h.url=o+d),h.ifModified&&(b.lastModified[o]&&E.setRequestHeader("If-Modified-Since",b.lastModified[o]),b.etag[o]&&E.setRequestHeader("If-None-Match",b.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Pt+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=It(Ot,h,n,E)){if(E.readyState=1,f&&v.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(w,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,w,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(w=function(e,t,n){for(var r,i,o,a,s=e.contents,u=e.dataTypes;"*"===u[0];)u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(h,E,r)),w=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];for(o=c.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e.throws)t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(h,w,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(b.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(b.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=w.state,p=w.data,l=!(d=w.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?y.resolveWith(g,[p,C,E]):y.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&v.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(v.trigger("ajaxComplete",[E,h]),--b.active||b.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return b.get(e,t,n,"json")},getScript:function(e,t){return b.get(e,void 0,t,"script")}}),b.each(["get","post"],function(e,t){b[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),b.ajax(b.extend({url:e,type:t,dataType:i,data:n,success:r},b.isPlainObject(e)&&e))}}),b._evalUrl=function(e){return b.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,throws:!0})},b.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=b(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){b(this).replaceWith(this.childNodes)}),this}}),b.expr.pseudos.hidden=function(e){return!b.expr.pseudos.visible(e)},b.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},b.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var $t={0:200,1223:204},Bt=b.ajaxSettings.xhr();h.cors=!!Bt&&"withCredentials"in Bt,h.ajax=Bt=!!Bt,b.ajaxTransport(function(t){var n,r;if(h.cors||Bt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o($t[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),b.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),b.ajaxTransport("script",function(e){var t,n;if(e.crossDomain)return{send:function(i,o){t=b(" + + \ No newline at end of file diff --git a/proyecto-gestor-notas/admin/addModulo.php b/proyecto-gestor-notas/admin/addModulo.php new file mode 100644 index 00000000..7c9558ef --- /dev/null +++ b/proyecto-gestor-notas/admin/addModulo.php @@ -0,0 +1,199 @@ +prepare("INSERT INTO modulos (nombre, foto) VALUES (?, ?)"); + $stmt->bind_param("ss", $nombre, $fotoPath); + + if ($stmt->execute()) { + $success = "Módulo creado correctamente."; + $nombre = ''; // Limpiar campo + } else { + $error = "Error al crear módulo: " . $stmt->error; + } + + $stmt->close(); + } + } +} +?> + + + + + + + Añadir Módulo + + + +
+

➕ Añadir Módulo

+ ← Volver +
+ +
+
+ +
+ + + +
+ + +
+
+ + +
+ +
+ + +
+ + +
+
+
+ + \ No newline at end of file diff --git a/proyecto-gestor-notas/admin/addNota.php b/proyecto-gestor-notas/admin/addNota.php new file mode 100644 index 00000000..22d16771 --- /dev/null +++ b/proyecto-gestor-notas/admin/addNota.php @@ -0,0 +1,240 @@ +query("SELECT id, nombre, apellidos FROM users WHERE role='student' ORDER BY nombre, apellidos"); +$students = $students_result->fetch_all(MYSQLI_ASSOC); + +// Obtener lista de módulos +$modulos_result = $mysqli->query("SELECT id, nombre FROM modulos ORDER BY nombre"); +$modulos = $modulos_result->fetch_all(MYSQLI_ASSOC); + +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $id_usuario = (int) $_POST['id_usuario']; + $id_modulo = (int) $_POST['id_modulo']; + $nota = (float) $_POST['nota']; + + // Validaciones + if (empty($id_usuario) || empty($id_modulo)) { + $error = "Debes seleccionar un estudiante y un módulo."; + } elseif ($nota < 0 || $nota > 10) { + $error = "La nota debe estar entre 0 y 10."; + } else { + // Verificar que no exista ya una nota para este estudiante en este módulo + $stmt = $mysqli->prepare("SELECT id FROM notas WHERE id_usuario = ? AND id_modulo = ?"); + $stmt->bind_param("ii", $id_usuario, $id_modulo); + $stmt->execute(); + $result = $stmt->get_result(); + + if ($result->num_rows > 0) { + $error = "Este estudiante ya tiene una nota registrada en este módulo."; + } else { + // Insertar nota + $stmt = $mysqli->prepare("INSERT INTO notas (nota, id_usuario, id_modulo) VALUES (?, ?, ?)"); + $stmt->bind_param("dii", $nota, $id_usuario, $id_modulo); + + if ($stmt->execute()) { + $success = "Nota registrada correctamente."; + } else { + $error = "Error al registrar nota: " . $stmt->error; + } + + $stmt->close(); + } + } +} +?> + + + + + + + Añadir Nota + + + +
+

➕ Añadir Nota

+ ← Volver +
+ +
+
+ +
+ + + +
+ + + +
+ ⚠️ Atención:
+ + No hay estudiantes registrados. Añade estudiantes primero.
+ + + No hay módulos registrados. Añade módulos primero. + +
+ + +
+
+ + +
+ +
+ + +
+ +
+ + +

Introduce una nota entre 0 y 10 (puedes usar decimales)

+
+ + +
+ + +
+
+ + \ No newline at end of file diff --git a/proyecto-gestor-notas/admin/addUser.php b/proyecto-gestor-notas/admin/addUser.php new file mode 100644 index 00000000..89fbb7f4 --- /dev/null +++ b/proyecto-gestor-notas/admin/addUser.php @@ -0,0 +1,238 @@ +prepare("SELECT id FROM users WHERE email = ?"); + $stmt->bind_param("s", $email); + $stmt->execute(); + $result = $stmt->get_result(); + + if ($result->num_rows > 0) { + $error = "Este email ya está registrado."; + } else { + // Procesar imagen + $fotoPath = NULL; + + if (isset($_FILES['foto']) && $_FILES['foto']['error'] === UPLOAD_ERR_OK) { + $fileTmpPath = $_FILES['foto']['tmp_name']; + $fileName = $_FILES['foto']['name']; + $fileExtension = strtolower(pathinfo($fileName, PATHINFO_EXTENSION)); + + $allowedExtensions = ['jpg', 'jpeg', 'png', 'gif']; + + if (in_array($fileExtension, $allowedExtensions)) { + $newFileName = uniqid() . '_' . time() . '.' . $fileExtension; + $fotoPath = 'uploads/users/' . $newFileName; + + if (!move_uploaded_file($fileTmpPath, '../' . $fotoPath)) { + $error = "Error al subir la imagen."; + } + } + } + + // Insertar usuario + if (empty($error)) { + $passwordHashed = password_hash($password, PASSWORD_DEFAULT); + + $stmt = $mysqli->prepare( + "INSERT INTO users (nombre, apellidos, email, password, foto, role) + VALUES (?, ?, ?, ?, ?, ?)" + ); + $stmt->bind_param("ssssss", $nombre, $apellidos, $email, $passwordHashed, $fotoPath, $role); + + if ($stmt->execute()) { + $success = "Usuario creado correctamente."; + // Limpiar campos + $nombre = $apellidos = $email = ''; + } else { + $error = "Error al crear usuario: " . $stmt->error; + } + + $stmt->close(); + } + } + } +} +?> + + + + + + + Añadir Usuario + + + +
+

➕ Añadir Usuario

+ ← Volver +
+ +
+
+ +
+ + + +
+ + +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+
+
+ + \ No newline at end of file diff --git a/proyecto-gestor-notas/admin/admin-dashboard.php b/proyecto-gestor-notas/admin/admin-dashboard.php new file mode 100644 index 00000000..778a9362 --- /dev/null +++ b/proyecto-gestor-notas/admin/admin-dashboard.php @@ -0,0 +1,219 @@ +query("SELECT COUNT(*) as total FROM users")->fetch_assoc()['total']; +$totalModulos = $mysqli->query("SELECT COUNT(*) as total FROM modulos")->fetch_assoc()['total']; +$totalNotas = $mysqli->query("SELECT COUNT(*) as total FROM notas")->fetch_assoc()['total']; +$totalStudents = $mysqli->query("SELECT COUNT(*) as total FROM users WHERE role='student'")->fetch_assoc()['total']; +?> + + + + + + + Panel de Administrador + + + +
+

👨‍💼 Panel de Administrador

+ +
+ +
+
+
+

Total Usuarios

+
+
+
+

Total Estudiantes

+
+
+
+

Total Módulos

+
+
+
+

Total Notas Registradas

+
+
+
+ + +
+ + \ No newline at end of file diff --git a/proyecto-gestor-notas/admin/adminModulos.php b/proyecto-gestor-notas/admin/adminModulos.php new file mode 100644 index 00000000..ba7dfa7f --- /dev/null +++ b/proyecto-gestor-notas/admin/adminModulos.php @@ -0,0 +1,185 @@ +query("SELECT * FROM modulos ORDER BY id DESC"); +$modulos = $result->fetch_all(MYSQLI_ASSOC); +?> + + + + + + + Gestión de Módulos + + + +
+

📚 Gestión de Módulos

+ ← Volver al Dashboard +
+ +
+ + +
+ + + + + + + + + + + + + + + + + + + +
IDFotoNombre del MóduloAcciones
+ + Foto + + Sin foto + +
+
+
+ + \ No newline at end of file diff --git a/proyecto-gestor-notas/admin/adminNotas.php b/proyecto-gestor-notas/admin/adminNotas.php new file mode 100644 index 00000000..e5ddf17b --- /dev/null +++ b/proyecto-gestor-notas/admin/adminNotas.php @@ -0,0 +1,271 @@ +query($query); +$notas = $result->fetch_all(MYSQLI_ASSOC); +?> + + + + + + + Gestión de Notas + + + +
+

📝 Gestión de Notas

+ ← Volver al Dashboard +
+ +
+ + +
+ 0): ?> + + + + + + + + + + + + + + + + + + + + + +
IDEstudianteMóduloNotaAcciones
+ + +
+ + Foto + + Sin foto + +
+ +
+
+
+ + + +
+ +
+

No hay notas registradas todavía.

+
+ +
+
+ + \ No newline at end of file diff --git a/proyecto-gestor-notas/admin/adminUsers.php b/proyecto-gestor-notas/admin/adminUsers.php new file mode 100644 index 00000000..b8d9b649 --- /dev/null +++ b/proyecto-gestor-notas/admin/adminUsers.php @@ -0,0 +1,213 @@ +query("SELECT id, nombre, apellidos, email, foto, role FROM users ORDER BY id DESC"); +$users = $result->fetch_all(MYSQLI_ASSOC); +?> + + + + + + + Gestión de Usuarios + + + +
+

👥 Gestión de Usuarios

+ ← Volver al Dashboard +
+ +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
IDFotoNombreApellidosEmailRolAcciones
+ + Foto + + Sin foto + + + + + +
+
+
+ + \ No newline at end of file diff --git a/proyecto-gestor-notas/admin/consultas-avanzadas.php b/proyecto-gestor-notas/admin/consultas-avanzadas.php new file mode 100644 index 00000000..e4884e4f --- /dev/null +++ b/proyecto-gestor-notas/admin/consultas-avanzadas.php @@ -0,0 +1,278 @@ +query($query_promedio_modulos)->fetch_all(MYSQLI_ASSOC); + +// 2. Alumnos con promedio >= 8 +$query_alumnos_destacados = " + SELECT + u.nombre, + u.apellidos, + ROUND(AVG(n.nota), 2) AS media + FROM users u + JOIN notas n ON u.id = n.id_usuario + WHERE u.role = 'student' + GROUP BY u.id, u.nombre, u.apellidos + HAVING media >= 8 + ORDER BY media DESC +"; +$alumnos_destacados = $mysqli->query($query_alumnos_destacados)->fetch_all(MYSQLI_ASSOC); + +// 3. Alumnos con promedio < 5 +$query_alumnos_bajo = " + SELECT + u.nombre, + u.apellidos, + ROUND(AVG(n.nota), 2) AS media + FROM users u + JOIN notas n ON u.id = n.id_usuario + WHERE u.role = 'student' + GROUP BY u.id, u.nombre, u.apellidos + HAVING media < 5 + ORDER BY media ASC +"; +$alumnos_bajo = $mysqli->query($query_alumnos_bajo)->fetch_all(MYSQLI_ASSOC); + +// 4. Módulo con mejor promedio +$mejor_modulo = count($promedios_modulos) > 0 ? $promedios_modulos[0] : null; + +// 5. Módulo con peor promedio +$peor_modulo = count($promedios_modulos) > 0 ? end($promedios_modulos) : null; +?> + + + + + + + Consultas Avanzadas + + + +
+

📊 Consultas Avanzadas y Estadísticas

+ ← Volver al Dashboard +
+ +
+ +
+

📈 Estadísticas Destacadas

+ + +
+ 🏆 Módulo con mejor promedio: + + (Promedio: ) +
+ + + +
+ ⚠️ Módulo con promedio más bajo: + + (Promedio: ) +
+ +
+ + +
+

📚 Promedio de Notas por Módulo

+ 0): ?> + + + + + + + + + + + + + + + + + +
MóduloPromedioTotal de Notas
+ + + +
+ +

No hay datos disponibles

+ +
+ + +
+

⭐ Alumnos Destacados (Promedio ≥ 8)

+ 0): ?> + + + + + + + + + + + + + + + + + +
NombreApellidosPromedio
+ +

No hay alumnos con promedio mayor o igual a 8

+ +
+ + +
+

⚠️ Alumnos en Riesgo (Promedio < 5)

+ 0): ?> + + + + + + + + + + + + + + + + + +
NombreApellidosPromedio
+ +

No hay alumnos con promedio menor a 5 😊

+ +
+
+ + \ No newline at end of file diff --git a/proyecto-gestor-notas/admin/deleteModulo.php b/proyecto-gestor-notas/admin/deleteModulo.php new file mode 100644 index 00000000..4b787edf --- /dev/null +++ b/proyecto-gestor-notas/admin/deleteModulo.php @@ -0,0 +1,35 @@ +prepare("SELECT foto FROM modulos WHERE id = ?"); +$stmt->bind_param("i", $id); +$stmt->execute(); +$result = $stmt->get_result(); +$modulo = $result->fetch_assoc(); + +if ($modulo) { + // Eliminar foto si existe + if ($modulo['foto'] && file_exists('../' . $modulo['foto'])) { + unlink('../' . $modulo['foto']); + } + + // Eliminar módulo (las notas se eliminarán automáticamente por CASCADE) + $stmt = $mysqli->prepare("DELETE FROM modulos WHERE id = ?"); + $stmt->bind_param("i", $id); + $stmt->execute(); + $stmt->close(); +} + +header("Location: adminModulos.php"); +exit; +?> \ No newline at end of file diff --git a/proyecto-gestor-notas/admin/deleteNota.php b/proyecto-gestor-notas/admin/deleteNota.php new file mode 100644 index 00000000..963de9ae --- /dev/null +++ b/proyecto-gestor-notas/admin/deleteNota.php @@ -0,0 +1,21 @@ +prepare("DELETE FROM notas WHERE id = ?"); +$stmt->bind_param("i", $id); +$stmt->execute(); +$stmt->close(); + +header("Location: adminNotas.php"); +exit; +?> \ No newline at end of file diff --git a/proyecto-gestor-notas/admin/deleteUser.php b/proyecto-gestor-notas/admin/deleteUser.php new file mode 100644 index 00000000..11c6b0b9 --- /dev/null +++ b/proyecto-gestor-notas/admin/deleteUser.php @@ -0,0 +1,41 @@ +prepare("SELECT foto FROM users WHERE id = ?"); +$stmt->bind_param("i", $id); +$stmt->execute(); +$result = $stmt->get_result(); +$user = $result->fetch_assoc(); + +if ($user) { + // Eliminar foto si existe + if ($user['foto'] && file_exists('../' . $user['foto'])) { + unlink('../' . $user['foto']); + } + + // Eliminar usuario + $stmt = $mysqli->prepare("DELETE FROM users WHERE id = ?"); + $stmt->bind_param("i", $id); + $stmt->execute(); + $stmt->close(); +} + +header("Location: adminUsers.php"); +exit; +?> \ No newline at end of file diff --git a/proyecto-gestor-notas/admin/editModulo.php b/proyecto-gestor-notas/admin/editModulo.php new file mode 100644 index 00000000..1e52565c --- /dev/null +++ b/proyecto-gestor-notas/admin/editModulo.php @@ -0,0 +1,236 @@ +prepare("SELECT * FROM modulos WHERE id = ?"); +$stmt->bind_param("i", $id); +$stmt->execute(); +$result = $stmt->get_result(); +$modulo = $result->fetch_assoc(); + +if (!$modulo) { + header("Location: adminModulos.php"); + exit; +} + +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $nombre = trim($_POST['nombre']); + + if (empty($nombre)) { + $error = "El nombre del módulo es obligatorio."; + } else { + // Procesar imagen si se sube una nueva + $fotoPath = $modulo['foto']; + + if (isset($_FILES['foto']) && $_FILES['foto']['error'] === UPLOAD_ERR_OK) { + $fileTmpPath = $_FILES['foto']['tmp_name']; + $fileName = $_FILES['foto']['name']; + $fileExtension = strtolower(pathinfo($fileName, PATHINFO_EXTENSION)); + + $allowedExtensions = ['jpg', 'jpeg', 'png', 'gif']; + + if (in_array($fileExtension, $allowedExtensions)) { + // Eliminar foto anterior + if ($modulo['foto'] && file_exists('../' . $modulo['foto'])) { + unlink('../' . $modulo['foto']); + } + + $newFileName = uniqid() . '_' . time() . '.' . $fileExtension; + $fotoPath = 'uploads/modulos/' . $newFileName; + + if (!move_uploaded_file($fileTmpPath, '../' . $fotoPath)) { + $error = "Error al subir la imagen."; + } + } + } + + // Actualizar módulo + if (empty($error)) { + $stmt = $mysqli->prepare("UPDATE modulos SET nombre=?, foto=? WHERE id=?"); + $stmt->bind_param("ssi", $nombre, $fotoPath, $id); + + if ($stmt->execute()) { + $success = "Módulo actualizado correctamente."; + $modulo['nombre'] = $nombre; + $modulo['foto'] = $fotoPath; + } else { + $error = "Error al actualizar módulo: " . $stmt->error; + } + + $stmt->close(); + } + } +} +?> + + + + + + + Editar Módulo + + + +
+

✏️ Editar Módulo

+ ← Volver +
+ +
+
+ +
+ + + +
+ + + +
+ Foto actual +

Foto actual

+
+ + +
+
+ + +
+ +
+ + +

Déjalo en blanco si no quieres cambiar la foto

+
+ + +
+
+
+ + \ No newline at end of file diff --git a/proyecto-gestor-notas/admin/editNota.php b/proyecto-gestor-notas/admin/editNota.php new file mode 100644 index 00000000..22d16771 --- /dev/null +++ b/proyecto-gestor-notas/admin/editNota.php @@ -0,0 +1,240 @@ +query("SELECT id, nombre, apellidos FROM users WHERE role='student' ORDER BY nombre, apellidos"); +$students = $students_result->fetch_all(MYSQLI_ASSOC); + +// Obtener lista de módulos +$modulos_result = $mysqli->query("SELECT id, nombre FROM modulos ORDER BY nombre"); +$modulos = $modulos_result->fetch_all(MYSQLI_ASSOC); + +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $id_usuario = (int) $_POST['id_usuario']; + $id_modulo = (int) $_POST['id_modulo']; + $nota = (float) $_POST['nota']; + + // Validaciones + if (empty($id_usuario) || empty($id_modulo)) { + $error = "Debes seleccionar un estudiante y un módulo."; + } elseif ($nota < 0 || $nota > 10) { + $error = "La nota debe estar entre 0 y 10."; + } else { + // Verificar que no exista ya una nota para este estudiante en este módulo + $stmt = $mysqli->prepare("SELECT id FROM notas WHERE id_usuario = ? AND id_modulo = ?"); + $stmt->bind_param("ii", $id_usuario, $id_modulo); + $stmt->execute(); + $result = $stmt->get_result(); + + if ($result->num_rows > 0) { + $error = "Este estudiante ya tiene una nota registrada en este módulo."; + } else { + // Insertar nota + $stmt = $mysqli->prepare("INSERT INTO notas (nota, id_usuario, id_modulo) VALUES (?, ?, ?)"); + $stmt->bind_param("dii", $nota, $id_usuario, $id_modulo); + + if ($stmt->execute()) { + $success = "Nota registrada correctamente."; + } else { + $error = "Error al registrar nota: " . $stmt->error; + } + + $stmt->close(); + } + } +} +?> + + + + + + + Añadir Nota + + + +
+

➕ Añadir Nota

+ ← Volver +
+ +
+
+ +
+ + + +
+ + + +
+ ⚠️ Atención:
+ + No hay estudiantes registrados. Añade estudiantes primero.
+ + + No hay módulos registrados. Añade módulos primero. + +
+ + +
+
+ + +
+ +
+ + +
+ +
+ + +

Introduce una nota entre 0 y 10 (puedes usar decimales)

+
+ + +
+ + +
+
+ + \ No newline at end of file diff --git a/proyecto-gestor-notas/admin/editUser.php b/proyecto-gestor-notas/admin/editUser.php new file mode 100644 index 00000000..89fbb7f4 --- /dev/null +++ b/proyecto-gestor-notas/admin/editUser.php @@ -0,0 +1,238 @@ +prepare("SELECT id FROM users WHERE email = ?"); + $stmt->bind_param("s", $email); + $stmt->execute(); + $result = $stmt->get_result(); + + if ($result->num_rows > 0) { + $error = "Este email ya está registrado."; + } else { + // Procesar imagen + $fotoPath = NULL; + + if (isset($_FILES['foto']) && $_FILES['foto']['error'] === UPLOAD_ERR_OK) { + $fileTmpPath = $_FILES['foto']['tmp_name']; + $fileName = $_FILES['foto']['name']; + $fileExtension = strtolower(pathinfo($fileName, PATHINFO_EXTENSION)); + + $allowedExtensions = ['jpg', 'jpeg', 'png', 'gif']; + + if (in_array($fileExtension, $allowedExtensions)) { + $newFileName = uniqid() . '_' . time() . '.' . $fileExtension; + $fotoPath = 'uploads/users/' . $newFileName; + + if (!move_uploaded_file($fileTmpPath, '../' . $fotoPath)) { + $error = "Error al subir la imagen."; + } + } + } + + // Insertar usuario + if (empty($error)) { + $passwordHashed = password_hash($password, PASSWORD_DEFAULT); + + $stmt = $mysqli->prepare( + "INSERT INTO users (nombre, apellidos, email, password, foto, role) + VALUES (?, ?, ?, ?, ?, ?)" + ); + $stmt->bind_param("ssssss", $nombre, $apellidos, $email, $passwordHashed, $fotoPath, $role); + + if ($stmt->execute()) { + $success = "Usuario creado correctamente."; + // Limpiar campos + $nombre = $apellidos = $email = ''; + } else { + $error = "Error al crear usuario: " . $stmt->error; + } + + $stmt->close(); + } + } + } +} +?> + + + + + + + Añadir Usuario + + + +
+

➕ Añadir Usuario

+ ← Volver +
+ +
+
+ +
+ + + +
+ + +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+
+
+ + \ No newline at end of file diff --git a/proyecto-gestor-notas/config.php b/proyecto-gestor-notas/config.php new file mode 100644 index 00000000..733e7269 --- /dev/null +++ b/proyecto-gestor-notas/config.php @@ -0,0 +1,16 @@ +connect_error) { + die("Error de conexion: " . $mysqli->connect_error); +}else{ + echo '

'; + echo "Conexion exitosa a la base de datos."; +} +?> \ No newline at end of file diff --git a/proyecto-gestor-notas/index.php b/proyecto-gestor-notas/index.php new file mode 100644 index 00000000..ced08d7d --- /dev/null +++ b/proyecto-gestor-notas/index.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/proyecto-gestor-notas/login.php b/proyecto-gestor-notas/login.php new file mode 100644 index 00000000..74a46c02 --- /dev/null +++ b/proyecto-gestor-notas/login.php @@ -0,0 +1,205 @@ +prepare("SELECT * FROM users WHERE email = ?"); + $stmt->bind_param("s", $email); + $stmt->execute(); + $result = $stmt->get_result(); + + if ($result->num_rows > 0) { + $user = $result->fetch_assoc(); + + // Verificar contraseña + if (password_verify($password, $user['password'])) { + // Crear sesión + $_SESSION['user_id'] = $user['id']; + $_SESSION['user_nombre'] = $user['nombre']; + $_SESSION['user_apellidos'] = $user['apellidos']; + $_SESSION['user_email'] = $user['email']; + $_SESSION['user_foto'] = $user['foto']; + $_SESSION['user_role'] = $user['role']; + + // Redirigir según rol + if ($user['role'] === 'admin') { + header("Location: admin/admin-dashboard.php"); + } else { + header("Location: student/student-dashboard.php"); + } + exit; + } else { + $error = "Contraseña incorrecta."; + } + } else { + $error = "No existe ningún usuario con ese email."; + } + + $stmt->close(); + } +} +?> + + + + + + + Login - Gestor Académico + + + +
+

🔐 Iniciar Sesión

+ +
+ Credenciales de prueba: +

Admin: admin@gestor.com / password

+

Estudiante: carlos@student.com / password

+
+ + +
+ + +
+
+ + +
+ +
+ + +
+ + +
+ + +
+ + \ No newline at end of file diff --git a/proyecto-gestor-notas/logout.php b/proyecto-gestor-notas/logout.php new file mode 100644 index 00000000..e46f75d6 --- /dev/null +++ b/proyecto-gestor-notas/logout.php @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/proyecto-gestor-notas/register.php b/proyecto-gestor-notas/register.php new file mode 100644 index 00000000..7c12e0ad --- /dev/null +++ b/proyecto-gestor-notas/register.php @@ -0,0 +1,263 @@ +prepare("SELECT id FROM users WHERE email = ?"); + $stmt->bind_param("s", $email); + $stmt->execute(); + $result = $stmt->get_result(); + + if ($result->num_rows > 0) { + $error = "Este email ya está registrado."; + } else { + + // 4. PROCESAR LA IMAGEN + $fotoPath = NULL; + + if (isset($_FILES['foto']) && $_FILES['foto']['error'] === UPLOAD_ERR_OK) { + $fileTmpPath = $_FILES['foto']['tmp_name']; + $fileName = $_FILES['foto']['name']; + $fileExtension = strtolower(pathinfo($fileName, PATHINFO_EXTENSION)); + + $allowedExtensions = ['jpg', 'jpeg', 'png', 'gif']; + + if (in_array($fileExtension, $allowedExtensions)) { + $newFileName = uniqid() . '_' . time() . '.' . $fileExtension; + $fotoPath = $uploadDir . $newFileName; + + if (!move_uploaded_file($fileTmpPath, $fotoPath)) { + $error = "Error al subir la imagen."; + } + } else { + $error = "Solo se permiten imágenes (jpg, jpeg, png, gif)."; + } + } + + // 5. SI NO HAY ERRORES, INSERTAR USUARIO + if (empty($error)) { + // ENCRIPTAR CONTRASEÑA + $passwordHashed = password_hash($password, PASSWORD_DEFAULT); + + // INSERTAR EN LA BASE DE DATOS + $stmt = $mysqli->prepare( + "INSERT INTO users (nombre, apellidos, email, password, foto, role) + VALUES (?, ?, ?, ?, ?, ?)" + ); + $stmt->bind_param("ssssss", $nombre, $apellidos, $email, $passwordHashed, $fotoPath, $role); + + if ($stmt->execute()) { + $success = "Usuario registrado correctamente. Ir al login"; + } else { + $error = "Error al registrar usuario: " . $stmt->error; + } + + $stmt->close(); + } + } + } +} +?> + + + + + + + Registro - Gestor Académico + + + +
+

📚 Registro

+ + +
+ + + +
+ + +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+ + +
+ + \ No newline at end of file diff --git a/proyecto-gestor-notas/student/mi-media.php b/proyecto-gestor-notas/student/mi-media.php new file mode 100644 index 00000000..fbe3e893 --- /dev/null +++ b/proyecto-gestor-notas/student/mi-media.php @@ -0,0 +1,340 @@ +query(" + SELECT ROUND(AVG(nota), 2) as promedio + FROM notas + WHERE id_usuario = $user_id +"); +$promedio_general = $promedio_result->fetch_assoc()['promedio'] ?? 0; + +// Obtener notas por módulo con promedio +$query = " + SELECT + m.nombre AS modulo, + m.foto AS modulo_foto, + n.nota + FROM notas n + JOIN modulos m ON n.id_modulo = m.id + WHERE n.id_usuario = ? + ORDER BY n.nota DESC +"; + +$stmt = $mysqli->prepare($query); +$stmt->bind_param("i", $user_id); +$stmt->execute(); +$result = $stmt->get_result(); +$notas = $result->fetch_all(MYSQLI_ASSOC); + +// Calcular estadísticas +$total_notas = count($notas); +$aprobados = 0; +$suspensos = 0; +$nota_mas_alta = 0; +$nota_mas_baja = 10; + +foreach ($notas as $nota) { + if ($nota['nota'] >= 5) { + $aprobados++; + } else { + $suspensos++; + } + + if ($nota['nota'] > $nota_mas_alta) { + $nota_mas_alta = $nota['nota']; + } + + if ($nota['nota'] < $nota_mas_baja) { + $nota_mas_baja = $nota['nota']; + } +} +?> + + + + + + + Mi Media + + + +
+

📊 Mi Promedio Académico

+ ← Volver +
+ +
+ 0): ?> + +
+

Tu Promedio General

+
+
sobre 10.00
+
+ +
+
+

Total de Notas

+
+
+ +
+

Aprobados

+
+
+ +
+

Suspensos

+
+
+ +
+

Nota Más Alta

+
+
+ +
+

Nota Más Baja

+
+
+
+ +
+

Detalle de Notas por Módulo

+ +
+
+ = 9) { + $clase = 'nota-excelente'; + } elseif ($nota_valor >= 7) { + $clase = 'nota-buena'; + } elseif ($nota_valor >= 5) { + $clase = 'nota-aprobado'; + } else { + $clase = 'nota-suspendido'; + } + ?> +
+ +
+
+ + + +
+ + +
+
+
📊
+

No tienes notas registradas

+

Tu promedio aparecerá aquí cuando tengas notas registradas.

+
+
+ +
+ + diff --git a/proyecto-gestor-notas/student/mi-perfil.php b/proyecto-gestor-notas/student/mi-perfil.php new file mode 100644 index 00000000..f91ed7f1 --- /dev/null +++ b/proyecto-gestor-notas/student/mi-perfil.php @@ -0,0 +1,293 @@ +prepare("SELECT * FROM users WHERE id = ?"); +$stmt->bind_param("i", $user_id); +$stmt->execute(); +$user = $stmt->get_result()->fetch_assoc(); + +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $nombre = trim($_POST['nombre']); + $apellidos = trim($_POST['apellidos']); + $email = trim($_POST['email']); + + if (empty($nombre) || empty($apellidos) || empty($email)) { + $error = "Nombre, apellidos y email son obligatorios."; + } else { + // Verificar si el email ya existe (excepto el propio) + $stmt = $mysqli->prepare("SELECT id FROM users WHERE email = ? AND id != ?"); + $stmt->bind_param("si", $email, $user_id); + $stmt->execute(); + $result = $stmt->get_result(); + + if ($result->num_rows > 0) { + $error = "Este email ya está registrado por otro usuario."; + } else { + // Procesar imagen si se sube una nueva + $fotoPath = $user['foto']; + + if (isset($_FILES['foto']) && $_FILES['foto']['error'] === UPLOAD_ERR_OK) { + $fileTmpPath = $_FILES['foto']['tmp_name']; + $fileName = $_FILES['foto']['name']; + $fileExtension = strtolower(pathinfo($fileName, PATHINFO_EXTENSION)); + + $allowedExtensions = ['jpg', 'jpeg', 'png', 'gif']; + + if (in_array($fileExtension, $allowedExtensions)) { + // Eliminar foto anterior + if ($user['foto'] && file_exists('../' . $user['foto'])) { + unlink('../' . $user['foto']); + } + + $newFileName = uniqid() . '_' . time() . '.' . $fileExtension; + $fotoPath = 'uploads/users/' . $newFileName; + + if (!move_uploaded_file($fileTmpPath, '../' . $fotoPath)) { + $error = "Error al subir la imagen."; + } + } + } + + // Actualizar usuario + if (empty($error)) { + // Si se proporciona una nueva contraseña + if (!empty($_POST['password'])) { + $passwordHashed = password_hash($_POST['password'], PASSWORD_DEFAULT); + $stmt = $mysqli->prepare( + "UPDATE users SET nombre=?, apellidos=?, email=?, password=?, foto=? WHERE id=?" + ); + $stmt->bind_param("sssssi", $nombre, $apellidos, $email, $passwordHashed, $fotoPath, $user_id); + } else { + $stmt = $mysqli->prepare( + "UPDATE users SET nombre=?, apellidos=?, email=?, foto=? WHERE id=?" + ); + $stmt->bind_param("ssssi", $nombre, $apellidos, $email, $fotoPath, $user_id); + } + + if ($stmt->execute()) { + $success = "Perfil actualizado correctamente."; + // Actualizar sesión + $_SESSION['user_nombre'] = $nombre; + $_SESSION['user_apellidos'] = $apellidos; + $_SESSION['user_email'] = $email; + $_SESSION['user_foto'] = $fotoPath; + // Recargar datos + $user['nombre'] = $nombre; + $user['apellidos'] = $apellidos; + $user['email'] = $email; + $user['foto'] = $fotoPath; + } else { + $error = "Error al actualizar perfil: " . $stmt->error; + } + + $stmt->close(); + } + } + } +} +?> + + + + + + + Mi Perfil + + + +
+

👤 Mi Perfil

+ ← Volver +
+ +
+
+ +
+ + + +
+ + +
+ ℹ️ Información: Puedes editar tu información personal desde aquí. + Los campos de contraseña y foto son opcionales. +
+ + +
+ Mi foto +

Foto actual

+
+ + +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +

Déjalo en blanco si no quieres cambiar tu contraseña

+
+ +
+ + +

Déjalo en blanco si no quieres cambiar tu foto

+
+ + +
+
+
+ + \ No newline at end of file diff --git a/proyecto-gestor-notas/student/mis-modulos.php b/proyecto-gestor-notas/student/mis-modulos.php new file mode 100644 index 00000000..d195df41 --- /dev/null +++ b/proyecto-gestor-notas/student/mis-modulos.php @@ -0,0 +1,169 @@ +prepare($query); +$stmt->bind_param("i", $user_id); +$stmt->execute(); +$result = $stmt->get_result(); +$modulos = $result->fetch_all(MYSQLI_ASSOC); +?> + + + + + + + Mis Módulos + + + +
+

📚 Mis Módulos

+ ← Volver +
+ +
+ 0): ?> +
+ +
+ + <?= htmlspecialchars($modulo['nombre']) ?> + +
+ +
+

+

ID:

+
+
+ +
+ +
+
📚
+

No estás matriculado en ningún módulo

+

Contacta con la administración para matricularte en los módulos disponibles.

+
+ +
+ + \ No newline at end of file diff --git a/proyecto-gestor-notas/student/mis-notas.php b/proyecto-gestor-notas/student/mis-notas.php new file mode 100644 index 00000000..6f90b191 --- /dev/null +++ b/proyecto-gestor-notas/student/mis-notas.php @@ -0,0 +1,228 @@ +prepare($query); +$stmt->bind_param("i", $user_id); +$stmt->execute(); +$result = $stmt->get_result(); +$notas = $result->fetch_all(MYSQLI_ASSOC); +?> + + + + + + + Mis Notas + + + +
+

📝 Mis Notas

+ ← Volver +
+ +
+
+ 0): ?> + + + + + + + + + + + + + + + + + + + +
MóduloNotaEstadoFecha Registro
+
+ + Módulo + + Módulo + + +
+
+ = 9) { + $clase = 'nota-excelente'; + } elseif ($nota_valor >= 7) { + $clase = 'nota-buena'; + } elseif ($nota_valor >= 5) { + $clase = 'nota-aprobado'; + } else { + $clase = 'nota-suspendido'; + } + ?> + + + + + = 5): ?> + ✓ Aprobado + + ✗ Suspenso + +
+ +
+
📝
+

No tienes notas registradas

+

Las notas aparecerán aquí cuando los profesores las registren.

+
+ +
+
+ + \ No newline at end of file diff --git a/proyecto-gestor-notas/student/student-dashboard.php b/proyecto-gestor-notas/student/student-dashboard.php new file mode 100644 index 00000000..14576712 --- /dev/null +++ b/proyecto-gestor-notas/student/student-dashboard.php @@ -0,0 +1,310 @@ +prepare("SELECT * FROM users WHERE id = ?"); +$stmt->bind_param("i", $user_id); +$stmt->execute(); +$user = $stmt->get_result()->fetch_assoc(); + +// Obtener estadísticas del estudiante +$total_modulos = $mysqli->query(" + SELECT COUNT(DISTINCT id_modulo) as total + FROM notas + WHERE id_usuario = $user_id +")->fetch_assoc()['total']; + +$total_notas = $mysqli->query(" + SELECT COUNT(*) as total + FROM notas + WHERE id_usuario = $user_id +")->fetch_assoc()['total']; + +$promedio_result = $mysqli->query(" + SELECT ROUND(AVG(nota), 2) as promedio + FROM notas + WHERE id_usuario = $user_id +"); +$promedio = $promedio_result->fetch_assoc()['promedio'] ?? 0; + +// Contar aprobados y suspensos +$aprobados = $mysqli->query(" + SELECT COUNT(*) as total + FROM notas + WHERE id_usuario = $user_id AND nota >= 5 +")->fetch_assoc()['total']; + +$suspensos = $mysqli->query(" + SELECT COUNT(*) as total + FROM notas + WHERE id_usuario = $user_id AND nota < 5 +")->fetch_assoc()['total']; +?> + + + + + + + Mi Panel - Estudiante + + + +
+

🎓 Mi Panel de Estudiante

+ +
+ +
+
+

¡Bienvenido/a, ! 👋

+

Este es tu panel personal donde puedes consultar tus módulos, notas y promedio académico.

+
+ +
+
+

Módulos Matriculados

+
+
+
+

Total de Notas

+
+
+
+

Promedio General

+
+
+
+

Aprobados

+
+
+
+

Suspensos

+
+
+
+ + +
+ + \ No newline at end of file diff --git a/teoria/intro.php b/teoria/intro.php new file mode 100644 index 00000000..9449bcdf --- /dev/null +++ b/teoria/intro.php @@ -0,0 +1,78 @@ + + + + + + p1 php + + +

Hola pp1 teoria

+ + Hola subtitulo'; + echo "Hola mundo con dos comillas"; + + $nom = 'Miguel Angel'; + $apellido = "Saiz"; + $edad = 21; + $frase = "Hola soy $nom $apellido y tengo $edad anyos"; + + echo '
'; + echo "Hola me llamo". $nom . "tengo" . $edad . "años!"; + echo '
'; + echo "Hola me llamo {$nom} tengo {$edad} y me apellido {$apellido}"; + echo '
'; + echo $frase; + + + echo '
'; + + + //Condicionales + + //if + + if($edad<22){ + echo "eres mayor de edad"; + }else{ + echo "eres menor de edad"; + } + //== + //% + //!= + //<= >= < > + + ?> + +
+

Numeros del 0-10

+ + "; + echo "
Numero: $i
"; + echo '
Numero: '. $i .'
'; + echo "
Numero: $i
"; + + } + + ?> +
+ + + + diff --git a/teoria/listas/Teoria Arrays 260925/asociativos.php b/teoria/listas/Teoria Arrays 260925/asociativos.php new file mode 100644 index 00000000..839e5915 --- /dev/null +++ b/teoria/listas/Teoria Arrays 260925/asociativos.php @@ -0,0 +1,32 @@ + 'Juan', + 'apellido' => 'Pérez', + 'edad' => 21, + 'curso' => 'DAW2', + 'inteligente' => TRUE, +]; + +//echo $alumno; +//var_dump($alumno); + +//print_r($alumno); + +echo $alumno['nombre']; +echo $alumno['edad']; +echo $alumno['inteligente']; + + +//añadir un elemento +$alumno['email'] = 'juan.perez@example.com'; +echo '

'; +print_r($alumno); + +//recorrer con foreach + +foreach($alumno as $clave => $valor){ + echo '

$clave: $valor

'; +} + +?> diff --git a/teoria/listas/Teoria Arrays 260925/multidimensional.php b/teoria/listas/Teoria Arrays 260925/multidimensional.php new file mode 100644 index 00000000..cf2cbd8a --- /dev/null +++ b/teoria/listas/Teoria Arrays 260925/multidimensional.php @@ -0,0 +1,38 @@ + 'Juan', + 'apellido' => 'Pérez', + 'edad' => 21, + 'curso' => 'DAW2', + 'inteligente' => TRUE, + ], + [ + 'nombre' => 'Juan', + 'apellido' => 'Pérez', + 'edad' => 21, + 'curso' => 'DAW2', + 'inteligente' => TRUE, + ], + [ + 'nombre' => 'Juan', + 'apellido' => 'Pérez', + 'edad' => 21, + 'curso' => 'DAW2', + 'inteligente' => TRUE, + ], +]; + +//echo $alumno; +//var_dump($alumno); + +//print_r($alumno); + +foreach($alumnos as $alumno){ + echo "

{$alumno['nombre']} {$alumno['apellido']}

"; +} + +?> \ No newline at end of file diff --git a/teoria/listas/Teoria Arrays 260925/simples.php b/teoria/listas/Teoria Arrays 260925/simples.php new file mode 100644 index 00000000..e69de29b diff --git a/teoria/listas/parametrosURL/pag1.php b/teoria/listas/parametrosURL/pag1.php new file mode 100644 index 00000000..5c486f3e --- /dev/null +++ b/teoria/listas/parametrosURL/pag1.php @@ -0,0 +1,13 @@ + + + + + + p1 + + +

Pagina para enviar datos

+ + + + \ No newline at end of file diff --git a/teoria/listas/parametrosURL/pag2.php b/teoria/listas/parametrosURL/pag2.php new file mode 100644 index 00000000..3616ff42 --- /dev/null +++ b/teoria/listas/parametrosURL/pag2.php @@ -0,0 +1,26 @@ + + + + + + p2 + + +

Esta es la pagina 2

+ '; + echo $_GET['edat']; + + //isset: lo usamos para comprobar que existe un parametro con ese nombre + if(isset($_GET['nom'])){ + + $n = $_GET['nom']; + echo $n; + } + else{ + echo 'no existe el parametro nombre'; + } + ?> + + \ No newline at end of file diff --git a/teoria/mini-wp/data.php b/teoria/mini-wp/data.php new file mode 100644 index 00000000..1e951e9d --- /dev/null +++ b/teoria/mini-wp/data.php @@ -0,0 +1,40 @@ + 'Noticia 1', + 'contenido' => 'Contenido de la noticia 1', + 'fecha' => '2024-10-01', + 'imagen' => 'https://via.placeholder.com/150', + 'categoria' => 'Tecnología' + ], + [ + 'titulo' => 'Noticia 2', + 'contenido' => 'Contenido de la noticia 2', + 'fecha' => '2024-10-02', + 'imagen' => 'https://via.placeholder.com/150', + 'categoria' => 'Salud' + ], + [ + 'titulo' => 'Noticia 3', + 'contenido' => 'Contenido de la noticia 3', + 'fecha' => '2024-10-03', + 'imagen' => 'https://via.placeholder.com/150', + 'categoria' => 'Deportes' + ], + [ + 'titulo' => 'Noticia 4', + 'contenido' => 'Contenido de la noticia 4', + 'fecha' => '2024-10-04', + 'imagen' => 'https://via.placeholder.com/150', + 'categoria' => 'Cultura' + ], + [ + 'titulo' => 'Noticia 5', + 'contenido' => 'Contenido de la noticia 5', + 'fecha' => '2024-10-05', + 'imagen' => 'https://via.placeholder.com/150', + 'categoria' => 'Economía' + ] +]; +// Fin del archivo data.php \ No newline at end of file diff --git a/teoria/mini-wp/form.php b/teoria/mini-wp/form.php new file mode 100644 index 00000000..aba9f6df --- /dev/null +++ b/teoria/mini-wp/form.php @@ -0,0 +1,83 @@ + $titulo, + 'contenido' => $contenido, + 'fecha' => $fecha, + 'imagen' => $imagen, + 'categoria' => $categoria + ]); + + //mensaje de exito + echo "

Noticia añadida correctamente

"; + }else{ + //mensaje de error + echo "

Error al añadir la noticia. Todos los campos son obligatorios.

"; + } +}else{ + //mensaje de error + echo "

Error al añadir la noticia. El formulario no se ha enviado correctamente.

"; } + +//fin del if del formulario + +//Ahora agrego el formulario html +?> +
+

+ +

+ +

+ +

+ +

+ + +
+Noticias actuales:"; +//muestro las noticias actuales +foreach($noticias as $noticia){ + echo "
"; + echo "

" . htmlspecialchars($noticia['titulo']) . "

"; + echo "

" . htmlspecialchars($noticia['fecha']) . " | " . htmlspecialchars($noticia['categoria']) . "

"; + echo "" . htmlspecialchars($noticia["; + echo "

" . nl2br(htmlspecialchars($noticia['contenido'])) . "

"; + echo "
"; +} +//fin del foreach + + \ No newline at end of file diff --git a/teoria/mini-wp/inc/footer.php b/teoria/mini-wp/inc/footer.php new file mode 100644 index 00000000..22abe6a4 --- /dev/null +++ b/teoria/mini-wp/inc/footer.php @@ -0,0 +1,4 @@ +
+
+

Desarrolado por Carolina Gonzalez a

+
\ No newline at end of file diff --git a/teoria/mini-wp/inc/header.php b/teoria/mini-wp/inc/header.php new file mode 100644 index 00000000..41d23c5f --- /dev/null +++ b/teoria/mini-wp/inc/header.php @@ -0,0 +1,21 @@ + + + + + + mini-wp + + + + +
Mini WordPress con Array Multidimensional + +
+ \ No newline at end of file diff --git a/teoria/mini-wp/index.php b/teoria/mini-wp/index.php new file mode 100644 index 00000000..22c9a03f --- /dev/null +++ b/teoria/mini-wp/index.php @@ -0,0 +1,37 @@ + + + + + + mini-wp + + + + + + +
+ +
+ "; + echo "

" . htmlspecialchars($noticia['titulo']) . "

"; + echo "

" . htmlspecialchars($noticia['fecha']) . " | " . htmlspecialchars($noticia['categoria']) . "

"; + echo "" . htmlspecialchars($noticia["; + echo "

" . nl2br(htmlspecialchars($noticia['contenido'])) . "

"; + echo ""; + } + ?> +
+
+ + + + \ No newline at end of file diff --git a/teoria/mini-wp/styles/index.css b/teoria/mini-wp/styles/index.css new file mode 100644 index 00000000..81697748 --- /dev/null +++ b/teoria/mini-wp/styles/index.css @@ -0,0 +1,6 @@ +body{ + font-family: Arial, Helvetica, sans-serif; + margin: 0; + padding: 0; + background-color: #428082; +} \ No newline at end of file diff --git a/teoria/reto1/imagenes/fotoLOTR.png b/teoria/reto1/imagenes/fotoLOTR.png new file mode 100644 index 00000000..75a45b62 Binary files /dev/null and b/teoria/reto1/imagenes/fotoLOTR.png differ diff --git a/teoria/reto1/reto.php b/teoria/reto1/reto.php new file mode 100644 index 00000000..9bd6d5be --- /dev/null +++ b/teoria/reto1/reto.php @@ -0,0 +1,79 @@ + + + + + + Reto 1 + + +

Pelis Favoritas - Top 10

+ + + + + + + + + + + "; + echo ""; + echo ""; + if($lista_puntuacion[$i]<5){ + //echo ""; + echo ""; + //echo ""; + }else{ + echo ""; + } + echo ""; + + + } + + ?> + +
NombreImagenPuntuacion
$lista_peliculas[$i] + Foto +
$lista_puntuacion[$i]
$lista_puntuacion[$i]
+ + + + \ No newline at end of file diff --git a/teoria/reto2/login.php b/teoria/reto2/login.php new file mode 100644 index 00000000..584b32dc --- /dev/null +++ b/teoria/reto2/login.php @@ -0,0 +1,42 @@ + + + + + + Document + + +
+ + + + +
+ + +
+ + + + +
+ + + '; + echo $_GET['nombre']; + echo '
'; + echo $_GET['contraseña']; + + //ahora envio con post + echo '
'; + echo $_POST['nombre']; + echo '
'; + echo $_POST['contraseña']; + ?> + + \ No newline at end of file diff --git a/teoria/reto3 - personajes/estilos.css b/teoria/reto3 - personajes/estilos.css new file mode 100644 index 00000000..bf5d7186 --- /dev/null +++ b/teoria/reto3 - personajes/estilos.css @@ -0,0 +1,92 @@ +body { + font-family: Arial, sans-serif; + background-color: #f0f2f5; + margin: 0; + padding: 0; +} + +header { + background-color: #4a90e2; + color: white; + padding: 15px 20px; + display: flex; + justify-content: space-between; + align-items: center; +} + +header h2 { + margin: 0; + font-size: 1.5em; +} + +header nav a { + color: white; + text-decoration: none; + margin: 0 10px; + font-weight: bold; +} + +header nav a:hover { + text-decoration: underline; +} + +.container { + max-width: 500px; + margin: 50px auto; + background-color: white; + padding: 30px; + border-radius: 12px; + box-shadow: 0 5px 15px rgba(0,0,0,0.1); +} + +form input[type="text"], +form input[type="password"] { + width: 100%; + padding: 10px; + margin-bottom: 15px; + border-radius: 6px; + border: 1px solid #ccc; + font-size: 1em; +} + +form input[type="submit"] { + background-color: #4a90e2; + color: white; + padding: 10px 15px; + border: none; + border-radius: 6px; + cursor: pointer; + font-size: 1em; +} + +form input[type="submit"]:hover { + background-color: #357ab8; +} + +.error { + color: red; + margin-bottom: 15px; +} + +.personaje { + color: #4a90e2; + font-weight: bold; + font-size: 1.2em; +} + +.logout-icon { + color: white; + text-decoration: none; + font-size: 1.2em; + margin-left: 10px; +} + +.logout-icon:hover { + color: #ffd1d1; +} + +.personaje img { + max-width: 100%; + border-radius: 10px; + margin-top: 10px; +} diff --git a/teoria/reto3 - personajes/header.php b/teoria/reto3 - personajes/header.php new file mode 100644 index 00000000..97b35c0f --- /dev/null +++ b/teoria/reto3 - personajes/header.php @@ -0,0 +1,20 @@ + + +
+

Mi sitio de personajes

+ + +
+ + Bienvenido, + 🔒 + +
+
diff --git a/teoria/reto3 - personajes/index.php b/teoria/reto3 - personajes/index.php new file mode 100644 index 00000000..421e7893 --- /dev/null +++ b/teoria/reto3 - personajes/index.php @@ -0,0 +1,47 @@ + trim($_POST['nombre']), + 'habilidad' => trim($_POST['habilidad']), + 'imagen' => trim($_POST['imagen']) + ]; +} +?> + + + + + + Elegir personaje + + + + + +
+

Hola 👋

+ +

Introduce los datos de tu personaje favorito:

+
+ + + + +
+ + +

Ya ingresaste tu personaje. Puedes verlo en la página Personajes.

+ +
+ + + diff --git a/teoria/reto3 - personajes/login.php b/teoria/reto3 - personajes/login.php new file mode 100644 index 00000000..0d689dd7 --- /dev/null +++ b/teoria/reto3 - personajes/login.php @@ -0,0 +1,54 @@ + + + + + + + Login + + + + +
+

Bienvenido al sitio de personajes

+
+ +
+

Iniciar Sesión

+ +
+ + + +
+ + $error

"; ?> +
+ + + + + diff --git a/teoria/reto3 - personajes/logout.php b/teoria/reto3 - personajes/logout.php new file mode 100644 index 00000000..4a0934bd --- /dev/null +++ b/teoria/reto3 - personajes/logout.php @@ -0,0 +1,5 @@ + + + + + + + Personaje elegido + + + + + +
+

Tu personaje favorito:

+

Nombre:

+

Habilidad:

+ + + Imagen del personaje + +
+ + + diff --git a/teoria/sesion310/fromularios/formularios.php b/teoria/sesion310/fromularios/formularios.php new file mode 100644 index 00000000..5f2c9701 --- /dev/null +++ b/teoria/sesion310/fromularios/formularios.php @@ -0,0 +1,24 @@ + + + + + + Document + + +
+ ////action a donde lo enviamos y method get o post + + + +
+ + //recoger datos en el formulario + + + \ No newline at end of file diff --git a/teoria/sesion310/funciones.php b/teoria/sesion310/funciones.php new file mode 100644 index 00000000..77bfaf5a --- /dev/null +++ b/teoria/sesion310/funciones.php @@ -0,0 +1,33 @@ + \ No newline at end of file diff --git a/teoria/sesion310/index.html b/teoria/sesion310/index.html new file mode 100644 index 00000000..a2d3fb1e --- /dev/null +++ b/teoria/sesion310/index.html @@ -0,0 +1,13 @@ + + + + + + Document + + +
+ +
+ + \ No newline at end of file diff --git a/teoria/sessiones/index.php b/teoria/sessiones/index.php new file mode 100644 index 00000000..24ea9971 --- /dev/null +++ b/teoria/sessiones/index.php @@ -0,0 +1,11 @@ +'; +echo "Usuario: ".$_SESSION['user']; +echo "
Role: ".$_SESSION['role']; + diff --git a/teoria/sessiones/index2.php b/teoria/sessiones/index2.php new file mode 100644 index 00000000..601fef58 --- /dev/null +++ b/teoria/sessiones/index2.php @@ -0,0 +1,7 @@ +'; +echo "Usuario: ".$_SESSION['user']; +echo "
Role: ".$_SESSION['role']; diff --git a/teoria/sessiones/logout.php b/teoria/sessiones/logout.php new file mode 100644 index 00000000..6823068f --- /dev/null +++ b/teoria/sessiones/logout.php @@ -0,0 +1,12 @@ + \ No newline at end of file