Compare commits

..
3 Commits
Author SHA1 Message Date
Nurfog d953afd3b4 feat: agregar SyncService y mejorar gestión de asistencia con nuevas funcionalidades 2026-08-20 10:45:53 -04:00
Nurfog fb275508ee Alinear BD local con esquema de produccion, login offline y publicacion portable
- Modelos renombrados para coincidir con columnas de MariaDB (ApPaterno/ApMaterno, HoraSalida, FechaFin, IdAsistenciaProfesor)
- Agregado campo IdAlumno a DetalleContrato
- Seed data con IDs reales de produccion (16451, 16493, profesor 15668563-1)
- Login offline: solo valida RUT contra BD local, sin contraseña
- ConnectivityService: checkea internet al inicio, bloquea si hay conexion
- ViewLocator corregido: busca tipos en todos los ensamblados
- Todos los ViewModels heredan de ViewModelBase
- Publicacion self-contained para win-x64, linux-x64, osx-x64, osx-arm64
- Agregado .gitignore, removidos bin/obj/publish del tracking
2026-08-19 16:43:52 -04:00
Nurfog 9068122b6b Remove project.nuget.cache file to eliminate outdated package cache and associated vulnerability warnings. 2026-08-19 16:43:23 -04:00
313 changed files with 506 additions and 10918 deletions

No files matched your search

+71
View File
@@ -0,0 +1,71 @@
## Build results
[Dd]ebug/
[Rr]elease/
x64/
x86/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
## Publish output
publish/
## NuGet
*.nupkg
*.snupkg
.nuget/
**/[Pp]ackages/*
!**/[Pp]ackages/build/
## Visual Studio
.vs/
*.suo
*.user
*.userosscache
*.sln.docstates
*.userprefs
## Rider
.idea/
*.sln.iml
## VS Code
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
## macOS
.DS_Store
*.dmg
## Windows
Thumbs.db
ehthumbs.db
Desktop.ini
## Linux
*~
## SQLite databases
*.db
*.db-shm
*.db-wal
## Resharper
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
## NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
## BenchmarkDotNet
BenchmarkDotNet.Artifacts/
+2
View File
@@ -29,6 +29,8 @@ public partial class App : Application
services.AddSingleton<AsistenciaRepository>(); services.AddSingleton<AsistenciaRepository>();
services.AddSingleton<AuthService>(); services.AddSingleton<AuthService>();
services.AddSingleton<AsistenciaService>(); services.AddSingleton<AsistenciaService>();
services.AddSingleton<ConnectivityService>();
services.AddSingleton<SyncService>();
services.AddSingleton<MainWindowViewModel>(); services.AddSingleton<MainWindowViewModel>();
Services = services.BuildServiceProvider(); Services = services.BuildServiceProvider();
+3
View File
@@ -5,6 +5,9 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<ApplicationManifest>app.manifest</ApplicationManifest> <ApplicationManifest>app.manifest</ApplicationManifest>
<RuntimeIdentifiers>win-x64;linux-x64;osx-x64;osx-arm64</RuntimeIdentifiers>
<SelfContained>true</SelfContained>
<BuiltInComInteropSupport>true</BuiltInComInteropSupport>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
-80
View File
@@ -55,85 +55,5 @@ public class AppDbContext : DbContext
private static void SeedData(ModelBuilder modelBuilder) private static void SeedData(ModelBuilder modelBuilder)
{ {
modelBuilder.Entity<Profesor>().HasData(
new Profesor
{
RutPasaporte = "12345678-9",
Nombre = "Juan",
Paterno = "Perez",
Materno = "Gonzalez",
Email = "juan.perez@norteamericano.cl",
Fono = "+56912345678",
Direccion = "Av. Providencia 1234, Santiago",
Clave = "",
CrearClave = true
}
);
modelBuilder.Entity<Curso>().HasData(
new Curso { IdCursos = 1, NombreCurso = "English Basic A1" },
new Curso { IdCursos = 2, NombreCurso = "English Intermediate B1" },
new Curso { IdCursos = 3, NombreCurso = "English Advanced C1" }
);
modelBuilder.Entity<CursoAbierto>().HasData(
new CursoAbierto
{
IdCursoAbierto = 1,
IdCursos = 1,
Sala = "Sala 101",
Sede = "Providencia",
HoraInicio = "09:00",
HoraFin = "10:30",
FechaInicio = new DateTime(2026, 3, 1),
FechaTermino = new DateTime(2026, 7, 31),
ProfesorRun = "12345678-9"
},
new CursoAbierto
{
IdCursoAbierto = 2,
IdCursos = 2,
Sala = "Sala 202",
Sede = "Las Condes",
HoraInicio = "14:00",
HoraFin = "15:30",
FechaInicio = new DateTime(2026, 3, 1),
FechaTermino = new DateTime(2026, 7, 31),
ProfesorRun = "12345678-9"
}
);
modelBuilder.Entity<DetalleContrato>().HasData(
new DetalleContrato
{
IdDetalleContrato = 1,
IdCursoAbierto = 1,
AP_Paterno = "Garcia",
AP_Materno = "Lopez",
Nombres = "Maria",
Email = "maria.garcia@email.com",
Telefono = "+56998765432"
},
new DetalleContrato
{
IdDetalleContrato = 2,
IdCursoAbierto = 1,
AP_Paterno = "Rodriguez",
AP_Materno = "Soto",
Nombres = "Carlos",
Email = "carlos.rodriguez@email.com",
Telefono = "+56987654321"
},
new DetalleContrato
{
IdDetalleContrato = 3,
IdCursoAbierto = 2,
AP_Paterno = "Martinez",
AP_Materno = "Fernandez",
Nombres = "Ana",
Email = "ana.martinez@email.com",
Telefono = "+56976543210"
}
);
} }
} }
@@ -21,7 +21,7 @@ public class AsistenciaRepository
a.Estado == "Activa"); a.Estado == "Activa");
} }
public async Task<AsistenciaProfesor> IniciarSesionAsync(int idCursoAbierto, string rut, DateTime fecha, string horaInicio) public async Task<AsistenciaProfesor> IniciarSesionAsync(int idCursoAbierto, string rut, DateTime fecha, string horaInicio, int tipoAsignacion)
{ {
var sesion = new AsistenciaProfesor var sesion = new AsistenciaProfesor
{ {
@@ -29,7 +29,8 @@ public class AsistenciaRepository
RutPasaporte = rut, RutPasaporte = rut,
FechaAsistencia = fecha, FechaAsistencia = fecha,
HoraInicio = horaInicio, HoraInicio = horaInicio,
Estado = "Activa" Estado = "Activa",
Temporal = tipoAsignacion == 4 ? 1 : 0
}; };
_context.AsistenciasProfesor.Add(sesion); _context.AsistenciasProfesor.Add(sesion);
await _context.SaveChangesAsync(); await _context.SaveChangesAsync();
@@ -41,7 +42,7 @@ public class AsistenciaRepository
var sesion = await _context.AsistenciasProfesor.FindAsync(idSesion); var sesion = await _context.AsistenciasProfesor.FindAsync(idSesion);
if (sesion == null) return false; if (sesion == null) return false;
sesion.HoraFin = horaFin; sesion.HoraSalida = horaFin;
sesion.Estado = "Finalizada"; sesion.Estado = "Finalizada";
await _context.SaveChangesAsync(); await _context.SaveChangesAsync();
return true; return true;
@@ -33,4 +33,11 @@ public class CursoRepository
.Where(d => d.IdCursoAbierto == idCursoAbierto) .Where(d => d.IdCursoAbierto == idCursoAbierto)
.ToListAsync(); .ToListAsync();
} }
public async Task<DetalleContrato?> BuscarAlumnoPorRutAsync(int idCursoAbierto, string idAlumno)
{
return await _context.DetallesContrato
.FirstOrDefaultAsync(d => d.IdCursoAbierto == idCursoAbierto
&& d.IdAlumno == idAlumno);
}
} }
+3 -3
View File
@@ -5,7 +5,7 @@ namespace Asistencia.Models;
public class AsistenciaProfesor public class AsistenciaProfesor
{ {
[Key] [Key]
public int Id { get; set; } public int IdAsistenciaProfesor { get; set; }
public int IdCursoAbierto { get; set; } public int IdCursoAbierto { get; set; }
@@ -18,12 +18,12 @@ public class AsistenciaProfesor
public string HoraInicio { get; set; } = string.Empty; public string HoraInicio { get; set; } = string.Empty;
[MaxLength(10)] [MaxLength(10)]
public string HoraFin { get; set; } = string.Empty; public string HoraSalida { get; set; } = string.Empty;
[MaxLength(20)] [MaxLength(20)]
public string Estado { get; set; } = "Activa"; public string Estado { get; set; } = "Activa";
public bool Temporal { get; set; } public int Temporal { get; set; }
public CursoAbierto? CursoAbierto { get; set; } public CursoAbierto? CursoAbierto { get; set; }
} }
+1 -1
View File
@@ -23,7 +23,7 @@ public class CursoAbierto
public DateTime FechaInicio { get; set; } public DateTime FechaInicio { get; set; }
public DateTime FechaTermino { get; set; } public DateTime FechaFin { get; set; }
[MaxLength(20)] [MaxLength(20)]
public string ProfesorRun { get; set; } = string.Empty; public string ProfesorRun { get; set; } = string.Empty;
+3 -6
View File
@@ -9,6 +9,9 @@ public class DetalleContrato
public int IdCursoAbierto { get; set; } public int IdCursoAbierto { get; set; }
[MaxLength(30)]
public string IdAlumno { get; set; } = string.Empty;
[MaxLength(100)] [MaxLength(100)]
public string AP_Paterno { get; set; } = string.Empty; public string AP_Paterno { get; set; } = string.Empty;
@@ -18,12 +21,6 @@ public class DetalleContrato
[MaxLength(100)] [MaxLength(100)]
public string Nombres { get; set; } = string.Empty; public string Nombres { get; set; } = string.Empty;
[MaxLength(200)]
public string Email { get; set; } = string.Empty;
[MaxLength(20)]
public string Telefono { get; set; } = string.Empty;
public CursoAbierto? CursoAbierto { get; set; } public CursoAbierto? CursoAbierto { get; set; }
public string NombreCompleto => $"{Nombres} {AP_Paterno} {AP_Materno}".Trim(); public string NombreCompleto => $"{Nombres} {AP_Paterno} {AP_Materno}".Trim();
+5 -3
View File
@@ -12,10 +12,10 @@ public class Profesor
public string Nombre { get; set; } = string.Empty; public string Nombre { get; set; } = string.Empty;
[MaxLength(100)] [MaxLength(100)]
public string Paterno { get; set; } = string.Empty; public string ApPaterno { get; set; } = string.Empty;
[MaxLength(100)] [MaxLength(100)]
public string Materno { get; set; } = string.Empty; public string ApMaterno { get; set; } = string.Empty;
[MaxLength(200)] [MaxLength(200)]
public string Email { get; set; } = string.Empty; public string Email { get; set; } = string.Empty;
@@ -31,5 +31,7 @@ public class Profesor
public bool CrearClave { get; set; } public bool CrearClave { get; set; }
public string NombreCompleto => $"{Nombre} {Paterno} {Materno}".Trim(); public bool Activo { get; set; } = true;
public string NombreCompleto => $"{Nombre} {ApPaterno} {ApMaterno}".Trim();
} }
+5 -2
View File
@@ -23,13 +23,16 @@ public class AsistenciaService
public Task<List<DetalleContrato>> ObtenerAlumnosAsync(int idCursoAbierto) public Task<List<DetalleContrato>> ObtenerAlumnosAsync(int idCursoAbierto)
=> _cursoRepo.BuscarAlumnosPorCursoAsync(idCursoAbierto); => _cursoRepo.BuscarAlumnosPorCursoAsync(idCursoAbierto);
public Task<DetalleContrato?> BuscarAlumnoPorRutAsync(int idCursoAbierto, string idAlumno)
=> _cursoRepo.BuscarAlumnoPorRutAsync(idCursoAbierto, idAlumno);
public Task<AsistenciaProfesor?> BuscarSesionActivaAsync(int idCursoAbierto) public Task<AsistenciaProfesor?> BuscarSesionActivaAsync(int idCursoAbierto)
=> _asistenciaRepo.BuscarSesionActivaAsync(idCursoAbierto, DateTime.Today); => _asistenciaRepo.BuscarSesionActivaAsync(idCursoAbierto, DateTime.Today);
public async Task<AsistenciaProfesor> IniciarSesionAsync(int idCursoAbierto, string rut) public async Task<AsistenciaProfesor> IniciarSesionAsync(int idCursoAbierto, string rut, int tipoAsignacion)
{ {
var now = DateTime.Now; var now = DateTime.Now;
return await _asistenciaRepo.IniciarSesionAsync(idCursoAbierto, rut, now.Date, now.ToString("HH:mm")); return await _asistenciaRepo.IniciarSesionAsync(idCursoAbierto, rut, now.Date, now.ToString("HH:mm"), tipoAsignacion);
} }
public async Task<bool> FinalizarSesionAsync(int idSesion) public async Task<bool> FinalizarSesionAsync(int idSesion)
+7 -11
View File
@@ -15,23 +15,19 @@ public class AuthService
public Profesor? CurrentUser => _currentUser; public Profesor? CurrentUser => _currentUser;
public async Task<(bool Success, string Message)> LoginAsync(string rut, string password) public int TipoAsignacionActual { get; private set; }
public async Task<(bool Success, string Message)> LoginAsync(string rut, int tipoAsignacion)
{ {
if (string.IsNullOrWhiteSpace(rut) || string.IsNullOrWhiteSpace(password)) if (string.IsNullOrWhiteSpace(rut))
return (false, "Ingrese usuario y contraseña"); return (false, "Ingrese su RUT");
var profesor = await _profesorRepo.BuscarPorRutAsync(rut); var profesor = await _profesorRepo.BuscarPorRutAsync(rut);
if (profesor == null) if (profesor == null)
return (false, "Usuario no encontrado"); return (false, "Usuario no encontrado");
if (profesor.CrearClave) _currentUser = profesor;
return (false, "Debe crear su contraseña primero"); TipoAsignacionActual = tipoAsignacion;
var authenticated = await _profesorRepo.AutenticarAsync(rut, password);
if (authenticated == null)
return (false, "Contraseña incorrecta");
_currentUser = authenticated;
return (true, "Inicio de sesión exitoso"); return (true, "Inicio de sesión exitoso");
} }
@@ -0,0 +1,20 @@
using System.Net.NetworkInformation;
namespace Asistencia.Services;
public class ConnectivityService
{
public async Task<bool> HayConexionAsync()
{
try
{
using var ping = new Ping();
var reply = await ping.SendPingAsync("8.8.8.8", 3000);
return reply.Status == IPStatus.Success;
}
catch
{
return false;
}
}
}
+68
View File
@@ -0,0 +1,68 @@
using Microsoft.EntityFrameworkCore;
using Asistencia.Data;
using Asistencia.Models;
namespace Asistencia.Services;
public class SyncService
{
private readonly AppDbContext _db;
private readonly ConnectivityService _connectivity;
public SyncService(AppDbContext db, ConnectivityService connectivity)
{
_db = db;
_connectivity = connectivity;
}
public async Task<int> ContarPendientesAsync()
{
var sesiones = await _db.AsistenciasProfesor
.Where(a => a.Estado == "Finalizada")
.CountAsync();
var asistencias = await _db.AsistenciasAlumno.CountAsync();
return sesiones + asistencias;
}
public async Task<(bool Success, string Message)> SincronizarAsync(string apiUrl)
{
if (!await _connectivity.HayConexionAsync())
return (false, "Sin conexion a internet");
var pendientes = await ContarPendientesAsync();
if (pendientes == 0)
return (true, "No hay datos pendientes");
try
{
var sesiones = await _db.AsistenciasProfesor
.Where(a => a.Estado == "Finalizada")
.ToListAsync();
foreach (var sesion in sesiones)
{
// TODO: POST to apiUrl + "/api/asistencia-profesor"
// await HttpClient.PostAsJsonAsync(apiUrl + "/api/asistencia-profesor", sesion);
}
var asistencias = await _db.AsistenciasAlumno.ToListAsync();
foreach (var asistencia in asistencias)
{
// TODO: POST to apiUrl + "/api/asistencia-alumno"
// await HttpClient.PostAsJsonAsync(apiUrl + "/api/asistencia-alumno", asistencia);
}
_db.AsistenciasProfesor.RemoveRange(sesiones);
_db.AsistenciasAlumno.RemoveRange(asistencias);
await _db.SaveChangesAsync();
return (true, $"Sincronizados {sesiones.Count} sesiones y {asistencias.Count} asistencias");
}
catch (Exception ex)
{
return (false, $"Error al sincronizar: {ex.Message}");
}
}
}
+6 -6
View File
@@ -1,14 +1,12 @@
using System; using System;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Controls.Templates; using Avalonia.Controls.Templates;
using Asistencia.ViewModels; using Asistencia.ViewModels;
namespace Asistencia; namespace Asistencia;
/// <summary>
/// Given a view model, returns the corresponding view if possible.
/// </summary>
[RequiresUnreferencedCode( [RequiresUnreferencedCode(
"Default implementation of ViewLocator involves reflection which may be trimmed away.", "Default implementation of ViewLocator involves reflection which may be trimmed away.",
Url = "https://docs.avaloniaui.net/docs/concepts/view-locator")] Url = "https://docs.avaloniaui.net/docs/concepts/view-locator")]
@@ -18,15 +16,17 @@ public class ViewLocator : IDataTemplate
{ {
if (param is null) if (param is null)
return null; return null;
var name = param.GetType().FullName!.Replace("ViewModel", "View", StringComparison.Ordinal); var name = param.GetType().FullName!.Replace("ViewModel", "View", StringComparison.Ordinal);
var type = Type.GetType(name); var type = AppDomain.CurrentDomain.GetAssemblies()
.Select(a => a.GetType(name))
.FirstOrDefault(t => t != null);
if (type != null) if (type != null)
{ {
return (Control)Activator.CreateInstance(type)!; return (Control)Activator.CreateInstance(type)!;
} }
return new TextBlock { Text = "Not Found: " + name }; return new TextBlock { Text = "Not Found: " + name };
} }
+71 -105
View File
@@ -6,105 +6,117 @@ using System.Collections.ObjectModel;
namespace Asistencia.ViewModels; namespace Asistencia.ViewModels;
public partial class AsistenciaViewModel : ObservableObject public partial class AsistenciaViewModel : ViewModelBase
{ {
private readonly AsistenciaService _asistenciaService; private readonly AsistenciaService _asistenciaService;
private readonly AuthService _authService; private readonly AuthService _authService;
private readonly MainWindowViewModel _mainVm; private readonly MainWindowViewModel _mainVm;
private readonly CursoAbierto _curso;
[ObservableProperty] [ObservableProperty]
private string _nombreCurso = string.Empty; private string _inputCursoAbierto = string.Empty;
[ObservableProperty]
private string _infoCurso = string.Empty;
[ObservableProperty] [ObservableProperty]
private bool _enSesion; private bool _enSesion;
[ObservableProperty] [ObservableProperty]
private int _totalAlumnos; private string _inputRutAlumno = string.Empty;
[ObservableProperty]
private int _presentes;
[ObservableProperty]
private int _tardanzas;
[ObservableProperty]
private int _ausentes;
[ObservableProperty] [ObservableProperty]
private string _mensajeEstado = string.Empty; private string _mensajeEstado = string.Empty;
public ObservableCollection<AlumnoAsistenciaViewModel> Alumnos { get; } = new(); [ObservableProperty]
private string _mensajeError = string.Empty;
public AsistenciaViewModel(AsistenciaService asistenciaService, AuthService authService, CursoAbierto curso, MainWindowViewModel mainVm) [ObservableProperty]
private bool _hasError;
public ObservableCollection<AlumnoPresenteViewModel> AlumnosPresentes { get; } = new();
private int _idCursoAbierto;
public AsistenciaViewModel(AsistenciaService asistenciaService, AuthService authService, MainWindowViewModel mainVm)
{ {
_asistenciaService = asistenciaService; _asistenciaService = asistenciaService;
_authService = authService; _authService = authService;
_mainVm = mainVm; _mainVm = mainVm;
_curso = curso;
NombreCurso = curso.Curso?.NombreCurso ?? "Curso";
InfoCurso = $"{curso.Sala} | {curso.Sede} | {curso.HoraInicio} - {curso.HoraFin}";
_ = InitAsync();
}
private async Task InitAsync()
{
var sesion = await _asistenciaService.BuscarSesionActivaAsync(_curso.IdCursoAbierto);
EnSesion = sesion != null;
var alumnos = await _asistenciaService.ObtenerAlumnosAsync(_curso.IdCursoAbierto);
var asistencias = await _asistenciaService.ObtenerAsistenciaAlumnosAsync(_curso.IdCursoAbierto);
Alumnos.Clear();
foreach (var alumno in alumnos)
{
var tipo = asistencias.TryGetValue(alumno.IdDetalleContrato, out var t) ? t : TipoAsistencia.Ausente;
Alumnos.Add(new AlumnoAsistenciaViewModel(alumno, tipo));
}
TotalAlumnos = Alumnos.Count;
ActualizarContadores();
MensajeEstado = EnSesion
? "Sesion en curso - Puede registrar asistencia"
: "Inicie la sesion para registrar asistencia";
} }
[RelayCommand] [RelayCommand]
private async Task IniciarSesionAsync() private async Task IniciarSesionAsync()
{ {
HasError = false;
if (!int.TryParse(InputCursoAbierto, out var idCurso))
{
MensajeError = "Ingrese un ID de curso valido";
HasError = true;
return;
}
if (_authService.CurrentUser == null) return; if (_authService.CurrentUser == null) return;
await _asistenciaService.IniciarSesionAsync(_curso.IdCursoAbierto, _authService.CurrentUser.RutPasaporte); _idCursoAbierto = idCurso;
await _asistenciaService.IniciarSesionAsync(idCurso, _authService.CurrentUser.RutPasaporte, _authService.TipoAsignacionActual);
EnSesion = true; EnSesion = true;
MensajeEstado = "Sesion iniciada - Registre la asistencia de los alumnos"; MensajeEstado = $"Sesion curso {idCurso} — Ingrese RUT de alumnos presentes";
} }
[RelayCommand] [RelayCommand]
private async Task FinalizarSesionAsync() private async Task FinalizarSesionAsync()
{ {
var sesion = await _asistenciaService.BuscarSesionActivaAsync(_curso.IdCursoAbierto); var sesion = await _asistenciaService.BuscarSesionActivaAsync(_idCursoAbierto);
if (sesion != null) if (sesion != null)
{ {
await _asistenciaService.FinalizarSesionAsync(sesion.Id); await _asistenciaService.FinalizarSesionAsync(sesion.IdAsistenciaProfesor);
} }
EnSesion = false; EnSesion = false;
AlumnosPresentes.Clear();
InputCursoAbierto = string.Empty;
InputRutAlumno = string.Empty;
MensajeEstado = "Sesion finalizada"; MensajeEstado = "Sesion finalizada";
} }
[RelayCommand] [RelayCommand]
private async Task MarcarAlumnoAsync(AlumnoAsistenciaViewModel? alumno) private async Task AgregarAlumnoAsync()
{ {
if (alumno == null || !EnSesion) return; if (!EnSesion) return;
alumno.CiclarTipoAsistencia(); HasError = false;
await _asistenciaService.GuardarAsistenciaAlumnoAsync(alumno.IdDetalleContrato, alumno.TipoAsistencia); var rut = InputRutAlumno.Trim();
ActualizarContadores();
if (string.IsNullOrWhiteSpace(rut))
{
MensajeError = "Ingrese el RUT del alumno";
HasError = true;
return;
}
if (AlumnosPresentes.Any(a => a.IdAlumno == rut))
{
MensajeError = "Este RUT ya fue registrado";
HasError = true;
InputRutAlumno = string.Empty;
return;
}
var alumno = await _asistenciaService.BuscarAlumnoPorRutAsync(_idCursoAbierto, rut);
if (alumno == null)
{
MensajeError = $"RUT {rut} no encontrado en el curso";
HasError = true;
InputRutAlumno = string.Empty;
return;
}
await _asistenciaService.GuardarAsistenciaAlumnoAsync(alumno.IdDetalleContrato, TipoAsistencia.Presente);
AlumnosPresentes.Add(new AlumnoPresenteViewModel
{
IdAlumno = rut,
NombreCompleto = alumno.NombreCompleto
});
InputRutAlumno = string.Empty;
} }
[RelayCommand] [RelayCommand]
@@ -112,56 +124,10 @@ public partial class AsistenciaViewModel : ObservableObject
{ {
_mainVm.NavigateToDashboard(); _mainVm.NavigateToDashboard();
} }
private void ActualizarContadores()
{
Presentes = Alumnos.Count(a => a.TipoAsistencia == Models.TipoAsistencia.Presente);
Tardanzas = Alumnos.Count(a => a.TipoAsistencia == Models.TipoAsistencia.Tardanza);
Ausentes = Alumnos.Count(a => a.TipoAsistencia == Models.TipoAsistencia.Ausente);
}
} }
public partial class AlumnoAsistenciaViewModel : ObservableObject public class AlumnoPresenteViewModel
{ {
public int IdDetalleContrato { get; } public string IdAlumno { get; set; } = string.Empty;
public string NombreCompleto { get; } public string NombreCompleto { get; set; } = string.Empty;
[ObservableProperty]
private int _tipoAsistencia;
[ObservableProperty]
private string _tipoAsistenciaTexto;
[ObservableProperty]
private string _tipoAsistenciaColor;
public AlumnoAsistenciaViewModel(DetalleContrato alumno, int tipoInicial)
{
IdDetalleContrato = alumno.IdDetalleContrato;
NombreCompleto = alumno.NombreCompleto;
TipoAsistencia = tipoInicial;
ActualizarDisplay();
}
public void CiclarTipoAsistencia()
{
TipoAsistencia = TipoAsistencia switch
{
Models.TipoAsistencia.Presente => Models.TipoAsistencia.Tardanza,
Models.TipoAsistencia.Tardanza => Models.TipoAsistencia.Ausente,
_ => Models.TipoAsistencia.Presente
};
ActualizarDisplay();
}
private void ActualizarDisplay()
{
TipoAsistenciaTexto = Models.TipoAsistencia.Nombre(TipoAsistencia);
TipoAsistenciaColor = TipoAsistencia switch
{
Models.TipoAsistencia.Presente => "#28A745",
Models.TipoAsistencia.Tardanza => "#FFC107",
_ => "#DC3545"
};
}
} }
+30 -16
View File
@@ -6,44 +6,58 @@ using System.Collections.ObjectModel;
namespace Asistencia.ViewModels; namespace Asistencia.ViewModels;
public partial class DashboardViewModel : ObservableObject public partial class DashboardViewModel : ViewModelBase
{ {
private readonly AuthService _authService; private readonly AuthService _authService;
private readonly AsistenciaService _asistenciaService; private readonly AsistenciaService _asistenciaService;
private readonly SyncService _syncService;
private readonly MainWindowViewModel _mainVm; private readonly MainWindowViewModel _mainVm;
[ObservableProperty] [ObservableProperty]
private string _nombreProfesor = string.Empty; private string _nombreProfesor = string.Empty;
[ObservableProperty] [ObservableProperty]
private int _totalCursos; private string _tipoAsignacion = string.Empty;
public ObservableCollection<CursoAbierto> Cursos { get; } = new(); [ObservableProperty]
private int _pendientes;
public DashboardViewModel(AuthService authService, AsistenciaService asistenciaService, MainWindowViewModel mainVm) [ObservableProperty]
private string _mensajeSync = string.Empty;
[ObservableProperty]
private bool _hasMensajeSync;
public DashboardViewModel(AuthService authService, AsistenciaService asistenciaService, SyncService syncService, MainWindowViewModel mainVm)
{ {
_authService = authService; _authService = authService;
_asistenciaService = asistenciaService; _asistenciaService = asistenciaService;
_syncService = syncService;
_mainVm = mainVm; _mainVm = mainVm;
NombreProfesor = authService.CurrentUser?.Nombre ?? ""; NombreProfesor = authService.CurrentUser?.NombreCompleto ?? "";
_ = LoadCursosAsync(); TipoAsignacion = authService.TipoAsignacionActual == 1 ? "Titular" : "Reemplazo";
_ = CargarPendientesAsync();
} }
private async Task LoadCursosAsync() private async Task CargarPendientesAsync()
{ {
if (_authService.CurrentUser == null) return; Pendientes = await _syncService.ContarPendientesAsync();
var cursos = await _asistenciaService.ObtenerCursosProfesorAsync(_authService.CurrentUser.RutPasaporte);
Cursos.Clear();
foreach (var c in cursos) Cursos.Add(c);
TotalCursos = Cursos.Count;
} }
[RelayCommand] [RelayCommand]
private void AbrirAsistencia(CursoAbierto? curso) private void AbrirAsistencia()
{ {
if (curso != null) _mainVm.NavigateToAsistencia();
_mainVm.NavigateToAsistencia(curso); }
[RelayCommand]
private async Task SincronizarAsync()
{
HasMensajeSync = false;
var (success, message) = await _syncService.SincronizarAsync("http://localhost:5000");
MensajeSync = message;
HasMensajeSync = true;
await CargarPendientesAsync();
} }
[RelayCommand] [RelayCommand]
+17 -3
View File
@@ -4,7 +4,7 @@ using Asistencia.Services;
namespace Asistencia.ViewModels; namespace Asistencia.ViewModels;
public partial class LoginViewModel : ObservableObject public partial class LoginViewModel : ViewModelBase
{ {
private readonly AuthService _authService; private readonly AuthService _authService;
private readonly MainWindowViewModel _mainVm; private readonly MainWindowViewModel _mainVm;
@@ -13,7 +13,10 @@ public partial class LoginViewModel : ObservableObject
private string _rut = string.Empty; private string _rut = string.Empty;
[ObservableProperty] [ObservableProperty]
private string _password = string.Empty; private bool _esTitular = true;
[ObservableProperty]
private bool _esReemplazo;
[ObservableProperty] [ObservableProperty]
private string _errorMessage = string.Empty; private string _errorMessage = string.Empty;
@@ -30,13 +33,24 @@ public partial class LoginViewModel : ObservableObject
_mainVm = mainVm; _mainVm = mainVm;
} }
partial void OnEsTitularChanged(bool value)
{
if (value) EsReemplazo = false;
}
partial void OnEsReemplazoChanged(bool value)
{
if (value) EsTitular = false;
}
[RelayCommand] [RelayCommand]
private async Task LoginAsync() private async Task LoginAsync()
{ {
IsLoading = true; IsLoading = true;
HasError = false; HasError = false;
var (success, message) = await _authService.LoginAsync(Rut, Password); var tipoAsignacion = EsTitular ? 1 : 4;
var (success, message) = await _authService.LoginAsync(Rut, tipoAsignacion);
if (success) if (success)
{ {
+33 -6
View File
@@ -8,26 +8,53 @@ using System.Collections.ObjectModel;
namespace Asistencia.ViewModels; namespace Asistencia.ViewModels;
public partial class MainWindowViewModel : ObservableObject public partial class MainWindowViewModel : ViewModelBase
{ {
private readonly AuthService _authService; private readonly AuthService _authService;
private readonly AsistenciaService _asistenciaService; private readonly AsistenciaService _asistenciaService;
private readonly ConnectivityService _connectivityService;
private readonly SyncService _syncService;
private object? _currentView; private object? _currentView;
[ObservableProperty] [ObservableProperty]
private string _currentViewTitle = "Login"; private string _currentViewTitle = "Login";
[ObservableProperty]
private bool _conexionDisponible;
[ObservableProperty]
private string _mensajeConexion = string.Empty;
public object? CurrentView public object? CurrentView
{ {
get => _currentView; get => _currentView;
set => SetProperty(ref _currentView, value); set => SetProperty(ref _currentView, value);
} }
public MainWindowViewModel(AuthService authService, AsistenciaService asistenciaService) public MainWindowViewModel(AuthService authService, AsistenciaService asistenciaService, ConnectivityService connectivityService, SyncService syncService)
{ {
_authService = authService; _authService = authService;
_asistenciaService = asistenciaService; _asistenciaService = asistenciaService;
CurrentView = new LoginViewModel(authService, this); _connectivityService = connectivityService;
_syncService = syncService;
_ = VerificarConexionAsync();
}
private async Task VerificarConexionAsync()
{
var hayInternet = await _connectivityService.HayConexionAsync();
ConexionDisponible = hayInternet;
if (hayInternet)
{
MensajeConexion = "Aplicación no disponible con conexión a internet. Desconéctese para usar el sistema.";
CurrentView = null;
}
else
{
MensajeConexion = "Modo offline — Using local database";
CurrentView = new LoginViewModel(_authService, this);
}
} }
public void NavigateToLogin() public void NavigateToLogin()
@@ -39,13 +66,13 @@ public partial class MainWindowViewModel : ObservableObject
public void NavigateToDashboard() public void NavigateToDashboard()
{ {
CurrentViewTitle = "Panel Principal"; CurrentViewTitle = "Panel Principal";
CurrentView = new DashboardViewModel(_authService, _asistenciaService, this); CurrentView = new DashboardViewModel(_authService, _asistenciaService, _syncService, this);
} }
public void NavigateToAsistencia(CursoAbierto curso) public void NavigateToAsistencia()
{ {
CurrentViewTitle = "Asistencia"; CurrentViewTitle = "Asistencia";
CurrentView = new AsistenciaViewModel(_asistenciaService, _authService, curso, this); CurrentView = new AsistenciaViewModel(_asistenciaService, _authService, this);
} }
public void NavigateToPerfil() public void NavigateToPerfil()
+1 -1
View File
@@ -4,7 +4,7 @@ using Asistencia.Services;
namespace Asistencia.ViewModels; namespace Asistencia.ViewModels;
public partial class PerfilViewModel : ObservableObject public partial class PerfilViewModel : ViewModelBase
{ {
private readonly AuthService _authService; private readonly AuthService _authService;
private readonly MainWindowViewModel _mainVm; private readonly MainWindowViewModel _mainVm;
+72 -93
View File
@@ -4,130 +4,109 @@
x:Class="Asistencia.Views.AsistenciaView" x:Class="Asistencia.Views.AsistenciaView"
x:DataType="vm:AsistenciaViewModel"> x:DataType="vm:AsistenciaViewModel">
<Design.DataContext>
<vm:AsistenciaViewModel />
</Design.DataContext>
<ScrollViewer> <ScrollViewer>
<StackPanel Spacing="0" Margin="32,24"> <StackPanel Spacing="0" Margin="32,24" MaxWidth="500">
<Button Content="Volver" Classes="secondary" <Button Content="Volver" Classes="secondary"
HorizontalAlignment="Left" HorizontalAlignment="Left"
Command="{Binding VolverCommand}" Command="{Binding VolverCommand}"
Margin="0,0,0,16" /> Margin="0,0,0,16" />
<TextBlock Text="{Binding NombreCurso}" Classes="page-header" /> <TextBlock Text="Tomar Asistencia" Classes="page-header" />
<Border Classes="card" Margin="0,0,0,20"> <Border Classes="card" Margin="0,0,0,16">
<StackPanel Spacing="8"> <StackPanel Spacing="12">
<TextBlock Text="{Binding InfoCurso}" <TextBlock Text="ID Curso Abierto" FontSize="13" FontWeight="SemiBold"
FontSize="14" Foreground="{DynamicResource TextSecondary}" /> Foreground="{DynamicResource TextPrimary}" />
<TextBox PlaceholderText="Ej: 16451"
<TextBlock Text="{Binding MensajeEstado}" Text="{Binding InputCursoAbierto}"
FontSize="13" FontWeight="SemiBold" FontSize="14" />
Foreground="{DynamicResource PrimaryNavy}" /> <StackPanel Orientation="Horizontal" Spacing="8">
<Button Content="Iniciar Sesion" Classes="success"
<StackPanel Orientation="Horizontal" Spacing="8" Margin="0,8,0,0">
<Button Content="Iniciar Sesion"
Classes="success"
Command="{Binding IniciarSesionCommand}" Command="{Binding IniciarSesionCommand}"
IsVisible="{Binding !EnSesion}" /> IsVisible="{Binding !EnSesion}" />
<Button Content="Finalizar Sesion" <Button Content="Finalizar Sesion" Classes="danger"
Classes="danger"
Command="{Binding FinalizarSesionCommand}" Command="{Binding FinalizarSesionCommand}"
IsVisible="{Binding EnSesion}" /> IsVisible="{Binding EnSesion}" />
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>
</Border> </Border>
<Grid ColumnDefinitions="*,Auto" Margin="0,0,0,16"> <Border Classes="card" Margin="0,0,0,16"
<TextBlock Grid.Column="0" IsVisible="{Binding EnSesion}">
Classes="section-title" <StackPanel Spacing="12">
Text="Alumnos" <TextBlock Text="RUT Alumno" FontSize="13" FontWeight="SemiBold"
VerticalAlignment="Center" /> Foreground="{DynamicResource TextPrimary}" />
<Grid ColumnDefinitions="*,Auto">
<StackPanel Grid.Column="1" Orientation="Horizontal" Spacing="16"> <TextBox Grid.Column="0"
<StackPanel Orientation="Horizontal" Spacing="4"> PlaceholderText="Ej: 11111111-1"
<Border Background="{DynamicResource SuccessColor}" Text="{Binding InputRutAlumno}"
CornerRadius="4" Width="12" Height="12" /> FontSize="14"
<TextBlock Text="{Binding Presentes}" FontSize="13" KeyDown="OnRutAlumnoKeyDown" />
Foreground="{DynamicResource TextSecondary}" /> <Button Grid.Column="1"
</StackPanel> Content="+"
<StackPanel Orientation="Horizontal" Spacing="4"> Classes="primary"
<Border Background="{DynamicResource WarningColor}" Command="{Binding AgregarAlumnoCommand}"
CornerRadius="4" Width="12" Height="12" /> Margin="8,0,0,0"
<TextBlock Text="{Binding Tardanzas}" FontSize="13" Width="40" Height="40"
Foreground="{DynamicResource TextSecondary}" /> FontSize="18" FontWeight="Bold" />
</StackPanel> </Grid>
<StackPanel Orientation="Horizontal" Spacing="4">
<Border Background="{DynamicResource DangerColor}"
CornerRadius="4" Width="12" Height="12" />
<TextBlock Text="{Binding Ausentes}" FontSize="13"
Foreground="{DynamicResource TextSecondary}" />
</StackPanel>
</StackPanel> </StackPanel>
</Grid> </Border>
<Border Classes="card" Padding="0"> <TextBlock Text="{Binding MensajeEstado}"
<Grid RowDefinitions="Auto,*"> FontSize="13" FontWeight="SemiBold"
Foreground="{DynamicResource PrimaryNavy}"
Margin="0,0,0,12"
IsVisible="{Binding !HasError}" />
<Border Grid.Row="0" Background="{DynamicResource BackgroundSecondary}" <TextBlock Text="{Binding MensajeError}"
FontSize="13"
Foreground="{DynamicResource DangerColor}"
Margin="0,0,0,12"
IsVisible="{Binding HasError}" />
<Border Classes="card" Padding="0"
IsVisible="{Binding EnSesion}">
<StackPanel>
<Border Background="{DynamicResource BackgroundSecondary}"
CornerRadius="12,12,0,0" Padding="16,12"> CornerRadius="12,12,0,0" Padding="16,12">
<Grid ColumnDefinitions="*,120"> <TextBlock Text="Alumnos Presentes"
<TextBlock Grid.Column="0" Text="Alumno" FontSize="13" FontWeight="SemiBold"
FontSize="13" FontWeight="SemiBold" Foreground="{DynamicResource TextSecondary}" />
Foreground="{DynamicResource TextSecondary}" />
<TextBlock Grid.Column="1" Text="Estado"
FontSize="13" FontWeight="SemiBold"
Foreground="{DynamicResource TextSecondary}"
HorizontalAlignment="Center" />
</Grid>
</Border> </Border>
<ListBox ItemsSource="{Binding AlumnosPresentes}"
<ListBox Grid.Row="1"
ItemsSource="{Binding Alumnos}"
Background="Transparent" Background="Transparent"
BorderThickness="0" BorderThickness="0"
Padding="0"> Padding="0"
MaxHeight="300">
<ListBox.ItemTemplate> <ListBox.ItemTemplate>
<DataTemplate x:DataType="vm:AlumnoAsistenciaViewModel"> <DataTemplate x:DataType="vm:AlumnoPresenteViewModel">
<Border Padding="16,12" <Border Padding="16,10"
BorderBrush="{DynamicResource BorderColor}" BorderBrush="{DynamicResource BorderColor}"
BorderThickness="0,0,0,1"> BorderThickness="0,0,0,1">
<Grid ColumnDefinitions="*,120"> <Grid ColumnDefinitions="Auto,*">
<TextBlock Grid.Column="0" <Border Grid.Column="0"
Text="{Binding NombreCompleto}" Background="{DynamicResource SuccessColor}"
FontSize="14" CornerRadius="12" Padding="10,4"
VerticalAlignment="Center" /> VerticalAlignment="Center">
<TextBlock Text="P" Foreground="White"
<Button Grid.Column="1" FontSize="12" FontWeight="Bold" />
HorizontalAlignment="Center" </Border>
Command="{Binding $parent[ListBox].((vm:AsistenciaViewModel)DataContext).MarcarAlumnoCommand}" <StackPanel Grid.Column="1" Margin="12,0,0,0"
CommandParameter="{Binding}" VerticalAlignment="Center">
Background="{Binding TipoAsistenciaColor}" <TextBlock Text="{Binding NombreCompleto}"
CornerRadius="20" FontSize="14" FontWeight="SemiBold" />
Padding="16,6" <TextBlock Text="{Binding IdAlumno}"
FontSize="13" FontSize="12"
FontWeight="SemiBold" Foreground="{DynamicResource TextSecondary}" />
Foreground="White" </StackPanel>
BorderThickness="0"
MinWidth="100">
<TextBlock Text="{Binding TipoAsistenciaTexto}"
Foreground="White" />
</Button>
</Grid> </Grid>
</Border> </Border>
</DataTemplate> </DataTemplate>
</ListBox.ItemTemplate> </ListBox.ItemTemplate>
</ListBox> </ListBox>
</Grid> </StackPanel>
</Border>
<Border Classes="card" Margin="0,16,0,0"
IsVisible="{Binding !Alumnos.Count}"
Background="#FFF3CD">
<TextBlock Text="No hay alumnos en este curso."
FontSize="14" Foreground="#856404" />
</Border> </Border>
</StackPanel> </StackPanel>
+10 -1
View File
@@ -1,5 +1,6 @@
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Markup.Xaml; using Avalonia.Input;
using Asistencia.ViewModels;
namespace Asistencia.Views; namespace Asistencia.Views;
@@ -9,4 +10,12 @@ public partial class AsistenciaView : UserControl
{ {
InitializeComponent(); InitializeComponent();
} }
private void OnRutAlumnoKeyDown(object? sender, KeyEventArgs e)
{
if (e.Key == Key.Return && DataContext is AsistenciaViewModel vm)
{
vm.AgregarAlumnoCommand.Execute(null);
}
}
} }
+35 -52
View File
@@ -1,7 +1,6 @@
<UserControl xmlns="https://github.com/avaloniaui" <UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:Asistencia.ViewModels" xmlns:vm="using:Asistencia.ViewModels"
xmlns:models="using:Asistencia.Models"
x:Class="Asistencia.Views.DashboardView" x:Class="Asistencia.Views.DashboardView"
x:DataType="vm:DashboardViewModel"> x:DataType="vm:DashboardViewModel">
@@ -10,18 +9,19 @@
</Design.DataContext> </Design.DataContext>
<ScrollViewer> <ScrollViewer>
<StackPanel Spacing="0" Margin="32,24"> <StackPanel Spacing="0" Margin="32,24" MaxWidth="500">
<TextBlock Text="Panel Principal" Classes="page-header" /> <TextBlock Text="Panel Principal" Classes="page-header" />
<Border Classes="card" Margin="0,0,0,24"> <Border Classes="card" Margin="0,0,0,24">
<Grid ColumnDefinitions="*,Auto"> <Grid ColumnDefinitions="*,Auto">
<StackPanel Grid.Column="0" Spacing="4"> <StackPanel Grid.Column="0" Spacing="4">
<TextBlock Text="Bienvenido"
FontSize="14" Foreground="{DynamicResource TextSecondary}" />
<TextBlock Text="{Binding NombreProfesor}" <TextBlock Text="{Binding NombreProfesor}"
FontSize="24" FontWeight="Bold" FontSize="22" FontWeight="Bold"
Foreground="{DynamicResource TextPrimary}" /> Foreground="{DynamicResource TextPrimary}" />
<TextBlock Text="{Binding TipoAsignacion}"
FontSize="13"
Foreground="{DynamicResource TextSecondary}" />
</StackPanel> </StackPanel>
<StackPanel Grid.Column="1" Orientation="Horizontal" Spacing="8"> <StackPanel Grid.Column="1" Orientation="Horizontal" Spacing="8">
@@ -35,55 +35,38 @@
</Grid> </Grid>
</Border> </Border>
<TextBlock Text="Mis Cursos" Classes="section-title" Margin="0,0,0,12" /> <Button Content="Tomar Asistencia"
Classes="primary"
Command="{Binding AbrirAsistenciaCommand}"
HorizontalAlignment="Stretch"
Height="50"
FontSize="16" FontWeight="SemiBold"
Margin="0,0,0,16" />
<ItemsControl ItemsSource="{Binding Cursos}"> <Border Classes="card" Margin="0,0,0,16">
<ItemsControl.ItemTemplate> <StackPanel Spacing="12">
<DataTemplate x:DataType="models:CursoAbierto"> <Grid ColumnDefinitions="*,Auto">
<Border Classes="card" Margin="0,0,0,12"> <TextBlock Grid.Column="0"
<Grid ColumnDefinitions="*,Auto" RowDefinitions="Auto,Auto,Auto"> FontSize="14" FontWeight="SemiBold"
Foreground="{DynamicResource TextPrimary}">
<TextBlock Grid.Row="0" Grid.Column="0" <TextBlock.Text>
Text="{Binding Curso.NombreCurso}" <MultiBinding StringFormat="Pendientes: {0}">
FontSize="18" FontWeight="Bold" <Binding Path="Pendientes" />
Foreground="{DynamicResource TextPrimary}" /> </MultiBinding>
</TextBlock.Text>
<TextBlock Grid.Row="0" Grid.Column="1" </TextBlock>
Text="{Binding Sala}" <Button Grid.Column="1"
FontSize="13" Content="Sincronizar"
Foreground="{DynamicResource TextSecondary}" /> Classes="success"
Command="{Binding SincronizarCommand}" />
<TextBlock Grid.Row="1" Grid.Column="0" </Grid>
FontSize="13" <TextBlock Text="{Binding MensajeSync}"
Foreground="{DynamicResource TextSecondary}" FontSize="12"
Margin="0,4,0,0"> Foreground="{DynamicResource SuccessColor}"
<TextBlock.Text> IsVisible="{Binding HasMensajeSync}" />
<MultiBinding StringFormat="{}{0} | {1}"> </StackPanel>
<Binding Path="Sede" />
<Binding Path="HoraInicio" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
<Button Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2"
Content="Tomar Asistencia"
Classes="primary"
HorizontalAlignment="Left"
Margin="0,12,0,0"
Command="{Binding $parent[ItemsControl].((vm:DashboardViewModel)DataContext).AbrirAsistenciaCommand}"
CommandParameter="{Binding}" />
</Grid>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<Border Classes="card" Margin="0,24,0,0"
IsVisible="{Binding !Cursos.Count}"
Background="#FFF3CD">
<TextBlock Text="No tiene cursos asignados actualmente."
FontSize="14" Foreground="#856404" />
</Border> </Border>
</StackPanel> </StackPanel>
</ScrollViewer> </ScrollViewer>
</UserControl> </UserControl>
+14 -14
View File
@@ -4,10 +4,6 @@
x:Class="Asistencia.Views.LoginView" x:Class="Asistencia.Views.LoginView"
x:DataType="vm:LoginViewModel"> x:DataType="vm:LoginViewModel">
<Design.DataContext>
<vm:LoginViewModel />
</Design.DataContext>
<Panel Background="{DynamicResource BackgroundSecondary}"> <Panel Background="{DynamicResource BackgroundSecondary}">
<Border HorizontalAlignment="Center" VerticalAlignment="Center" <Border HorizontalAlignment="Center" VerticalAlignment="Center"
CornerRadius="16" Padding="48" Width="420" CornerRadius="16" Padding="48" Width="420"
@@ -20,24 +16,28 @@
Foreground="{DynamicResource PrimaryNavy}" Foreground="{DynamicResource PrimaryNavy}"
HorizontalAlignment="Center" /> HorizontalAlignment="Center" />
<TextBlock Text="Inicie sesion con su cuenta" <TextBlock Text="Modo offline"
FontSize="14" Foreground="{DynamicResource TextSecondary}" FontSize="14" Foreground="{DynamicResource TextSecondary}"
HorizontalAlignment="Center" Margin="0,0,0,24" /> HorizontalAlignment="Center" Margin="0,0,0,24" />
<TextBlock Text="RUT" FontSize="13" FontWeight="SemiBold" <TextBlock Text="RUT" FontSize="13" FontWeight="SemiBold"
Foreground="{DynamicResource TextPrimary}" /> Foreground="{DynamicResource TextPrimary}" />
<TextBox Watermark="Ej: 12345678-9" <TextBox PlaceholderText="Ej: 15668563-1"
Text="{Binding Rut}" Text="{Binding Rut}"
FontSize="14" Margin="0,0,0,8" /> FontSize="14" Margin="0,0,0,12" />
<TextBlock Text="Contrasena" FontSize="13" FontWeight="SemiBold" <TextBlock Text="Tipo de asignacion" FontSize="13" FontWeight="SemiBold"
Foreground="{DynamicResource TextPrimary}" /> Foreground="{DynamicResource TextPrimary}" Margin="0,0,0,4" />
<TextBox Watermark="Ingrese su contrasena" <RadioButton Content="Titular"
Text="{Binding Password}" IsChecked="{Binding EsTitular}"
PasswordChar="*" GroupName="TipoAsignacion"
FontSize="14" Margin="0,0,0,16" /> FontSize="14" />
<RadioButton Content="Reemplazo"
IsChecked="{Binding EsReemplazo}"
GroupName="TipoAsignacion"
FontSize="14" Margin="0,0,0,16" />
<Button Content="Iniciar Sesion" <Button Content="Ingresar"
Command="{Binding LoginCommand}" Command="{Binding LoginCommand}"
Classes="primary" Classes="primary"
HorizontalAlignment="Stretch" HorizontalAlignment="Stretch"
+18 -1
View File
@@ -17,7 +17,24 @@
<vm:MainWindowViewModel /> <vm:MainWindowViewModel />
</Design.DataContext> </Design.DataContext>
<Panel> <Panel Background="{DynamicResource BackgroundSecondary}">
<ContentControl Content="{Binding CurrentView}" /> <ContentControl Content="{Binding CurrentView}" />
<Border IsVisible="{Binding ConexionDisponible}"
HorizontalAlignment="Center" VerticalAlignment="Center"
CornerRadius="16" Padding="48" Width="420"
Background="#FFF3CD" BorderBrush="#FFC107" BorderThickness="1">
<StackPanel Spacing="16" HorizontalAlignment="Center">
<TextBlock Text="Sin acceso al sistema"
FontSize="24" FontWeight="Bold"
Foreground="#856404"
HorizontalAlignment="Center" />
<TextBlock Text="{Binding MensajeConexion}"
FontSize="14" TextWrapping="Wrap"
Foreground="#856404"
HorizontalAlignment="Center"
TextAlignment="Center" />
</StackPanel>
</Border>
</Panel> </Panel>
</Window> </Window>
Binary file not shown.
File diff suppressed because it is too large. Load diff
Binary file not shown.
Binary file not shown.
@@ -1,16 +0,0 @@
{
"runtimeOptions": {
"tfm": "net10.0",
"framework": {
"name": "Microsoft.NETCore.App",
"version": "10.0.0"
},
"configProperties": {
"Avalonia.Diagnostics.Diagnostic.IsEnabled": true,
"MVVMTOOLKIT_ENABLE_INOTIFYPROPERTYCHANGING_SUPPORT": true,
"System.Diagnostics.Metrics.Meter.IsSupported": true,
"System.Reflection.NullabilityInfoContext.IsSupported": true,
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
}
}
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,56 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Build" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-15.1.0.0" newVersion="15.1.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Build.Framework" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-15.1.0.0" newVersion="15.1.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Build.Utilities.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-15.1.0.0" newVersion="15.1.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Build.Tasks.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-15.1.0.0" newVersion="15.1.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.IO.Redist" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.1" newVersion="6.0.0.1" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
@@ -1,260 +0,0 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v6.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v6.0": {
"Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost/4.14.0-3.25262.10": {
"dependencies": {
"Microsoft.Build.Locator": "1.6.10",
"Microsoft.CodeAnalysis.NetAnalyzers": "8.0.0-preview.23468.1",
"Microsoft.CodeAnalysis.PerformanceSensitiveAnalyzers": "3.3.4-beta1.22504.1",
"Microsoft.DotNet.XliffTasks": "9.0.0-beta.25255.5",
"Microsoft.VisualStudio.Threading.Analyzers": "17.13.2",
"Newtonsoft.Json": "13.0.3",
"Roslyn.Diagnostics.Analyzers": "3.11.0-beta1.24081.1",
"System.Collections.Immutable": "9.0.0",
"System.CommandLine": "2.0.0-beta4.24528.1"
},
"runtime": {
"Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.dll": {}
},
"resources": {
"cs/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": {
"locale": "cs"
},
"de/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": {
"locale": "de"
},
"es/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": {
"locale": "es"
},
"fr/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": {
"locale": "fr"
},
"it/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": {
"locale": "it"
},
"ja/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": {
"locale": "ja"
},
"ko/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": {
"locale": "ko"
},
"pl/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": {
"locale": "pl"
},
"pt-BR/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": {
"locale": "pt-BR"
},
"ru/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": {
"locale": "ru"
},
"tr/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": {
"locale": "tr"
},
"zh-Hans/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": {
"locale": "zh-Hans"
},
"zh-Hant/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": {
"locale": "zh-Hant"
}
}
},
"Microsoft.Build.Locator/1.6.10": {
"runtime": {
"lib/net6.0/Microsoft.Build.Locator.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.6.10.57384"
}
}
},
"Microsoft.CodeAnalysis.BannedApiAnalyzers/3.11.0-beta1.24081.1": {},
"Microsoft.CodeAnalysis.NetAnalyzers/8.0.0-preview.23468.1": {},
"Microsoft.CodeAnalysis.PerformanceSensitiveAnalyzers/3.3.4-beta1.22504.1": {},
"Microsoft.CodeAnalysis.PublicApiAnalyzers/3.11.0-beta1.24081.1": {},
"Microsoft.DotNet.XliffTasks/9.0.0-beta.25255.5": {},
"Microsoft.VisualStudio.Threading.Analyzers/17.13.2": {},
"Newtonsoft.Json/13.0.3": {
"runtime": {
"lib/net6.0/Newtonsoft.Json.dll": {
"assemblyVersion": "13.0.0.0",
"fileVersion": "13.0.3.27908"
}
}
},
"Roslyn.Diagnostics.Analyzers/3.11.0-beta1.24081.1": {
"dependencies": {
"Microsoft.CodeAnalysis.BannedApiAnalyzers": "3.11.0-beta1.24081.1",
"Microsoft.CodeAnalysis.PublicApiAnalyzers": "3.11.0-beta1.24081.1"
}
},
"System.Collections.Immutable/9.0.0": {
"dependencies": {
"System.Memory": "4.5.5",
"System.Runtime.CompilerServices.Unsafe": "6.0.0"
},
"runtime": {
"lib/netstandard2.0/System.Collections.Immutable.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.24.52809"
}
}
},
"System.CommandLine/2.0.0-beta4.24528.1": {
"dependencies": {
"System.Memory": "4.5.5"
},
"runtime": {
"lib/netstandard2.0/System.CommandLine.dll": {
"assemblyVersion": "2.0.0.0",
"fileVersion": "2.0.24.52801"
}
},
"resources": {
"lib/netstandard2.0/cs/System.CommandLine.resources.dll": {
"locale": "cs"
},
"lib/netstandard2.0/de/System.CommandLine.resources.dll": {
"locale": "de"
},
"lib/netstandard2.0/es/System.CommandLine.resources.dll": {
"locale": "es"
},
"lib/netstandard2.0/fr/System.CommandLine.resources.dll": {
"locale": "fr"
},
"lib/netstandard2.0/it/System.CommandLine.resources.dll": {
"locale": "it"
},
"lib/netstandard2.0/ja/System.CommandLine.resources.dll": {
"locale": "ja"
},
"lib/netstandard2.0/ko/System.CommandLine.resources.dll": {
"locale": "ko"
},
"lib/netstandard2.0/pl/System.CommandLine.resources.dll": {
"locale": "pl"
},
"lib/netstandard2.0/pt-BR/System.CommandLine.resources.dll": {
"locale": "pt-BR"
},
"lib/netstandard2.0/ru/System.CommandLine.resources.dll": {
"locale": "ru"
},
"lib/netstandard2.0/tr/System.CommandLine.resources.dll": {
"locale": "tr"
},
"lib/netstandard2.0/zh-Hans/System.CommandLine.resources.dll": {
"locale": "zh-Hans"
},
"lib/netstandard2.0/zh-Hant/System.CommandLine.resources.dll": {
"locale": "zh-Hant"
}
}
},
"System.Memory/4.5.5": {},
"System.Runtime.CompilerServices.Unsafe/6.0.0": {}
}
},
"libraries": {
"Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost/4.14.0-3.25262.10": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"Microsoft.Build.Locator/1.6.10": {
"type": "package",
"serviceable": true,
"sha512": "sha512-DJhCkTGqy1LMJzEmG/2qxRTMHwdPc3WdVoGQI5o5mKHVo4dsHrCMLIyruwU/NSvPNSdvONlaf7jdFXnAMuxAuA==",
"path": "microsoft.build.locator/1.6.10",
"hashPath": "microsoft.build.locator.1.6.10.nupkg.sha512"
},
"Microsoft.CodeAnalysis.BannedApiAnalyzers/3.11.0-beta1.24081.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-DH6L3rsbjppLrHM2l2/NKbnMaYd0NFHx2pjZaFdrVcRkONrV3i9FHv6Id8Dp6/TmjhXQsJVJJFbhhjkpuP1xxg==",
"path": "microsoft.codeanalysis.bannedapianalyzers/3.11.0-beta1.24081.1",
"hashPath": "microsoft.codeanalysis.bannedapianalyzers.3.11.0-beta1.24081.1.nupkg.sha512"
},
"Microsoft.CodeAnalysis.NetAnalyzers/8.0.0-preview.23468.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ZhIvyxmUCqb8OiU/VQfxfuAmIB4lQsjqhMVYKeoyxzSI+d7uR5Pzx3ZKoaIhPizQ15wa4lnyD6wg3TnSJ6P4LA==",
"path": "microsoft.codeanalysis.netanalyzers/8.0.0-preview.23468.1",
"hashPath": "microsoft.codeanalysis.netanalyzers.8.0.0-preview.23468.1.nupkg.sha512"
},
"Microsoft.CodeAnalysis.PerformanceSensitiveAnalyzers/3.3.4-beta1.22504.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-2XRlqPAzVke7Sb80+UqaC7o57OwfK+tIr+aIOxrx41RWDMeR2SBUW7kL4sd6hfLFfBNsLo3W5PT+UwfvwPaOzA==",
"path": "microsoft.codeanalysis.performancesensitiveanalyzers/3.3.4-beta1.22504.1",
"hashPath": "microsoft.codeanalysis.performancesensitiveanalyzers.3.3.4-beta1.22504.1.nupkg.sha512"
},
"Microsoft.CodeAnalysis.PublicApiAnalyzers/3.11.0-beta1.24081.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-3bYGBihvoNO0rhCOG1U9O50/4Q8suZ+glHqQLIAcKvnodSnSW+dYWYzTNb1UbS8pUS8nAUfxSFMwuMup/G5DtQ==",
"path": "microsoft.codeanalysis.publicapianalyzers/3.11.0-beta1.24081.1",
"hashPath": "microsoft.codeanalysis.publicapianalyzers.3.11.0-beta1.24081.1.nupkg.sha512"
},
"Microsoft.DotNet.XliffTasks/9.0.0-beta.25255.5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-bb0fZB5ViPscdfYeWlmtyXJMzNkgcpkV5RWmXktfV9lwIUZgNZmFotUXrdcTyZzrN7v1tQK/Y6BGnbkP9gEsXg==",
"path": "microsoft.dotnet.xlifftasks/9.0.0-beta.25255.5",
"hashPath": "microsoft.dotnet.xlifftasks.9.0.0-beta.25255.5.nupkg.sha512"
},
"Microsoft.VisualStudio.Threading.Analyzers/17.13.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Qcd8IlaTXZVq3wolBnzby1P7kWihdWaExtD8riumiKuG1sHa8EgjV/o70TMjTaeUMhomBbhfdC9OPwAHoZfnjQ==",
"path": "microsoft.visualstudio.threading.analyzers/17.13.2",
"hashPath": "microsoft.visualstudio.threading.analyzers.17.13.2.nupkg.sha512"
},
"Newtonsoft.Json/13.0.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==",
"path": "newtonsoft.json/13.0.3",
"hashPath": "newtonsoft.json.13.0.3.nupkg.sha512"
},
"Roslyn.Diagnostics.Analyzers/3.11.0-beta1.24081.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-reHqZCDKifA+DURcL8jUfYkMGL4FpgNt5LI0uWTS6IpM8kKVbu/kO8byZsqfhBu4wUzT3MBDcoMfzhZPdENIpg==",
"path": "roslyn.diagnostics.analyzers/3.11.0-beta1.24081.1",
"hashPath": "roslyn.diagnostics.analyzers.3.11.0-beta1.24081.1.nupkg.sha512"
},
"System.Collections.Immutable/9.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-QhkXUl2gNrQtvPmtBTQHb0YsUrDiDQ2QS09YbtTTiSjGcf7NBqtYbrG/BE06zcBPCKEwQGzIv13IVdXNOSub2w==",
"path": "system.collections.immutable/9.0.0",
"hashPath": "system.collections.immutable.9.0.0.nupkg.sha512"
},
"System.CommandLine/2.0.0-beta4.24528.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Xt8tsSU8yd0ZpbT9gl5DAwkMYWLo8PV1fq2R/belrUbHVVOIKqhLfbWksbdknUDpmzMHZenBtD6AGAp9uJTa2w==",
"path": "system.commandline/2.0.0-beta4.24528.1",
"hashPath": "system.commandline.2.0.0-beta4.24528.1.nupkg.sha512"
},
"System.Memory/4.5.5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==",
"path": "system.memory/4.5.5",
"hashPath": "system.memory.4.5.5.nupkg.sha512"
},
"System.Runtime.CompilerServices.Unsafe/6.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==",
"path": "system.runtime.compilerservices.unsafe/6.0.0",
"hashPath": "system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512"
}
}
}
@@ -1,605 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Build" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-15.1.0.0" newVersion="15.1.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Build.Framework" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-15.1.0.0" newVersion="15.1.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Build.Utilities.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-15.1.0.0" newVersion="15.1.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Build.Tasks.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-15.1.0.0" newVersion="15.1.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.VisualBasic.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Win32.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Win32.Registry" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Collections.Concurrent" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Collections.NonGeneric" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Collections.Specialized" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Collections" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.ComponentModel.Annotations" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.ComponentModel.EventBasedAsync" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.ComponentModel.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.ComponentModel.TypeConverter" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.ComponentModel" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Console" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Data.Common" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.Contracts" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.FileVersionInfo" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.Process" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.StackTrace" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.TextWriterTraceListener" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.TraceSource" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.Tracing" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Drawing.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.IO.Compression.ZipFile" publicKeyToken="b77a5c561934e089" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.IO.Compression" publicKeyToken="b77a5c561934e089" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.IO.FileSystem.AccessControl" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.IO.FileSystem.DriveInfo" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.IO.FileSystem.Watcher" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.IO.IsolatedStorage" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.IO.MemoryMappedFiles" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.IO.Pipes.AccessControl" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.IO.Pipes" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Linq.Expressions" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Linq.Parallel" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Linq.Queryable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Linq" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Net.HttpListener" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Net.Mail" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Net.NameResolution" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Net.NetworkInformation" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Net.Ping" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Net.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Net.Requests" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Net.Security" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Net.ServicePoint" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Net.Sockets" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Net.WebClient" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Net.WebHeaderCollection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Net.WebProxy" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Net.WebSockets.Client" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Net.WebSockets" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.ObjectModel" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Reflection.Emit.ILGeneration" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Reflection.Emit.Lightweight" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Reflection.Emit" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Reflection.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Resources.Writer" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.VisualC" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.InteropServices.RuntimeInformation" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.InteropServices" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Numerics" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Serialization.Formatters" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Serialization.Json" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Serialization.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Serialization.Xml" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Security.AccessControl" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Security.Claims" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Security.Cryptography.Algorithms" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Security.Cryptography.Cng" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Security.Cryptography.Csp" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Security.Cryptography.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Security.Cryptography.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Security.Cryptography.X509Certificates" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Security.Principal.Windows" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Text.Encoding.Extensions" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Text.RegularExpressions" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Threading.Overlapped" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks.Parallel" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Threading.Thread" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Threading.ThreadPool" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Threading" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Transactions.Local" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.HttpUtility" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Xml.ReaderWriter" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Xml.XDocument" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Xml.XPath.XDocument" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Xml.XPath" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Xml.XmlSerializer" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="netstandard" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.1.0.0" newVersion="2.1.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Configuration.ConfigurationManager" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Security.Cryptography.Xml" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.CodeDom" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
@@ -1,13 +0,0 @@
{
"runtimeOptions": {
"tfm": "net6.0",
"framework": {
"name": "Microsoft.NETCore.App",
"version": "6.0.0"
},
"rollForward": "Major",
"configProperties": {
"System.Reflection.Metadata.MetadataUpdater.IsSupported": false
}
}
}
Loaded 100 of 313 files, more files were not shown because too many files have changed in this diff. Show more