From a01968cf268a5c60c405b6520ddba918a178cdee Mon Sep 17 00:00:00 2001 From: fixterjake Date: Tue, 24 Oct 2023 14:16:38 -0400 Subject: [PATCH] Email template start and rework training models --- .github/workflows/create-tag.yaml | 2 +- Memphis.API/Controllers/AirportsController.cs | 57 +- Memphis.API/Controllers/AuthController.cs | 60 +- Memphis.API/Controllers/CommentsController.cs | 61 +- .../Controllers/EmailLogsController.cs | 6 +- .../Controllers/EventPositionsController.cs | 70 +- .../EventRegistrationController.cs | 144 +- Memphis.API/Controllers/EventsController.cs | 56 +- Memphis.API/Controllers/FaqController.cs | 38 +- Memphis.API/Controllers/FeedbackController.cs | 251 +- Memphis.API/Controllers/FilesController.cs | 266 + Memphis.API/Controllers/HoursController.cs | 202 + .../Controllers/NotificationsController.cs | 83 + .../OnlineControllersController.cs | 49 + Memphis.API/Controllers/OtsController.cs | 29 + Memphis.API/Data/DatabaseContext.cs | 6 +- Memphis.API/Emails/.editorconfig | 9 + Memphis.API/Emails/.github/dependabot.yml | 7 + Memphis.API/Emails/.github/logo-dark.svg | 1 + Memphis.API/Emails/.github/logo-light.svg | 1 + Memphis.API/Emails/.gitignore | 8 + Memphis.API/Emails/LICENSE | 21 + Memphis.API/Emails/README.md | 68 + Memphis.API/Emails/config.js | 27 + Memphis.API/Emails/config.production.js | 26 + Memphis.API/Emails/package.json | 13 + Memphis.API/Emails/src/components/button.html | 38 + .../Emails/src/components/divider.html | 30 + Memphis.API/Emails/src/components/spacer.html | 20 + Memphis.API/Emails/src/components/v-fill.html | 13 + .../Emails/src/components/v-image.html | 14 + Memphis.API/Emails/src/css/resets.css | 13 + Memphis.API/Emails/src/css/tailwind.css | 17 + Memphis.API/Emails/src/css/utilities.css | 15 + Memphis.API/Emails/src/layouts/main.html | 70 + .../Emails/src/templates/activityWarning.html | 11 + .../src/templates/eventPositionAssigned.html | 28 + .../src/templates/eventPositionRemoved.html | 21 + .../templates/eventPositionUnassigned.html | 21 + .../templates/eventRegistrationSubmitted.html | 21 + .../Emails/src/templates/facilityJoin.html | 21 + .../Emails/src/templates/facilityRemoval.html | 21 + .../src/templates/feedbackApproved.html | 21 + .../Emails/src/templates/feedbackReply.html | 21 + .../src/templates/feedbackSubmitted.html | 21 + .../src/templates/trainingRequestDropped.html | 21 + .../templates/trainingRequestSubmitted.html | 21 + .../src/templates/trainingRequestTaken.html | 21 + .../templates/trainingTicketSubmitted.html | 21 + .../src/templates/visitAppAccepted.html | 21 + .../src/templates/visitAppRejected.html | 21 + .../src/templates/visitAppSubmited.html | 21 + Memphis.API/Emails/tailwind.config.js | 137 + Memphis.API/Emails/yarn.lock | 5192 +++++++++++++++++ .../Extensions/HttpContextExtensions.cs | 18 +- Memphis.API/Memphis.API.csproj | 4 + .../20231015030718_Updates.Designer.cs | 1236 ++++ .../Migrations/20231015030718_Updates.cs | 343 ++ ...231024181558_TrainingSchedules.Designer.cs | 1233 ++++ .../20231024181558_TrainingSchedules.cs | 307 + .../DatabaseContextModelSnapshot.cs | 255 +- Memphis.API/Program.cs | 16 +- Memphis.API/Services/EmailService.cs | 5 + Memphis.API/Services/LoggingService.cs | 2 +- Memphis.API/Services/RedisService.cs | 9 +- Memphis.API/Services/S3Service.cs | 35 +- Memphis.API/Validators/AirportValidator.cs | 4 +- Memphis.API/Validators/CommentValidator.cs | 14 + .../Validators/EventPositionValidator.cs | 4 +- .../Validators/EventRegistrationValidator.cs | 4 +- Memphis.API/Validators/EventValidator.cs | 4 +- Memphis.API/Validators/FaqValidator.cs | 4 +- Memphis.API/Validators/FeedbackValidator.cs | 15 + Memphis.API/Validators/FileValidator.cs | 15 + Memphis.API/Validators/OtsValidator.cs | 15 + Memphis.Shared/Dtos/AirportDto.cs | 7 + Memphis.Shared/Dtos/{ => Auth}/VatsimToken.cs | 4 +- Memphis.Shared/Dtos/{ => Auth}/VatsimUser.cs | 5 +- Memphis.Shared/Dtos/CommentDto.cs | 9 + Memphis.Shared/Dtos/EventDto.cs | 11 + Memphis.Shared/Dtos/EventPositionDto.cs | 10 + Memphis.Shared/Dtos/EventRegistrationDto.cs | 9 + Memphis.Shared/Dtos/FaqDto.cs | 8 + Memphis.Shared/Dtos/FeedbackDto.cs | 13 + Memphis.Shared/Dtos/FileDto.cs | 11 + Memphis.Shared/Dtos/HoursDto.cs | 14 + Memphis.Shared/Dtos/NotificationDto.cs | 10 + Memphis.Shared/Dtos/OtsDto.cs | 15 + Memphis.Shared/Dtos/RosterDto.cs | 19 + Memphis.Shared/Dtos/RosterUser.cs | 46 - Memphis.Shared/Enums/AirportCert.cs | 2 +- Memphis.Shared/Enums/CenterCert.cs | 2 +- .../Enums/EventRegistrationStatus.cs | 2 +- Memphis.Shared/Enums/FeedbackLevel.cs | 2 +- Memphis.Shared/Enums/FeedbackStatus.cs | 2 +- Memphis.Shared/Enums/FileType.cs | 2 +- Memphis.Shared/Enums/OtsStatus.cs | 2 +- Memphis.Shared/Enums/Rating.cs | 2 +- Memphis.Shared/Enums/TrainingRequestStatus.cs | 2 +- .../Enums/TrainingTicketPerformance.cs | 2 +- .../Enums/TrainingTicketPosition.cs | 2 +- .../Enums/VisitingApplicationStatus.cs | 3 +- Memphis.Shared/Models/Airport.cs | 2 +- Memphis.Shared/Models/Comment.cs | 6 +- Memphis.Shared/Models/EmailLog.cs | 2 +- Memphis.Shared/Models/Event.cs | 2 +- Memphis.Shared/Models/EventPosition.cs | 10 +- Memphis.Shared/Models/EventRegistration.cs | 20 +- Memphis.Shared/Models/Faq.cs | 2 +- Memphis.Shared/Models/Feedback.cs | 7 +- .../Models/FeedbackCannedResponse.cs | 8 - Memphis.Shared/Models/File.cs | 2 +- Memphis.Shared/Models/Hours.cs | 16 +- Memphis.Shared/Models/Notification.cs | 15 + Memphis.Shared/Models/OnlineController.cs | 2 +- Memphis.Shared/Models/Ots.cs | 13 +- Memphis.Shared/Models/Role.cs | 3 +- Memphis.Shared/Models/Session.cs | 5 +- Memphis.Shared/Models/Settings.cs | 2 +- Memphis.Shared/Models/TrainingMilestone.cs | 14 + Memphis.Shared/Models/TrainingRequest.cs | 19 - Memphis.Shared/Models/TrainingSchedule.cs | 12 + Memphis.Shared/Models/TrainingTicket.cs | 10 +- Memphis.Shared/Models/TrainingType.cs | 7 + Memphis.Shared/Models/User.cs | 1 + Memphis.Shared/Models/VisitingApplication.cs | 2 +- Memphis.Shared/Models/WebsiteLog.cs | 2 +- Memphis.Shared/Utils/Constants.cs | 91 +- Memphis.Shared/Utils/Helpers.cs | 2 +- Memphis.Shared/Utils/Response.cs | 2 +- 130 files changed, 10959 insertions(+), 552 deletions(-) create mode 100644 Memphis.API/Controllers/FilesController.cs create mode 100644 Memphis.API/Controllers/HoursController.cs create mode 100644 Memphis.API/Controllers/NotificationsController.cs create mode 100644 Memphis.API/Controllers/OnlineControllersController.cs create mode 100644 Memphis.API/Controllers/OtsController.cs create mode 100644 Memphis.API/Emails/.editorconfig create mode 100644 Memphis.API/Emails/.github/dependabot.yml create mode 100644 Memphis.API/Emails/.github/logo-dark.svg create mode 100644 Memphis.API/Emails/.github/logo-light.svg create mode 100644 Memphis.API/Emails/.gitignore create mode 100644 Memphis.API/Emails/LICENSE create mode 100644 Memphis.API/Emails/README.md create mode 100644 Memphis.API/Emails/config.js create mode 100644 Memphis.API/Emails/config.production.js create mode 100644 Memphis.API/Emails/package.json create mode 100644 Memphis.API/Emails/src/components/button.html create mode 100644 Memphis.API/Emails/src/components/divider.html create mode 100644 Memphis.API/Emails/src/components/spacer.html create mode 100644 Memphis.API/Emails/src/components/v-fill.html create mode 100644 Memphis.API/Emails/src/components/v-image.html create mode 100644 Memphis.API/Emails/src/css/resets.css create mode 100644 Memphis.API/Emails/src/css/tailwind.css create mode 100644 Memphis.API/Emails/src/css/utilities.css create mode 100644 Memphis.API/Emails/src/layouts/main.html create mode 100644 Memphis.API/Emails/src/templates/activityWarning.html create mode 100644 Memphis.API/Emails/src/templates/eventPositionAssigned.html create mode 100644 Memphis.API/Emails/src/templates/eventPositionRemoved.html create mode 100644 Memphis.API/Emails/src/templates/eventPositionUnassigned.html create mode 100644 Memphis.API/Emails/src/templates/eventRegistrationSubmitted.html create mode 100644 Memphis.API/Emails/src/templates/facilityJoin.html create mode 100644 Memphis.API/Emails/src/templates/facilityRemoval.html create mode 100644 Memphis.API/Emails/src/templates/feedbackApproved.html create mode 100644 Memphis.API/Emails/src/templates/feedbackReply.html create mode 100644 Memphis.API/Emails/src/templates/feedbackSubmitted.html create mode 100644 Memphis.API/Emails/src/templates/trainingRequestDropped.html create mode 100644 Memphis.API/Emails/src/templates/trainingRequestSubmitted.html create mode 100644 Memphis.API/Emails/src/templates/trainingRequestTaken.html create mode 100644 Memphis.API/Emails/src/templates/trainingTicketSubmitted.html create mode 100644 Memphis.API/Emails/src/templates/visitAppAccepted.html create mode 100644 Memphis.API/Emails/src/templates/visitAppRejected.html create mode 100644 Memphis.API/Emails/src/templates/visitAppSubmited.html create mode 100644 Memphis.API/Emails/tailwind.config.js create mode 100644 Memphis.API/Emails/yarn.lock create mode 100644 Memphis.API/Migrations/20231015030718_Updates.Designer.cs create mode 100644 Memphis.API/Migrations/20231015030718_Updates.cs create mode 100644 Memphis.API/Migrations/20231024181558_TrainingSchedules.Designer.cs create mode 100644 Memphis.API/Migrations/20231024181558_TrainingSchedules.cs create mode 100644 Memphis.API/Services/EmailService.cs create mode 100644 Memphis.API/Validators/CommentValidator.cs create mode 100644 Memphis.API/Validators/FeedbackValidator.cs create mode 100644 Memphis.API/Validators/FileValidator.cs create mode 100644 Memphis.API/Validators/OtsValidator.cs create mode 100644 Memphis.Shared/Dtos/AirportDto.cs rename Memphis.Shared/Dtos/{ => Auth}/VatsimToken.cs (95%) rename Memphis.Shared/Dtos/{ => Auth}/VatsimUser.cs (98%) create mode 100644 Memphis.Shared/Dtos/CommentDto.cs create mode 100644 Memphis.Shared/Dtos/EventDto.cs create mode 100644 Memphis.Shared/Dtos/EventPositionDto.cs create mode 100644 Memphis.Shared/Dtos/EventRegistrationDto.cs create mode 100644 Memphis.Shared/Dtos/FaqDto.cs create mode 100644 Memphis.Shared/Dtos/FeedbackDto.cs create mode 100644 Memphis.Shared/Dtos/FileDto.cs create mode 100644 Memphis.Shared/Dtos/HoursDto.cs create mode 100644 Memphis.Shared/Dtos/NotificationDto.cs create mode 100644 Memphis.Shared/Dtos/OtsDto.cs create mode 100644 Memphis.Shared/Dtos/RosterDto.cs delete mode 100644 Memphis.Shared/Dtos/RosterUser.cs delete mode 100644 Memphis.Shared/Models/FeedbackCannedResponse.cs create mode 100644 Memphis.Shared/Models/Notification.cs create mode 100644 Memphis.Shared/Models/TrainingMilestone.cs delete mode 100644 Memphis.Shared/Models/TrainingRequest.cs create mode 100644 Memphis.Shared/Models/TrainingSchedule.cs create mode 100644 Memphis.Shared/Models/TrainingType.cs diff --git a/.github/workflows/create-tag.yaml b/.github/workflows/create-tag.yaml index 4d1230c..ac2cca8 100644 --- a/.github/workflows/create-tag.yaml +++ b/.github/workflows/create-tag.yaml @@ -8,7 +8,7 @@ on: jobs: CreateTag: if: github.event.pull_request.merged == true - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest permissions: contents: write steps: diff --git a/Memphis.API/Controllers/AirportsController.cs b/Memphis.API/Controllers/AirportsController.cs index 1c4f136..c3d100e 100644 --- a/Memphis.API/Controllers/AirportsController.cs +++ b/Memphis.API/Controllers/AirportsController.cs @@ -3,6 +3,7 @@ using Memphis.API.Data; using Memphis.API.Extensions; using Memphis.API.Services; +using Memphis.Shared.Dtos; using Memphis.Shared.Models; using Memphis.Shared.Utils; using Microsoft.AspNetCore.Authorization; @@ -22,12 +23,12 @@ public class AirportsController : ControllerBase private readonly DatabaseContext _context; private readonly RedisService _redisService; private readonly LoggingService _loggingService; - private readonly IValidator _validator; + private readonly IValidator _validator; private readonly IHub _sentryHub; private readonly ILogger _logger; public AirportsController(DatabaseContext context, RedisService redisService, LoggingService loggingService, - IValidator validator, IHub sentryHub, ILogger logger) + IValidator validator, IHub sentryHub, ILogger logger) { _context = context; _redisService = redisService; @@ -39,17 +40,17 @@ public AirportsController(DatabaseContext context, RedisService redisService, Lo [HttpPost] - [Authorize(Roles = Constants.CAN_AIRPORTS)] + [Authorize(Roles = Constants.CanAirports)] [ProducesResponseType(typeof(Response), 200)] [ProducesResponseType(typeof(Response>), 400)] [ProducesResponseType(401)] [ProducesResponseType(403)] [ProducesResponseType(typeof(Response), 500)] - public async Task>> CreateAirport(Airport data) + public async Task>> CreateAirport(AirportDto data) { try { - if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CAN_AIRPORTS_LIST)) + if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CanAirportsList)) return StatusCode(401); var validation = await _validator.ValidateAsync(data); @@ -63,13 +64,16 @@ public async Task>> CreateAirport(Airport data) }); } - var result = await _context.Airports.AddAsync(data); + var result = await _context.Airports.AddAsync(new Airport + { + Name = data.Name, + Icao = data.Icao, + }); await _context.SaveChangesAsync(); var newData = JsonConvert.SerializeObject(result.Entity); await _loggingService.AddWebsiteLog(Request, $"Created airport {result.Entity.Id}", string.Empty, newData); - await _redisService.RemoveCached("airports"); - return CreatedAtAction(nameof(GetAirport), new { airportId = result.Entity.Id }, new Response + return Ok(new Response { StatusCode = 200, Message = $"Created airport '{result.Entity.Id}'", @@ -90,20 +94,7 @@ public async Task>>> GetAirports() { try { - var cached = await _redisService.GetCached("airports"); - _logger.LogDebug("Cached airports: {Airports}", cached); - if (cached != null) - { - var cachedResult = JsonConvert.DeserializeObject>(cached); - return Ok(new Response> - { - StatusCode = 200, - Message = $"Got {cachedResult?.Count} airports", - Data = cachedResult - }); - } var result = await _context.Airports.ToListAsync(); - await _redisService.SetCached("airports", JsonConvert.SerializeObject(result)); return Ok(new Response> { StatusCode = 200, @@ -151,19 +142,19 @@ public async Task>>> GetAirport(int airport } } - [HttpPut] - [Authorize(Roles = Constants.CAN_AIRPORTS)] + [HttpPut("{airportId:int}")] + [Authorize(Roles = Constants.CanAirports)] [ProducesResponseType(typeof(Response), 200)] [ProducesResponseType(typeof(Response>), 400)] [ProducesResponseType(401)] [ProducesResponseType(403)] - [ProducesResponseType(typeof(Response), 404)] + [ProducesResponseType(typeof(Response), 404)] [ProducesResponseType(typeof(Response), 500)] - public async Task>> UpdateAirport(Airport data) + public async Task>> UpdateAirport(int airportId, AirportDto data) { try { - if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CAN_AIRPORTS_LIST)) + if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CanAirportsList)) return StatusCode(401); var validation = await _validator.ValidateAsync(data); @@ -177,14 +168,13 @@ public async Task>> UpdateAirport(Airport data) }); } - var airport = await _context.Airports.FindAsync(data.Id); + var airport = await _context.Airports.FindAsync(airportId); if (airport == null) { - return NotFound(new Response + return NotFound(new Response { StatusCode = 404, - Message = $"Airport '{data.Id}' not found", - Data = data.Id + Message = $"Airport '{airportId}' not found", }); } @@ -197,7 +187,6 @@ public async Task>> UpdateAirport(Airport data) await _loggingService.AddWebsiteLog(Request, $"Updated airport '{airport.Id}'", oldData, newData); - await _redisService.RemoveCached("airports"); return Ok(new Response { StatusCode = 200, @@ -213,7 +202,7 @@ public async Task>> UpdateAirport(Airport data) } [HttpDelete("{airportId:int}")] - [Authorize(Roles = Constants.CAN_AIRPORTS)] + [Authorize(Roles = Constants.CanAirports)] [ProducesResponseType(typeof(Response), 200)] [ProducesResponseType(401)] [ProducesResponseType(403)] @@ -223,7 +212,7 @@ public async Task>> DeleteAirport(int airportId) { try { - if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CAN_AIRPORTS_LIST)) + if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CanAirportsList)) return StatusCode(401); var airport = await _context.Airports.FindAsync(airportId); @@ -256,4 +245,4 @@ public async Task>> DeleteAirport(int airportId) return _sentryHub.CaptureException(ex).ReturnActionResult(); } } -} +} \ No newline at end of file diff --git a/Memphis.API/Controllers/AuthController.cs b/Memphis.API/Controllers/AuthController.cs index e46b7c9..f052082 100644 --- a/Memphis.API/Controllers/AuthController.cs +++ b/Memphis.API/Controllers/AuthController.cs @@ -1,7 +1,7 @@ using Memphis.API.Data; using Memphis.API.Extensions; using Memphis.API.Services; -using Memphis.Shared.Dtos; +using Memphis.Shared.Dtos.auth; using Memphis.Shared.Enums; using Memphis.Shared.Utils; using Microsoft.AspNetCore.Mvc; @@ -25,7 +25,8 @@ public class AuthController : ControllerBase private readonly IHub _sentryHub; private readonly ILogger _logger; - public AuthController(DatabaseContext context, RedisService redisService, IHub sentryHub, ILogger logger) + public AuthController(DatabaseContext context, RedisService redisService, IHub sentryHub, + ILogger logger) { _context = context; _redisService = redisService; @@ -41,12 +42,13 @@ public async Task RedirectToVatsim() try { var authUrl = Environment.GetEnvironmentVariable("CONNECT_AUTH_URL") ?? - throw new ArgumentNullException("CONNECT_AUTH_URL env variable not found"); + throw new ArgumentNullException("CONNECT_AUTH_URL env variable not found"); var clientId = Environment.GetEnvironmentVariable("CONNECT_CLIENT_ID") ?? - throw new ArgumentNullException("CONNECT_CLIENT_ID env variable not found"); + throw new ArgumentNullException("CONNECT_CLIENT_ID env variable not found"); var redirectUrl = Environment.GetEnvironmentVariable("CONNECT_REDIRECT_URL") ?? - throw new ArgumentNullException("CONNECT_REDIRECT_URL env variable not found"); - var url = $"{authUrl}/oauth/authorize?client_id={clientId}&redirect_uri={redirectUrl}&response_type=code&scope=full_name+vatsim_details+email"; + throw new ArgumentNullException("CONNECT_REDIRECT_URL env variable not found"); + var url = + $"{authUrl}/oauth/authorize?client_id={clientId}&redirect_uri={redirectUrl}&response_type=code&scope=full_name+vatsim_details+email"; await Task.CompletedTask; return RedirectPreserveMethod(url); } @@ -64,23 +66,24 @@ public async Task ProcessCallback(string code) try { var authUrl = Environment.GetEnvironmentVariable("CONNECT_AUTH_URL") ?? - throw new ArgumentNullException("CONNECT_AUTH_URL env variable not found"); + throw new ArgumentNullException("CONNECT_AUTH_URL env variable not found"); var clientId = Environment.GetEnvironmentVariable("CONNECT_CLIENT_ID") ?? - throw new ArgumentNullException("CONNECT_CLIENT_ID env variable not found"); + throw new ArgumentNullException("CONNECT_CLIENT_ID env variable not found"); var clientSecret = Environment.GetEnvironmentVariable("CONNECT_CLIENT_SECRET") ?? - throw new ArgumentNullException("CONNECT_CLIENT_SECRET env variable not found"); + throw new ArgumentNullException("CONNECT_CLIENT_SECRET env variable not found"); var redirectUrl = Environment.GetEnvironmentVariable("CONNECT_REDIRECT_URL") ?? - throw new ArgumentNullException("CONNECT_REDIRECT_URL env variable not found"); + throw new ArgumentNullException("CONNECT_REDIRECT_URL env variable not found"); var uiRedirect = Environment.GetEnvironmentVariable("CONNEXT_REDIRECT_URL_UI") ?? - throw new ArgumentNullException("CONNEXT_REDIRECT_URL_UI env variable not found"); + throw new ArgumentNullException("CONNEXT_REDIRECT_URL_UI env variable not found"); var issuer = Environment.GetEnvironmentVariable("JWT_ISSUER") ?? - throw new ArgumentNullException("JWT_ISSUER env variable not found"); + throw new ArgumentNullException("JWT_ISSUER env variable not found"); var audience = Environment.GetEnvironmentVariable("JWT_AUDIENCE") ?? - throw new ArgumentNullException("JWT_AUDIENCE env variable not found"); + throw new ArgumentNullException("JWT_AUDIENCE env variable not found"); var secret = Environment.GetEnvironmentVariable("JWT_SECRET") ?? - throw new ArgumentNullException("JWT_SECRET env variable not found"); + throw new ArgumentNullException("JWT_SECRET env variable not found"); var expirationDays = int.Parse(Environment.GetEnvironmentVariable("JWT_ACCESS_EXPIRATION") ?? - throw new ArgumentNullException("JWT_ACCESS_EXPIRATION env variable not found")); + throw new ArgumentNullException( + "JWT_ACCESS_EXPIRATION env variable not found")); var tokenRequest = new FormUrlEncodedContent(new Dictionary { @@ -101,7 +104,8 @@ public async Task ProcessCallback(string code) var token = JsonConvert.DeserializeObject(content); if (token == null) { - _logger.LogError("Invalid VATSIM token response:\nconnect response code: {Code}\ncontent: {Content}", response.StatusCode, content); + _logger.LogError("Invalid VATSIM token response:\nconnect response code: {Code}\ncontent: {Content}", + response.StatusCode, content); throw new InvalidDataException("Invalid VATSIM token response"); } @@ -110,21 +114,22 @@ public async Task ProcessCallback(string code) if (data == null) { - _logger.LogError("Invalid VATSIM data response:\nconnect response code: {Code}\ndata: {Data}", response.StatusCode, data); + _logger.LogError("Invalid VATSIM data response:\nconnect response code: {Code}\ndata: {Data}", + response.StatusCode, data); throw new InvalidDataException("Invalid VATSIM data response"); } var claims = new List() { - new Claim("cid", $"{data.Data.Cid}"), - new Claim("email", data.Data.PersonalDetails.Email), - new Claim("fullName", data.Data.PersonalDetails.NameFull), - new Claim("firstName", data.Data.PersonalDetails.NameFirst), - new Claim("lastName", data.Data.PersonalDetails.NameLast), - new Claim("rating", $"{data.Data.VatsimDetails.ControllerRating.Id}"), - new Claim("ratingLong", data.Data.VatsimDetails.ControllerRating.Long), - new Claim("region", data.Data.VatsimDetails.Region.Id), - new Claim("division", data.Data.VatsimDetails.Division.Id), + new("cid", $"{data.Data.Cid}"), + new("email", data.Data.PersonalDetails.Email), + new("fullName", data.Data.PersonalDetails.NameFull), + new("firstName", data.Data.PersonalDetails.NameFirst), + new("lastName", data.Data.PersonalDetails.NameLast), + new("rating", $"{data.Data.VatsimDetails.ControllerRating.Id}"), + new("ratingLong", data.Data.VatsimDetails.ControllerRating.Long), + new("region", data.Data.VatsimDetails.Region.Id), + new("division", data.Data.VatsimDetails.Division.Id), }; var user = await _context.Users.Include(x => x.Roles).FirstOrDefaultAsync(x => x.Id == data.Data.Cid); @@ -138,7 +143,8 @@ public async Task ProcessCallback(string code) claims, expires: DateTime.UtcNow.AddDays(expirationDays), signingCredentials: new SigningCredentials( - new SymmetricSecurityKey(Encoding.ASCII.GetBytes(secret)), SecurityAlgorithms.HmacSha256Signature + new SymmetricSecurityKey(Encoding.ASCII.GetBytes(secret)), + SecurityAlgorithms.HmacSha256Signature ) ); var accessTokenNone = new JwtSecurityTokenHandler().WriteToken(jwtNone); diff --git a/Memphis.API/Controllers/CommentsController.cs b/Memphis.API/Controllers/CommentsController.cs index c78cf75..cb62337 100644 --- a/Memphis.API/Controllers/CommentsController.cs +++ b/Memphis.API/Controllers/CommentsController.cs @@ -3,6 +3,7 @@ using Memphis.API.Data; using Memphis.API.Extensions; using Memphis.API.Services; +using Memphis.Shared.Dtos; using Memphis.Shared.Models; using Memphis.Shared.Utils; using Microsoft.AspNetCore.Authorization; @@ -22,12 +23,12 @@ public class CommentsController : ControllerBase private readonly DatabaseContext _context; private readonly RedisService _redisService; private readonly LoggingService _loggingService; - private readonly IValidator _validator; + private readonly IValidator _validator; private readonly IHub _sentryHub; private readonly ILogger _logger; public CommentsController(DatabaseContext context, RedisService redisService, LoggingService loggingService, - IValidator validator, IHub sentryHub, ILogger logger) + IValidator validator, IHub sentryHub, ILogger logger) { _context = context; _redisService = redisService; @@ -38,22 +39,23 @@ public CommentsController(DatabaseContext context, RedisService redisService, Lo } [HttpPost] - [Authorize(Roles = Constants.CAN_COMMENT)] + [Authorize(Roles = Constants.CanComment)] [ProducesResponseType(typeof(Response), 200)] [ProducesResponseType(typeof(Response>), 400)] [ProducesResponseType(401)] [ProducesResponseType(403)] [ProducesResponseType(typeof(Response), 404)] [ProducesResponseType(typeof(Response), 500)] - public async Task>> CreateComment(Comment data) + public async Task>> CreateComment(CommentDto data) { try { - if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CAN_COMMENT_LIST)) + if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CanCommentList)) return StatusCode(401); // Check if they can add a confidential comment - if (data.Confidential && !await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CAN_COMMENT_CONFIDENTIAL_LIST)) + if (data.Confidential && + !await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CanCommentConfidentialList)) return StatusCode(401); var validation = await _validator.ValidateAsync(data); @@ -67,7 +69,8 @@ public async Task>> CreateComment(Comment data) }); } - if (!await _context.Users.AnyAsync(x => x.Id == data.UserId)) + var user = await _context.Users.FindAsync(data.UserId); + if (user == null) { return NotFound(new Response { @@ -77,7 +80,7 @@ public async Task>> CreateComment(Comment data) }); } - var submitter = Request.HttpContext.GetCid(); + var submitter = await Request.HttpContext.GetUser(_context); if (submitter == null) { return NotFound(new Response @@ -88,15 +91,21 @@ public async Task>> CreateComment(Comment data) }); } - data.SubmitterId = submitter ?? 0; - - var result = await _context.Comments.AddAsync(data); + var result = await _context.Comments.AddAsync(new Comment + { + User = user, + Submitter = submitter, + Confidential = data.Confidential, + Title = data.Title, + Description = data.Description, + }); await _context.SaveChangesAsync(); var newData = JsonConvert.SerializeObject(result.Entity); - await _loggingService.AddWebsiteLog(Request, $"Created comment '{result.Entity.Id}'", string.Empty, newData); + await _loggingService.AddWebsiteLog(Request, $"Created comment '{result.Entity.Id}'", string.Empty, + newData); - return StatusCode(201, new Response + return Ok(new Response { StatusCode = 200, Message = $"Created comment '{result.Entity.Id}'", @@ -111,7 +120,7 @@ public async Task>> CreateComment(Comment data) } [HttpGet("{userId:int}")] - [Authorize(Roles = $"{Constants.CAN_COMMENT},{Constants.CAN_COMMENT_CONFIDENTIAL}")] + [Authorize(Roles = $"{Constants.CanComment},{Constants.CanCommentConfidential}")] [ProducesResponseType(typeof(ResponsePaging>), 200)] [ProducesResponseType(401)] [ProducesResponseType(403)] @@ -121,7 +130,8 @@ public async Task>>> GetComments(int userId { try { - if (!await _context.Users.AnyAsync(x => x.Id == userId)) + var user = await _context.Users.FindAsync(userId); + if (user == null) { return NotFound(new Response { @@ -130,15 +140,16 @@ public async Task>>> GetComments(int userId Data = userId }); } - if (await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CAN_COMMENT_CONFIDENTIAL_LIST)) + + if (await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CanCommentConfidentialList)) { var confidentialResult = await _context.Comments - .Where(x => x.UserId == userId) + .Where(x => x.User == user) .OrderBy(x => x.Timestamp) .Skip((page - 1) * size).Take(size) .ToListAsync(); var confidentialTotalCount = await _context.Comments - .Where(x => x.UserId == userId).CountAsync(); + .Where(x => x.User == user).CountAsync(); return Ok(new ResponsePaging> { StatusCode = 200, @@ -148,16 +159,16 @@ public async Task>>> GetComments(int userId Data = confidentialResult }); } - else if (await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CAN_COMMENT_LIST)) + else if (await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CanCommentList)) { var result = await _context.Comments - .Where(x => x.UserId == userId) + .Where(x => x.User == user) .Where(x => !x.Confidential) .OrderBy(x => x.Timestamp) .Skip((page - 1) * size).Take(size) .ToListAsync(); var totalCount = await _context.Comments - .Where(x => x.UserId == userId) + .Where(x => x.User == user) .Where(x => !x.Confidential) .OrderBy(x => x.Timestamp).CountAsync(); return Ok(new ResponsePaging> @@ -169,6 +180,7 @@ public async Task>>> GetComments(int userId Data = result }); } + return StatusCode(401); } catch (Exception ex) @@ -179,7 +191,7 @@ public async Task>>> GetComments(int userId } [HttpDelete("{commentId:int}")] - [Authorize(Roles = Constants.SENIOR_STAFF)] + [Authorize(Roles = Constants.SeniorStaff)] [ProducesResponseType(typeof(Response), 200)] [ProducesResponseType(401)] [ProducesResponseType(403)] @@ -189,7 +201,7 @@ public async Task>>> GetComments(int userId { try { - if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.SENIOR_STAFF_LIST)) + if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.SeniorStaffList)) return StatusCode(401); var comment = await _context.Comments.FindAsync(commentId); @@ -202,6 +214,7 @@ public async Task>>> GetComments(int userId Data = commentId }); } + var oldData = JsonConvert.SerializeObject(comment); _context.Comments.Remove(comment); await _context.SaveChangesAsync(); @@ -220,4 +233,4 @@ public async Task>>> GetComments(int userId return _sentryHub.CaptureException(ex).ReturnActionResult(); } } -} +} \ No newline at end of file diff --git a/Memphis.API/Controllers/EmailLogsController.cs b/Memphis.API/Controllers/EmailLogsController.cs index 7d505e5..a295e7d 100644 --- a/Memphis.API/Controllers/EmailLogsController.cs +++ b/Memphis.API/Controllers/EmailLogsController.cs @@ -29,14 +29,14 @@ public EmailLogsController(DatabaseContext context, RedisService redisService, I } [HttpGet] - [Authorize(Roles = Constants.CAN_EMAIL_LOGS)] + [Authorize(Roles = Constants.CanEmailLogs)] [ProducesResponseType(typeof(Response>), 200)] [ProducesResponseType(typeof(Response), 500)] public async Task>>> GetEmailLogs(int page, int size, string? to = null) { try { - if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CAN_EMAIL_LOGS_LIST)) + if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CanEmailLogsList)) return StatusCode(401); var raw = _context.EmailLogs.OrderBy(x => x.Timestamp); @@ -59,4 +59,4 @@ public async Task>>> GetEmailLogs(in return _sentryHub.CaptureException(ex).ReturnActionResult(); } } -} +} \ No newline at end of file diff --git a/Memphis.API/Controllers/EventPositionsController.cs b/Memphis.API/Controllers/EventPositionsController.cs index b212f62..e2b3102 100644 --- a/Memphis.API/Controllers/EventPositionsController.cs +++ b/Memphis.API/Controllers/EventPositionsController.cs @@ -3,6 +3,7 @@ using Memphis.API.Data; using Memphis.API.Extensions; using Memphis.API.Services; +using Memphis.Shared.Dtos; using Memphis.Shared.Models; using Memphis.Shared.Utils; using Microsoft.AspNetCore.Authorization; @@ -22,36 +23,34 @@ public class EventPositionsController : ControllerBase private readonly DatabaseContext _context; private readonly RedisService _redisService; private readonly LoggingService _loggingService; - private readonly S3Service _s3Service; - private readonly IValidator _validator; + private readonly IValidator _validator; private readonly IHub _sentryHub; private readonly ILogger _logger; public EventPositionsController(DatabaseContext context, RedisService redisService, LoggingService loggingService, - S3Service s3Service, IValidator validator, IHub sentryHub, ILogger logger) + IValidator validator, IHub sentryHub, ILogger logger) { _context = context; _redisService = redisService; _loggingService = loggingService; - _s3Service = s3Service; _validator = validator; _sentryHub = sentryHub; _logger = logger; } [HttpPost] - [Authorize(Roles = Constants.CAN_EVENTS)] + [Authorize(Roles = Constants.CanEvents)] [ProducesResponseType(typeof(Response), 200)] [ProducesResponseType(typeof(Response>), 400)] [ProducesResponseType(401)] [ProducesResponseType(403)] [ProducesResponseType(typeof(Response), 404)] [ProducesResponseType(typeof(Response), 500)] - public async Task>> CreateEventPosition(EventPosition data) + public async Task>> CreateEventPosition(EventPositionDto data) { try { - if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CAN_EVENTS_LIST)) + if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CanEventsList)) return StatusCode(401); var validation = await _validator.ValidateAsync(data); @@ -65,7 +64,8 @@ public async Task>> CreateEventPosition(Eve }); } - if (!await _context.Events.AnyAsync(x => x.Id == data.EventId)) + var @event = await _context.Events.FindAsync(data.EventId); + if (@event == null) { return NotFound(new Response { @@ -74,11 +74,18 @@ public async Task>> CreateEventPosition(Eve }); } - var result = await _context.EventPositions.AddAsync(data); + var result = await _context.EventPositions.AddAsync(new EventPosition + { + Event = @event, + Name = data.Name, + MinRating = data.MinRating, + Available = true + }); await _context.SaveChangesAsync(); var newData = JsonConvert.SerializeObject(result.Entity); - await _loggingService.AddWebsiteLog(Request, $"Created event position '{result.Entity.Id}'", string.Empty, newData); + await _loggingService.AddWebsiteLog(Request, $"Created event position '{result.Entity.Id}'", string.Empty, + newData); return Ok(new Response { @@ -102,9 +109,19 @@ public async Task>>> GetEventPosition { try { - if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.ALL_STAFF_LIST)) + var @event = await _context.Events.FindAsync(eventId); + if (@event == null) + { + return NotFound(new Response + { + StatusCode = 404, + Message = $"Event '{eventId}' not found" + }); + } + + if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.AllStaffList)) { - if (!await _context.Events.AnyAsync(x => x.Id == eventId && x.IsOpen)) + if (!@event.IsOpen) { return NotFound(new Response { @@ -112,7 +129,8 @@ public async Task>>> GetEventPosition Message = $"Event '{eventId}' not found" }); } - var result = await _context.EventPositions.Where(x => x.EventId == eventId).ToListAsync(); + + var result = await _context.EventPositions.Where(x => x.Event == @event).ToListAsync(); return Ok(new Response> { StatusCode = 200, @@ -122,15 +140,7 @@ public async Task>>> GetEventPosition } else { - if (!await _context.Events.AnyAsync(x => x.Id == eventId)) - { - return NotFound(new Response - { - StatusCode = 404, - Message = $"Event '{eventId}' not found" - }); - } - var result = await _context.EventPositions.Where(x => x.EventId == eventId).ToListAsync(); + var result = await _context.EventPositions.Where(x => x.Event == @event).ToListAsync(); return Ok(new Response> { StatusCode = 200, @@ -147,7 +157,7 @@ public async Task>>> GetEventPosition } [HttpDelete("Positions/{eventPositionId:int}")] - [Authorize(Roles = Constants.CAN_EVENTS)] + [Authorize(Roles = Constants.CanEvents)] [ProducesResponseType(typeof(Response), 200)] [ProducesResponseType(401)] [ProducesResponseType(403)] @@ -157,7 +167,7 @@ public async Task>>> GetEventPosition { try { - if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CAN_EVENTS_LIST)) + if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CanEventsList)) return StatusCode(401); var eventPosition = await _context.EventPositions.FindAsync(eventPositionId); @@ -169,7 +179,9 @@ public async Task>>> GetEventPosition Message = $"Event position '{eventPositionId}' not found" }); } - var eventRegistrations = await _context.EventRegistrations.Where(x => x.EventPositionId == eventPositionId).ToListAsync(); + + var eventRegistrations = + await _context.EventRegistrations.Where(x => x.EventPosition == eventPosition).ToListAsync(); // Delete registrations that are for the given position foreach (var entry in eventRegistrations) @@ -179,7 +191,8 @@ public async Task>>> GetEventPosition // todo: send email that position was removed _context.EventRegistrations.Remove(entry); await _context.SaveChangesAsync(); - await _loggingService.AddWebsiteLog(Request, $"Deleted event position '{entry.Id}'", registrationOldData, string.Empty); + await _loggingService.AddWebsiteLog(Request, $"Deleted event position '{entry.Id}'", + registrationOldData, string.Empty); } // Now delete the position @@ -187,7 +200,8 @@ public async Task>>> GetEventPosition _context.EventPositions.Remove(eventPosition); await _context.SaveChangesAsync(); - await _loggingService.AddWebsiteLog(Request, $"Deleted event position '{eventPositionId}'", oldData, string.Empty); + await _loggingService.AddWebsiteLog(Request, $"Deleted event position '{eventPositionId}'", oldData, + string.Empty); return Ok(new Response { @@ -201,4 +215,4 @@ public async Task>>> GetEventPosition return _sentryHub.CaptureException(ex).ReturnActionResult(); } } -} +} \ No newline at end of file diff --git a/Memphis.API/Controllers/EventRegistrationController.cs b/Memphis.API/Controllers/EventRegistrationController.cs index 4141a27..ad0ef4e 100644 --- a/Memphis.API/Controllers/EventRegistrationController.cs +++ b/Memphis.API/Controllers/EventRegistrationController.cs @@ -3,6 +3,7 @@ using Memphis.API.Data; using Memphis.API.Extensions; using Memphis.API.Services; +using Memphis.Shared.Dtos; using Memphis.Shared.Enums; using Memphis.Shared.Models; using Memphis.Shared.Utils; @@ -24,12 +25,14 @@ public class EventRegistrationController : ControllerBase private readonly RedisService _redisService; private readonly LoggingService _loggingService; private readonly S3Service _s3Service; - private readonly IValidator _validator; + private readonly IValidator _validator; private readonly IHub _sentryHub; private readonly ILogger _logger; - public EventRegistrationController(DatabaseContext context, RedisService redisService, LoggingService loggingService, - S3Service s3Service, IValidator validator, IHub sentryHub, ILogger logger) + public EventRegistrationController(DatabaseContext context, RedisService redisService, + LoggingService loggingService, + S3Service s3Service, IValidator validator, IHub sentryHub, + ILogger logger) { _context = context; _redisService = redisService; @@ -41,18 +44,19 @@ public EventRegistrationController(DatabaseContext context, RedisService redisSe } [HttpPost] - [Authorize(Roles = Constants.CAN_REGISTER_FOR_EVENTS)] + [Authorize(Roles = Constants.CanRegisterForEvents)] [ProducesResponseType(typeof(Response), 200)] [ProducesResponseType(typeof(Response>), 400)] [ProducesResponseType(401)] [ProducesResponseType(403)] [ProducesResponseType(typeof(Response), 404)] [ProducesResponseType(typeof(Response), 500)] - public async Task>> CreateEventRegistration(EventRegistration data) + public async Task>> CreateEventRegistration(EventRegistrationDto data) { try { - if (!await _redisService.ValidateRoles(Request.HttpContext.User, new string[] { Constants.CAN_REGISTER_FOR_EVENTS })) + if (!await _redisService.ValidateRoles(Request.HttpContext.User, + new[] { Constants.CanRegisterForEvents })) return StatusCode(401); var validation = await _validator.ValidateAsync(data); @@ -75,6 +79,7 @@ public async Task>> CreateEventRegistra Message = $"Event '{data.EventId}' not found" }); } + var position = await _context.EventPositions.FindAsync(data.EventPositionId); if (position == null) { @@ -84,6 +89,7 @@ public async Task>> CreateEventRegistra Message = $"Event position '{data.EventPositionId}' not found" }); } + var user = await Request.HttpContext.GetUser(_context); if (user == null) { @@ -95,7 +101,7 @@ public async Task>> CreateEventRegistra } var existingRegistrations = await _context.EventRegistrations - .AnyAsync(x => x.EventId == data.EventId && x.UserId == user.Id); + .AnyAsync(x => x.Event == @event && x.User == user); var failures = new List(); if (existingRegistrations) { @@ -112,6 +118,7 @@ public async Task>> CreateEventRegistra Data = failures }); } + if (user.Rating < position.MinRating) { failures.Add(new ValidationFailure @@ -121,48 +128,57 @@ public async Task>> CreateEventRegistra ErrorMessage = $"User rating is less than {position.MinRating}", }); } + if (data.Start < @event.Start.AddMinutes(-1)) { failures.Add(new ValidationFailure { PropertyName = nameof(data.Start), AttemptedValue = data.Start, - ErrorMessage = $"Registration start '{data.Start:u}' is invalid, must be after event start '{@event.Start:u}'", + ErrorMessage = + $"Registration start '{data.Start:u}' is invalid, must be after event start '{@event.Start:u}'", }); } + if (data.Start > @event.End.AddMinutes(1)) { failures.Add(new ValidationFailure { PropertyName = nameof(data.Start), AttemptedValue = data.Start, - ErrorMessage = $"Registration start '{data.Start:u}' is invalid, must be before event end '{@event.End:u}'", + ErrorMessage = + $"Registration start '{data.Start:u}' is invalid, must be before event end '{@event.End:u}'", }); } + if (data.End < @event.Start.AddMinutes(-1)) { failures.Add(new ValidationFailure { PropertyName = nameof(data.End), AttemptedValue = data.End, - ErrorMessage = $"Registration end '{data.End:u}' is invalid, must be after event start '{@event.Start:u}'", + ErrorMessage = + $"Registration end '{data.End:u}' is invalid, must be after event start '{@event.Start:u}'", }); } + if (data.End > @event.End.AddMinutes(1)) { failures.Add(new ValidationFailure { PropertyName = nameof(data.End), AttemptedValue = data.End, - ErrorMessage = $"Registration start '{data.End:u}' is invalid, must be before event end '{@event.End:u}'", + ErrorMessage = + $"Registration start '{data.End:u}' is invalid, must be before event end '{@event.End:u}'", }); } + if (!user.CanRegisterForEvents) { failures.Add(new ValidationFailure { - PropertyName = nameof(data.UserId), - AttemptedValue = data.UserId, + PropertyName = nameof(data.EventId), + AttemptedValue = data.EventId, ErrorMessage = "User may not sign up for events", }); } @@ -177,15 +193,21 @@ public async Task>> CreateEventRegistra }); } - data.UserId = user.Id; - - var result = await _context.EventRegistrations.AddAsync(data); + var result = await _context.EventRegistrations.AddAsync(new EventRegistration + { + User = user, + Event = @event, + EventPosition = position, + Start = data.Start, + End = data.End + }); await _context.SaveChangesAsync(); var newData = JsonConvert.SerializeObject(result.Entity); // todo: send confirmation email - await _loggingService.AddWebsiteLog(Request, $"Created event registration '{result.Entity.Id}'", string.Empty, newData); + await _loggingService.AddWebsiteLog(Request, $"Created event registration '{result.Entity.Id}'", + string.Empty, newData); return Ok(new Response { @@ -211,7 +233,8 @@ public async Task>> GetOwnEventRegistra { try { - if (!await _context.Events.AnyAsync(x => x.Id == eventId)) + var @event = await _context.Events.FindAsync(eventId); + if (@event == null) { return NotFound(new Response { @@ -219,6 +242,7 @@ public async Task>> GetOwnEventRegistra Message = $"Event '{eventId}' not found" }); } + var user = await Request.HttpContext.GetUser(_context); if (user == null) { @@ -229,7 +253,8 @@ public async Task>> GetOwnEventRegistra }); } - var result = await _context.EventRegistrations.FirstOrDefaultAsync(x => x.EventId == eventId && x.UserId == user.Id); + var result = + await _context.EventRegistrations.FirstOrDefaultAsync(x => x.Event == @event && x.User == user); if (result == null) { return NotFound(new Response @@ -254,7 +279,7 @@ public async Task>> GetOwnEventRegistra } [HttpGet("Registrations/{eventId:int}")] - [Authorize(Roles = Constants.CAN_EVENTS)] + [Authorize(Roles = Constants.CanEvents)] [ProducesResponseType(401)] [ProducesResponseType(403)] [ProducesResponseType(typeof(Response>), 200)] @@ -264,10 +289,11 @@ public async Task>>> GetEventRegi { try { - if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CAN_EVENTS_LIST)) + if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CanEventsList)) return StatusCode(401); - if (!await _context.Events.AnyAsync(x => x.Id == eventId)) + var @event = await _context.Events.FindAsync(eventId); + if (@event == null) { return NotFound(new Response { @@ -276,7 +302,7 @@ public async Task>>> GetEventRegi }); } - var result = await _context.EventRegistrations.Where(x => x.EventId == eventId).ToListAsync(); + var result = await _context.EventRegistrations.Where(x => x.Event == @event).ToListAsync(); return Ok(new Response> { StatusCode = 200, @@ -292,20 +318,22 @@ public async Task>>> GetEventRegi } [HttpPut("assign/{eventRegistrationId:int}")] - [Authorize(Roles = Constants.CAN_EVENTS)] + [Authorize(Roles = Constants.CanEvents)] [ProducesResponseType(401)] [ProducesResponseType(403)] [ProducesResponseType(typeof(Response), 200)] [ProducesResponseType(typeof(Response), 404)] [ProducesResponseType(typeof(Response), 500)] - public async Task>> AssignEventRegistration(int eventRegistrationId, bool relief) + public async Task>> AssignEventRegistration(int eventRegistrationId, + bool relief) { try { - if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CAN_EVENTS_LIST)) + if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CanEventsList)) return StatusCode(401); - var eventRegistration = await _context.EventRegistrations.FindAsync(eventRegistrationId); + var eventRegistration = await _context.EventRegistrations.Include(x => x.EventPosition) + .FirstOrDefaultAsync(x => x.Id == eventRegistrationId); if (eventRegistration == null) { return NotFound(new Response @@ -336,27 +364,18 @@ await _loggingService.AddWebsiteLog(Request, }); } - var eventPosition = await _context.EventPositions.FindAsync(eventRegistration.EventPositionId); - if (eventPosition == null) - { - return NotFound(new Response - { - StatusCode = 404, - Message = $"Event position '{eventRegistration.EventPositionId}' not found" - }); - } - var oldData = JsonConvert.SerializeObject(eventRegistration); eventRegistration.Status = EventRegistrationStatus.ASSIGNED; eventRegistration.Updated = DateTimeOffset.UtcNow; - eventPosition.Available = false; + eventRegistration.EventPosition.Available = false; await _context.SaveChangesAsync(); var newData = JsonConvert.SerializeObject(eventRegistration); // todo: send email await _loggingService.AddWebsiteLog(Request, - $"Assigned event registration '{eventRegistrationId}' to event position '{eventPosition.Id}'", oldData, newData); + $"Assigned event registration '{eventRegistrationId}' to event position '{eventRegistration.EventPosition.Id}'", + oldData, newData); return Ok(new Response { @@ -382,7 +401,8 @@ public async Task>> DeleteOwnEventRegistration(int { try { - if (!await _context.Events.AnyAsync(x => x.Id == eventId)) + var @event = await _context.Events.FindAsync(eventId); + if (@event == null) { return NotFound(new Response { @@ -390,6 +410,7 @@ public async Task>> DeleteOwnEventRegistration(int Message = $"Event '{eventId}' not found" }); } + var user = await Request.HttpContext.GetUser(_context); if (user == null) { @@ -399,7 +420,9 @@ public async Task>> DeleteOwnEventRegistration(int Message = "User not found" }); } - var registration = await _context.EventRegistrations.FirstOrDefaultAsync(x => x.EventId == eventId && x.UserId == user.Id); + + var registration = await _context.EventRegistrations.Include(x => x.EventPosition) + .FirstOrDefaultAsync(x => x.Event == @event && x.User == user); if (registration == null) { return NotFound(new Response @@ -408,24 +431,16 @@ public async Task>> DeleteOwnEventRegistration(int Message = "Event registration not found" }); } - var position = await _context.EventPositions.FindAsync(registration.EventPositionId); - if (position == null) - { - return NotFound(new Response - { - StatusCode = 404, - Message = "Event position not found" - }); - } var oldData = JsonConvert.SerializeObject(registration); _context.EventRegistrations.Remove(registration); await _context.SaveChangesAsync(); - position.Available = true; + registration.EventPosition.Available = true; await _context.SaveChangesAsync(); - await _loggingService.AddWebsiteLog(Request, $"User deleted event registration '{registration.Id}'", oldData, string.Empty); + await _loggingService.AddWebsiteLog(Request, $"User deleted event registration '{registration.Id}'", + oldData, string.Empty); // todo: send confirmation email return Ok(new Response @@ -441,8 +456,8 @@ public async Task>> DeleteOwnEventRegistration(int } } - [HttpDelete("{evenRegistrationtId:int}")] - [Authorize(Roles = Constants.CAN_EVENTS)] + [HttpDelete("{eventRegistrationId:int}")] + [Authorize(Roles = Constants.CanEvents)] [ProducesResponseType(401)] [ProducesResponseType(typeof(Response), 200)] [ProducesResponseType(typeof(Response), 404)] @@ -451,10 +466,11 @@ public async Task>> DeleteEventRegistration(int ev { try { - if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CAN_EVENTS_LIST)) + if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CanEventsList)) return StatusCode(401); - var registration = await _context.EventRegistrations.FindAsync(eventRegistrationId); + var registration = await _context.EventRegistrations.Include(x => x.EventPosition) + .FirstOrDefaultAsync(x => x.Id == eventRegistrationId); if (registration == null) { return NotFound(new Response @@ -463,24 +479,16 @@ public async Task>> DeleteEventRegistration(int ev Message = $"Event registration '{eventRegistrationId}' not found" }); } - var position = await _context.EventPositions.FindAsync(registration.EventPositionId); - if (position == null) - { - return NotFound(new Response - { - StatusCode = 404, - Message = $"Event position '{registration.EventPositionId}' not found" - }); - } var oldData = JsonConvert.SerializeObject(registration); _context.EventRegistrations.Remove(registration); await _context.SaveChangesAsync(); - position.Available = true; + registration.EventPosition.Available = true; await _context.SaveChangesAsync(); - await _loggingService.AddWebsiteLog(Request, $"Deleted event registration '{registration.Id}'", oldData, string.Empty); + await _loggingService.AddWebsiteLog(Request, $"Deleted event registration '{registration.Id}'", oldData, + string.Empty); return Ok(new Response { @@ -494,4 +502,4 @@ public async Task>> DeleteEventRegistration(int ev return _sentryHub.CaptureException(ex).ReturnActionResult(); } } -} +} \ No newline at end of file diff --git a/Memphis.API/Controllers/EventsController.cs b/Memphis.API/Controllers/EventsController.cs index 631841d..40ec6fc 100644 --- a/Memphis.API/Controllers/EventsController.cs +++ b/Memphis.API/Controllers/EventsController.cs @@ -3,6 +3,7 @@ using Memphis.API.Data; using Memphis.API.Extensions; using Memphis.API.Services; +using Memphis.Shared.Dtos; using Memphis.Shared.Models; using Memphis.Shared.Utils; using Microsoft.AspNetCore.Authorization; @@ -23,12 +24,12 @@ public class EventsController : ControllerBase private readonly RedisService _redisService; private readonly LoggingService _loggingService; private readonly S3Service _s3Service; - private readonly IValidator _validator; + private readonly IValidator _validator; private readonly IHub _sentryHub; private readonly ILogger _logger; public EventsController(DatabaseContext context, RedisService redisService, LoggingService loggingService, - S3Service s3Service, IValidator validator, IHub sentryHub, ILogger logger) + S3Service s3Service, IValidator validator, IHub sentryHub, ILogger logger) { _context = context; _redisService = redisService; @@ -40,17 +41,17 @@ public EventsController(DatabaseContext context, RedisService redisService, Logg } [HttpPost] - [Authorize(Roles = Constants.CAN_EVENTS)] + [Authorize(Roles = Constants.CanEvents)] [ProducesResponseType(typeof(Response), 200)] [ProducesResponseType(typeof(Response>), 400)] [ProducesResponseType(401)] [ProducesResponseType(403)] [ProducesResponseType(typeof(Response), 500)] - public async Task>> CreateEvent(Event data) + public async Task>> CreateEvent(EventDto data) { try { - if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CAN_EVENTS_LIST)) + if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CanEventsList)) return StatusCode(401); var validation = await _validator.ValidateAsync(data); @@ -81,8 +82,17 @@ public async Task>> CreateEvent(Event data) }); } - data.BannerUrl = await _s3Service.UploadFile(Request, "events"); - var result = await _context.Events.AddAsync(data); + var bannerUrl = await _s3Service.UploadFile(Request, "events"); + var result = await _context.Events.AddAsync(new Event + { + Title = data.Title, + Description = data.Description, + Host = data.Host, + BannerUrl = bannerUrl, + Start = data.Start, + End = data.End, + IsOpen = data.IsOpen + }); await _context.SaveChangesAsync(); var newData = JsonConvert.SerializeObject(result.Entity); @@ -109,10 +119,11 @@ public async Task>> GetEvents(int page = 1, int siz { try { - var getClosed = await _redisService.ValidateRoles(Request.HttpContext.User, Constants.ALL_STAFF_LIST); + var getClosed = await _redisService.ValidateRoles(Request.HttpContext.User, Constants.AllStaffList); if (getClosed) { - var result = await _context.Events.OrderBy(x => x.Start).Skip((page - 1) * size).Take(size).ToListAsync(); + var result = await _context.Events.OrderBy(x => x.Start).Skip((page - 1) * size).Take(size) + .ToListAsync(); var totalCount = await _context.Events.Where(x => x.IsOpen).OrderBy(x => x.Start).CountAsync(); return Ok(new ResponsePaging> { @@ -125,7 +136,8 @@ public async Task>> GetEvents(int page = 1, int siz } else { - var result = await _context.Events.OrderBy(x => x.Start).Where(x => x.IsOpen).Skip((page - 1) * size).Take(size).ToListAsync(); + var result = await _context.Events.OrderBy(x => x.Start).Where(x => x.IsOpen).Skip((page - 1) * size) + .Take(size).ToListAsync(); var totalCount = await _context.Events.Where(x => x.IsOpen).OrderBy(x => x.Start).CountAsync(); return Ok(new ResponsePaging> { @@ -136,7 +148,6 @@ public async Task>> GetEvents(int page = 1, int siz Data = result }); } - } catch (Exception ex) { @@ -153,7 +164,7 @@ public async Task>> GetEvent(int eventId) { try { - var getClosed = await _redisService.ValidateRoles(Request.HttpContext.User, Constants.ALL_STAFF_LIST); + var getClosed = await _redisService.ValidateRoles(Request.HttpContext.User, Constants.AllStaffList); var result = await _context.Events.FindAsync(eventId); if (result == null) { @@ -163,6 +174,7 @@ public async Task>> GetEvent(int eventId) Message = $"Event '{eventId}' not found" }); } + if (!getClosed && !result.IsOpen) { return NotFound(new Response @@ -171,6 +183,7 @@ public async Task>> GetEvent(int eventId) Message = $"Event '{eventId}' not found" }); } + return Ok(new Response { StatusCode = 200, @@ -185,19 +198,19 @@ public async Task>> GetEvent(int eventId) } } - [HttpPut] - [Authorize(Roles = Constants.CAN_EVENTS)] + [HttpPut("{eventId:int}")] + [Authorize(Roles = Constants.CanEvents)] [ProducesResponseType(typeof(Response), 200)] [ProducesResponseType(typeof(Response>), 400)] [ProducesResponseType(401)] [ProducesResponseType(403)] [ProducesResponseType(typeof(Response), 404)] [ProducesResponseType(typeof(Response), 500)] - public async Task>> UpdateEvent(Event data) + public async Task>> UpdateEvent(int eventId, EventDto data) { try { - if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CAN_EVENTS_LIST)) + if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CanEventsList)) return StatusCode(401); var validation = await _validator.ValidateAsync(data); @@ -211,13 +224,13 @@ public async Task>> UpdateEvent(Event data) }); } - var @event = await _context.Events.FindAsync(data.Id); + var @event = await _context.Events.FindAsync(eventId); if (@event == null) { return NotFound(new Response { StatusCode = 404, - Message = $"Event '{data.Id}' not found" + Message = $"Event '{eventId}' not found" }); } @@ -236,6 +249,7 @@ public async Task>> UpdateEvent(Event data) { @event.BannerUrl = await _s3Service.UploadFile(Request, "events"); } + @event.Start = data.Start; @event.End = data.End; @event.IsOpen = data.IsOpen; @@ -261,7 +275,7 @@ public async Task>> UpdateEvent(Event data) [HttpDelete("{eventId:int}")] - [Authorize(Roles = Constants.CAN_EVENTS)] + [Authorize(Roles = Constants.CanEvents)] [ProducesResponseType(typeof(Response), 200)] [ProducesResponseType(401)] [ProducesResponseType(403)] @@ -271,7 +285,7 @@ public async Task>> UpdateEvent(Event data) { try { - if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CAN_EVENTS_LIST)) + if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CanEventsList)) return StatusCode(401); var @event = await _context.Events.FindAsync(eventId); @@ -307,4 +321,4 @@ public async Task>> UpdateEvent(Event data) return _sentryHub.CaptureException(ex).ReturnActionResult(); } } -} +} \ No newline at end of file diff --git a/Memphis.API/Controllers/FaqController.cs b/Memphis.API/Controllers/FaqController.cs index bcdbc71..e4db159 100644 --- a/Memphis.API/Controllers/FaqController.cs +++ b/Memphis.API/Controllers/FaqController.cs @@ -3,6 +3,7 @@ using Memphis.API.Data; using Memphis.API.Extensions; using Memphis.API.Services; +using Memphis.Shared.Dtos; using Memphis.Shared.Models; using Memphis.Shared.Utils; using Microsoft.AspNetCore.Authorization; @@ -22,12 +23,12 @@ public class FaqController : ControllerBase private readonly DatabaseContext _context; private readonly RedisService _redisService; private readonly LoggingService _loggingService; - private readonly IValidator _validator; + private readonly IValidator _validator; private readonly IHub _sentryHub; private readonly ILogger _logger; public FaqController(DatabaseContext context, RedisService redisService, LoggingService loggingService, - IValidator validator, IHub sentryHub, ILogger logger) + IValidator validator, IHub sentryHub, ILogger logger) { _context = context; _redisService = redisService; @@ -38,17 +39,17 @@ public FaqController(DatabaseContext context, RedisService redisService, Logging } [HttpPost] - [Authorize(Roles = Constants.CAN_FAQ)] + [Authorize(Roles = Constants.CanFaq)] [ProducesResponseType(typeof(Response), 200)] [ProducesResponseType(typeof(Response>), 400)] [ProducesResponseType(401)] [ProducesResponseType(403)] [ProducesResponseType(typeof(Response), 500)] - public async Task>> CreateFaq(Faq data) + public async Task>> CreateFaq(FaqDto data) { try { - if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CAN_FAQ_LIST)) + if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CanFaqList)) return StatusCode(401); var validation = await _validator.ValidateAsync(data); @@ -62,7 +63,12 @@ public async Task>> CreateFaq(Faq data) }); } - var result = await _context.Faq.AddAsync(data); + var result = await _context.Faq.AddAsync(new Faq + { + Question = data.Question, + Answer = data.Answer, + Order = data.Order, + }); await _context.SaveChangesAsync(); var newData = JsonConvert.SerializeObject(result.Entity); @@ -89,7 +95,7 @@ public async Task>> GetFaqs() { try { - var result = await _context.Faq.OrderBy(x => x.Order).OrderBy(x => x.Question).ToListAsync(); + var result = await _context.Faq.OrderBy(x => x.Order).ThenBy(x => x.Question).ToListAsync(); return Ok(new Response> { StatusCode = 200, @@ -104,19 +110,19 @@ public async Task>> GetFaqs() } } - [HttpPut] - [Authorize(Roles = Constants.CAN_FAQ)] + [HttpPut("{faqId:int}")] + [Authorize(Roles = Constants.CanFaq)] [ProducesResponseType(typeof(Response), 200)] [ProducesResponseType(typeof(Response>), 400)] [ProducesResponseType(401)] [ProducesResponseType(403)] [ProducesResponseType(typeof(Response), 404)] [ProducesResponseType(typeof(Response), 500)] - public async Task>> UpdateFaq(Faq data) + public async Task>> UpdateFaq(int faqId, FaqDto data) { try { - if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CAN_FAQ_LIST)) + if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CanFaqList)) return StatusCode(401); var validation = await _validator.ValidateAsync(data); @@ -130,13 +136,13 @@ public async Task>> UpdateFaq(Faq data) }); } - var faq = await _context.Faq.FindAsync(data.Id); + var faq = await _context.Faq.FindAsync(faqId); if (faq == null) { return NotFound(new Response { StatusCode = 404, - Message = $"FAQ '{data.Id}' not found" + Message = $"FAQ '{faqId}' not found" }); } @@ -165,7 +171,7 @@ public async Task>> UpdateFaq(Faq data) } [HttpDelete("{faqId:int}")] - [Authorize(Roles = Constants.CAN_FAQ)] + [Authorize(Roles = Constants.CanFaq)] [ProducesResponseType(typeof(Response), 200)] [ProducesResponseType(401)] [ProducesResponseType(403)] @@ -175,7 +181,7 @@ public async Task>> UpdateFaq(Faq data) { try { - if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CAN_FAQ_LIST)) + if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CanFaqList)) return StatusCode(401); var faq = await _context.Faq.FindAsync(faqId); @@ -205,4 +211,4 @@ public async Task>> UpdateFaq(Faq data) return _sentryHub.CaptureException(ex).ReturnActionResult(); } } -} +} \ No newline at end of file diff --git a/Memphis.API/Controllers/FeedbackController.cs b/Memphis.API/Controllers/FeedbackController.cs index b64777b..701d61d 100644 --- a/Memphis.API/Controllers/FeedbackController.cs +++ b/Memphis.API/Controllers/FeedbackController.cs @@ -3,12 +3,16 @@ using Memphis.API.Data; using Memphis.API.Extensions; using Memphis.API.Services; +using Memphis.Shared.Dtos; +using Memphis.Shared.Enums; using Memphis.Shared.Models; using Memphis.Shared.Utils; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; using Newtonsoft.Json; using Sentry; +using Constants = Memphis.Shared.Utils.Constants; namespace Memphis.API.Controllers; @@ -20,12 +24,12 @@ public class FeedbackController : ControllerBase private readonly DatabaseContext _context; private readonly RedisService _redisService; private readonly LoggingService _loggingService; - private readonly IValidator _validator; + private readonly IValidator _validator; private readonly IHub _sentryHub; private readonly ILogger _logger; public FeedbackController(DatabaseContext context, RedisService redisService, LoggingService loggingService, - IValidator validator, IHub sentryHub, ILogger logger) + IValidator validator, IHub sentryHub, ILogger logger) { _context = context; _redisService = redisService; @@ -43,7 +47,7 @@ public FeedbackController(DatabaseContext context, RedisService redisService, Lo [ProducesResponseType(403)] [ProducesResponseType(typeof(Response), 404)] [ProducesResponseType(typeof(Response), 500)] - public async Task>> CreateFeedback(Feedback data) + public async Task>> CreateFeedback(FeedbackDto data) { try { @@ -58,8 +62,8 @@ public async Task>> CreateFeedback(Feedback data }); } - var user = await _context.Users.FindAsync(data.ControllerId); - if (user == null) + var controller = await _context.Users.FindAsync(data.ControllerId); + if (controller == null) { return NotFound(new Response { @@ -68,13 +72,21 @@ public async Task>> CreateFeedback(Feedback data }); } - data.ControllerName = $"{user.FirstName} {user.LastName}"; - - var result = await _context.Feedback.AddAsync(data); + var result = await _context.Feedback.AddAsync(new Feedback + { + Cid = Request.HttpContext.GetCid() ?? 0, + Name = Request.HttpContext.GetName() ?? string.Empty, + Email = Request.HttpContext.GetEmail() ?? string.Empty, + Controller = controller, + ControllerCallsign = data.ControllerCallsign, + Description = data.Description, + Level = data.Level + }); await _context.SaveChangesAsync(); var newData = JsonConvert.SerializeObject(result.Entity); - await _loggingService.AddWebsiteLog(Request, $"Created feedback '{result.Entity.Id}'", string.Empty, newData); + await _loggingService.AddWebsiteLog(Request, $"Created feedback '{result.Entity.Id}'", string.Empty, + newData); return Ok(new Response { @@ -85,7 +97,226 @@ public async Task>> CreateFeedback(Feedback data } catch (Exception ex) { + _logger.LogError("CreateFeedback error '{Message}'\n{StackTrace}", ex.Message, ex.StackTrace); + return _sentryHub.CaptureException(ex).ReturnActionResult(); + } + } + + [HttpGet] + [Authorize(Roles = Constants.CanFeedback)] + [ProducesResponseType(typeof(Response), 200)] + [ProducesResponseType(401)] + [ProducesResponseType(403)] + [ProducesResponseType(typeof(Response), 404)] + [ProducesResponseType(typeof(Response), 500)] + public async Task>>> GetAllFeedback( + FeedbackStatus status = FeedbackStatus.PENDING, int page = 1, int size = 10) + { + try + { + if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CanFeedbackList)) + return StatusCode(401); + + var result = await _context.Feedback.OrderBy(x => x.Created) + .Where(x => x.Status == status).Skip((page - 1) * size).Take(size).ToListAsync(); + + return Ok(new Response> + { + StatusCode = 200, + Message = $"Got {result.Count} feedback", + Data = result + }); + } + catch (Exception ex) + { + _logger.LogError("GetAllFeedback error '{Message}'\n{StackTrace}", ex.Message, ex.StackTrace); + return _sentryHub.CaptureException(ex).ReturnActionResult(); + } + } + + [HttpGet("{feedbackId:int}")] + [Authorize(Roles = Constants.CanFeedback)] + [ProducesResponseType(typeof(Response), 200)] + [ProducesResponseType(401)] + [ProducesResponseType(403)] + [ProducesResponseType(typeof(Response), 404)] + [ProducesResponseType(typeof(Response), 500)] + public async Task>> GetFeedback(int feedbackId) + { + try + { + if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CanFeedbackList)) + return StatusCode(401); + + var result = await _context.Feedback.FindAsync(feedbackId); + if (result == null) + { + return NotFound(new Response + { + StatusCode = 404, + Message = $"Feedback '{feedbackId}' not found", + }); + } + + return Ok(new Response + { + StatusCode = 200, + Message = $"Got feedback '{result.Id}'", + Data = result + }); + } + catch (Exception ex) + { + _logger.LogError("GetFeedback error '{Message}'\n{StackTrace}", ex.Message, ex.StackTrace); + return _sentryHub.CaptureException(ex).ReturnActionResult(); + } + } + + [HttpGet("own")] + [Authorize] + [ProducesResponseType(typeof(Response), 200)] + [ProducesResponseType(401)] + [ProducesResponseType(403)] + [ProducesResponseType(typeof(Response), 404)] + [ProducesResponseType(typeof(Response), 500)] + public async Task>>> GetOwnFeedback(int page = 1, int size = 10) + { + try + { + var controller = await Request.HttpContext.GetUser(_context); + if (controller == null) + { + return NotFound(new Response + { + StatusCode = 404, + Message = "User not found", + }); + } + + var result = await _context.Feedback + .Where(x => x.Controller == controller && x.Status == FeedbackStatus.APPROVED) + .Skip((page - 1) * size).Take(size).ToListAsync(); + var totalCount = await _context.Feedback + .Where(x => x.Controller == controller && x.Status == FeedbackStatus.APPROVED) + .CountAsync(); + return Ok(new ResponsePaging> + { + StatusCode = 200, + TotalCount = totalCount, + ResultCount = result.Count, + Message = $"Got {result.Count} feedback", + Data = result + }); + } + catch (Exception ex) + { + _logger.LogError("GetOwnFeedback error '{Message}'\n{StackTrace}", ex.Message, ex.StackTrace); + return _sentryHub.CaptureException(ex).ReturnActionResult(); + } + } + + [HttpPut("{feedbackId:int}")] + [Authorize(Roles = Constants.CanFeedback)] + [ProducesResponseType(typeof(Response), 200)] + [ProducesResponseType(typeof(Response>), 400)] + [ProducesResponseType(401)] + [ProducesResponseType(403)] + [ProducesResponseType(typeof(Response), 404)] + [ProducesResponseType(typeof(Response), 500)] + public async Task>> UpdateFeedback(int feedbackId, FeedbackDto data) + { + try + { + if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CanFeedbackList)) + return StatusCode(401); + + var validation = await _validator.ValidateAsync(data); + if (!validation.IsValid) + { + return BadRequest(new Response> + { + StatusCode = 400, + Message = "Validation failure", + Data = validation.Errors + }); + } + + var feedback = await _context.Feedback.FindAsync(feedbackId); + if (feedback == null) + { + return NotFound(new Response + { + StatusCode = 404, + Message = $"Feedback '{feedbackId}' not found" + }); + } + + var oldData = JsonConvert.SerializeObject(feedback); + feedback.Reply = data.Reply; + feedback.Status = data.Status; + feedback.Updated = DateTimeOffset.UtcNow; + await _context.SaveChangesAsync(); + var newData = JsonConvert.SerializeObject(feedback); + + await _loggingService.AddWebsiteLog(Request, $"Updated feedback '{feedback.Id}'", oldData, newData); + + // todo: send email to person with reply-to of staff member who processed feedback if reply was not null + // todo: send email to controller if feedback was approved + + return Ok(new Response + { + StatusCode = 200, + Message = $"Updated feedback '{feedback.Id}'", + Data = feedback + }); + } + catch (Exception ex) + { + _logger.LogError("UpdateFeedback error '{Message}'\n{StackTrace}", ex.Message, ex.StackTrace); + return _sentryHub.CaptureException(ex).ReturnActionResult(); + } + } + + [HttpDelete("{feedbackId:int}")] + [Authorize(Roles = Constants.CanFeedback)] + [ProducesResponseType(typeof(Response), 200)] + [ProducesResponseType(401)] + [ProducesResponseType(403)] + [ProducesResponseType(typeof(Response), 404)] + [ProducesResponseType(typeof(Response), 500)] + public async Task>> DeleteFeedback(int feedbackId) + { + try + { + if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CanFeedbackList)) + return StatusCode(401); + + var result = await _context.Feedback.FindAsync(feedbackId); + if (result == null) + { + return NotFound(new Response + { + StatusCode = 404, + Message = $"Feedback '{feedbackId}' not found" + }); + } + + var oldData = JsonConvert.SerializeObject(result); + _context.Feedback.Remove(result); + await _context.SaveChangesAsync(); + + await _loggingService.AddWebsiteLog(Request, $"Deleted feedback '{feedbackId}'", oldData, string.Empty); + + return Ok(new Response + { + StatusCode = 200, + Message = $"Deleted feedback '{feedbackId}'" + }); + } + catch (Exception ex) + { + _logger.LogError("DeleteFeedback error '{Message}'\n{StackTrace}", ex.Message, ex.StackTrace); return _sentryHub.CaptureException(ex).ReturnActionResult(); } } -} +} \ No newline at end of file diff --git a/Memphis.API/Controllers/FilesController.cs b/Memphis.API/Controllers/FilesController.cs new file mode 100644 index 0000000..1c7edd7 --- /dev/null +++ b/Memphis.API/Controllers/FilesController.cs @@ -0,0 +1,266 @@ +using FluentValidation; +using FluentValidation.Results; +using Memphis.API.Data; +using Memphis.API.Extensions; +using Memphis.API.Services; +using Memphis.Shared.Dtos; +using Memphis.Shared.Enums; +using Memphis.Shared.Utils; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Newtonsoft.Json; +using Sentry; +using Constants = Memphis.Shared.Utils.Constants; +using File = Memphis.Shared.Models.File; + +namespace Memphis.API.Controllers; + +[ApiController] +[Route("[controller]")] +[Produces("application/json")] +public class FilesController : ControllerBase +{ + private readonly DatabaseContext _context; + private readonly RedisService _redisService; + private readonly S3Service _s3Service; + private readonly LoggingService _loggingService; + private readonly IValidator _validator; + private readonly IHub _sentryHub; + private readonly ILogger _logger; + + public FilesController(DatabaseContext context, RedisService redisService, S3Service s3Service, + LoggingService loggingService, IValidator validator, IHub sentryHub, ILogger logger) + { + _context = context; + _redisService = redisService; + _loggingService = loggingService; + _validator = validator; + _sentryHub = sentryHub; + _logger = logger; + _s3Service = s3Service; + } + + [HttpPost] + [Authorize(Roles = Constants.CanFiles)] + [ProducesResponseType(typeof(Response), 200)] + [ProducesResponseType(typeof(Response>), 400)] + [ProducesResponseType(401)] + [ProducesResponseType(403)] + [ProducesResponseType(typeof(Response), 404)] + [ProducesResponseType(typeof(Response), 500)] + public async Task>> CreateFile(FileDto data) + { + try + { + if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CanFilesList)) + return StatusCode(401); + + var validation = await _validator.ValidateAsync(data); + if (!validation.IsValid) + { + return BadRequest(new Response> + { + StatusCode = 400, + Message = "Validation failure", + Data = validation.Errors + }); + } + + var file = Request.Form.Files.FirstOrDefault(); + if (file == null) + { + return BadRequest(new Response> + { + StatusCode = 400, + Message = "No file to upload", + Data = new List + { + new ValidationFailure + { + PropertyName = "file", + AttemptedValue = file, + ErrorMessage = "No file to upload" + } + } + }); + } + + var fileUrl = await _s3Service.UploadFile(Request, "files"); + var result = await _context.Files.AddAsync(new File + { + Title = data.Title, + Description = data.Description, + Version = data.Version, + FileUrl = fileUrl, + Type = data.Type + }); + var newData = JsonConvert.SerializeObject(result.Entity); + await _loggingService.AddWebsiteLog(Request, $"Created file '{result.Entity.Id}'", string.Empty, newData); + + return Ok(new Response + { + StatusCode = 200, + Message = $"Created file '{result.Entity.Id}'", + Data = result.Entity + }); + } + catch (Exception ex) + { + _logger.LogError("CreateFile error '{Message}'\n{StackTrace}", ex.Message, ex.StackTrace); + return _sentryHub.CaptureException(ex).ReturnActionResult(); + } + } + + [HttpGet] + [ProducesResponseType(typeof(Response), 200)] + [ProducesResponseType(typeof(Response), 404)] + [ProducesResponseType(typeof(Response), 500)] + public async Task>>> GetFiles() + { + try + { + var isStaff = await _redisService.ValidateRoles(Request.HttpContext.User, Constants.AllStaffList); + var isSeniorStaff = + await _redisService.ValidateRoles(Request.HttpContext.User, Constants.SeniorStaffList); + var isTrainingStaff = + await _redisService.ValidateRoles(Request.HttpContext.User, Constants.TrainingStaffList); + var resultQuery = _context.Files.AsQueryable(); + if (!isStaff) + { + resultQuery = resultQuery.Where(x => x.Type != FileType.STAFF); + } + + if (!isSeniorStaff) + { + resultQuery = resultQuery.Where(x => x.Type != FileType.SENIOR_STAFF); + } + + if (!isTrainingStaff) + { + resultQuery = resultQuery.Where(x => x.Type != FileType.TRAINING_STAFF); + } + + var result = await resultQuery.ToListAsync(); + return Ok(new Response> + { + StatusCode = 200, + Message = $"Got {result.Count} files", + Data = result + }); + } + catch (Exception ex) + { + _logger.LogError("GetFiles error '{Message}'\n{StackTrace}", ex.Message, ex.StackTrace); + return _sentryHub.CaptureException(ex).ReturnActionResult(); + } + } + + [HttpGet("{fileId:int}")] + [ProducesResponseType(typeof(Response), 200)] + [ProducesResponseType(401)] + [ProducesResponseType(403)] + [ProducesResponseType(typeof(Response), 404)] + [ProducesResponseType(typeof(Response), 500)] + public async Task>> GetFile(int fileId) + { + try + { + var result = await _context.Files.FindAsync(fileId); + if (result == null) + { + return NotFound(new Response + { + StatusCode = 400, + Message = $"File '{fileId}' not found" + }); + } + + return Ok(new Response + { + StatusCode = 200, + Message = $"Got file '{fileId}'", + Data = result + }); + } + catch (Exception ex) + { + _logger.LogError("GetFile error '{Message}'\n{StackTrace}", ex.Message, ex.StackTrace); + return _sentryHub.CaptureException(ex).ReturnActionResult(); + } + } + + [HttpPut("{fileId:int}")] + [Authorize(Roles = Constants.CanFiles)] + [ProducesResponseType(typeof(Response), 200)] + [ProducesResponseType(typeof(Response>), 400)] + [ProducesResponseType(401)] + [ProducesResponseType(403)] + [ProducesResponseType(typeof(Response), 404)] + [ProducesResponseType(typeof(Response), 500)] + public async Task>> UpdateFile(int fileId, FileDto data) + { + try + { + if (!await _redisService.ValidateRoles(Request.HttpContext.User, Constants.CanFilesList)) + return StatusCode(401); + + var validation = await _validator.ValidateAsync(data); + if (!validation.IsValid) + { + return BadRequest(new Response> + { + StatusCode = 400, + Message = "Validation failure", + Data = validation.Errors + }); + } + + var file = await _context.Files.FindAsync(fileId); + if (file == null) + { + return NotFound(new Response + { + StatusCode = 404, + Message = $"File '{fileId}' not found" + }); + } + + var oldData = JsonConvert.SerializeObject(file); + + if (Request.Form.Files.Any()) + { + if (file.FileUrl != null) + { + await _s3Service.DeleteFile(file.FileUrl); + var newUrl = await _s3Service.UploadFile(Request, "files"); + if (newUrl != null) + { + file.FileUrl = newUrl; + } + } + } + + file.Title = data.Title; + file.Description = data.Description; + file.Version = data.Version; + file.Type = data.Type; + await _context.SaveChangesAsync(); + var newData = JsonConvert.SerializeObject(file); + + await _loggingService.AddWebsiteLog(Request, $"Updated file '{fileId}'", oldData, newData); + + return Ok(new Response + { + StatusCode = 200, + Message = $"Updated file '{fileId}'", + Data = file + }); + } + catch (Exception ex) + { + _logger.LogError("UpdateFile error '{Message}'\n{StackTrace}", ex.Message, ex.StackTrace); + return _sentryHub.CaptureException(ex).ReturnActionResult(); + } + } +} \ No newline at end of file diff --git a/Memphis.API/Controllers/HoursController.cs b/Memphis.API/Controllers/HoursController.cs new file mode 100644 index 0000000..e06bdf3 --- /dev/null +++ b/Memphis.API/Controllers/HoursController.cs @@ -0,0 +1,202 @@ +using Memphis.API.Data; +using Memphis.API.Extensions; +using Memphis.Shared.Dtos; +using Memphis.Shared.Models; +using Memphis.Shared.Utils; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Sentry; + +namespace Memphis.API.Controllers; + +[ApiController] +[Route("[controller]")] +[Produces("application/json")] +public class HoursController : ControllerBase +{ + private readonly DatabaseContext _context; + private readonly IHub _sentryHub; + private readonly ILogger _logger; + + public HoursController(DatabaseContext context, IHub sentryHub, ILogger logger) + { + _context = context; + _sentryHub = sentryHub; + _logger = logger; + } + + [HttpGet] + [ProducesResponseType(typeof(Response>), 200)] + [ProducesResponseType(typeof(Response), 500)] + public async Task>> GetHours(int? month, int? year) + { + try + { + month ??= DateTimeOffset.UtcNow.Month; + year ??= DateTimeOffset.UtcNow.Year; + + var hours = await _context.Hours.Include(x => x.User) + .Include(x => x.User.Roles).Where(x => x.Month == month && x.Year == year) + .OrderBy(x => x.User.LastName).ToListAsync(); + + var result = new List(); + foreach (var entry in hours) + { + var userEntry = new RosterUserDto + { + Cid = entry.User.Id, + Name = $"{entry.User.FirstName} {entry.User.LastName}", + Initials = entry.User.Initials, + Rating = Helpers.GetRatingName(entry.User.Rating), + Status = entry.User.Status, + Visitor = entry.User.Visitor, + VisitorFrom = entry.User.VisitorFrom, + Minor = entry.User.Minor, + Major = entry.User.Major, + Center = entry.User.Center, + Roles = entry.User.Roles?.ToList() ?? new List() + }; + result.Add(new HoursDto + { + Month = entry.Month, + Year = entry.Year, + User = userEntry, + DeliveryHours = entry.DeliveryHours, + GroundHours = entry.GroundHours, + TowerHours = entry.TowerHours, + ApproachHours = entry.ApproachHours, + CenterHours = entry.CenterHours + }); + } + + // Get all users who didn't get any hours so create a HoursDto wih 0 hours for each + var userIds = result.Select(x => x.User.Cid).ToList(); + var usersNoHours = await _context.Users.Include(x => x.Roles) + .Where(x => !userIds.Contains(x.Id)).ToListAsync(); + + foreach (var entry in usersNoHours) + { + var userEntry = new RosterUserDto + { + Cid = entry.Id, + Name = $"{entry.FirstName} {entry.LastName}", + Initials = entry.Initials, + Rating = Helpers.GetRatingName(entry.Rating), + Status = entry.Status, + Visitor = entry.Visitor, + VisitorFrom = entry.VisitorFrom, + Minor = entry.Minor, + Major = entry.Major, + Center = entry.Center, + Roles = entry.Roles?.ToList() ?? new List() + }; + result.Add(new HoursDto + { + Month = month ?? 0, + Year = year ?? 0, + User = userEntry, + DeliveryHours = 0.0, + GroundHours = 0.0, + TowerHours = 0.0, + ApproachHours = 0.0, + CenterHours = 0.0 + }); + } + + return Ok(new Response> + { + StatusCode = 200, + Message = $"Got {result.Count} hours entries", + Data = result + }); + } + catch (Exception ex) + { + _logger.LogError("GetHours error '{Message}'\n{StackTrace}", ex.Message, ex.StackTrace); + return _sentryHub.CaptureException(ex).ReturnActionResult(); + } + } + + [HttpGet("{cid:int}")] + [ProducesResponseType(typeof(Response>), 200)] + [ProducesResponseType(typeof(Response), 404)] + [ProducesResponseType(typeof(Response), 500)] + public async Task>>> GetUserHours(int cid) + { + try + { + var user = await _context.Users.Include(x => x.Roles).FirstOrDefaultAsync(x => x.Id == cid); + if (user == null) + { + return NotFound(new Response + { + StatusCode = 404, + Message = $"User '{cid}' not found" + }); + } + + var result = new List(); + var now = DateTimeOffset.UtcNow; + var userEntry = new RosterUserDto + { + Cid = user.Id, + Name = $"{user.FirstName} {user.LastName}", + Initials = user.Initials, + Rating = Helpers.GetRatingName(user.Rating), + Status = user.Status, + Visitor = user.Visitor, + VisitorFrom = user.VisitorFrom, + Minor = user.Minor, + Major = user.Major, + Center = user.Center, + Roles = user.Roles?.ToList() ?? new List() + }; + for (var i = 0; i < 12; i++) + { + var hours = await _context.Hours.Include(x => x.User).Include(x => x.User.Roles) + .Where(x => x.User == user && x.Month == now.Month && x.Year == now.Year).FirstOrDefaultAsync(); + if (hours == null) + { + result.Add(new HoursDto + { + Month = now.Month, + Year = now.Year, + User = userEntry, + DeliveryHours = 0.0, + GroundHours = 0.0, + TowerHours = 0.0, + ApproachHours = 0.0, + CenterHours = 0.0 + }); + now = now.AddMonths(-1); + continue; + } + + result.Add(new HoursDto + { + Month = now.Month, + Year = now.Year, + User = userEntry, + DeliveryHours = hours.DeliveryHours, + GroundHours = hours.GroundHours, + TowerHours = hours.TowerHours, + ApproachHours = hours.ApproachHours, + CenterHours = hours.CenterHours + }); + now = now.AddMonths(-1); + } + + return Ok(new Response> + { + StatusCode = 200, + Message = $"Got {result.Count} hours entries", + Data = result + }); + } + catch (Exception ex) + { + _logger.LogError("GetUserHours error '{Message}'\n{StackTrace}", ex.Message, ex.StackTrace); + return _sentryHub.CaptureException(ex).ReturnActionResult(); + } + } +} \ No newline at end of file diff --git a/Memphis.API/Controllers/NotificationsController.cs b/Memphis.API/Controllers/NotificationsController.cs new file mode 100644 index 0000000..3fed569 --- /dev/null +++ b/Memphis.API/Controllers/NotificationsController.cs @@ -0,0 +1,83 @@ +using Memphis.API.Data; +using Memphis.API.Extensions; +using Memphis.API.Services; +using Memphis.Shared.Dtos; +using Memphis.Shared.Utils; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Sentry; + +namespace Memphis.API.Controllers; + +[ApiController] +[Route("[controller]")] +[Produces("application/json")] +public class NotificationsController : ControllerBase +{ + private readonly DatabaseContext _context; + private readonly RedisService _redisService; + private readonly LoggingService _loggingService; + private readonly IHub _sentryHub; + private readonly ILogger _logger; + + public NotificationsController(DatabaseContext context, RedisService redisService, LoggingService loggingService, + IHub sentryHub, ILogger logger) + { + _context = context; + _redisService = redisService; + _loggingService = loggingService; + _sentryHub = sentryHub; + _logger = logger; + } + + [HttpGet] + [Authorize] + [ProducesResponseType(typeof(Response>), 200)] + [ProducesResponseType(401)] + [ProducesResponseType(403)] + [ProducesResponseType(typeof(Response), 404)] + [ProducesResponseType(typeof(Response), 500)] + public async Task>>> GetNotifications() + { + try + { + var user = await Request.HttpContext.GetUser(_context); + if (user == null) + { + return NotFound(new Response + { + StatusCode = 404, + Message = "User not found" + }); + } + + var notifications = await _context.Notifications.Where(x => x.User == user).OrderBy(x => x.Timestamp) + .ToListAsync(); + var result = new List(); + foreach (var entry in notifications) + { + result.Add(new NotificationDto + { + Id = entry.Id, + Title = entry.Title, + Link = entry.Link, + Read = entry.Read, + Timestamp = entry.Timestamp, + }); + } + + return Ok(new Response> + { + StatusCode = 200, + Message = $"Got {result.Count} notifications", + Data = result + }); + } + catch (Exception ex) + { + _logger.LogError("GetNotifications error '{Message}'\n{StackTrace}", ex.Message, ex.StackTrace); + return _sentryHub.CaptureException(ex).ReturnActionResult(); + } + } +} \ No newline at end of file diff --git a/Memphis.API/Controllers/OnlineControllersController.cs b/Memphis.API/Controllers/OnlineControllersController.cs new file mode 100644 index 0000000..a575f4a --- /dev/null +++ b/Memphis.API/Controllers/OnlineControllersController.cs @@ -0,0 +1,49 @@ +using Memphis.API.Data; +using Memphis.API.Extensions; +using Memphis.Shared.Models; +using Memphis.Shared.Utils; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Sentry; + +namespace Memphis.API.Controllers; + +[ApiController] +[Route("[controller]")] +[Produces("application/json")] +public class OnlineControllersController : ControllerBase +{ + private readonly DatabaseContext _context; + private readonly IHub _sentryHub; + private readonly ILogger _logger; + + public OnlineControllersController(DatabaseContext context, IHub sentryHub, + ILogger logger) + { + _context = context; + _sentryHub = sentryHub; + _logger = logger; + } + + [HttpGet] + [ProducesResponseType(typeof(Response>), 200)] + [ProducesResponseType(typeof(Response), 500)] + public async Task>>> GetOnlineControllers() + { + try + { + var result = await _context.OnlineControllers.OrderBy(x => x.Name).ToListAsync(); + return Ok(new Response> + { + StatusCode = 200, + Message = $"Got {result.Count} online controllers", + Data = result + }); + } + catch (Exception ex) + { + _logger.LogError("GetOnlineControllers error '{Message}'\n{StackTrace}", ex.Message, ex.StackTrace); + return _sentryHub.CaptureException(ex).ReturnActionResult(); + } + } +} \ No newline at end of file diff --git a/Memphis.API/Controllers/OtsController.cs b/Memphis.API/Controllers/OtsController.cs new file mode 100644 index 0000000..00e9490 --- /dev/null +++ b/Memphis.API/Controllers/OtsController.cs @@ -0,0 +1,29 @@ +using FluentValidation; +using Memphis.API.Data; +using Memphis.API.Services; +using Memphis.Shared.Models; +using Microsoft.AspNetCore.Mvc; +using Sentry; + +namespace Memphis.API.Controllers; + +public class OtsController : ControllerBase +{ + private readonly DatabaseContext _context; + private readonly RedisService _redisService; + private readonly LoggingService _loggingService; + private readonly IValidator _validator; + private readonly IHub _sentryHub; + private readonly ILogger _logger; + + public OtsController(DatabaseContext context, RedisService redisService, LoggingService loggingService, + IValidator validator, IHub sentryHub, ILogger logger) + { + _context = context; + _redisService = redisService; + _loggingService = loggingService; + _validator = validator; + _sentryHub = sentryHub; + _logger = logger; + } +} \ No newline at end of file diff --git a/Memphis.API/Data/DatabaseContext.cs b/Memphis.API/Data/DatabaseContext.cs index ec614d6..5f07df5 100644 --- a/Memphis.API/Data/DatabaseContext.cs +++ b/Memphis.API/Data/DatabaseContext.cs @@ -17,16 +17,18 @@ public DatabaseContext(DbContextOptions options) : base(options public required DbSet EventRegistrations { get; set; } public required DbSet Faq { get; set; } public required DbSet Feedback { get; set; } - public required DbSet FeedbackCannedResponse { get; set; } public required DbSet Files { get; set; } public required DbSet Hours { get; set; } + public required DbSet Notifications { get; set; } public required DbSet OnlineControllers { get; set; } public required DbSet Ots { get; set; } public required DbSet Roles { get; set; } public required DbSet Sessions { get; set; } public required DbSet Settings { get; set; } - public required DbSet TrainingRequests { get; set; } + public required DbSet TrainingMilestones { get; set; } + public required DbSet TrainingSchedules { get; set; } public required DbSet TrainingTickets { get; set; } + public required DbSet TrainingTypes { get; set; } public required DbSet Users { get; set; } public required DbSet VisitingApplications { get; set; } public required DbSet WebsiteLogs { get; set; } diff --git a/Memphis.API/Emails/.editorconfig b/Memphis.API/Emails/.editorconfig new file mode 100644 index 0000000..c6c8b36 --- /dev/null +++ b/Memphis.API/Emails/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/Memphis.API/Emails/.github/dependabot.yml b/Memphis.API/Emails/.github/dependabot.yml new file mode 100644 index 0000000..cd44b57 --- /dev/null +++ b/Memphis.API/Emails/.github/dependabot.yml @@ -0,0 +1,7 @@ +version: 2 +updates: +- package-ecosystem: npm + directory: "/" + schedule: + interval: weekly + open-pull-requests-limit: 10 diff --git a/Memphis.API/Emails/.github/logo-dark.svg b/Memphis.API/Emails/.github/logo-dark.svg new file mode 100644 index 0000000..ca521b4 --- /dev/null +++ b/Memphis.API/Emails/.github/logo-dark.svg @@ -0,0 +1 @@ + diff --git a/Memphis.API/Emails/.github/logo-light.svg b/Memphis.API/Emails/.github/logo-light.svg new file mode 100644 index 0000000..f721794 --- /dev/null +++ b/Memphis.API/Emails/.github/logo-light.svg @@ -0,0 +1 @@ + diff --git a/Memphis.API/Emails/.gitignore b/Memphis.API/Emails/.gitignore new file mode 100644 index 0000000..95b3b8e --- /dev/null +++ b/Memphis.API/Emails/.gitignore @@ -0,0 +1,8 @@ +node_modules +build_local +.vscode +.idea +Thumbs.db +.DS_Store +npm-debug.log +yarn-error.log diff --git a/Memphis.API/Emails/LICENSE b/Memphis.API/Emails/LICENSE new file mode 100644 index 0000000..978162d --- /dev/null +++ b/Memphis.API/Emails/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Cosmin Popovici + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/Memphis.API/Emails/README.md b/Memphis.API/Emails/README.md new file mode 100644 index 0000000..fe984ab --- /dev/null +++ b/Memphis.API/Emails/README.md @@ -0,0 +1,68 @@ +
+

+ + + + Maizzle Starter + + +

+

Quickly build HTML emails with utility-first CSS

+
+ + [![Version][npm-version-shield]][npm] + [![Build][github-ci-shield]][github-ci] + [![Downloads][npm-stats-shield]][npm-stats] + [![License][license-shield]][license] + +
+
+ +## Getting Started + +Clone this starter: + +```bash +npx degit maizzle/maizzle my-project +``` + +Install dependencies: + +``` +cd my-project + +npm install +``` + +Start local development: + +``` +npm run dev +``` + +Build emails for production: + +``` +npm run build +``` + +## Documentation + +Maizzle documentation is available at https://maizzle.com + +## Issues + +Please open all issues in the [framework repository](https://github.com/maizzle/framework). + +## License + +The Maizzle framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT). + +[npm]: https://www.npmjs.com/package/@maizzle/framework +[npm-stats]: https://npm-stat.com/charts.html?package=%40maizzle%2Fframework&from=2019-03-27 +[npm-version-shield]: https://img.shields.io/npm/v/@maizzle/framework.svg +[npm-stats-shield]: https://img.shields.io/npm/dt/@maizzle/framework.svg?color=6875f5 +[github-ci]: https://github.com/maizzle/framework/actions +[github-ci-shield]: https://github.com/maizzle/framework/actions/workflows/nodejs.yml/badge.svg +[license]: ./LICENSE +[license-shield]: https://img.shields.io/npm/l/@maizzle/framework.svg?color=0e9f6e diff --git a/Memphis.API/Emails/config.js b/Memphis.API/Emails/config.js new file mode 100644 index 0000000..29676d3 --- /dev/null +++ b/Memphis.API/Emails/config.js @@ -0,0 +1,27 @@ +/** @type {import('@maizzle/framework').Config} */ + +/* +|------------------------------------------------------------------------------- +| Development config https://maizzle.com/docs/environments +|------------------------------------------------------------------------------- +| +| The exported object contains the default Maizzle settings for development. +| This is used when you run `maizzle build` or `maizzle serve` and it has +| the fastest build time, since most transformations are disabled. +| +*/ + +module.exports = { + build: { + templates: { + source: 'src/templates', + destination: { + path: 'build_local', + }, + assets: { + source: 'src/images', + destination: 'images', + }, + }, + }, +} diff --git a/Memphis.API/Emails/config.production.js b/Memphis.API/Emails/config.production.js new file mode 100644 index 0000000..5a2f421 --- /dev/null +++ b/Memphis.API/Emails/config.production.js @@ -0,0 +1,26 @@ +/** @type {import('@maizzle/framework').Config} */ + +/* +|------------------------------------------------------------------------------- +| Production config https://maizzle.com/docs/environments +|------------------------------------------------------------------------------- +| +| This is where you define settings that optimize your emails for production. +| These will be merged on top of the base config.js, so you only need to +| specify the options that are changing. +| +*/ + +module.exports = { + build: { + templates: { + destination: { + path: 'build_production', + }, + }, + }, + inlineCSS: true, + removeUnusedCSS: true, + shorthandCSS: true, + prettify: true, +} diff --git a/Memphis.API/Emails/package.json b/Memphis.API/Emails/package.json new file mode 100644 index 0000000..a179736 --- /dev/null +++ b/Memphis.API/Emails/package.json @@ -0,0 +1,13 @@ +{ + "private": true, + "scripts": { + "dev": "maizzle serve", + "build": "maizzle build production" + }, + "dependencies": { + "@maizzle/framework": "latest", + "tailwindcss-box-shadow": "^2.0.0", + "tailwindcss-email-variants": "^2.0.0", + "tailwindcss-mso": "^1.3.0" + } +} diff --git a/Memphis.API/Emails/src/components/button.html b/Memphis.API/Emails/src/components/button.html new file mode 100644 index 0000000..30a0e87 --- /dev/null +++ b/Memphis.API/Emails/src/components/button.html @@ -0,0 +1,38 @@ + + + diff --git a/Memphis.API/Emails/src/components/divider.html b/Memphis.API/Emails/src/components/divider.html new file mode 100644 index 0000000..dd86296 --- /dev/null +++ b/Memphis.API/Emails/src/components/divider.html @@ -0,0 +1,30 @@ + + + diff --git a/Memphis.API/Emails/src/components/spacer.html b/Memphis.API/Emails/src/components/spacer.html new file mode 100644 index 0000000..cbcfac7 --- /dev/null +++ b/Memphis.API/Emails/src/components/spacer.html @@ -0,0 +1,20 @@ + + + +
+
+ +
+
diff --git a/Memphis.API/Emails/src/components/v-fill.html b/Memphis.API/Emails/src/components/v-fill.html new file mode 100644 index 0000000..b2c1043 --- /dev/null +++ b/Memphis.API/Emails/src/components/v-fill.html @@ -0,0 +1,13 @@ + + + + + diff --git a/Memphis.API/Emails/src/components/v-image.html b/Memphis.API/Emails/src/components/v-image.html new file mode 100644 index 0000000..1295d37 --- /dev/null +++ b/Memphis.API/Emails/src/components/v-image.html @@ -0,0 +1,14 @@ + + + + + diff --git a/Memphis.API/Emails/src/css/resets.css b/Memphis.API/Emails/src/css/resets.css new file mode 100644 index 0000000..d6fcbd6 --- /dev/null +++ b/Memphis.API/Emails/src/css/resets.css @@ -0,0 +1,13 @@ +/* + * Here is where you can add your global email CSS resets. + * + * We use a custom, email-specific CSS reset, instead + * of Tailwind's web-optimized `base` layer. + * + * Styles defined here will be inlined. +*/ + +img { + @apply max-w-full leading-none align-middle; + border: 0; +} diff --git a/Memphis.API/Emails/src/css/tailwind.css b/Memphis.API/Emails/src/css/tailwind.css new file mode 100644 index 0000000..d1d8823 --- /dev/null +++ b/Memphis.API/Emails/src/css/tailwind.css @@ -0,0 +1,17 @@ +/* Your custom CSS resets for email */ +@import "resets"; + +/* Tailwind CSS components */ +@import "tailwindcss/components"; + +/** + * @import here any custom CSS components - that is, CSS that + * you'd want loaded before the Tailwind utilities, so the + * utilities can still override them. +*/ + +/* Tailwind CSS utility classes */ +@import "tailwindcss/utilities"; + +/* Your custom utility classes */ +@import "utilities"; diff --git a/Memphis.API/Emails/src/css/utilities.css b/Memphis.API/Emails/src/css/utilities.css new file mode 100644 index 0000000..7fbefca --- /dev/null +++ b/Memphis.API/Emails/src/css/utilities.css @@ -0,0 +1,15 @@ +/* + * Here is where you can define your custom utility classes. + * + * We wrap them in the `utilities` @layer directive, so + * that Tailwind moves them to the correct location. + * + * More info: + * https://tailwindcss.com/docs/functions-and-directives#layer +*/ + +@layer utilities { + .break-word { + word-break: break-word; + } +} diff --git a/Memphis.API/Emails/src/layouts/main.html b/Memphis.API/Emails/src/layouts/main.html new file mode 100644 index 0000000..b06a1b3 --- /dev/null +++ b/Memphis.API/Emails/src/layouts/main.html @@ -0,0 +1,70 @@ + + + + + + + + + + + + {{{ page.title }}} + + + + + + + + +
+
+ + + + + + + +
+
+ Memphis ARTCC +
+
+

{{{ page.title }}}

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

+ If you believe you received this email in error, please contact the Memphis ARTCC Webmaster: wm@memphisartcc.com +

+
+
+
+ + diff --git a/Memphis.API/Emails/src/templates/activityWarning.html b/Memphis.API/Emails/src/templates/activityWarning.html new file mode 100644 index 0000000..2f3cbcd --- /dev/null +++ b/Memphis.API/Emails/src/templates/activityWarning.html @@ -0,0 +1,11 @@ +--- +title: "Activity Warning" +--- + + +
+ Dear {memberName}, +

+ +
+
diff --git a/Memphis.API/Emails/src/templates/eventPositionAssigned.html b/Memphis.API/Emails/src/templates/eventPositionAssigned.html new file mode 100644 index 0000000..b563311 --- /dev/null +++ b/Memphis.API/Emails/src/templates/eventPositionAssigned.html @@ -0,0 +1,28 @@ +--- +title: "Event Position Assigned" +--- + + +
+ + + + +
+

+ {Name} +

+
+

Position: {Position}

+

Start: {Start}

+

End: {End}

+
+ + View Event + +

+ If you have any questions, please contact the Memphis ARTCC Events Coordinator: ec@memphisartcc.com. +

+
+
+
diff --git a/Memphis.API/Emails/src/templates/eventPositionRemoved.html b/Memphis.API/Emails/src/templates/eventPositionRemoved.html new file mode 100644 index 0000000..a7abb53 --- /dev/null +++ b/Memphis.API/Emails/src/templates/eventPositionRemoved.html @@ -0,0 +1,21 @@ +--- +title: "Feedback Submitted" +preheader: "Feedback has been submitted, please allow some time for ARTCC staff to review your submission." +bodyClass: bg-slate-50 +--- + + +
+ + + + +
+
+ + Maizzle + +
+
+
+
diff --git a/Memphis.API/Emails/src/templates/eventPositionUnassigned.html b/Memphis.API/Emails/src/templates/eventPositionUnassigned.html new file mode 100644 index 0000000..a7abb53 --- /dev/null +++ b/Memphis.API/Emails/src/templates/eventPositionUnassigned.html @@ -0,0 +1,21 @@ +--- +title: "Feedback Submitted" +preheader: "Feedback has been submitted, please allow some time for ARTCC staff to review your submission." +bodyClass: bg-slate-50 +--- + + +
+ + + + +
+
+ + Maizzle + +
+
+
+
diff --git a/Memphis.API/Emails/src/templates/eventRegistrationSubmitted.html b/Memphis.API/Emails/src/templates/eventRegistrationSubmitted.html new file mode 100644 index 0000000..a7abb53 --- /dev/null +++ b/Memphis.API/Emails/src/templates/eventRegistrationSubmitted.html @@ -0,0 +1,21 @@ +--- +title: "Feedback Submitted" +preheader: "Feedback has been submitted, please allow some time for ARTCC staff to review your submission." +bodyClass: bg-slate-50 +--- + + +
+ + + + +
+
+ + Maizzle + +
+
+
+
diff --git a/Memphis.API/Emails/src/templates/facilityJoin.html b/Memphis.API/Emails/src/templates/facilityJoin.html new file mode 100644 index 0000000..a7abb53 --- /dev/null +++ b/Memphis.API/Emails/src/templates/facilityJoin.html @@ -0,0 +1,21 @@ +--- +title: "Feedback Submitted" +preheader: "Feedback has been submitted, please allow some time for ARTCC staff to review your submission." +bodyClass: bg-slate-50 +--- + + +
+ + + + +
+
+ + Maizzle + +
+
+
+
diff --git a/Memphis.API/Emails/src/templates/facilityRemoval.html b/Memphis.API/Emails/src/templates/facilityRemoval.html new file mode 100644 index 0000000..a7abb53 --- /dev/null +++ b/Memphis.API/Emails/src/templates/facilityRemoval.html @@ -0,0 +1,21 @@ +--- +title: "Feedback Submitted" +preheader: "Feedback has been submitted, please allow some time for ARTCC staff to review your submission." +bodyClass: bg-slate-50 +--- + + +
+ + + + +
+
+ + Maizzle + +
+
+
+
diff --git a/Memphis.API/Emails/src/templates/feedbackApproved.html b/Memphis.API/Emails/src/templates/feedbackApproved.html new file mode 100644 index 0000000..a7abb53 --- /dev/null +++ b/Memphis.API/Emails/src/templates/feedbackApproved.html @@ -0,0 +1,21 @@ +--- +title: "Feedback Submitted" +preheader: "Feedback has been submitted, please allow some time for ARTCC staff to review your submission." +bodyClass: bg-slate-50 +--- + + +
+ + + + +
+
+ + Maizzle + +
+
+
+
diff --git a/Memphis.API/Emails/src/templates/feedbackReply.html b/Memphis.API/Emails/src/templates/feedbackReply.html new file mode 100644 index 0000000..a7abb53 --- /dev/null +++ b/Memphis.API/Emails/src/templates/feedbackReply.html @@ -0,0 +1,21 @@ +--- +title: "Feedback Submitted" +preheader: "Feedback has been submitted, please allow some time for ARTCC staff to review your submission." +bodyClass: bg-slate-50 +--- + + +
+ + + + +
+
+ + Maizzle + +
+
+
+
diff --git a/Memphis.API/Emails/src/templates/feedbackSubmitted.html b/Memphis.API/Emails/src/templates/feedbackSubmitted.html new file mode 100644 index 0000000..a7abb53 --- /dev/null +++ b/Memphis.API/Emails/src/templates/feedbackSubmitted.html @@ -0,0 +1,21 @@ +--- +title: "Feedback Submitted" +preheader: "Feedback has been submitted, please allow some time for ARTCC staff to review your submission." +bodyClass: bg-slate-50 +--- + + +
+ + + + +
+
+ + Maizzle + +
+
+
+
diff --git a/Memphis.API/Emails/src/templates/trainingRequestDropped.html b/Memphis.API/Emails/src/templates/trainingRequestDropped.html new file mode 100644 index 0000000..a7abb53 --- /dev/null +++ b/Memphis.API/Emails/src/templates/trainingRequestDropped.html @@ -0,0 +1,21 @@ +--- +title: "Feedback Submitted" +preheader: "Feedback has been submitted, please allow some time for ARTCC staff to review your submission." +bodyClass: bg-slate-50 +--- + + +
+ + + + +
+
+ + Maizzle + +
+
+
+
diff --git a/Memphis.API/Emails/src/templates/trainingRequestSubmitted.html b/Memphis.API/Emails/src/templates/trainingRequestSubmitted.html new file mode 100644 index 0000000..a7abb53 --- /dev/null +++ b/Memphis.API/Emails/src/templates/trainingRequestSubmitted.html @@ -0,0 +1,21 @@ +--- +title: "Feedback Submitted" +preheader: "Feedback has been submitted, please allow some time for ARTCC staff to review your submission." +bodyClass: bg-slate-50 +--- + + +
+ + + + +
+
+ + Maizzle + +
+
+
+
diff --git a/Memphis.API/Emails/src/templates/trainingRequestTaken.html b/Memphis.API/Emails/src/templates/trainingRequestTaken.html new file mode 100644 index 0000000..a7abb53 --- /dev/null +++ b/Memphis.API/Emails/src/templates/trainingRequestTaken.html @@ -0,0 +1,21 @@ +--- +title: "Feedback Submitted" +preheader: "Feedback has been submitted, please allow some time for ARTCC staff to review your submission." +bodyClass: bg-slate-50 +--- + + +
+ + + + +
+
+ + Maizzle + +
+
+
+
diff --git a/Memphis.API/Emails/src/templates/trainingTicketSubmitted.html b/Memphis.API/Emails/src/templates/trainingTicketSubmitted.html new file mode 100644 index 0000000..a7abb53 --- /dev/null +++ b/Memphis.API/Emails/src/templates/trainingTicketSubmitted.html @@ -0,0 +1,21 @@ +--- +title: "Feedback Submitted" +preheader: "Feedback has been submitted, please allow some time for ARTCC staff to review your submission." +bodyClass: bg-slate-50 +--- + + +
+ + + + +
+
+ + Maizzle + +
+
+
+
diff --git a/Memphis.API/Emails/src/templates/visitAppAccepted.html b/Memphis.API/Emails/src/templates/visitAppAccepted.html new file mode 100644 index 0000000..a7abb53 --- /dev/null +++ b/Memphis.API/Emails/src/templates/visitAppAccepted.html @@ -0,0 +1,21 @@ +--- +title: "Feedback Submitted" +preheader: "Feedback has been submitted, please allow some time for ARTCC staff to review your submission." +bodyClass: bg-slate-50 +--- + + +
+ + + + +
+
+ + Maizzle + +
+
+
+
diff --git a/Memphis.API/Emails/src/templates/visitAppRejected.html b/Memphis.API/Emails/src/templates/visitAppRejected.html new file mode 100644 index 0000000..a7abb53 --- /dev/null +++ b/Memphis.API/Emails/src/templates/visitAppRejected.html @@ -0,0 +1,21 @@ +--- +title: "Feedback Submitted" +preheader: "Feedback has been submitted, please allow some time for ARTCC staff to review your submission." +bodyClass: bg-slate-50 +--- + + +
+ + + + +
+
+ + Maizzle + +
+
+
+
diff --git a/Memphis.API/Emails/src/templates/visitAppSubmited.html b/Memphis.API/Emails/src/templates/visitAppSubmited.html new file mode 100644 index 0000000..a7abb53 --- /dev/null +++ b/Memphis.API/Emails/src/templates/visitAppSubmited.html @@ -0,0 +1,21 @@ +--- +title: "Feedback Submitted" +preheader: "Feedback has been submitted, please allow some time for ARTCC staff to review your submission." +bodyClass: bg-slate-50 +--- + + +
+ + + + +
+
+ + Maizzle + +
+
+
+
diff --git a/Memphis.API/Emails/tailwind.config.js b/Memphis.API/Emails/tailwind.config.js new file mode 100644 index 0000000..1fe8441 --- /dev/null +++ b/Memphis.API/Emails/tailwind.config.js @@ -0,0 +1,137 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + theme: { + screens: { + sm: {max: '600px'}, + xs: {max: '425px'}, + }, + extend: { + spacing: { + screen: '100vw', + full: '100%', + 0: '0', + 0.5: '2px', + 1: '4px', + 1.5: '6px', + 2: '8px', + 2.5: '10px', + 3: '12px', + 3.5: '14px', + 4: '16px', + 4.5: '18px', + 5: '20px', + 5.5: '22px', + 6: '24px', + 6.5: '26px', + 7: '28px', + 7.5: '30px', + 8: '32px', + 8.5: '34px', + 9: '36px', + 9.5: '38px', + 10: '40px', + 11: '44px', + 12: '48px', + 14: '56px', + 16: '64px', + 20: '80px', + 24: '96px', + 28: '112px', + 32: '128px', + 36: '144px', + 40: '160px', + 44: '176px', + 48: '192px', + 52: '208px', + 56: '224px', + 60: '240px', + 64: '256px', + 72: '288px', + 80: '320px', + 96: '384px', + }, + borderRadius: { + none: '0px', + sm: '2px', + DEFAULT: '4px', + md: '6px', + lg: '8px', + xl: '12px', + '2xl': '16px', + '3xl': '24px', + }, + boxShadow: { + sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)', + DEFAULT: '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1)', + md: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1)', + lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1)', + xl: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1)', + '2xl': '0 25px 50px -12px rgba(0, 0, 0, 0.25)', + inner: 'inset 0 2px 4px 0 rgba(0, 0, 0, 0.05)', + }, + fontFamily: { + sans: ['ui-sans-serif', 'system-ui', '-apple-system', '"Segoe UI"', 'sans-serif'], + serif: ['ui-serif', 'Georgia', 'Cambria', '"Times New Roman"', 'Times', 'serif'], + mono: ['ui-monospace', 'Menlo', 'Consolas', 'monospace'], + }, + fontSize: { + 0: '0', + xxs: '11px', + xs: '12px', + '2xs': '13px', + sm: '14px', + '2sm': '15px', + base: '16px', + lg: '18px', + xl: '20px', + '2xl': '24px', + '3xl': '30px', + '4xl': '36px', + '5xl': '48px', + '6xl': '60px', + '7xl': '72px', + '8xl': '96px', + '9xl': '128px', + }, + letterSpacing: theme => ({ + ...theme('width'), + }), + lineHeight: theme => ({ + ...theme('width'), + }), + maxWidth: theme => ({ + ...theme('width'), + xs: '160px', + sm: '192px', + md: '224px', + lg: '256px', + xl: '288px', + '2xl': '336px', + '3xl': '384px', + '4xl': '448px', + '5xl': '512px', + '6xl': '576px', + '7xl': '640px', + }), + minHeight: theme => ({ + ...theme('width'), + }), + minWidth: theme => ({ + ...theme('width'), + }), + }, + }, + corePlugins: { + preflight: false, + backgroundOpacity: false, + borderOpacity: false, + divideOpacity: false, + placeholderOpacity: false, + textOpacity: false, + }, + plugins: [ + require('tailwindcss-mso'), + require('tailwindcss-box-shadow'), + require('tailwindcss-email-variants'), + ], +} diff --git a/Memphis.API/Emails/yarn.lock b/Memphis.API/Emails/yarn.lock new file mode 100644 index 0000000..8d6475c --- /dev/null +++ b/Memphis.API/Emails/yarn.lock @@ -0,0 +1,5192 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + +"@babel/code-frame@^7.0.0": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== + dependencies: + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/highlight@^7.22.13": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/runtime@^7.14.0": + version "7.23.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.1.tgz#72741dc4d413338a91dcb044a86f3c0bc402646d" + integrity sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g== + dependencies: + regenerator-runtime "^0.14.0" + +"@bconnorwhite/module@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@bconnorwhite/module/-/module-2.0.2.tgz#557846110bb89412e9689ac778358bc2b1af0c4a" + integrity sha512-ck1me5WMgZKp06gnJrVKEkytpehTTQbvsAMbF1nGPeHri/AZNhj87++PSE2LOxmZqM0EtGMaqeLdx7Lw7SUnTA== + dependencies: + find-up "^5.0.0" + read-json-safe "^1.0.5" + types-pkg-json "^1.1.0" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.19" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" + integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@ljharb/through@^2.3.9": + version "2.3.9" + resolved "https://registry.yarnpkg.com/@ljharb/through/-/through-2.3.9.tgz#85f221eb82f9d555e180e87d6e50fb154af85408" + integrity sha512-yN599ZBuMPPK4tdoToLlvgJB4CLK8fGl7ntfy0Wn7U6ttNvHYurd81bfUiK/6sMkiIwm65R6ck4L6+Y3DfVbNQ== + +"@maizzle/cli@^1.5.1": + version "1.5.7" + resolved "https://registry.yarnpkg.com/@maizzle/cli/-/cli-1.5.7.tgz#fe6ca62615dd9569a01b47835a852463cef0ee07" + integrity sha512-yxLCQ2SBKZ3pEdLtcE/QhocXPFHBWuP5xDrvK7UY9hvMfkfGLtWJ0pINw4Uw8nO++CNuNKlmRm9ciD62myuGbA== + dependencies: + chalk "^4.1.0" + commander "^11.0.0" + execa "^5.0.0" + fs-extra "^10.0.0" + import-cwd "^3.0.0" + inquirer "^8.0.0" + np "*" + ora "^5.1.0" + resolve-cwd "^3.0.0" + update-notifier "^5.0.1" + +"@maizzle/framework@latest": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@maizzle/framework/-/framework-4.6.0.tgz#00b89e714efaffdcb66c71e3b494426fa6112528" + integrity sha512-p9gIBmlihJ3DcCx8/qzO05Cm4OFgLq5lM6JbucdIFEX2BUA7zxLo31CVUMT8tSjazJNYJWo2GRK+QVn+KWuLiQ== + dependencies: + "@maizzle/cli" "^1.5.1" + autoprefixer "^10.4.14" + browser-sync "^2.28.3" + color-shorthand-hex-to-six-digit "^3.0.2" + email-comb "^5.2.0" + front-matter "^4.0.0" + fs-extra "^10.0.0" + glob-promise "^4.1.0" + html-crush "^4.0.0" + is-url-superb "^5.0.0" + juice "^9.0.0" + lodash "^4.17.20" + ora "^5.1.0" + postcss "^8.4.21" + postcss-import "^15.0.0" + postcss-merge-longhand "^6.0.0" + posthtml "^0.16.6" + posthtml-attrs-parser "^0.1.1" + posthtml-base-url "^2.0.0" + posthtml-component "^1.1.0" + posthtml-content "^0.1.0" + posthtml-extend "^0.6.0" + posthtml-extra-attributes "^2.0.0" + posthtml-fetch "^3.0.0" + posthtml-markdownit "^1.3.1" + posthtml-match-helper "^1.0.3" + posthtml-mso "^2.0.0" + posthtml-postcss-merge-longhand "^2.0.1" + posthtml-safe-class-names "^3.0.0" + posthtml-url-parameters "^2.0.0" + pretty "^2.0.0" + query-string "^7.1.3" + string-remove-widows "^2.1.0" + string-strip-html "^8.2.0" + tailwindcss "^3.2.7" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@one-ini/wasm@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@one-ini/wasm/-/wasm-0.1.1.tgz#6013659736c9dbfccc96e8a9c2b3de317df39323" + integrity sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw== + +"@pnpm/config.env-replace@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz#ab29da53df41e8948a00f2433f085f54de8b3a4c" + integrity sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w== + +"@pnpm/network.ca-file@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz#2ab05e09c1af0cdf2fcf5035bea1484e222f7983" + integrity sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA== + dependencies: + graceful-fs "4.2.10" + +"@pnpm/npm-conf@^2.1.0": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz#0058baf1c26cbb63a828f0193795401684ac86f0" + integrity sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA== + dependencies: + "@pnpm/config.env-replace" "^1.1.0" + "@pnpm/network.ca-file" "^1.0.1" + config-chain "^1.1.11" + +"@samverschueren/stream-to-observable@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz#a21117b19ee9be70c379ec1877537ef2e1c63301" + integrity sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ== + dependencies: + any-observable "^0.3.0" + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@sindresorhus/is@^4.0.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" + integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== + +"@sindresorhus/is@^5.2.0", "@sindresorhus/is@^5.3.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.6.0.tgz#41dd6093d34652cddb5d5bdeee04eafc33826668" + integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== + +"@socket.io/component-emitter@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" + integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@szmarczak/http-timer@^4.0.5": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" + integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== + dependencies: + defer-to-connect "^2.0.0" + +"@szmarczak/http-timer@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" + integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== + dependencies: + defer-to-connect "^2.0.1" + +"@types/cacheable-request@^6.0.1": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" + integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "^3.1.4" + "@types/node" "*" + "@types/responselike" "^1.0.0" + +"@types/cookie@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + +"@types/cors@^2.8.12": + version "2.8.14" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.14.tgz#94eeb1c95eda6a8ab54870a3bf88854512f43a92" + integrity sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ== + dependencies: + "@types/node" "*" + +"@types/glob@^7.1.3": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/http-cache-semantics@*", "@types/http-cache-semantics@^4.0.1": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.2.tgz#abe102d06ccda1efdf0ed98c10ccf7f36a785a41" + integrity sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw== + +"@types/keyv@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" + integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== + dependencies: + "@types/node" "*" + +"@types/minimatch@*": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== + +"@types/node@*", "@types/node@>=10.0.0": + version "20.8.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.2.tgz#d76fb80d87d0d8abfe334fc6d292e83e5524efc4" + integrity sha512-Vvycsc9FQdwhxE3y3DzeIxuEJbWGDsnrxvMADzTDF/lcdR9/K+AQIeAghTQsHtotg/q0j3WEOYS/jQgSdWue3w== + +"@types/normalize-package-data@^2.4.1": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.2.tgz#9b0e3e8533fe5024ad32d6637eb9589988b6fdca" + integrity sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A== + +"@types/responselike@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.1.tgz#1dd57e54509b3b95c7958e52709567077019d65d" + integrity sha512-TiGnitEDxj2X0j+98Eqk5lv/Cij8oHd32bU4D/Yw6AOq7vvTk0gSD2GPj0G/HkvhMoVsdlhYF4yqqlyPBTM6Sg== + dependencies: + "@types/node" "*" + +abbrev@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@~1.3.4: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +aggregate-error@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-4.0.1.tgz#25091fe1573b9e0be892aeda15c7c66a545f758e" + integrity sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w== + dependencies: + clean-stack "^4.0.0" + indent-string "^5.0.0" + +all-package-names@^2.0.2: + version "2.0.751" + resolved "https://registry.yarnpkg.com/all-package-names/-/all-package-names-2.0.751.tgz#aa77d0197b19f98e504984af1ef99382129520a4" + integrity sha512-DeTOGia+4rjBoOFWDAn7W9WBmq0dMKogu7aYU4E4/Io6AjNvsr5zxuNjT0Yxis8uFWzRFLgPfns89O1FGMIc9Q== + dependencies: + commander-version "^1.1.0" + p-lock "^2.0.0" + parse-json-object "^2.0.1" + progress "^2.0.3" + types-json "^1.2.2" + +ansi-align@^3.0.0, ansi-align@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-escapes@^4.2.1, ansi-escapes@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-escapes@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-5.0.0.tgz#b6a0caf0eef0c41af190e9a749e0c00ec04bb2a6" + integrity sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA== + dependencies: + type-fest "^1.0.2" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== + +ansi-regex@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" + integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== + +ansi-regex@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +any-observable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" + integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +arrayiffy-if-string@^3.14.0: + version "3.14.0" + resolved "https://registry.yarnpkg.com/arrayiffy-if-string/-/arrayiffy-if-string-3.14.0.tgz#0aae4fcced2f23d13d4f313a78f2d039905677a2" + integrity sha512-pQQDnM+wOBvgElVGB8//y16IpZEsi3mU3jkjvhJCm3J7zSvRPlm/8Wl76gE1O9vnU1CWcz2u5JfsOLtD7yvuLw== + dependencies: + "@babel/runtime" "^7.14.0" + +async-each-series@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-0.1.1.tgz#7617c1917401fd8ca4a28aadce3dbae98afeb432" + integrity sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ== + +async@^2.6.0: + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== + dependencies: + lodash "^4.17.14" + +autoprefixer@^10.4.14: + version "10.4.16" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.16.tgz#fad1411024d8670880bdece3970aa72e3572feb8" + integrity sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ== + dependencies: + browserslist "^4.21.10" + caniuse-lite "^1.0.30001538" + fraction.js "^4.3.6" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +axios@0.21.4: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base64id@2.0.0, base64id@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + +big-integer@^1.6.44: + version "1.6.51" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" + integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +boxen@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + +boxen@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-7.1.1.tgz#f9ba525413c2fec9cdb88987d835c4f7cad9c8f4" + integrity sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog== + dependencies: + ansi-align "^3.0.1" + camelcase "^7.0.1" + chalk "^5.2.0" + cli-boxes "^3.0.0" + string-width "^5.1.2" + type-fest "^2.13.0" + widest-line "^4.0.1" + wrap-ansi "^8.1.0" + +bplist-parser@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" + integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== + dependencies: + big-integer "^1.6.44" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-sync-client@^2.29.3: + version "2.29.3" + resolved "https://registry.yarnpkg.com/browser-sync-client/-/browser-sync-client-2.29.3.tgz#9300b97f42abc2c4f95ca29b5a9781b5c492f14a" + integrity sha512-4tK5JKCl7v/3aLbmCBMzpufiYLsB1+UI+7tUXCCp5qF0AllHy/jAqYu6k7hUF3hYtlClKpxExWaR+rH+ny07wQ== + dependencies: + etag "1.8.1" + fresh "0.5.2" + mitt "^1.1.3" + +browser-sync-ui@^2.29.3: + version "2.29.3" + resolved "https://registry.yarnpkg.com/browser-sync-ui/-/browser-sync-ui-2.29.3.tgz#35e2ce3b470dce6b7219307cac7278bf324a0f16" + integrity sha512-kBYOIQjU/D/3kYtUIJtj82e797Egk1FB2broqItkr3i4eF1qiHbFCG6srksu9gWhfmuM/TNG76jMfzAdxEPakg== + dependencies: + async-each-series "0.1.1" + chalk "4.1.2" + connect-history-api-fallback "^1" + immutable "^3" + server-destroy "1.0.1" + socket.io-client "^4.4.1" + stream-throttle "^0.1.3" + +browser-sync@^2.28.3: + version "2.29.3" + resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.29.3.tgz#c2a3ff00c659eb87a13cae9d7a427e1b4b580ee1" + integrity sha512-NiM38O6XU84+MN+gzspVmXV2fTOoe+jBqIBx3IBdhZrdeURr6ZgznJr/p+hQ+KzkKEiGH/GcC4SQFSL0jV49bg== + dependencies: + browser-sync-client "^2.29.3" + browser-sync-ui "^2.29.3" + bs-recipes "1.3.4" + chalk "4.1.2" + chokidar "^3.5.1" + connect "3.6.6" + connect-history-api-fallback "^1" + dev-ip "^1.0.1" + easy-extender "^2.3.4" + eazy-logger "^4.0.1" + etag "^1.8.1" + fresh "^0.5.2" + fs-extra "3.0.1" + http-proxy "^1.18.1" + immutable "^3" + localtunnel "^2.0.1" + micromatch "^4.0.2" + opn "5.3.0" + portscanner "2.2.0" + raw-body "^2.3.2" + resp-modifier "6.0.2" + rx "4.1.0" + send "0.16.2" + serve-index "1.9.1" + serve-static "1.13.2" + server-destroy "1.0.1" + socket.io "^4.4.1" + ua-parser-js "^1.0.33" + yargs "^17.3.1" + +browserslist@^4.21.10, browserslist@^4.21.4: + version "4.22.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" + integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== + dependencies: + caniuse-lite "^1.0.30001541" + electron-to-chromium "^1.4.535" + node-releases "^2.0.13" + update-browserslist-db "^1.0.13" + +bs-recipes@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/bs-recipes/-/bs-recipes-1.3.4.tgz#0d2d4d48a718c8c044769fdc4f89592dc8b69585" + integrity sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builtins@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== + +bundle-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a" + integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw== + dependencies: + run-applescript "^5.0.0" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cacheable-lookup@^5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== + +cacheable-lookup@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz#3476a8215d046e5a3202a9209dd13fec1f933a27" + integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== + +cacheable-request@^10.2.8: + version "10.2.13" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.13.tgz#b7012bb4a2acdb18cb54d2dff751d766b3500842" + integrity sha512-3SD4rrMu1msNGEtNSt8Od6enwdo//U9s4ykmXfA2TD58kcLkCobtCDiby7kNyj7a/Q7lz/mAesAFI54rTdnvBA== + dependencies: + "@types/http-cache-semantics" "^4.0.1" + get-stream "^6.0.1" + http-cache-semantics "^4.1.1" + keyv "^4.5.3" + mimic-response "^4.0.0" + normalize-url "^8.0.0" + responselike "^3.0.0" + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +cacheable-request@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817" + integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^6.0.1" + responselike "^2.0.0" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +callsites@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-4.1.0.tgz#de72b98612eed4e1e2564c952498677faa9d86c2" + integrity sha512-aBMbD1Xxay75ViYezwT40aQONfr+pSXTHwNKvIXhXD6+LY3F1dLIcceoC5OZKBVHbXcysz1hL9D2w0JJIMXpUw== + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +camelcase@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-7.0.1.tgz#f02e50af9fd7782bc8b88a3558c32fd3a388f048" + integrity sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw== + +caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001541: + version "1.0.30001546" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001546.tgz#10fdad03436cfe3cc632d3af7a99a0fb497407f0" + integrity sha512-zvtSJwuQFpewSyRrI3AsftF6rM0X80mZkChIt1spBGEvRglCrjTniXvinc8JKRoqTwXAgvqTImaN9igfSMtUBw== + +chalk@4.1.2, chalk@^4.1.0, chalk@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^1.0.0, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^5.0.0, chalk@^5.0.1, chalk@^5.2.0, chalk@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +cheerio-select@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" + integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== + dependencies: + boolbase "^1.0.0" + css-select "^5.1.0" + css-what "^6.1.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + +cheerio@^1.0.0-rc.12: + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" + integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== + dependencies: + cheerio-select "^2.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.3" + domutils "^3.0.1" + htmlparser2 "^8.0.1" + parse5 "^7.0.0" + parse5-htmlparser2-tree-adapter "^7.0.0" + +chokidar@^3.5.1, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +clean-stack@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-4.2.0.tgz#c464e4cde4ac789f4e0735c5d75beb49d7b30b31" + integrity sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg== + dependencies: + escape-string-regexp "5.0.0" + +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +cli-boxes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" + integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== + +cli-cursor@^2.0.0, cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== + dependencies: + restore-cursor "^2.0.0" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.9.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.1.tgz#9c0b9dad69a6d47cbb4333c14319b060ed395a35" + integrity sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ== + +cli-truncate@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" + integrity sha512-f4r4yJnbT++qUPI9NR4XLDLq41gQ+uqnPItWG0F5ZkehuNiTTa3EY0S4AqTSUOeJ7/zU41oWPQSNkW5BqPL9bg== + dependencies: + slice-ansi "0.0.4" + string-width "^1.0.1" + +cli-width@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cli-width@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" + integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone-response@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== + dependencies: + mimic-response "^1.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-shorthand-hex-to-six-digit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/color-shorthand-hex-to-six-digit/-/color-shorthand-hex-to-six-digit-3.1.0.tgz#52064c50ef95b6cc052809991d56b3ff2b44312a" + integrity sha512-Mqd0b5KwDuvbQET6UsP82K4w27pWA3I7qzyoDiM7gI+6nb222d0+dUy6rlzr28YbVJkpY1dnF5yclhfG055kZg== + dependencies: + "@babel/runtime" "^7.14.0" + hex-color-regex "^1.1.0" + lodash.clonedeep "^4.5.0" + lodash.isplainobject "^4.0.6" + +commander-version@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/commander-version/-/commander-version-1.1.0.tgz#fbfaea4632921a42f8f855f96bcaa3d9920a6296" + integrity sha512-9aNW4N6q6EPDUszLRH6k9IwO6OoGYh3HRgUF/fA7Zs+Mz1v1x5akSqT7QGB8JsGY7AG7qMA7oRRB/4yyn33FYA== + dependencies: + "@bconnorwhite/module" "^2.0.2" + commander "^6.1.0" + +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +commander@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-11.0.0.tgz#43e19c25dbedc8256203538e8d7e9346877a6f67" + integrity sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ== + +commander@^2.2.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +commander@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +condense-newlines@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/condense-newlines/-/condense-newlines-0.2.1.tgz#3de985553139475d32502c83b02f60684d24c55f" + integrity sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg== + dependencies: + extend-shallow "^2.0.1" + is-whitespace "^0.3.0" + kind-of "^3.0.2" + +config-chain@^1.1.11, config-chain@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + dependencies: + dot-prop "^5.2.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + +configstore@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-6.0.0.tgz#49eca2ebc80983f77e09394a1a56e0aca8235566" + integrity sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA== + dependencies: + dot-prop "^6.0.1" + graceful-fs "^4.2.6" + unique-string "^3.0.0" + write-file-atomic "^3.0.3" + xdg-basedir "^5.0.1" + +connect-history-api-fallback@^1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +connect@3.6.6: + version "3.6.6" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" + integrity sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.0" + parseurl "~1.3.2" + utils-merge "1.0.1" + +cookie@~0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +cors@~2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cosmiconfig@^8.1.3: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== + dependencies: + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +crypto-random-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-4.0.0.tgz#5a3cc53d7dd86183df5da0312816ceeeb5bb1fc2" + integrity sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA== + dependencies: + type-fest "^1.0.1" + +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +date-fns@^1.27.2: + version "1.30.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" + integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== + +debug@2.6.9, debug@^2.2.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + +debug@~4.3.1, debug@~4.3.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decode-uri-component@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== + dependencies: + mimic-response "^1.0.0" + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +default-browser-id@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c" + integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA== + dependencies: + bplist-parser "^0.2.0" + untildify "^4.0.0" + +default-browser@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da" + integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA== + dependencies: + bundle-name "^3.0.0" + default-browser-id "^3.0.0" + execa "^7.1.1" + titleize "^3.0.0" + +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +defer-to-connect@^2.0.0, defer-to-connect@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + +define-lazy-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" + integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== + +del@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/del/-/del-7.1.0.tgz#0de0044d556b649ff05387f1fa7c885e155fd1b6" + integrity sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg== + dependencies: + globby "^13.1.2" + graceful-fs "^4.2.10" + is-glob "^4.0.3" + is-path-cwd "^3.0.0" + is-path-inside "^4.0.0" + p-map "^5.5.0" + rimraf "^3.0.2" + slash "^4.0.0" + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg== + +dev-ip@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dev-ip/-/dev-ip-1.0.1.tgz#a76a3ed1855be7a012bb8ac16cb80f3c00dc28f0" + integrity sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A== + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.3.0.tgz#6db7ea46e4617eb15cf875df68b2b8524ce0037a" + integrity sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA== + dependencies: + domelementtype "^2.0.1" + +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^2.4.2, domutils@^2.5.2, domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +domutils@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +dot-prop@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== + dependencies: + is-obj "^2.0.0" + +dot-prop@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-7.2.0.tgz#468172a3529779814d21a779c1ba2f6d76609809" + integrity sha512-Ol/IPXUARn9CSbkrdV4VJo7uCy1I3VuSiWCaFSg+8BdUOzF9n3jefIpcgAydvUZbTdEBZs2vEiTiS9m61ssiDA== + dependencies: + type-fest "^2.11.2" + +duplexer3@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" + integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +easy-extender@^2.3.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/easy-extender/-/easy-extender-2.3.4.tgz#298789b64f9aaba62169c77a2b3b64b4c9589b8f" + integrity sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q== + dependencies: + lodash "^4.17.10" + +eazy-logger@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/eazy-logger/-/eazy-logger-4.0.1.tgz#2e9fe487fb14ed6ac20d5f01d90dff377d403041" + integrity sha512-2GSFtnnC6U4IEKhEI7+PvdxrmjJ04mdsj3wHZTFiw0tUtG4HCWzTr13ZYTk8XOGnA1xQMaDljoBOYlk3D/MMSw== + dependencies: + chalk "4.1.2" + +editorconfig@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-1.0.4.tgz#040c9a8e9a6c5288388b87c2db07028aa89f53a3" + integrity sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q== + dependencies: + "@one-ini/wasm" "0.1.1" + commander "^10.0.0" + minimatch "9.0.1" + semver "^7.5.3" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.535: + version "1.4.542" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.542.tgz#9bfe19d8ddafc2591e4a17d04e60a5f5acc54965" + integrity sha512-6+cpa00G09N3sfh2joln4VUXHquWrOFx3FLZqiVQvl45+zS9DskDBTPvob+BhvFRmTBkyDSk0vvLMMRo/qc6mQ== + +elegant-spinner@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" + integrity sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ== + +email-comb@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/email-comb/-/email-comb-5.3.1.tgz#8ab92004c2222c7c03519fc01c343b318babb4db" + integrity sha512-0rFhgyrRRw6BGWc5Iakf6HI1LGQbmzqFzoMTwq1SGby6PehTTAxqns1y5lBf9HSTY02kC1sqqq8cq+fI4Wx+Sg== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +encodeurl@~1.0.1, encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +engine.io-client@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.5.2.tgz#8709e22c291d4297ae80318d3c8baeae71f0e002" + integrity sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + engine.io-parser "~5.2.1" + ws "~8.11.0" + xmlhttprequest-ssl "~2.0.0" + +engine.io-parser@~5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.1.tgz#9f213c77512ff1a6cc0c7a86108a7ffceb16fcfb" + integrity sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ== + +engine.io@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.2.tgz#769348ced9d56bd47bd83d308ec1c3375e85937c" + integrity sha512-IXsMcGpw/xRfjra46sVZVHiSWo/nJ/3g1337q9KNXtS6YRzbW5yIzTCb9DjhrBe7r3GZQR0I4+nq+4ODk5g/cA== + dependencies: + "@types/cookie" "^0.4.1" + "@types/cors" "^2.8.12" + "@types/node" ">=10.0.0" + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + cors "~2.8.5" + debug "~4.3.1" + engine.io-parser "~5.2.1" + ws "~8.11.0" + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +entities@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" + integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== + +entities@^4.2.0, entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +entities@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" + integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-goat@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" + integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== + +escape-goat@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-3.0.0.tgz#e8b5fb658553fe8a3c4959c316c6ebb8c842b19c" + integrity sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw== + +escape-goat@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-4.0.0.tgz#9424820331b510b0666b98f7873fe11ac4aa8081" + integrity sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@5.0.0, escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +etag@1.8.1, etag@^1.8.1, etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +execa@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" + integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.1" + human-signals "^4.3.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^3.0.7" + strip-final-newline "^3.0.0" + +exit-hook@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-3.2.0.tgz#7d86bc361a4d79278001b72a0509318a6f468f20" + integrity sha512-aIQN7Q04HGAV/I5BszisuHTZHXNoC23WtLkxdCLuYZMdWviRD0TMIt2bnUBi9MrHaF/hH8b3gwG9iaAUHKnJGA== + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +external-editor@^3.0.3, external-editor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +fast-glob@^3.2.12, fast-glob@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +fclone@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fclone/-/fclone-1.0.11.tgz#10e85da38bfea7fc599341c296ee1d77266ee640" + integrity sha512-GDqVQezKzRABdeqflsgMr7ktzgF9CyS+p2oe0jJqUY6izSSbhPIQJDpoU4PtGcD7VPM9xh/dVrTu6z1nwgmEGw== + +figures@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + integrity sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ== + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== + dependencies: + escape-string-regexp "^1.0.5" + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +figures@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-5.0.0.tgz#126cd055052dea699f8a54e8c9450e6ecfc44d5f" + integrity sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg== + dependencies: + escape-string-regexp "^5.0.0" + is-unicode-supported "^1.2.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +filter-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" + integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== + +finalhandler@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" + integrity sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw== + dependencies: + debug "2.6.9" + encodeurl "~1.0.1" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.3.1" + unpipe "~1.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" + +follow-redirects@^1.0.0, follow-redirects@^1.14.0: + version "1.15.3" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" + integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== + +form-data-encoder@^2.1.2: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" + integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== + +fraction.js@^4.3.6: + version "4.3.6" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.6.tgz#e9e3acec6c9a28cf7bc36cbe35eea4ceb2c5c92d" + integrity sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg== + +fresh@0.5.2, fresh@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +front-matter@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/front-matter/-/front-matter-4.0.2.tgz#b14e54dc745cfd7293484f3210d15ea4edd7f4d5" + integrity sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg== + dependencies: + js-yaml "^3.13.1" + +fs-extra@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" + integrity sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^3.0.0" + universalify "^0.1.0" + +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0, get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +github-url-from-git@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/github-url-from-git/-/github-url-from-git-1.5.0.tgz#f985fedcc0a9aa579dc88d7aff068d55cc6251a0" + integrity sha512-WWOec4aRI7YAykQ9+BHmzjyNlkfJFG8QLXnDTsLz/kZefq7qkzdfo4p6fkYYMIq1aj+gZcQs/1HQhQh3DPPxlQ== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-promise@^4.1.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/glob-promise/-/glob-promise-4.2.2.tgz#15f44bcba0e14219cd93af36da6bb905ff007877" + integrity sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw== + dependencies: + "@types/glob" "^7.1.3" + +glob@7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +global-dirs@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" + integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== + dependencies: + ini "2.0.0" + +globby@^13.1.2: + version "13.2.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" + integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.3.0" + ignore "^5.2.4" + merge2 "^1.4.1" + slash "^4.0.0" + +got@^11.8.0, got@^11.8.5: + version "11.8.6" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" + integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + +got@^12.1.0: + version "12.6.1" + resolved "https://registry.yarnpkg.com/got/-/got-12.6.1.tgz#8869560d1383353204b5a9435f782df9c091f549" + integrity sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ== + dependencies: + "@sindresorhus/is" "^5.2.0" + "@szmarczak/http-timer" "^5.0.1" + cacheable-lookup "^7.0.0" + cacheable-request "^10.2.8" + decompress-response "^6.0.0" + form-data-encoder "^2.1.2" + get-stream "^6.0.1" + http2-wrapper "^2.1.10" + lowercase-keys "^3.0.0" + p-cancelable "^3.0.0" + responselike "^3.0.0" + +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@4.2.10: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.6: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== + dependencies: + ansi-regex "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-yarn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" + integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + +has-yarn@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-3.0.0.tgz#c3c21e559730d1d3b57e28af1f30d06fac38147d" + integrity sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA== + +has@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" + integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +hosted-git-info@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + +hosted-git-info@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-6.1.1.tgz#629442c7889a69c05de604d52996b74fe6f26d58" + integrity sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w== + dependencies: + lru-cache "^7.5.1" + +html-crush@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/html-crush/-/html-crush-4.2.0.tgz#ec5774d252ab15235c5c27af056d691b4f5abb07" + integrity sha512-z+8zsmaf6iHX1UN6t5mFxnlvweBh1eSws0NI2RjrMv9NX2gGubjcUPIaU6sdrypiBvU0S/Hjqr5aEcJ55fndPA== + dependencies: + "@babel/runtime" "^7.14.0" + ranges-apply "^5.1.0" + ranges-push "^5.1.0" + string-left-right "^4.1.0" + string-match-left-right "^7.1.0" + string-range-expander "^2.1.0" + test-mixer "^2.1.0" + +htmlparser2@^5.0.0, htmlparser2@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-5.0.1.tgz#7daa6fc3e35d6107ac95a4fc08781f091664f6e7" + integrity sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ== + dependencies: + domelementtype "^2.0.1" + domhandler "^3.3.0" + domutils "^2.4.2" + entities "^2.0.0" + +htmlparser2@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +htmlparser2@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-7.2.0.tgz#8817cdea38bbc324392a90b1990908e81a65f5a5" + integrity sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.2" + domutils "^2.8.0" + entities "^3.0.1" + +htmlparser2@^8.0.1: + version "8.0.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + entities "^4.4.0" + +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" + integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + +http2-wrapper@^2.1.10: + version "2.2.0" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.0.tgz#b80ad199d216b7d3680195077bd7b9060fa9d7f3" + integrity sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.2.0" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +human-signals@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" + integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== + +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore-walk@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.3.tgz#0fcdb6decaccda35e308a7b0948645dd9523b7bb" + integrity sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA== + dependencies: + minimatch "^9.0.0" + +ignore@^5.2.4: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +immutable@^3: + version "3.8.2" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" + integrity sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg== + +import-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-3.0.0.tgz#20845547718015126ea9b3676b7592fb8bd4cf92" + integrity sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg== + dependencies: + import-from "^3.0.0" + +import-fresh@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966" + integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ== + dependencies: + resolve-from "^5.0.0" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A== + +import-lazy@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== + +import-local@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ== + +indent-string@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" + integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +ini@^1.3.4, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inline-style-parser@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== + +inquirer-autosubmit-prompt@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/inquirer-autosubmit-prompt/-/inquirer-autosubmit-prompt-0.2.0.tgz#a10f952af4f7bac9c43010e3e9e0891d7e8d15a1" + integrity sha512-mzNrusCk5L6kSzlN0Ioddn8yzrhYNLli+Sn2ZxMuLechMYAzakiFCIULxsxlQb5YKzthLGfrFACcWoAvM7p04Q== + dependencies: + chalk "^2.4.1" + inquirer "^6.2.1" + rxjs "^6.3.3" + +inquirer@^6.2.1: + version "6.5.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.12" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +inquirer@^7.0.0: + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.19" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +inquirer@^8.0.0: + version "8.2.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" + integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^6.0.1" + +inquirer@^9.2.6: + version "9.2.11" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-9.2.11.tgz#e9003755c233a414fceda1891c23bd622cad4a95" + integrity sha512-B2LafrnnhbRzCWfAdOXisUzL89Kg8cVJlYmhqoi3flSiV/TveO+nsXwgKr9h9PIo+J1hz7nBSk6gegRIMBBf7g== + dependencies: + "@ljharb/through" "^2.3.9" + ansi-escapes "^4.3.2" + chalk "^5.3.0" + cli-cursor "^3.1.0" + cli-width "^4.1.0" + external-editor "^3.1.0" + figures "^5.0.0" + lodash "^4.17.21" + mute-stream "1.0.0" + ora "^5.4.1" + run-async "^3.0.0" + rxjs "^7.8.1" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wrap-ansi "^6.2.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-ci@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + +is-core-module@^2.13.0, is-core-module@^2.5.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== + dependencies: + has "^1.0.3" + +is-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-docker@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" + integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== + +is-extendable@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-inside-container@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" + integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== + dependencies: + is-docker "^3.0.0" + +is-installed-globally@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-interactive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-2.0.0.tgz#40c57614593826da1100ade6059778d597f16e90" + integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== + +is-json@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-json/-/is-json-2.0.1.tgz#6be166d144828a131d686891b983df62c39491ff" + integrity sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA== + +is-name-taken@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-name-taken/-/is-name-taken-2.0.0.tgz#c36e6515e07621dc48cd026b6b015a504942fae1" + integrity sha512-W+FUWF5g7ONVJTx3rldZeVizmPzrMMUdscpSQ96vyYerx+4b2NcqaujLJJDWruGzE0FjzGZO9RFIipOGxx/WIw== + dependencies: + all-package-names "^2.0.2" + package-name-conflict "^1.0.3" + validate-npm-package-name "^3.0.0" + +is-npm@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" + integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== + +is-npm@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-6.0.0.tgz#b59e75e8915543ca5d881ecff864077cba095261" + integrity sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ== + +is-number-like@^1.0.3: + version "1.0.8" + resolved "https://registry.yarnpkg.com/is-number-like/-/is-number-like-1.0.8.tgz#2e129620b50891042e44e9bbbb30593e75cfbbe3" + integrity sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA== + dependencies: + lodash.isfinite "^3.3.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-observable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" + integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== + dependencies: + symbol-observable "^1.1.0" + +is-path-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-3.0.0.tgz#889b41e55c8588b1eb2a96a61d05740a674521c7" + integrity sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA== + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-path-inside@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-4.0.0.tgz#805aeb62c47c1b12fc3fd13bfb3ed1e7430071db" + integrity sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA== + +is-promise@^2.1.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" + integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== + +is-scoped@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-scoped/-/is-scoped-3.0.0.tgz#2f9fc6e37c17d432d8e38d3c749aab8c76d1bdd8" + integrity sha512-ezxLUq30kiTvP0w/5n9tj4qTOKlrA07Oty1hwTQ+lcqw11x6uc8sp7VRb2OVGRzKfCHZ2A22T5Zsau/Q2Akb0g== + dependencies: + scoped-regex "^3.0.0" + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-unicode-supported@^1.1.0, is-unicode-supported@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714" + integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== + +is-url-superb@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-url-superb/-/is-url-superb-5.0.0.tgz#8b3c0ce1ceacaa7561fefb9510018106091dccf5" + integrity sha512-jGkG59ra7/JlcV8ap3dsc0M79IgpuFU/obfsSf6X5D0z1NVvFTFuzt4ob7nfBTZEPbTwjGXVKNQDfWfPghapKQ== + +is-url-superb@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/is-url-superb/-/is-url-superb-6.1.0.tgz#182f0d92b482412afeadfba8e6ea2c76680e3631" + integrity sha512-LXdhGlYqUPdvEyIhWPEEwYYK3yrUiPcBjmFGlZNv1u5GtIL5qQRf7ddDyPNAvsMFqdzS923FROpTQU97tLe3JQ== + +is-url@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== + +is-whitespace@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-whitespace/-/is-whitespace-0.3.0.tgz#1639ecb1be036aec69a54cbb401cfbed7114ab7f" + integrity sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + +is-yarn-global@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.4.1.tgz#b312d902b313f81e4eaf98b6361ba2b45cd694bb" + integrity sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +issue-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/issue-regex/-/issue-regex-4.1.0.tgz#e2039123748a48e6711eed7a9eb392f2c17c9341" + integrity sha512-X3HBmm7+Th+l4/kMtqwcHHgELD0Lfl0Ina6S3+grr+mKmTxsrM84NAO1UuRPIxIbGLIl3TCEu45S1kdu21HYbQ== + +jiti@^1.18.2: + version "1.20.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.20.0.tgz#2d823b5852ee8963585c8dd8b7992ffc1ae83b42" + integrity sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA== + +js-beautify@^1.6.12: + version "1.14.9" + resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.14.9.tgz#a5db728bc5a0d84d3b1a597c376b29bd4d39c8e5" + integrity sha512-coM7xq1syLcMyuVGyToxcj2AlzhkDjmfklL8r0JgJ7A76wyGMpJ1oA35mr4APdYNO/o/4YY8H54NQIJzhMbhBg== + dependencies: + config-chain "^1.1.13" + editorconfig "^1.0.3" + glob "^8.1.0" + nopt "^6.0.0" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +jsonfile@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + integrity sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +juice@^9.0.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/juice/-/juice-9.1.0.tgz#3ef8a12392d44c1cd996022aa977581049a65050" + integrity sha512-odblShmPrUoHUwRuC8EmLji5bPP2MLO1GL+gt4XU3tT2ECmbSrrMjtMQaqg3wgMFP2zvUzdPZGfxc5Trk3Z+fQ== + dependencies: + cheerio "^1.0.0-rc.12" + commander "^6.1.0" + mensch "^0.3.4" + slick "^1.12.2" + web-resource-inliner "^6.0.1" + +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +keyv@^4.0.0, keyv@^4.5.3: + version "4.5.3" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" + integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== + dependencies: + json-buffer "3.0.1" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + +latest-version@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + dependencies: + package-json "^6.3.0" + +latest-version@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-7.0.0.tgz#843201591ea81a4d404932eeb61240fe04e9e5da" + integrity sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg== + dependencies: + package-json "^8.1.0" + +lilconfig@^2.0.5, lilconfig@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +limiter@^1.0.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.5.tgz#8f92a25b3b16c6131293a0cc834b4a838a2aa7c2" + integrity sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +linkify-it@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e" + integrity sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ== + dependencies: + uc.micro "^1.0.1" + +listr-input@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/listr-input/-/listr-input-0.2.1.tgz#ce735c34530683580388fdf9462ecfebd3b66126" + integrity sha512-oa8iVG870qJq+OuuMK3DjGqFcwsK1SDu+kULp9kEq09TY231aideIZenr3lFOQdASpAr6asuyJBbX62/a3IIhg== + dependencies: + inquirer "^7.0.0" + inquirer-autosubmit-prompt "^0.2.0" + rxjs "^6.5.3" + through "^2.3.8" + +listr-silent-renderer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" + integrity sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA== + +listr-update-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" + integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA== + dependencies: + chalk "^1.1.3" + cli-truncate "^0.2.1" + elegant-spinner "^1.0.1" + figures "^1.7.0" + indent-string "^3.0.0" + log-symbols "^1.0.2" + log-update "^2.3.0" + strip-ansi "^3.0.1" + +listr-verbose-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db" + integrity sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw== + dependencies: + chalk "^2.4.1" + cli-cursor "^2.1.0" + date-fns "^1.27.2" + figures "^2.0.0" + +listr@^0.14.3: + version "0.14.3" + resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" + integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA== + dependencies: + "@samverschueren/stream-to-observable" "^0.3.0" + is-observable "^1.1.0" + is-promise "^2.1.0" + is-stream "^1.1.0" + listr-silent-renderer "^1.1.1" + listr-update-renderer "^0.5.0" + listr-verbose-renderer "^0.5.0" + p-map "^2.0.0" + rxjs "^6.3.3" + +localtunnel@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-2.0.2.tgz#528d50087151c4790f89c2db374fe7b0a48501f0" + integrity sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug== + dependencies: + axios "0.21.4" + debug "4.3.2" + openurl "1.1.1" + yargs "17.1.1" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +locate-path@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== + dependencies: + p-locate "^6.0.0" + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== + +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== + +lodash.intersection@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.intersection/-/lodash.intersection-4.4.0.tgz#0a11ba631d0e95c23c7f2f4cbb9a692ed178e705" + integrity sha512-N+L0cCfnqMv6mxXtSPeKt+IavbOBBSiAEkKyLasZ8BVcP9YXQgxLO12oPR8OyURwKV8l5vJKiE1M8aS70heuMg== + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + +lodash.isfinite@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3" + integrity sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA== + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.omit@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" + integrity sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg== + +lodash.pull@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/lodash.pull/-/lodash.pull-4.1.0.tgz#60060cc6bd625b4d4567ec27dc45cd1be9eec012" + integrity sha512-EM7CVTzXfkTyusQdN7mgGPh2ZfkKfQ5lA9U+X7NNDeEgKEaO65dB5Kh8+Ppap0X1wQOndPjKP/VVTis7hFvkzg== + +lodash.zip@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.zip/-/lodash.zip-4.2.0.tgz#ec6662e4896408ed4ab6c542a3990b72cc080020" + integrity sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg== + +lodash@^4.17.10, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + integrity sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ== + dependencies: + chalk "^1.0.0" + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log-symbols@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-5.1.0.tgz#a20e3b9a5f53fac6aeb8e2bb22c07cf2c8f16d93" + integrity sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA== + dependencies: + chalk "^5.0.0" + is-unicode-supported "^1.1.0" + +log-update@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" + integrity sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg== + dependencies: + ansi-escapes "^3.0.0" + cli-cursor "^2.0.0" + wrap-ansi "^3.0.1" + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lowercase-keys@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" + integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lru-cache@^7.5.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +markdown-it@^12.0.2: + version "12.3.2" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.3.2.tgz#bf92ac92283fe983fe4de8ff8abfb5ad72cd0c90" + integrity sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg== + dependencies: + argparse "^2.0.1" + entities "~2.1.0" + linkify-it "^3.0.1" + mdurl "^1.0.1" + uc.micro "^1.0.5" + +mdurl@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== + +mensch@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/mensch/-/mensch-0.3.4.tgz#770f91b46cb16ea5b204ee735768c3f0c491fecd" + integrity sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g== + +meow@^12.0.1: + version "12.1.1" + resolved "https://registry.yarnpkg.com/meow/-/meow-12.1.1.tgz#e558dddbab12477b69b2e9a2728c327f191bace6" + integrity sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@~2.1.17, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== + +mime@^2.4.6: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +mimic-response@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f" + integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +minimatch@9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.1.tgz#8a555f541cf976c622daf078bb28f29fb927c253" + integrity sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.0: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mitt@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.2.0.tgz#cb24e6569c806e31bd4e3995787fe38a04fdf90d" + integrity sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +mute-stream@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" + integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +new-github-release-url@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/new-github-release-url/-/new-github-release-url-2.0.0.tgz#335189b91f52bbb9569042a7485900a205a0500b" + integrity sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ== + dependencies: + type-fest "^2.5.1" + +node-fetch@^2.6.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-releases@^2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== + +nopt@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" + integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== + dependencies: + abbrev "^1.0.0" + +normalize-package-data@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" + integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== + dependencies: + hosted-git-info "^4.0.1" + is-core-module "^2.5.0" + semver "^7.3.4" + validate-npm-package-license "^3.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +normalize-url@^4.1.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +normalize-url@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.0.tgz#593dbd284f743e8dcf6a5ddf8fadff149c82701a" + integrity sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw== + +np@*: + version "8.0.4" + resolved "https://registry.yarnpkg.com/np/-/np-8.0.4.tgz#67d68e95cf443ddff5b3aed3ceb0c2a03375be38" + integrity sha512-a4s1yESHcIwsrk/oaTekfbhb1R/2z2yyfVLX6Atl54w/9+QR01qeYyK3vMWgJ0UY+kYsGzQXausgvUX0pkmIMg== + dependencies: + chalk "^5.2.0" + cosmiconfig "^8.1.3" + del "^7.0.0" + escape-goat "^4.0.0" + escape-string-regexp "^5.0.0" + execa "^7.1.1" + exit-hook "^3.2.0" + github-url-from-git "^1.5.0" + has-yarn "^3.0.0" + hosted-git-info "^6.1.1" + ignore-walk "^6.0.3" + import-local "^3.1.0" + inquirer "^9.2.6" + is-installed-globally "^0.4.0" + is-interactive "^2.0.0" + is-scoped "^3.0.0" + issue-regex "^4.1.0" + listr "^0.14.3" + listr-input "^0.2.1" + log-symbols "^5.1.0" + meow "^12.0.1" + new-github-release-url "^2.0.0" + npm-name "^7.1.0" + onetime "^6.0.0" + open "^9.1.0" + ow "^1.1.1" + p-memoize "^7.1.1" + p-timeout "^6.1.1" + path-exists "^5.0.0" + pkg-dir "^7.0.0" + read-pkg-up "^9.1.0" + rxjs "^7.8.1" + semver "^7.5.1" + symbol-observable "^4.0.0" + terminal-link "^3.0.0" + update-notifier "^6.0.2" + +npm-name@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/npm-name/-/npm-name-7.1.0.tgz#03fba1e9fe9d239de8c8c40abd6a37a90e9571f9" + integrity sha512-0Sxf+7tQUOkQ9HuYVSdvq7gZNAOPp1ZJjHiKzpJhsQw9m1YjNfARC0SxWuuUWefChsbvu+DWrwWFfGQWLHmLjg== + dependencies: + got "^11.8.5" + is-name-taken "^2.0.0" + is-scoped "^3.0.0" + is-url-superb "^6.1.0" + lodash.zip "^4.2.0" + org-regex "^1.0.0" + p-map "^5.5.0" + registry-auth-token "^4.2.2" + registry-url "^6.0.1" + validate-npm-package-name "^3.0.0" + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npm-run-path@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" + integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== + dependencies: + path-key "^4.0.0" + +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== + +object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-boolean-combinations@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object-boolean-combinations/-/object-boolean-combinations-4.1.0.tgz#3684053c13b38da87533c64f225c4168ce15db94" + integrity sha512-AkiONPtYhPo7B2X/0sohAlFsIBCFr9HElIe34edEFJIk5XSYc/N/06SJyQWeq6L/gFuvnUTa0/TnrqE0Ge3ncA== + dependencies: + "@babel/runtime" "^7.14.0" + lodash.clonedeep "^4.5.0" + lodash.intersection "^4.4.0" + lodash.isplainobject "^4.0.6" + lodash.pull "^4.1.0" + +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== + dependencies: + mimic-fn "^1.0.0" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + +open@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6" + integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg== + dependencies: + default-browser "^4.0.0" + define-lazy-prop "^3.0.0" + is-inside-container "^1.0.0" + is-wsl "^2.2.0" + +openurl@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/openurl/-/openurl-1.1.1.tgz#3875b4b0ef7a52c156f0db41d4609dbb0f94b387" + integrity sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA== + +opn@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" + integrity sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g== + dependencies: + is-wsl "^1.1.0" + +ora@^5.1.0, ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +org-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/org-regex/-/org-regex-1.0.0.tgz#67ebb9ab3cb124fea5841289d60b59434f041a59" + integrity sha512-7bqkxkEJwzJQUAlyYniqEZ3Ilzjh0yoa62c7gL6Ijxj5bEpPL+8IE1Z0PFj0ywjjXQcdrwR51g9MIcLezR0hKQ== + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +ow@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ow/-/ow-1.1.1.tgz#354a0f7df9d8d0cf961b29116daf972ef6be1632" + integrity sha512-sJBRCbS5vh1Jp9EOgwp1Ws3c16lJrUkJYlvWTYC03oyiYVwS/ns7lKRWow4w4XjDyTrA2pplQv4B2naWSR6yDA== + dependencies: + "@sindresorhus/is" "^5.3.0" + callsites "^4.0.0" + dot-prop "^7.2.0" + lodash.isequal "^4.5.0" + vali-date "^1.0.0" + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-cancelable@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== + +p-cancelable@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" + integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + +p-lock@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-lock/-/p-lock-2.1.0.tgz#6f9dbc55d3aac5b0f75c8ec47f3a6f1b954135f8" + integrity sha512-pi2yT8gNhVrV4LgsUvJWQy58TXH1HG2+NXDby9+UrsS/9fXb0FJH9aCxbdHJ0EAQ6XC7ggSP6GAzuR5puDArUQ== + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-map@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-5.5.0.tgz#054ca8ca778dfa4cf3f8db6638ccb5b937266715" + integrity sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg== + dependencies: + aggregate-error "^4.0.0" + +p-memoize@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/p-memoize/-/p-memoize-7.1.1.tgz#53b1d0e6007288f7261cfa11a7603b84c9261bfa" + integrity sha512-DZ/bONJILHkQ721hSr/E9wMz5Am/OTJ9P6LhLFo2Tu+jL8044tgc9LwHO8g4PiaYePnlVVRAJcKmgy8J9MVFrA== + dependencies: + mimic-fn "^4.0.0" + type-fest "^3.0.0" + +p-timeout@^6.1.1: + version "6.1.2" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-6.1.2.tgz#22b8d8a78abf5e103030211c5fc6dee1166a6aa5" + integrity sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ== + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + +package-json@^8.1.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-8.1.1.tgz#3e9948e43df40d1e8e78a85485f1070bf8f03dc8" + integrity sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA== + dependencies: + got "^12.1.0" + registry-auth-token "^5.0.1" + registry-url "^6.0.0" + semver "^7.3.7" + +package-name-conflict@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/package-name-conflict/-/package-name-conflict-1.0.3.tgz#5147d35e8ae7f93401f1b3f9f3763c070463f25c" + integrity sha512-DPBNWSUWC0wPofXeNThao0uP4a93J7r90UyhagmJS0QcacTTkorZwXYsOop70phn1hKdcf/2e9lJIhazS8bx5A== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json-object@^1.0.5: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parse-json-object/-/parse-json-object-1.1.0.tgz#eef60211cec368259723d8586ecec7252f8fcdb2" + integrity sha512-4w5s6uJY1tW9REY8UwUOyaZKSKsrbQrMEzlV/Le/g5t4iMWuuyK83pZZ0OZimSOL9iyv2ORvRSgz71Ekd7iD3g== + dependencies: + types-json "^1.0.6" + +parse-json-object@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/parse-json-object/-/parse-json-object-2.0.1.tgz#a441bd8c36d2c33a69516286e7e4138a23607ee0" + integrity sha512-/oF7PUUBjCqHmMEE6xIQeX5ZokQ9+miudACzPt4KBU2qi6CxZYPdisPXx4ad7wpZJYi2ZpcW2PacLTU3De3ebw== + dependencies: + types-json "^1.2.0" + +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse5-htmlparser2-tree-adapter@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" + integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== + dependencies: + domhandler "^5.0.2" + parse5 "^7.0.0" + +parse5@^7.0.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + +parseurl@~1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pirates@^4.0.1: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-dir@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-7.0.0.tgz#8f0c08d6df4476756c5ff29b3282d0bab7517d11" + integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA== + dependencies: + find-up "^6.3.0" + +portscanner@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-2.2.0.tgz#6059189b3efa0965c9d96a56b958eb9508411cf1" + integrity sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw== + dependencies: + async "^2.6.0" + is-number-like "^1.0.3" + +postcss-import@^15.0.0, postcss-import@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== + dependencies: + camelcase-css "^2.0.1" + +postcss-load-config@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.1.tgz#152383f481c2758274404e4962743191d73875bd" + integrity sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA== + dependencies: + lilconfig "^2.0.5" + yaml "^2.1.1" + +postcss-merge-longhand@^5.0.1: + version "5.1.7" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16" + integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== + dependencies: + postcss-value-parser "^4.2.0" + stylehacks "^5.1.1" + +postcss-merge-longhand@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-6.0.0.tgz#6f627b27db939bce316eaa97e22400267e798d69" + integrity sha512-4VSfd1lvGkLTLYcxFuISDtWUfFS4zXe0FpF149AyziftPFQIWxjvFSKhA4MIxMe4XM3yTDgQMbSNgzIVxChbIg== + dependencies: + postcss-value-parser "^4.2.0" + stylehacks "^6.0.0" + +postcss-nested@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" + integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== + dependencies: + postcss-selector-parser "^6.0.11" + +postcss-safe-parser@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz#bb4c29894171a94bc5c996b9a30317ef402adaa1" + integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ== + +postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.4: + version "6.0.13" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" + integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^8.1.10, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.6: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +posthtml-attrs-parser@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posthtml-attrs-parser/-/posthtml-attrs-parser-0.1.1.tgz#cc33e00155fb99ba96f67e25e330461f05742ac8" + integrity sha512-ZFZfTIb74uHFdn80+7DyP+qrryDX/Bb7Q2rUaByh6iUJ1HlKGSxkChKORpwIUHjChJDzcKEtnyXxzXzcjpH9CQ== + dependencies: + object-assign "^4.0.1" + +posthtml-base-url@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/posthtml-base-url/-/posthtml-base-url-2.0.0.tgz#0baec6eedd5757ae8f2bd578a6eec087d38865c5" + integrity sha512-ZR8U5IVt8RoaigIxrkyA65b1D+iSgaPHwbS/NZ78fDqHsbSuOqEvALOy8DR3MciKIFf0QpIDOcLNDhf4eAkjig== + dependencies: + is-url-superb "^5.0.0" + lodash.merge "^4.6.2" + postcss "^8.4.6" + srcset "^4.0.0" + +posthtml-component@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/posthtml-component/-/posthtml-component-1.1.0.tgz#79bc00a78a79b1c690a5e53d93b80588cdc1f0c0" + integrity sha512-8bDF8VWYwA2qWJn+ieglFyDrvjuQzO5Tz8Sh3cdcJ6ccoynXui+JzE5G25qnqQHw2I0eszqsvjpGfiWcqMsqsQ== + dependencies: + lodash "^4.17.21" + posthtml-attrs-parser "^0.1.1" + posthtml-expressions "^1.9.0" + posthtml-parser "^0.11.0" + posthtml-render "^3.0.0" + style-to-object "^0.3.0" + +posthtml-content@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/posthtml-content/-/posthtml-content-0.1.2.tgz#5131cbb3ddb4157ba3f66c29eebd40aba5522ff0" + integrity sha512-UesIunmvd+ZJZQWJneFqN5hWdV37e1YIkRdoVbmbZB0jPUHORYFLJdC9PaBEL9Jbm46RFoiYI2nX07QBiAqiMA== + dependencies: + when "^3.7.8" + +posthtml-expressions@^1.10.0, posthtml-expressions@^1.6.2, posthtml-expressions@^1.9.0: + version "1.11.1" + resolved "https://registry.yarnpkg.com/posthtml-expressions/-/posthtml-expressions-1.11.1.tgz#1e1f8914d49ddd1a8dcabd9ed911078efb8908f7" + integrity sha512-2zA5SRM7quupTGa422xH72T0n3tF5quZeZ66czmMa/4QAj8HFzCTlN5l42wWVjLCxj7XOmMmQJEeK0+p3AgH+w== + dependencies: + fclone "^1.0.11" + posthtml "^0.16.5" + posthtml-match-helper "^1.0.1" + posthtml-parser "^0.10.0" + posthtml-render "^3.0.0" + +posthtml-extend@^0.6.0: + version "0.6.5" + resolved "https://registry.yarnpkg.com/posthtml-extend/-/posthtml-extend-0.6.5.tgz#9316b29d412b153584f1e867ee8a1ee68db042a3" + integrity sha512-4GUJaGViVfzthUHDUNxdb4Et4VeRNIJ+v3bz0Zsa7UZney6xcqBOtWsE71P31TbZ3g94LAZfQb+HOQZLXZKyCQ== + dependencies: + deepmerge "^4.2.2" + posthtml "^0.16.5" + posthtml-expressions "^1.10.0" + posthtml-parser "^0.11.0" + +posthtml-extra-attributes@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/posthtml-extra-attributes/-/posthtml-extra-attributes-2.0.0.tgz#ed259c9395f8ae1257f468b82cbdd2d01062e8a1" + integrity sha512-hsgcYtvu9v1zGTtUE+KPFLueiz72gdZiKD9CRlTCQXB2f9sDYPqWLacbzm21DVrD6cpQ4aemZLZjkectehS2hQ== + dependencies: + lodash.omit "^4.5.0" + posthtml-match-helper "^1.0.1" + +posthtml-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/posthtml-fetch/-/posthtml-fetch-3.0.0.tgz#2656eac839526e84c0b70efe85b557de2a4acfed" + integrity sha512-YwvmC8Ze3JOPsC3l368TKkTnwGXERKeA4wcdMhHi4bamEszRPESYvjzIIpRFNzao/r4BtKEN6X5dRoc8RNRDnA== + dependencies: + got "^11.8.0" + is-url "^1.2.4" + lodash.merge "^4.6.2" + posthtml "^0.16.4" + posthtml-expressions "^1.6.2" + posthtml-match-helper "^1.0.1" + +posthtml-markdownit@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/posthtml-markdownit/-/posthtml-markdownit-1.3.1.tgz#7ba3d5aa92ebbe2e06002909b55faaf7c889f4d5" + integrity sha512-ohva3TR6zD+k+yRirsvC5tYvSNs6FyZ4rD5WdS2rXA7ZP8z5XXispGJPuGKFt4L7pS4eBmB5oROoggG/pwatuA== + dependencies: + markdown-it "^12.0.2" + min-indent "^1.0.0" + posthtml "^0.15.0" + posthtml-parser "^0.6.0" + posthtml-render "^1.4.0" + +posthtml-match-helper@^1.0.1, posthtml-match-helper@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/posthtml-match-helper/-/posthtml-match-helper-1.0.3.tgz#9308f0bdc66398735f7117441feca64f131956d5" + integrity sha512-aeRAPvok2Fs6uzSm85665jdAk5UOd8US2QCkWtGU6yLPlKSwzWTSgZZuABc3UeNy3K1lVk/HV9bRkWJYN05Ymw== + +posthtml-mso@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/posthtml-mso/-/posthtml-mso-2.0.0.tgz#35fa5bd1f717567cf78f38cc732d70094c0ebe66" + integrity sha512-xyjjV883L4gv8LZ9qh0+chuHDhXWeBVwEUTipzdM3sumRVGrIKfU0X08TWxc0q7LThnTAtlwyTyN5XQplg2bcA== + dependencies: + posthtml "^0.16.4" + +posthtml-parser@^0.10.0: + version "0.10.2" + resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.10.2.tgz#df364d7b179f2a6bf0466b56be7b98fd4e97c573" + integrity sha512-PId6zZ/2lyJi9LiKfe+i2xv57oEjJgWbsHGGANwos5AvdQp98i6AtamAl8gzSVFGfQ43Glb5D614cvZf012VKg== + dependencies: + htmlparser2 "^7.1.1" + +posthtml-parser@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.11.0.tgz#25d1c7bf811ea83559bc4c21c189a29747a24b7a" + integrity sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw== + dependencies: + htmlparser2 "^7.1.1" + +posthtml-parser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.6.0.tgz#52488cdb4fa591c3102de73197c471859ee0be63" + integrity sha512-5ffwKQNgtVHdhZniWxu+1ryvaZv5l25HPLUV6W5xy5nYVWMXtvjtwRnbSpfbKFvbyl7XI+d4AqkjmonkREqnXA== + dependencies: + htmlparser2 "^5.0.1" + +posthtml-parser@^0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.7.2.tgz#3fba3375544d824bb1c8504f0d69f6e0b95774db" + integrity sha512-LjEEG/3fNcWZtBfsOE3Gbyg1Li4CmsZRkH1UmbMR7nKdMXVMYI3B4/ZMiCpaq8aI1Aym4FRMMW9SAOLSwOnNsQ== + dependencies: + htmlparser2 "^6.0.0" + +posthtml-postcss-merge-longhand@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/posthtml-postcss-merge-longhand/-/posthtml-postcss-merge-longhand-2.0.1.tgz#ed1ee2ea6119908f560a1653a3d8022bc200c99c" + integrity sha512-Ob+jiusv1qA7NmVFvrCcJlpsLpfM1mJg6P4fBTi9+K1U+3wZR3th3KDnewUxzUFWyTmObole2SfajMfWSC0qQg== + dependencies: + postcss "^8.1.10" + postcss-merge-longhand "^5.0.1" + posthtml "^0.16.4" + +posthtml-render@^1.3.1, posthtml-render@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/posthtml-render/-/posthtml-render-1.4.0.tgz#40114070c45881cacb93347dae3eff53afbcff13" + integrity sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw== + +posthtml-render@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/posthtml-render/-/posthtml-render-3.0.0.tgz#97be44931496f495b4f07b99e903cc70ad6a3205" + integrity sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA== + dependencies: + is-json "^2.0.1" + +posthtml-safe-class-names@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/posthtml-safe-class-names/-/posthtml-safe-class-names-3.0.0.tgz#af2b3a95f17cc8b76c38bacfd0fc73ba5a6a080b" + integrity sha512-3UepR+RKVp6ZDYmWp/XcdTxDjcdY5DNFQoTvprBYOVLKCUbPZNSIGvaYlPm1TnRvnxb9PVRIhYi6FF0DOtE+JA== + dependencies: + css.escape "^1.5.1" + postcss "^8.1.10" + postcss-safe-parser "^6.0.0" + postcss-selector-parser "^6.0.4" + posthtml "^0.16.4" + +posthtml-url-parameters@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/posthtml-url-parameters/-/posthtml-url-parameters-2.0.0.tgz#a47fb0c0e83a6146132a1fb9a24d6e326f57d6c0" + integrity sha512-h2bryr1SdO7MpqlSPoLAj89ESxL/Z2QKSlT+93Rw1Xf/vxMUCh5G3g5KDYE0+MCprlI1K3h3V9WdKpMSJiz90w== + dependencies: + is-url-superb "^5.0.0" + posthtml "^0.16.6" + posthtml-match-helper "^1.0.3" + query-string "7.1.3" + +posthtml@^0.15.0: + version "0.15.2" + resolved "https://registry.yarnpkg.com/posthtml/-/posthtml-0.15.2.tgz#739cf0d3ffec70868b87121dc7393478e1898c9c" + integrity sha512-YugEJ5ze/0DLRIVBjCpDwANWL4pPj1kHJ/2llY8xuInr0nbkon3qTiMPe5LQa+cCwNjxS7nAZZTp+1M+6mT4Zg== + dependencies: + posthtml-parser "^0.7.2" + posthtml-render "^1.3.1" + +posthtml@^0.16.4, posthtml@^0.16.5, posthtml@^0.16.6: + version "0.16.6" + resolved "https://registry.yarnpkg.com/posthtml/-/posthtml-0.16.6.tgz#e2fc407f67a64d2fa3567afe770409ffdadafe59" + integrity sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ== + dependencies: + posthtml-parser "^0.11.0" + posthtml-render "^3.0.0" + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== + +pretty@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pretty/-/pretty-2.0.0.tgz#adbc7960b7bbfe289a557dc5f737619a220d06a5" + integrity sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w== + dependencies: + condense-newlines "^0.2.1" + extend-shallow "^2.0.1" + js-beautify "^1.6.12" + +progress@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pupa@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" + integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== + dependencies: + escape-goat "^2.0.0" + +pupa@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-3.1.0.tgz#f15610274376bbcc70c9a3aa8b505ea23f41c579" + integrity sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug== + dependencies: + escape-goat "^4.0.0" + +query-string@7.1.3, query-string@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.3.tgz#a1cf90e994abb113a325804a972d98276fe02328" + integrity sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg== + dependencies: + decode-uri-component "^0.2.2" + filter-obj "^1.1.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +range-parser@~1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +ranges-apply@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ranges-apply/-/ranges-apply-5.1.0.tgz#d18ec097844e548eb4a325f9257ad81179946f85" + integrity sha512-VF3a0XUuYS/BQHv2RaIyX1K7S1hbfrs64hkGKgPVk0Y7p4XFwSucjTTttrBqmkcmB/PZx5ISTZdxErRZi/89aQ== + dependencies: + "@babel/runtime" "^7.14.0" + ranges-merge "^7.1.0" + +ranges-merge@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/ranges-merge/-/ranges-merge-7.1.0.tgz#b2626d5865060944297a21cd499b886cb59127b9" + integrity sha512-coTHcyAEIhoEdsBs9f5f+q0rmy7UHvS/5nfuXzuj5oLX/l/tbqM5uxRb6eh8WMdetXia3lK67ZO4tarH4ieulQ== + dependencies: + "@babel/runtime" "^7.14.0" + ranges-push "^5.1.0" + ranges-sort "^4.1.0" + +ranges-push@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ranges-push/-/ranges-push-5.1.0.tgz#73cd42e347b8e7807e42ccf35d6e5041e1705fb4" + integrity sha512-vqGcaGq7GWV1zBa9w83E+dzYkOvE9/3pIRUPvLf12c+mGQCf1nesrkBI7Ob8taN2CC9V1HDSJx0KAQl0SgZftA== + dependencies: + "@babel/runtime" "^7.14.0" + ranges-merge "^7.1.0" + string-collapse-leading-whitespace "^5.1.0" + string-trim-spaces-only "^3.1.0" + +ranges-sort@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ranges-sort/-/ranges-sort-4.1.0.tgz#ec2313421b2538186582062751c77be30182f186" + integrity sha512-GOQgk6UtsrfKFeYa53YLiBVnLINwYmOk5l2QZG1csZpT6GdImUwooh+/cRrp7b+fYawZX/rnyA3Ul+pdgQBIzA== + dependencies: + "@babel/runtime" "^7.14.0" + +raw-body@^2.3.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc@1.2.8, rc@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +read-file-safe@^1.0.5: + version "1.0.10" + resolved "https://registry.yarnpkg.com/read-file-safe/-/read-file-safe-1.0.10.tgz#9ac9118f12cb122614612211f90dad9daf732e39" + integrity sha512-qW25fd2uMX3dV6Ui/R0jYK1MhTpjx8FO/VHaHTXzwWsGnkNwLRcqYfCXd9qDM+NZ273DPUvP2RaimYuLSu1K/g== + +read-json-safe@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/read-json-safe/-/read-json-safe-1.0.5.tgz#c459443b8e6eb3a2672cf68ddc81d2f4ef95c8d7" + integrity sha512-SJyNY/U9+vW35FPus22Qvv1oilnR7PCfN2E70uKQEGaJS313A5/cz9Yhv7ZtWzZ+XIwrtEPxXf10BOyYemHehA== + dependencies: + parse-json-object "^1.0.5" + read-file-safe "^1.0.5" + +read-pkg-up@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-9.1.0.tgz#38ca48e0bc6c6b260464b14aad9bcd4e5b1fbdc3" + integrity sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg== + dependencies: + find-up "^6.3.0" + read-pkg "^7.1.0" + type-fest "^2.5.0" + +read-pkg@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-7.1.0.tgz#438b4caed1ad656ba359b3e00fd094f3c427a43e" + integrity sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg== + dependencies: + "@types/normalize-package-data" "^2.4.1" + normalize-package-data "^3.0.2" + parse-json "^5.2.0" + type-fest "^2.0.0" + +readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + +registry-auth-token@^4.0.0, registry-auth-token@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.2.tgz#f02d49c3668884612ca031419491a13539e21fac" + integrity sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg== + dependencies: + rc "1.2.8" + +registry-auth-token@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.2.tgz#8b026cc507c8552ebbe06724136267e63302f756" + integrity sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ== + dependencies: + "@pnpm/npm-conf" "^2.1.0" + +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" + +registry-url@^6.0.0, registry-url@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-6.0.1.tgz#056d9343680f2f64400032b1e199faa692286c58" + integrity sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q== + dependencies: + rc "1.2.8" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-alpn@^1.0.0, resolve-alpn@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve@^1.1.7, resolve@^1.22.2: + version "1.22.6" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.6.tgz#dd209739eca3aef739c626fea1b4f3c506195362" + integrity sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resp-modifier@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/resp-modifier/-/resp-modifier-6.0.2.tgz#b124de5c4fbafcba541f48ffa73970f4aa456b4f" + integrity sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw== + dependencies: + debug "^2.2.0" + minimatch "^3.0.2" + +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== + dependencies: + lowercase-keys "^1.0.0" + +responselike@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" + integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== + dependencies: + lowercase-keys "^2.0.0" + +responselike@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-3.0.0.tgz#20decb6c298aff0dbee1c355ca95461d42823626" + integrity sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg== + dependencies: + lowercase-keys "^3.0.0" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-applescript@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c" + integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg== + dependencies: + execa "^5.0.0" + +run-async@^2.2.0, run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-async@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-3.0.0.tgz#42a432f6d76c689522058984384df28be379daad" + integrity sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rx@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + integrity sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug== + +rxjs@^6.3.3, rxjs@^6.4.0, rxjs@^6.5.3, rxjs@^6.6.0: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +rxjs@^7.5.5, rxjs@^7.8.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scoped-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/scoped-regex/-/scoped-regex-3.0.0.tgz#cd7ede7d942f2ae90da53272102ff2d73129c46f" + integrity sha512-yEsN6TuxZhZ1Tl9iB81frTNS292m0I/IG7+w8lTvfcJQP2x3vnpOoevjBoE3Np5A6KnZM2+RtVenihj9t6NiYg== + +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + dependencies: + semver "^6.3.0" + +semver-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-4.0.0.tgz#3afcf5ed6d62259f5c72d0d5d50dffbdc9680df5" + integrity sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA== + dependencies: + semver "^7.3.5" + +semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.1, semver@^7.5.3: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + +serve-index@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + +server-destroy@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" + integrity sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ== + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + integrity sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw== + +slick@^1.12.2: + version "1.12.2" + resolved "https://registry.yarnpkg.com/slick/-/slick-1.12.2.tgz#bd048ddb74de7d1ca6915faa4a57570b3550c2d7" + integrity sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A== + +socket.io-adapter@~2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz#5de9477c9182fdc171cd8c8364b9a8894ec75d12" + integrity sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA== + dependencies: + ws "~8.11.0" + +socket.io-client@^4.4.1: + version "4.7.2" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.7.2.tgz#f2f13f68058bd4e40f94f2a1541f275157ff2c08" + integrity sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.2" + engine.io-client "~6.5.2" + socket.io-parser "~4.2.4" + +socket.io-parser@~4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + +socket.io@^4.4.1: + version "4.7.2" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.7.2.tgz#22557d76c3f3ca48f82e73d68b7add36a22df002" + integrity sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw== + dependencies: + accepts "~1.3.4" + base64id "~2.0.0" + cors "~2.8.5" + debug "~4.3.2" + engine.io "~6.5.2" + socket.io-adapter "~2.5.2" + socket.io-parser "~4.2.4" + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.15" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.15.tgz#142460aabaca062bc7cd4cc87b7d50725ed6a4ba" + integrity sha512-lpT8hSQp9jAKp9mhtBU4Xjon8LPGBvLIuBiSVhMEtmLecTh2mO0tlqrAMp47tBXzMr13NJMQ2lf7RpQGLJ3HsQ== + +split-on-first@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" + integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +srcset@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/srcset/-/srcset-4.0.0.tgz#336816b665b14cd013ba545b6fe62357f86e65f4" + integrity sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + integrity sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg== + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== + +stream-throttle@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/stream-throttle/-/stream-throttle-0.1.3.tgz#add57c8d7cc73a81630d31cd55d3961cfafba9c3" + integrity sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ== + dependencies: + commander "^2.2.0" + limiter "^1.0.5" + +strict-uri-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== + +string-character-is-astral-surrogate@^1.13.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/string-character-is-astral-surrogate/-/string-character-is-astral-surrogate-1.13.0.tgz#fb3ebd8de6deb33d748cd30e3c3d947a79c233f7" + integrity sha512-tKRG2qaGiV2ntUur32sfeAypqTvMUtl+8spEYSJzDsee4lKGMFxQmdHIyCw/uiWWQSve+DQmde2japDYZlQpLA== + dependencies: + "@babel/runtime" "^7.14.0" + +string-collapse-leading-whitespace@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/string-collapse-leading-whitespace/-/string-collapse-leading-whitespace-5.1.0.tgz#3ebe317241421bcba651e697ef60d6b9a9bf43c3" + integrity sha512-mYz9/Kb5uvRB4DZj46zILwI4y9lD9JsvXG9Xb7zjbwm0I/R40G7oFfMsqJ28l2d7gWMTLJL569NfJQVLQbnHCw== + dependencies: + "@babel/runtime" "^7.14.0" + +string-left-right@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/string-left-right/-/string-left-right-4.1.0.tgz#d73c066720cb0a8cd2b6a61e3188d3458b22b776" + integrity sha512-ic/WvfNVUygWWsgg8akzSzp2NuttfhrdbH7QmSnda5b5RFmT9aCEDiS/M+gmTJwtFy7+b/2AXU4Z6vejcePQqQ== + dependencies: + "@babel/runtime" "^7.14.0" + lodash.clonedeep "^4.5.0" + lodash.isplainobject "^4.0.6" + +string-match-left-right@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/string-match-left-right/-/string-match-left-right-7.1.0.tgz#4ad6b2d69bfbc40f276699170e8b0b95f65b932a" + integrity sha512-PSyXWesECKYnTJy6xaXAz/2AiyIjrga2hhMN8QbSNGwsnxcpWxt5pMpc7JQIzPkkEwDwip8PdIuU110xKuBevg== + dependencies: + "@babel/runtime" "^7.14.0" + arrayiffy-if-string "^3.14.0" + lodash.isplainobject "^4.0.6" + string-character-is-astral-surrogate "^1.13.0" + +string-range-expander@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/string-range-expander/-/string-range-expander-2.1.0.tgz#14b54e085590393d73eaa07cbfbef3929c4c7ede" + integrity sha512-y/lRS0l1vfqAfj/msJ3APzf9IXCB7CZ6PrZFEPkXcLjau2vFrZ7ML1skKVItMYy16wGO87rv+28KtTYIAQoAYw== + dependencies: + "@babel/runtime" "^7.14.0" + +string-remove-widows@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/string-remove-widows/-/string-remove-widows-2.1.0.tgz#3af85b01ffa7459f31045706ff487db99742da35" + integrity sha512-GoBqfTvkc1uKeazfS/+hjLSi81IBDPmPPVBowk5x39Z+VvrvHLjJZFoYJbwe0JlPg1Mc4rX3Ak+5zPqAexWu5Q== + dependencies: + "@babel/runtime" "^7.14.0" + ranges-apply "^5.1.0" + ranges-push "^5.1.0" + string-left-right "^4.1.0" + string-match-left-right "^7.1.0" + +string-strip-html@^8.2.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/string-strip-html/-/string-strip-html-8.5.0.tgz#5e239fe84016fad7b33ca02d23c591f1ccb6af75" + integrity sha512-5ICsK1B1j0A3AF1d45m0sqQCcmi1Q+t1QpF+b794LO5FTHV+ITkGR5C+UCDJQZgs5LMuRruqr6j48PxQVIurJQ== + +string-trim-spaces-only@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-trim-spaces-only/-/string-trim-spaces-only-3.1.0.tgz#b7936051706110caec5bcf3f7f866fe46354d7aa" + integrity sha512-AW7RSi3+QtE6wR+4m/kmwlyy39neBbCIzrzzu1/RGzNRiPKQOeB3rGzr4ubg4UIQgYtr2w0PrxhKPXgyqJ0vaQ== + dependencies: + "@babel/runtime" "^7.14.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +style-to-object@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" + integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== + dependencies: + inline-style-parser "0.1.1" + +stylehacks@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" + integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== + dependencies: + browserslist "^4.21.4" + postcss-selector-parser "^6.0.4" + +stylehacks@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-6.0.0.tgz#9fdd7c217660dae0f62e14d51c89f6c01b3cb738" + integrity sha512-+UT589qhHPwz6mTlCLSt/vMNTJx8dopeJlZAlBMJPWA3ORqu6wmQY7FBXf+qD+FsqoBJODyqNxOUP3jdntFRdw== + dependencies: + browserslist "^4.21.4" + postcss-selector-parser "^6.0.4" + +sucrase@^3.32.0: + version "3.34.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.34.0.tgz#1e0e2d8fcf07f8b9c3569067d92fbd8690fb576f" + integrity sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "7.1.6" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" + integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +symbol-observable@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== + +symbol-observable@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" + integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== + +tailwindcss-box-shadow@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/tailwindcss-box-shadow/-/tailwindcss-box-shadow-2.0.1.tgz#5d224fff9231019ff2780c07805821c43608e474" + integrity sha512-F0reqyXrQkcPQiCM27ZqV8Le0CGqea0S5PCwwgTnNrdzOdDs2y6iJ5jJKIdMgKu/1VxUpgP0CMPU/k8vdqpLBA== + +tailwindcss-email-variants@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/tailwindcss-email-variants/-/tailwindcss-email-variants-2.0.3.tgz#74e733ef0f2bc3a2858346ffd0dc029e4f34d0b5" + integrity sha512-AfO4g/ZpTW7EUV9c1F3gJK6Tqud7nz54oqo0U4ik0Y9jK2Wu7KNNFFK2IuhOa2FkuwGfZp6KLs9rTzwandq/+g== + dependencies: + lodash.get "^4.4.2" + +tailwindcss-mso@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/tailwindcss-mso/-/tailwindcss-mso-1.3.0.tgz#05023f191ac200b7da86a179fbf2d18f3b3fa0fd" + integrity sha512-aCdQrJaS0GM3/aTOG7T/KuUvoVJvpW4H+9Ao2aYfm3mjd515I5JtJqOcZRXaC99AOTfaKJ0skgRIt8h6LTkDNw== + +tailwindcss@^3.2.7: + version "3.3.3" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.3.3.tgz#90da807393a2859189e48e9e7000e6880a736daf" + integrity sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w== + dependencies: + "@alloc/quick-lru" "^5.2.0" + arg "^5.0.2" + chokidar "^3.5.3" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.2.12" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.18.2" + lilconfig "^2.1.0" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.23" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.1" + postcss-nested "^6.0.1" + postcss-selector-parser "^6.0.11" + resolve "^1.22.2" + sucrase "^3.32.0" + +terminal-link@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-3.0.0.tgz#91c82a66b52fc1684123297ce384429faf72ac5c" + integrity sha512-flFL3m4wuixmf6IfhFJd1YPiLiMuxEc8uHRM1buzIeZPm22Au2pDqBJQgdo7n1WfPU1ONFGv7YDwpFBmHGF6lg== + dependencies: + ansi-escapes "^5.0.0" + supports-hyperlinks "^2.2.0" + +test-mixer@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/test-mixer/-/test-mixer-2.1.0.tgz#7d7b36d197e6736b860cbc605bcc99ac1b269ae5" + integrity sha512-b258NzCyFOZlCNUiPubygccoTt0AAYeJQgFVV5BMQfzFxkSKJuWauehCOmocxM56+2P+Wv1uIIXac90M8KyJLA== + dependencies: + "@babel/runtime" "^7.14.0" + lodash.clonedeep "^4.5.0" + object-boolean-combinations "^4.1.0" + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +through@^2.3.6, through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +titleize@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53" + integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ== + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.1.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^1.0.1, type-fest@^1.0.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== + +type-fest@^2.0.0, type-fest@^2.11.2, type-fest@^2.13.0, type-fest@^2.5.0, type-fest@^2.5.1: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + +type-fest@^3.0.0: + version "3.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.13.1.tgz#bb744c1f0678bea7543a2d1ec24e83e68e8c8706" + integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +types-eslintrc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/types-eslintrc/-/types-eslintrc-1.0.3.tgz#b277d301caca6c330477cbaa67bf6f79ac3d6fee" + integrity sha512-zKTR6aKHEudQpl+JoZjS3qh0B5IzSpQK/BCpYBECujcnKtqL87DJJ1sJKe5B8k/y8/UJ5sukq42QDvlaJyCO2w== + dependencies: + types-json "^1.2.2" + +types-json@^1.0.6, types-json@^1.2.0, types-json@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/types-json/-/types-json-1.2.2.tgz#91ebe6de59e741ab38a98b071708a29494cedfe6" + integrity sha512-VfVLISHypS7ayIHvhacOESOTib4Sm4mAhnsgR8fzQdGp89YoBwMqvGmqENjtYehUQzgclT+7NafpEXkK/MHKwA== + +types-pkg-json@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/types-pkg-json/-/types-pkg-json-1.2.1.tgz#890fe4f231000a721299831ef3e17a489b1e635e" + integrity sha512-Wj75lCkPwfj1BhmaJxMPpTQj9YGpihjs3WICigt1IjTAswr7zPXP0iJYPZjU0Rw/IriODhMJjAImkCIxt9KeuQ== + dependencies: + types-eslintrc "^1.0.3" + types-json "^1.2.2" + +ua-parser-js@^1.0.33: + version "1.0.36" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.36.tgz#a9ab6b9bd3a8efb90bb0816674b412717b7c428c" + integrity sha512-znuyCIXzl8ciS3+y3fHJI/2OhQIXbXw9MWC/o3qwyR+RGppjZHrM27CGFSKCJXi2Kctiz537iOu2KnXs1lMQhw== + +uc.micro@^1.0.1, uc.micro@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" + integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +unique-string@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-3.0.0.tgz#84a1c377aff5fd7a8bc6b55d8244b2bd90d75b9a" + integrity sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ== + dependencies: + crypto-random-string "^4.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +update-notifier@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" + integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== + dependencies: + boxen "^5.0.0" + chalk "^4.1.0" + configstore "^5.0.1" + has-yarn "^2.1.0" + import-lazy "^2.1.0" + is-ci "^2.0.0" + is-installed-globally "^0.4.0" + is-npm "^5.0.0" + is-yarn-global "^0.3.0" + latest-version "^5.1.0" + pupa "^2.1.1" + semver "^7.3.4" + semver-diff "^3.1.1" + xdg-basedir "^4.0.0" + +update-notifier@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-6.0.2.tgz#a6990253dfe6d5a02bd04fbb6a61543f55026b60" + integrity sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og== + dependencies: + boxen "^7.0.0" + chalk "^5.0.1" + configstore "^6.0.0" + has-yarn "^3.0.0" + import-lazy "^4.0.0" + is-ci "^3.0.1" + is-installed-globally "^0.4.0" + is-npm "^6.0.0" + is-yarn-global "^0.4.0" + latest-version "^7.0.0" + pupa "^3.1.0" + semver "^7.3.7" + semver-diff "^4.0.0" + xdg-basedir "^5.1.0" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== + dependencies: + prepend-http "^2.0.0" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +vali-date@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" + integrity sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg== + +valid-data-url@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/valid-data-url/-/valid-data-url-3.0.1.tgz#826c1744e71b5632e847dd15dbd45b9fb38aa34f" + integrity sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validate-npm-package-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + integrity sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw== + dependencies: + builtins "^1.0.3" + +vary@^1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +web-resource-inliner@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/web-resource-inliner/-/web-resource-inliner-6.0.1.tgz#df0822f0a12028805fe80719ed52ab6526886e02" + integrity sha512-kfqDxt5dTB1JhqsCUQVFDj0rmY+4HLwGQIsLPbyrsN9y9WV/1oFDSx3BQ4GfCv9X+jVeQ7rouTqwK53rA/7t8A== + dependencies: + ansi-colors "^4.1.1" + escape-goat "^3.0.0" + htmlparser2 "^5.0.0" + mime "^2.4.6" + node-fetch "^2.6.0" + valid-data-url "^3.0.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +when@^3.7.8: + version "3.7.8" + resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82" + integrity sha512-5cZ7mecD3eYcMiCH4wtRPA5iFJZ50BJYDfckI5RRpQiktMiYTcn0ccLTZOvcbBume+1304fQztxeNzNS9Gvrnw== + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +widest-line@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-4.0.1.tgz#a0fc673aaba1ea6f0a0d35b3c2795c9a9cc2ebf2" + integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== + dependencies: + string-width "^5.0.1" + +wrap-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" + integrity sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + +wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@~8.11.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== + +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + +xdg-basedir@^5.0.1, xdg-basedir@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" + integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== + +xmlhttprequest-ssl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67" + integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^2.1.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.2.tgz#f522db4313c671a0ca963a75670f1c12ea909144" + integrity sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@17.1.1: + version "17.1.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.1.1.tgz#c2a8091564bdb196f7c0a67c1d12e5b85b8067ba" + integrity sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.3.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== diff --git a/Memphis.API/Extensions/HttpContextExtensions.cs b/Memphis.API/Extensions/HttpContextExtensions.cs index 0d966d3..c737df7 100644 --- a/Memphis.API/Extensions/HttpContextExtensions.cs +++ b/Memphis.API/Extensions/HttpContextExtensions.cs @@ -18,6 +18,16 @@ public static class HttpContextExtensions return goodCid ? cid : null; } + public static string? GetName(this HttpContext httpContext) + { + return httpContext.User.Claims.FirstOrDefault(x => x.Type == "fullName")?.Value; + } + + public static string? GetEmail(this HttpContext httpContext) + { + return httpContext.User.Claims.FirstOrDefault(x => x.Type == "email")?.Value; + } + public static async Task IsMember(this HttpContext httpContext, DatabaseContext context) { var cidRaw = httpContext.User.Claims.FirstOrDefault(x => x.Type == "cid")?.Value; @@ -49,21 +59,21 @@ public static async Task IsMember(this HttpContext httpContext, DatabaseCo public static async Task IsTrainingStaff(this HttpContext httpContext, RedisService redisService) { - return await redisService.ValidateRoles(httpContext.User, Constants.TRAINING_STAFF_LIST); + return await redisService.ValidateRoles(httpContext.User, Constants.TrainingStaffList); } public static async Task IsAllStaff(this HttpContext httpContext, RedisService redisService) { - return await redisService.ValidateRoles(httpContext.User, Constants.ALL_STAFF_LIST); + return await redisService.ValidateRoles(httpContext.User, Constants.AllStaffList); } public static async Task IsFullStaff(this HttpContext httpContext, RedisService redisService) { - return await redisService.ValidateRoles(httpContext.User, Constants.FULL_STAFF_LIST); + return await redisService.ValidateRoles(httpContext.User, Constants.FullStaffList); } public static async Task IsSeniorStaff(this HttpContext httpContext, RedisService redisService) { - return await redisService.ValidateRoles(httpContext.User, Constants.SENIOR_STAFF_LIST); + return await redisService.ValidateRoles(httpContext.User, Constants.SeniorStaffList); } } \ No newline at end of file diff --git a/Memphis.API/Memphis.API.csproj b/Memphis.API/Memphis.API.csproj index d29d1d5..e132477 100644 --- a/Memphis.API/Memphis.API.csproj +++ b/Memphis.API/Memphis.API.csproj @@ -31,4 +31,8 @@ + + + + diff --git a/Memphis.API/Migrations/20231015030718_Updates.Designer.cs b/Memphis.API/Migrations/20231015030718_Updates.Designer.cs new file mode 100644 index 0000000..3859928 --- /dev/null +++ b/Memphis.API/Migrations/20231015030718_Updates.Designer.cs @@ -0,0 +1,1236 @@ +// +using System; +using Memphis.API.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Memphis.API.Migrations +{ + [DbContext(typeof(DatabaseContext))] + [Migration("20231015030718_Updates")] + partial class Updates + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.11") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Memphis.Shared.Models.Airport", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Altimeter") + .HasColumnType("text"); + + b.Property("Arrivals") + .HasColumnType("integer"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("Departures") + .HasColumnType("integer"); + + b.Property("Icao") + .IsRequired() + .HasColumnType("text"); + + b.Property("MetarRaw") + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Temperature") + .HasColumnType("text"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.Property("Wind") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Airports"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Comment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Confidential") + .HasColumnType("boolean"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("SubmitterId") + .HasColumnType("integer"); + + b.Property("Timestamp") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("SubmitterId"); + + b.HasIndex("UserId"); + + b.ToTable("Comments"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.EmailLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("Timestamp") + .HasColumnType("timestamp with time zone"); + + b.Property("To") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("EmailLogs"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Event", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BannerUrl") + .HasColumnType("text"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("End") + .HasColumnType("timestamp with time zone"); + + b.Property("Host") + .IsRequired() + .HasColumnType("text"); + + b.Property("IsOpen") + .HasColumnType("boolean"); + + b.Property("Start") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("Title"); + + b.ToTable("Events"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.EventPosition", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Available") + .HasColumnType("boolean"); + + b.Property("EventId") + .HasColumnType("integer"); + + b.Property("MinRating") + .HasColumnType("integer"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("EventId"); + + b.ToTable("EventPositions"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.EventRegistration", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("End") + .HasColumnType("timestamp with time zone"); + + b.Property("EventId") + .HasColumnType("integer"); + + b.Property("EventPositionId") + .HasColumnType("integer"); + + b.Property("Start") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("EventId"); + + b.HasIndex("EventPositionId"); + + b.HasIndex("UserId"); + + b.ToTable("EventRegistrations"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Faq", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Answer") + .IsRequired() + .HasColumnType("text"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("Order") + .HasColumnType("integer"); + + b.Property("Question") + .IsRequired() + .HasColumnType("text"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("Faq"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Feedback", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Cid") + .HasColumnType("integer"); + + b.Property("ControllerCallsign") + .IsRequired() + .HasColumnType("text"); + + b.Property("ControllerId") + .HasColumnType("integer"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("Level") + .HasColumnType("integer"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Reply") + .HasColumnType("text"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("ControllerId"); + + b.ToTable("Feedback"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.File", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("FileUrl") + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("Type") + .HasColumnType("integer"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.Property("Version") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Files"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Hours", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ApproachHours") + .HasColumnType("real"); + + b.Property("CenterHours") + .HasColumnType("real"); + + b.Property("DeliveryHours") + .HasColumnType("real"); + + b.Property("GroundHours") + .HasColumnType("real"); + + b.Property("Month") + .HasColumnType("integer"); + + b.Property("TowerHours") + .HasColumnType("real"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("Year") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Month"); + + b.HasIndex("UserId"); + + b.HasIndex("Year"); + + b.ToTable("Hours"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Notification", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Link") + .IsRequired() + .HasColumnType("text"); + + b.Property("Read") + .HasColumnType("boolean"); + + b.Property("Timestamp") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Read"); + + b.HasIndex("Title"); + + b.HasIndex("UserId"); + + b.ToTable("Notifications"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.OnlineController", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Callsign") + .IsRequired() + .HasColumnType("text"); + + b.Property("Duration") + .HasColumnType("interval"); + + b.Property("Frequency") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("OnlineControllers"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Ots", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("Facility") + .IsRequired() + .HasColumnType("text"); + + b.Property("InstructorId") + .HasColumnType("integer"); + + b.Property("MilestoneId") + .HasColumnType("integer"); + + b.Property("Start") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("SubmitterId") + .HasColumnType("integer"); + + b.Property("TrainingRequestId") + .HasColumnType("integer"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("InstructorId"); + + b.HasIndex("MilestoneId"); + + b.HasIndex("Status"); + + b.HasIndex("SubmitterId"); + + b.HasIndex("TrainingRequestId"); + + b.HasIndex("UserId"); + + b.ToTable("Ots"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("NameShort") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Roles"); + + b.HasData( + new + { + Id = 1, + Email = "atm@memphisartcc.com", + Name = "Air Traffic Manager", + NameShort = "ATM" + }, + new + { + Id = 2, + Email = "datm@memphisartcc.com", + Name = "Deputy Air Traffic Manager", + NameShort = "DATM" + }, + new + { + Id = 3, + Email = "ta@memphisartcc.com", + Name = "Training Administrator", + NameShort = "TA" + }, + new + { + Id = 4, + Email = "ata@memphisartcc.com", + Name = "Assistant Training Administrator", + NameShort = "ATA" + }, + new + { + Id = 5, + Email = "wm@memphisartcc.com", + Name = "Webmaster", + NameShort = "WM" + }, + new + { + Id = 6, + Email = "awm@memphisartcc.com", + Name = "Assistant Webmaster", + NameShort = "AWM" + }, + new + { + Id = 7, + Email = "ec@memphisartcc.com", + Name = "Events Coordinator", + NameShort = "EC" + }, + new + { + Id = 8, + Email = "aec@memphisartcc.com", + Name = "Assistant Events Coordinator", + NameShort = "AEC" + }, + new + { + Id = 9, + Email = "fe@memphisartcc.com", + Name = "Facility Engineer", + NameShort = "FE" + }, + new + { + Id = 10, + Email = "afe@memphisartcc.com", + Name = "Assistant Facility Engineer", + NameShort = "AFE" + }, + new + { + Id = 11, + Email = "instructors@memphisartcc.com", + Name = "Instructor", + NameShort = "INS" + }, + new + { + Id = 12, + Email = "mentors@memphisartcc.com", + Name = "Mentor", + NameShort = "MTR" + }); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Session", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Callsign") + .IsRequired() + .HasColumnType("text"); + + b.Property("Duration") + .HasColumnType("interval"); + + b.Property("End") + .HasColumnType("timestamp with time zone"); + + b.Property("Frequency") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Start") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Callsign"); + + b.HasIndex("End"); + + b.HasIndex("Frequency"); + + b.HasIndex("Name"); + + b.HasIndex("Start"); + + b.HasIndex("UserId"); + + b.ToTable("Sessions"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Settings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("LastUpdated") + .HasColumnType("timestamp with time zone"); + + b.Property("RequiredHours") + .HasColumnType("integer"); + + b.Property("VisitingOpen") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.ToTable("Settings"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.TrainingMilestone", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Code") + .IsRequired() + .HasColumnType("text"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("Facility") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.ToTable("TrainingMilestones"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.TrainingRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("End") + .HasColumnType("timestamp with time zone"); + + b.Property("MilestoneId") + .HasColumnType("integer"); + + b.Property("Ots") + .HasColumnType("boolean"); + + b.Property("Start") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("MilestoneId"); + + b.HasIndex("Start"); + + b.HasIndex("Status"); + + b.HasIndex("UserId"); + + b.ToTable("TrainingRequests"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.TrainingTicket", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("End") + .HasColumnType("timestamp with time zone"); + + b.Property("MilestoneId") + .HasColumnType("integer"); + + b.Property("Performance") + .HasColumnType("integer"); + + b.Property("Start") + .HasColumnType("timestamp with time zone"); + + b.Property("TrainerId") + .HasColumnType("integer"); + + b.Property("TrainingNotes") + .IsRequired() + .HasColumnType("text"); + + b.Property("TrainingRequestId") + .HasColumnType("integer"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("UserNotes") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("MilestoneId"); + + b.HasIndex("Performance"); + + b.HasIndex("TrainerId"); + + b.HasIndex("TrainingRequestId"); + + b.HasIndex("UserId"); + + b.ToTable("TrainingTickets"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CanRegisterForEvents") + .HasColumnType("boolean"); + + b.Property("CanRequestTraining") + .HasColumnType("boolean"); + + b.Property("Center") + .HasColumnType("integer"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("text"); + + b.Property("Initials") + .IsRequired() + .HasColumnType("text"); + + b.Property("Joined") + .HasColumnType("timestamp with time zone"); + + b.Property("LastName") + .IsRequired() + .HasColumnType("text"); + + b.Property("Major") + .HasColumnType("integer"); + + b.Property("Minor") + .HasColumnType("integer"); + + b.Property("Rating") + .HasColumnType("integer"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.Property("Visitor") + .HasColumnType("boolean"); + + b.Property("VisitorFrom") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("Email"); + + b.HasIndex("FirstName"); + + b.HasIndex("LastName"); + + b.HasIndex("Rating"); + + b.HasIndex("Status"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.VisitingApplication", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Cid") + .HasColumnType("integer"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("DenialReason") + .HasColumnType("text"); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("text"); + + b.Property("LastName") + .IsRequired() + .HasColumnType("text"); + + b.Property("Rating") + .HasColumnType("integer"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("VisitingApplications"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.WebsiteLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Action") + .IsRequired() + .HasColumnType("text"); + + b.Property("Cid") + .HasColumnType("text"); + + b.Property("Ip") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("NewData") + .IsRequired() + .HasColumnType("text"); + + b.Property("OldData") + .IsRequired() + .HasColumnType("text"); + + b.Property("Timestamp") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("WebsiteLogs"); + }); + + modelBuilder.Entity("RoleUser", b => + { + b.Property("RolesId") + .HasColumnType("integer"); + + b.Property("UsersId") + .HasColumnType("integer"); + + b.HasKey("RolesId", "UsersId"); + + b.HasIndex("UsersId"); + + b.ToTable("RoleUser"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Comment", b => + { + b.HasOne("Memphis.Shared.Models.User", "Submitter") + .WithMany() + .HasForeignKey("SubmitterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Submitter"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.EventPosition", b => + { + b.HasOne("Memphis.Shared.Models.Event", "Event") + .WithMany() + .HasForeignKey("EventId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Event"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.EventRegistration", b => + { + b.HasOne("Memphis.Shared.Models.Event", "Event") + .WithMany() + .HasForeignKey("EventId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.EventPosition", "EventPosition") + .WithMany() + .HasForeignKey("EventPositionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Event"); + + b.Navigation("EventPosition"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Feedback", b => + { + b.HasOne("Memphis.Shared.Models.User", "Controller") + .WithMany() + .HasForeignKey("ControllerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Controller"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Hours", b => + { + b.HasOne("Memphis.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Notification", b => + { + b.HasOne("Memphis.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Ots", b => + { + b.HasOne("Memphis.Shared.Models.User", "Instructor") + .WithMany() + .HasForeignKey("InstructorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.TrainingMilestone", "Milestone") + .WithMany() + .HasForeignKey("MilestoneId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", "Submitter") + .WithMany() + .HasForeignKey("SubmitterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.TrainingRequest", "TrainingRequest") + .WithMany() + .HasForeignKey("TrainingRequestId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Instructor"); + + b.Navigation("Milestone"); + + b.Navigation("Submitter"); + + b.Navigation("TrainingRequest"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Session", b => + { + b.HasOne("Memphis.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.TrainingRequest", b => + { + b.HasOne("Memphis.Shared.Models.TrainingMilestone", "Milestone") + .WithMany() + .HasForeignKey("MilestoneId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Milestone"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.TrainingTicket", b => + { + b.HasOne("Memphis.Shared.Models.TrainingMilestone", "Milestone") + .WithMany() + .HasForeignKey("MilestoneId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", "Trainer") + .WithMany() + .HasForeignKey("TrainerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.TrainingRequest", "TrainingRequest") + .WithMany() + .HasForeignKey("TrainingRequestId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Milestone"); + + b.Navigation("Trainer"); + + b.Navigation("TrainingRequest"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("RoleUser", b => + { + b.HasOne("Memphis.Shared.Models.Role", null) + .WithMany() + .HasForeignKey("RolesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", null) + .WithMany() + .HasForeignKey("UsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Memphis.API/Migrations/20231015030718_Updates.cs b/Memphis.API/Migrations/20231015030718_Updates.cs new file mode 100644 index 0000000..746cd58 --- /dev/null +++ b/Memphis.API/Migrations/20231015030718_Updates.cs @@ -0,0 +1,343 @@ +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Memphis.API.Migrations +{ + /// + public partial class Updates : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Ots_Users_InstructorId", + table: "Ots"); + + migrationBuilder.DropTable( + name: "FeedbackCannedResponse"); + + migrationBuilder.DropColumn( + name: "Facility", + table: "TrainingTickets"); + + migrationBuilder.DropColumn( + name: "ControllerName", + table: "Feedback"); + + migrationBuilder.RenameColumn( + name: "Position", + table: "TrainingTickets", + newName: "MilestoneId"); + + migrationBuilder.RenameIndex( + name: "IX_TrainingTickets_Position", + table: "TrainingTickets", + newName: "IX_TrainingTickets_MilestoneId"); + + migrationBuilder.RenameColumn( + name: "Position", + table: "TrainingRequests", + newName: "MilestoneId"); + + migrationBuilder.RenameColumn( + name: "Position", + table: "Ots", + newName: "MilestoneId"); + + migrationBuilder.RenameIndex( + name: "IX_Ots_Position", + table: "Ots", + newName: "IX_Ots_MilestoneId"); + + migrationBuilder.AddColumn( + name: "Ots", + table: "TrainingRequests", + type: "boolean", + nullable: false, + defaultValue: false); + + migrationBuilder.AlterColumn( + name: "TrainingRequestId", + table: "Ots", + type: "integer", + nullable: false, + defaultValue: 0, + oldClrType: typeof(int), + oldType: "integer", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "InstructorId", + table: "Ots", + type: "integer", + nullable: false, + defaultValue: 0, + oldClrType: typeof(int), + oldType: "integer", + oldNullable: true); + + migrationBuilder.CreateTable( + name: "Notifications", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + UserId = table.Column(type: "integer", nullable: false), + Title = table.Column(type: "text", nullable: false), + Link = table.Column(type: "text", nullable: false), + Read = table.Column(type: "boolean", nullable: false), + Timestamp = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Notifications", x => x.Id); + table.ForeignKey( + name: "FK_Notifications_Users_UserId", + column: x => x.UserId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "TrainingMilestones", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Code = table.Column(type: "text", nullable: false), + Name = table.Column(type: "text", nullable: false), + Facility = table.Column(type: "text", nullable: false), + Created = table.Column(type: "timestamp with time zone", nullable: false), + Updated = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_TrainingMilestones", x => x.Id); + }); + + migrationBuilder.CreateIndex( + name: "IX_TrainingRequests_MilestoneId", + table: "TrainingRequests", + column: "MilestoneId"); + + migrationBuilder.CreateIndex( + name: "IX_Ots_TrainingRequestId", + table: "Ots", + column: "TrainingRequestId"); + + migrationBuilder.CreateIndex( + name: "IX_Feedback_ControllerId", + table: "Feedback", + column: "ControllerId"); + + migrationBuilder.CreateIndex( + name: "IX_Notifications_Read", + table: "Notifications", + column: "Read"); + + migrationBuilder.CreateIndex( + name: "IX_Notifications_Title", + table: "Notifications", + column: "Title"); + + migrationBuilder.CreateIndex( + name: "IX_Notifications_UserId", + table: "Notifications", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_TrainingMilestones_Code", + table: "TrainingMilestones", + column: "Code"); + + migrationBuilder.AddForeignKey( + name: "FK_Feedback_Users_ControllerId", + table: "Feedback", + column: "ControllerId", + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_Hours_Users_UserId", + table: "Hours", + column: "UserId", + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_Ots_TrainingMilestones_MilestoneId", + table: "Ots", + column: "MilestoneId", + principalTable: "TrainingMilestones", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_Ots_TrainingRequests_TrainingRequestId", + table: "Ots", + column: "TrainingRequestId", + principalTable: "TrainingRequests", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_Ots_Users_InstructorId", + table: "Ots", + column: "InstructorId", + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_TrainingRequests_TrainingMilestones_MilestoneId", + table: "TrainingRequests", + column: "MilestoneId", + principalTable: "TrainingMilestones", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_TrainingTickets_TrainingMilestones_MilestoneId", + table: "TrainingTickets", + column: "MilestoneId", + principalTable: "TrainingMilestones", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Feedback_Users_ControllerId", + table: "Feedback"); + + migrationBuilder.DropForeignKey( + name: "FK_Hours_Users_UserId", + table: "Hours"); + + migrationBuilder.DropForeignKey( + name: "FK_Ots_TrainingMilestones_MilestoneId", + table: "Ots"); + + migrationBuilder.DropForeignKey( + name: "FK_Ots_TrainingRequests_TrainingRequestId", + table: "Ots"); + + migrationBuilder.DropForeignKey( + name: "FK_Ots_Users_InstructorId", + table: "Ots"); + + migrationBuilder.DropForeignKey( + name: "FK_TrainingRequests_TrainingMilestones_MilestoneId", + table: "TrainingRequests"); + + migrationBuilder.DropForeignKey( + name: "FK_TrainingTickets_TrainingMilestones_MilestoneId", + table: "TrainingTickets"); + + migrationBuilder.DropTable( + name: "Notifications"); + + migrationBuilder.DropTable( + name: "TrainingMilestones"); + + migrationBuilder.DropIndex( + name: "IX_TrainingRequests_MilestoneId", + table: "TrainingRequests"); + + migrationBuilder.DropIndex( + name: "IX_Ots_TrainingRequestId", + table: "Ots"); + + migrationBuilder.DropIndex( + name: "IX_Feedback_ControllerId", + table: "Feedback"); + + migrationBuilder.DropColumn( + name: "Ots", + table: "TrainingRequests"); + + migrationBuilder.RenameColumn( + name: "MilestoneId", + table: "TrainingTickets", + newName: "Position"); + + migrationBuilder.RenameIndex( + name: "IX_TrainingTickets_MilestoneId", + table: "TrainingTickets", + newName: "IX_TrainingTickets_Position"); + + migrationBuilder.RenameColumn( + name: "MilestoneId", + table: "TrainingRequests", + newName: "Position"); + + migrationBuilder.RenameColumn( + name: "MilestoneId", + table: "Ots", + newName: "Position"); + + migrationBuilder.RenameIndex( + name: "IX_Ots_MilestoneId", + table: "Ots", + newName: "IX_Ots_Position"); + + migrationBuilder.AddColumn( + name: "Facility", + table: "TrainingTickets", + type: "text", + nullable: false, + defaultValue: ""); + + migrationBuilder.AlterColumn( + name: "TrainingRequestId", + table: "Ots", + type: "integer", + nullable: true, + oldClrType: typeof(int), + oldType: "integer"); + + migrationBuilder.AlterColumn( + name: "InstructorId", + table: "Ots", + type: "integer", + nullable: true, + oldClrType: typeof(int), + oldType: "integer"); + + migrationBuilder.AddColumn( + name: "ControllerName", + table: "Feedback", + type: "text", + nullable: false, + defaultValue: ""); + + migrationBuilder.CreateTable( + name: "FeedbackCannedResponse", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Response = table.Column(type: "text", nullable: false), + Title = table.Column(type: "text", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_FeedbackCannedResponse", x => x.Id); + }); + + migrationBuilder.AddForeignKey( + name: "FK_Ots_Users_InstructorId", + table: "Ots", + column: "InstructorId", + principalTable: "Users", + principalColumn: "Id"); + } + } +} diff --git a/Memphis.API/Migrations/20231024181558_TrainingSchedules.Designer.cs b/Memphis.API/Migrations/20231024181558_TrainingSchedules.Designer.cs new file mode 100644 index 0000000..6a70bea --- /dev/null +++ b/Memphis.API/Migrations/20231024181558_TrainingSchedules.Designer.cs @@ -0,0 +1,1233 @@ +// +using System; +using Memphis.API.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Memphis.API.Migrations +{ + [DbContext(typeof(DatabaseContext))] + [Migration("20231024181558_TrainingSchedules")] + partial class TrainingSchedules + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.11") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Memphis.Shared.Models.Airport", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Altimeter") + .HasColumnType("text"); + + b.Property("Arrivals") + .HasColumnType("integer"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("Departures") + .HasColumnType("integer"); + + b.Property("Icao") + .IsRequired() + .HasColumnType("text"); + + b.Property("MetarRaw") + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Temperature") + .HasColumnType("text"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.Property("Wind") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Airports"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Comment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Confidential") + .HasColumnType("boolean"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("SubmitterId") + .HasColumnType("integer"); + + b.Property("Timestamp") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("SubmitterId"); + + b.HasIndex("UserId"); + + b.ToTable("Comments"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.EmailLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("Timestamp") + .HasColumnType("timestamp with time zone"); + + b.Property("To") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("EmailLogs"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Event", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BannerUrl") + .HasColumnType("text"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("End") + .HasColumnType("timestamp with time zone"); + + b.Property("Host") + .IsRequired() + .HasColumnType("text"); + + b.Property("IsOpen") + .HasColumnType("boolean"); + + b.Property("Start") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("Title"); + + b.ToTable("Events"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.EventPosition", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Available") + .HasColumnType("boolean"); + + b.Property("EventId") + .HasColumnType("integer"); + + b.Property("MinRating") + .HasColumnType("integer"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("EventId"); + + b.ToTable("EventPositions"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.EventRegistration", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("End") + .HasColumnType("timestamp with time zone"); + + b.Property("EventId") + .HasColumnType("integer"); + + b.Property("EventPositionId") + .HasColumnType("integer"); + + b.Property("Start") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("EventId"); + + b.HasIndex("EventPositionId"); + + b.HasIndex("UserId"); + + b.ToTable("EventRegistrations"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Faq", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Answer") + .IsRequired() + .HasColumnType("text"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("Order") + .HasColumnType("integer"); + + b.Property("Question") + .IsRequired() + .HasColumnType("text"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("Faq"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Feedback", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Cid") + .HasColumnType("integer"); + + b.Property("ControllerCallsign") + .IsRequired() + .HasColumnType("text"); + + b.Property("ControllerId") + .HasColumnType("integer"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("Level") + .HasColumnType("integer"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Reply") + .HasColumnType("text"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("ControllerId"); + + b.ToTable("Feedback"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.File", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("FileUrl") + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("Type") + .HasColumnType("integer"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.Property("Version") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Files"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Hours", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ApproachHours") + .HasColumnType("double precision"); + + b.Property("CenterHours") + .HasColumnType("double precision"); + + b.Property("DeliveryHours") + .HasColumnType("double precision"); + + b.Property("GroundHours") + .HasColumnType("double precision"); + + b.Property("Month") + .HasColumnType("integer"); + + b.Property("TowerHours") + .HasColumnType("double precision"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("Year") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Month"); + + b.HasIndex("UserId"); + + b.HasIndex("Year"); + + b.ToTable("Hours"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Notification", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Link") + .IsRequired() + .HasColumnType("text"); + + b.Property("Read") + .HasColumnType("boolean"); + + b.Property("Timestamp") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Read"); + + b.HasIndex("Title"); + + b.HasIndex("UserId"); + + b.ToTable("Notifications"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.OnlineController", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Callsign") + .IsRequired() + .HasColumnType("text"); + + b.Property("Duration") + .HasColumnType("interval"); + + b.Property("Frequency") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("OnlineControllers"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Ots", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("Facility") + .IsRequired() + .HasColumnType("text"); + + b.Property("InstructorId") + .HasColumnType("integer"); + + b.Property("MilestoneId") + .HasColumnType("integer"); + + b.Property("Start") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("SubmitterId") + .HasColumnType("integer"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("InstructorId"); + + b.HasIndex("MilestoneId"); + + b.HasIndex("Status"); + + b.HasIndex("SubmitterId"); + + b.HasIndex("UserId"); + + b.ToTable("Ots"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("NameShort") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Roles"); + + b.HasData( + new + { + Id = 1, + Email = "atm@memphisartcc.com", + Name = "Air Traffic Manager", + NameShort = "ATM" + }, + new + { + Id = 2, + Email = "datm@memphisartcc.com", + Name = "Deputy Air Traffic Manager", + NameShort = "DATM" + }, + new + { + Id = 3, + Email = "ta@memphisartcc.com", + Name = "Training Administrator", + NameShort = "TA" + }, + new + { + Id = 4, + Email = "ata@memphisartcc.com", + Name = "Assistant Training Administrator", + NameShort = "ATA" + }, + new + { + Id = 5, + Email = "wm@memphisartcc.com", + Name = "Webmaster", + NameShort = "WM" + }, + new + { + Id = 6, + Email = "awm@memphisartcc.com", + Name = "Assistant Webmaster", + NameShort = "AWM" + }, + new + { + Id = 7, + Email = "ec@memphisartcc.com", + Name = "Events Coordinator", + NameShort = "EC" + }, + new + { + Id = 8, + Email = "aec@memphisartcc.com", + Name = "Assistant Events Coordinator", + NameShort = "AEC" + }, + new + { + Id = 9, + Email = "fe@memphisartcc.com", + Name = "Facility Engineer", + NameShort = "FE" + }, + new + { + Id = 10, + Email = "afe@memphisartcc.com", + Name = "Assistant Facility Engineer", + NameShort = "AFE" + }, + new + { + Id = 11, + Email = "instructors@memphisartcc.com", + Name = "Instructor", + NameShort = "INS" + }, + new + { + Id = 12, + Email = "mentors@memphisartcc.com", + Name = "Mentor", + NameShort = "MTR" + }); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Session", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Callsign") + .IsRequired() + .HasColumnType("text"); + + b.Property("Duration") + .HasColumnType("interval"); + + b.Property("End") + .HasColumnType("timestamp with time zone"); + + b.Property("Frequency") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Start") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Callsign"); + + b.HasIndex("End"); + + b.HasIndex("Frequency"); + + b.HasIndex("Name"); + + b.HasIndex("Start"); + + b.HasIndex("UserId"); + + b.ToTable("Sessions"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Settings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("LastUpdated") + .HasColumnType("timestamp with time zone"); + + b.Property("RequiredHours") + .HasColumnType("integer"); + + b.Property("VisitingOpen") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.ToTable("Settings"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.TrainingMilestone", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Code") + .IsRequired() + .HasColumnType("text"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("Facility") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.ToTable("TrainingMilestones"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.TrainingSchedule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("SelectedTypeId") + .HasColumnType("integer"); + + b.Property("Start") + .HasColumnType("timestamp with time zone"); + + b.Property("StudentId") + .HasColumnType("integer"); + + b.Property("TypeId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("SelectedTypeId"); + + b.HasIndex("StudentId"); + + b.HasIndex("TypeId"); + + b.HasIndex("UserId"); + + b.ToTable("TrainingSchedules"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.TrainingTicket", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("End") + .HasColumnType("timestamp with time zone"); + + b.Property("MilestoneId") + .HasColumnType("integer"); + + b.Property("Performance") + .HasColumnType("integer"); + + b.Property("Start") + .HasColumnType("timestamp with time zone"); + + b.Property("TrainerId") + .HasColumnType("integer"); + + b.Property("TrainingNotes") + .IsRequired() + .HasColumnType("text"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("UserNotes") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("MilestoneId"); + + b.HasIndex("Performance"); + + b.HasIndex("TrainerId"); + + b.HasIndex("UserId"); + + b.ToTable("TrainingTickets"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.TrainingType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("TrainingTypes"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CanRegisterForEvents") + .HasColumnType("boolean"); + + b.Property("CanRequestTraining") + .HasColumnType("boolean"); + + b.Property("Center") + .HasColumnType("integer"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("DiscordId") + .HasColumnType("text"); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("text"); + + b.Property("Initials") + .IsRequired() + .HasColumnType("text"); + + b.Property("Joined") + .HasColumnType("timestamp with time zone"); + + b.Property("LastName") + .IsRequired() + .HasColumnType("text"); + + b.Property("Major") + .HasColumnType("integer"); + + b.Property("Minor") + .HasColumnType("integer"); + + b.Property("Rating") + .HasColumnType("integer"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.Property("Visitor") + .HasColumnType("boolean"); + + b.Property("VisitorFrom") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("Email"); + + b.HasIndex("FirstName"); + + b.HasIndex("LastName"); + + b.HasIndex("Rating"); + + b.HasIndex("Status"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.VisitingApplication", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Cid") + .HasColumnType("integer"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("DenialReason") + .HasColumnType("text"); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("text"); + + b.Property("LastName") + .IsRequired() + .HasColumnType("text"); + + b.Property("Rating") + .HasColumnType("integer"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("VisitingApplications"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.WebsiteLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Action") + .IsRequired() + .HasColumnType("text"); + + b.Property("Cid") + .HasColumnType("text"); + + b.Property("Ip") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("NewData") + .IsRequired() + .HasColumnType("text"); + + b.Property("OldData") + .IsRequired() + .HasColumnType("text"); + + b.Property("Timestamp") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("WebsiteLogs"); + }); + + modelBuilder.Entity("RoleUser", b => + { + b.Property("RolesId") + .HasColumnType("integer"); + + b.Property("UsersId") + .HasColumnType("integer"); + + b.HasKey("RolesId", "UsersId"); + + b.HasIndex("UsersId"); + + b.ToTable("RoleUser"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Comment", b => + { + b.HasOne("Memphis.Shared.Models.User", "Submitter") + .WithMany() + .HasForeignKey("SubmitterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Submitter"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.EventPosition", b => + { + b.HasOne("Memphis.Shared.Models.Event", "Event") + .WithMany() + .HasForeignKey("EventId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Event"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.EventRegistration", b => + { + b.HasOne("Memphis.Shared.Models.Event", "Event") + .WithMany() + .HasForeignKey("EventId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.EventPosition", "EventPosition") + .WithMany() + .HasForeignKey("EventPositionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Event"); + + b.Navigation("EventPosition"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Feedback", b => + { + b.HasOne("Memphis.Shared.Models.User", "Controller") + .WithMany() + .HasForeignKey("ControllerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Controller"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Hours", b => + { + b.HasOne("Memphis.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Notification", b => + { + b.HasOne("Memphis.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Ots", b => + { + b.HasOne("Memphis.Shared.Models.User", "Instructor") + .WithMany() + .HasForeignKey("InstructorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.TrainingMilestone", "Milestone") + .WithMany() + .HasForeignKey("MilestoneId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", "Submitter") + .WithMany() + .HasForeignKey("SubmitterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Instructor"); + + b.Navigation("Milestone"); + + b.Navigation("Submitter"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Session", b => + { + b.HasOne("Memphis.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.TrainingSchedule", b => + { + b.HasOne("Memphis.Shared.Models.TrainingType", "SelectedType") + .WithMany() + .HasForeignKey("SelectedTypeId"); + + b.HasOne("Memphis.Shared.Models.User", "Student") + .WithMany() + .HasForeignKey("StudentId"); + + b.HasOne("Memphis.Shared.Models.TrainingType", "Type") + .WithMany() + .HasForeignKey("TypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("SelectedType"); + + b.Navigation("Student"); + + b.Navigation("Type"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.TrainingTicket", b => + { + b.HasOne("Memphis.Shared.Models.TrainingMilestone", "Milestone") + .WithMany() + .HasForeignKey("MilestoneId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", "Trainer") + .WithMany() + .HasForeignKey("TrainerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Milestone"); + + b.Navigation("Trainer"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("RoleUser", b => + { + b.HasOne("Memphis.Shared.Models.Role", null) + .WithMany() + .HasForeignKey("RolesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", null) + .WithMany() + .HasForeignKey("UsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Memphis.API/Migrations/20231024181558_TrainingSchedules.cs b/Memphis.API/Migrations/20231024181558_TrainingSchedules.cs new file mode 100644 index 0000000..0bfc076 --- /dev/null +++ b/Memphis.API/Migrations/20231024181558_TrainingSchedules.cs @@ -0,0 +1,307 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Memphis.API.Migrations +{ + /// + public partial class TrainingSchedules : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Ots_TrainingRequests_TrainingRequestId", + table: "Ots"); + + migrationBuilder.DropForeignKey( + name: "FK_TrainingTickets_TrainingRequests_TrainingRequestId", + table: "TrainingTickets"); + + migrationBuilder.DropTable( + name: "TrainingRequests"); + + migrationBuilder.DropIndex( + name: "IX_TrainingTickets_TrainingRequestId", + table: "TrainingTickets"); + + migrationBuilder.DropIndex( + name: "IX_Ots_TrainingRequestId", + table: "Ots"); + + migrationBuilder.DropColumn( + name: "TrainingRequestId", + table: "TrainingTickets"); + + migrationBuilder.DropColumn( + name: "TrainingRequestId", + table: "Ots"); + + migrationBuilder.AddColumn( + name: "DiscordId", + table: "Users", + type: "text", + nullable: true); + + migrationBuilder.AlterColumn( + name: "TowerHours", + table: "Hours", + type: "double precision", + nullable: false, + oldClrType: typeof(float), + oldType: "real"); + + migrationBuilder.AlterColumn( + name: "GroundHours", + table: "Hours", + type: "double precision", + nullable: false, + oldClrType: typeof(float), + oldType: "real"); + + migrationBuilder.AlterColumn( + name: "DeliveryHours", + table: "Hours", + type: "double precision", + nullable: false, + oldClrType: typeof(float), + oldType: "real"); + + migrationBuilder.AlterColumn( + name: "CenterHours", + table: "Hours", + type: "double precision", + nullable: false, + oldClrType: typeof(float), + oldType: "real"); + + migrationBuilder.AlterColumn( + name: "ApproachHours", + table: "Hours", + type: "double precision", + nullable: false, + oldClrType: typeof(float), + oldType: "real"); + + migrationBuilder.CreateTable( + name: "TrainingTypes", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Name = table.Column(type: "text", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_TrainingTypes", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "TrainingSchedules", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + UserId = table.Column(type: "integer", nullable: false), + StudentId = table.Column(type: "integer", nullable: true), + TypeId = table.Column(type: "integer", nullable: false), + SelectedTypeId = table.Column(type: "integer", nullable: true), + Start = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_TrainingSchedules", x => x.Id); + table.ForeignKey( + name: "FK_TrainingSchedules_TrainingTypes_SelectedTypeId", + column: x => x.SelectedTypeId, + principalTable: "TrainingTypes", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_TrainingSchedules_TrainingTypes_TypeId", + column: x => x.TypeId, + principalTable: "TrainingTypes", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_TrainingSchedules_Users_StudentId", + column: x => x.StudentId, + principalTable: "Users", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_TrainingSchedules_Users_UserId", + column: x => x.UserId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_TrainingSchedules_SelectedTypeId", + table: "TrainingSchedules", + column: "SelectedTypeId"); + + migrationBuilder.CreateIndex( + name: "IX_TrainingSchedules_StudentId", + table: "TrainingSchedules", + column: "StudentId"); + + migrationBuilder.CreateIndex( + name: "IX_TrainingSchedules_TypeId", + table: "TrainingSchedules", + column: "TypeId"); + + migrationBuilder.CreateIndex( + name: "IX_TrainingSchedules_UserId", + table: "TrainingSchedules", + column: "UserId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "TrainingSchedules"); + + migrationBuilder.DropTable( + name: "TrainingTypes"); + + migrationBuilder.DropColumn( + name: "DiscordId", + table: "Users"); + + migrationBuilder.AddColumn( + name: "TrainingRequestId", + table: "TrainingTickets", + type: "integer", + nullable: false, + defaultValue: 0); + + migrationBuilder.AddColumn( + name: "TrainingRequestId", + table: "Ots", + type: "integer", + nullable: false, + defaultValue: 0); + + migrationBuilder.AlterColumn( + name: "TowerHours", + table: "Hours", + type: "real", + nullable: false, + oldClrType: typeof(double), + oldType: "double precision"); + + migrationBuilder.AlterColumn( + name: "GroundHours", + table: "Hours", + type: "real", + nullable: false, + oldClrType: typeof(double), + oldType: "double precision"); + + migrationBuilder.AlterColumn( + name: "DeliveryHours", + table: "Hours", + type: "real", + nullable: false, + oldClrType: typeof(double), + oldType: "double precision"); + + migrationBuilder.AlterColumn( + name: "CenterHours", + table: "Hours", + type: "real", + nullable: false, + oldClrType: typeof(double), + oldType: "double precision"); + + migrationBuilder.AlterColumn( + name: "ApproachHours", + table: "Hours", + type: "real", + nullable: false, + oldClrType: typeof(double), + oldType: "double precision"); + + migrationBuilder.CreateTable( + name: "TrainingRequests", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + MilestoneId = table.Column(type: "integer", nullable: false), + UserId = table.Column(type: "integer", nullable: false), + Created = table.Column(type: "timestamp with time zone", nullable: false), + End = table.Column(type: "timestamp with time zone", nullable: false), + Ots = table.Column(type: "boolean", nullable: false), + Start = table.Column(type: "timestamp with time zone", nullable: false), + Status = table.Column(type: "integer", nullable: false), + Updated = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_TrainingRequests", x => x.Id); + table.ForeignKey( + name: "FK_TrainingRequests_TrainingMilestones_MilestoneId", + column: x => x.MilestoneId, + principalTable: "TrainingMilestones", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_TrainingRequests_Users_UserId", + column: x => x.UserId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_TrainingTickets_TrainingRequestId", + table: "TrainingTickets", + column: "TrainingRequestId"); + + migrationBuilder.CreateIndex( + name: "IX_Ots_TrainingRequestId", + table: "Ots", + column: "TrainingRequestId"); + + migrationBuilder.CreateIndex( + name: "IX_TrainingRequests_MilestoneId", + table: "TrainingRequests", + column: "MilestoneId"); + + migrationBuilder.CreateIndex( + name: "IX_TrainingRequests_Start", + table: "TrainingRequests", + column: "Start"); + + migrationBuilder.CreateIndex( + name: "IX_TrainingRequests_Status", + table: "TrainingRequests", + column: "Status"); + + migrationBuilder.CreateIndex( + name: "IX_TrainingRequests_UserId", + table: "TrainingRequests", + column: "UserId"); + + migrationBuilder.AddForeignKey( + name: "FK_Ots_TrainingRequests_TrainingRequestId", + table: "Ots", + column: "TrainingRequestId", + principalTable: "TrainingRequests", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_TrainingTickets_TrainingRequests_TrainingRequestId", + table: "TrainingTickets", + column: "TrainingRequestId", + principalTable: "TrainingRequests", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + } +} diff --git a/Memphis.API/Migrations/DatabaseContextModelSnapshot.cs b/Memphis.API/Migrations/DatabaseContextModelSnapshot.cs index a8d7160..4b81175 100644 --- a/Memphis.API/Migrations/DatabaseContextModelSnapshot.cs +++ b/Memphis.API/Migrations/DatabaseContextModelSnapshot.cs @@ -292,10 +292,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("ControllerId") .HasColumnType("integer"); - b.Property("ControllerName") - .IsRequired() - .HasColumnType("text"); - b.Property("Created") .HasColumnType("timestamp with time zone"); @@ -325,28 +321,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.ToTable("Feedback"); - }); - - modelBuilder.Entity("Memphis.Shared.Models.FeedbackCannedResponse", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Response") - .IsRequired() - .HasColumnType("text"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); + b.HasIndex("ControllerId"); - b.ToTable("FeedbackCannedResponse"); + b.ToTable("Feedback"); }); modelBuilder.Entity("Memphis.Shared.Models.File", b => @@ -394,23 +371,23 @@ protected override void BuildModel(ModelBuilder modelBuilder) NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("ApproachHours") - .HasColumnType("real"); + b.Property("ApproachHours") + .HasColumnType("double precision"); - b.Property("CenterHours") - .HasColumnType("real"); + b.Property("CenterHours") + .HasColumnType("double precision"); - b.Property("DeliveryHours") - .HasColumnType("real"); + b.Property("DeliveryHours") + .HasColumnType("double precision"); - b.Property("GroundHours") - .HasColumnType("real"); + b.Property("GroundHours") + .HasColumnType("double precision"); b.Property("Month") .HasColumnType("integer"); - b.Property("TowerHours") - .HasColumnType("real"); + b.Property("TowerHours") + .HasColumnType("double precision"); b.Property("UserId") .HasColumnType("integer"); @@ -429,6 +406,42 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("Hours"); }); + modelBuilder.Entity("Memphis.Shared.Models.Notification", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Link") + .IsRequired() + .HasColumnType("text"); + + b.Property("Read") + .HasColumnType("boolean"); + + b.Property("Timestamp") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Read"); + + b.HasIndex("Title"); + + b.HasIndex("UserId"); + + b.ToTable("Notifications"); + }); + modelBuilder.Entity("Memphis.Shared.Models.OnlineController", b => { b.Property("Id") @@ -472,10 +485,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .IsRequired() .HasColumnType("text"); - b.Property("InstructorId") + b.Property("InstructorId") .HasColumnType("integer"); - b.Property("Position") + b.Property("MilestoneId") .HasColumnType("integer"); b.Property("Start") @@ -487,9 +500,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("SubmitterId") .HasColumnType("integer"); - b.Property("TrainingRequestId") - .HasColumnType("integer"); - b.Property("Updated") .HasColumnType("timestamp with time zone"); @@ -500,7 +510,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("InstructorId"); - b.HasIndex("Position"); + b.HasIndex("MilestoneId"); b.HasIndex("Status"); @@ -693,7 +703,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("Settings"); }); - modelBuilder.Entity("Memphis.Shared.Models.TrainingRequest", b => + modelBuilder.Entity("Memphis.Shared.Models.TrainingMilestone", b => { b.Property("Id") .ValueGeneratedOnAdd() @@ -701,36 +711,65 @@ protected override void BuildModel(ModelBuilder modelBuilder) NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + b.Property("Code") + .IsRequired() + .HasColumnType("text"); + b.Property("Created") .HasColumnType("timestamp with time zone"); - b.Property("End") + b.Property("Facility") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Updated") .HasColumnType("timestamp with time zone"); - b.Property("Position") + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.ToTable("TrainingMilestones"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.TrainingSchedule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("SelectedTypeId") .HasColumnType("integer"); b.Property("Start") .HasColumnType("timestamp with time zone"); - b.Property("Status") + b.Property("StudentId") .HasColumnType("integer"); - b.Property("Updated") - .HasColumnType("timestamp with time zone"); + b.Property("TypeId") + .HasColumnType("integer"); b.Property("UserId") .HasColumnType("integer"); b.HasKey("Id"); - b.HasIndex("Start"); + b.HasIndex("SelectedTypeId"); - b.HasIndex("Status"); + b.HasIndex("StudentId"); + + b.HasIndex("TypeId"); b.HasIndex("UserId"); - b.ToTable("TrainingRequests"); + b.ToTable("TrainingSchedules"); }); modelBuilder.Entity("Memphis.Shared.Models.TrainingTicket", b => @@ -747,14 +786,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("End") .HasColumnType("timestamp with time zone"); - b.Property("Facility") - .IsRequired() - .HasColumnType("text"); - - b.Property("Performance") + b.Property("MilestoneId") .HasColumnType("integer"); - b.Property("Position") + b.Property("Performance") .HasColumnType("integer"); b.Property("Start") @@ -767,9 +802,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) .IsRequired() .HasColumnType("text"); - b.Property("TrainingRequestId") - .HasColumnType("integer"); - b.Property("Updated") .HasColumnType("timestamp with time zone"); @@ -782,19 +814,34 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("Performance"); + b.HasIndex("MilestoneId"); - b.HasIndex("Position"); + b.HasIndex("Performance"); b.HasIndex("TrainerId"); - b.HasIndex("TrainingRequestId"); - b.HasIndex("UserId"); b.ToTable("TrainingTickets"); }); + modelBuilder.Entity("Memphis.Shared.Models.TrainingType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("TrainingTypes"); + }); + modelBuilder.Entity("Memphis.Shared.Models.User", b => { b.Property("Id") @@ -815,6 +862,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("Created") .HasColumnType("timestamp with time zone"); + b.Property("DiscordId") + .HasColumnType("text"); + b.Property("Email") .IsRequired() .HasColumnType("text"); @@ -1023,11 +1073,52 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("User"); }); + modelBuilder.Entity("Memphis.Shared.Models.Feedback", b => + { + b.HasOne("Memphis.Shared.Models.User", "Controller") + .WithMany() + .HasForeignKey("ControllerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Controller"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Hours", b => + { + b.HasOne("Memphis.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Notification", b => + { + b.HasOne("Memphis.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + modelBuilder.Entity("Memphis.Shared.Models.Ots", b => { b.HasOne("Memphis.Shared.Models.User", "Instructor") .WithMany() - .HasForeignKey("InstructorId"); + .HasForeignKey("InstructorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.TrainingMilestone", "Milestone") + .WithMany() + .HasForeignKey("MilestoneId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); b.HasOne("Memphis.Shared.Models.User", "Submitter") .WithMany() @@ -1043,6 +1134,8 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("Instructor"); + b.Navigation("Milestone"); + b.Navigation("Submitter"); b.Navigation("User"); @@ -1059,28 +1152,48 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("User"); }); - modelBuilder.Entity("Memphis.Shared.Models.TrainingRequest", b => + modelBuilder.Entity("Memphis.Shared.Models.TrainingSchedule", b => { + b.HasOne("Memphis.Shared.Models.TrainingType", "SelectedType") + .WithMany() + .HasForeignKey("SelectedTypeId"); + + b.HasOne("Memphis.Shared.Models.User", "Student") + .WithMany() + .HasForeignKey("StudentId"); + + b.HasOne("Memphis.Shared.Models.TrainingType", "Type") + .WithMany() + .HasForeignKey("TypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + b.HasOne("Memphis.Shared.Models.User", "User") .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + b.Navigation("SelectedType"); + + b.Navigation("Student"); + + b.Navigation("Type"); + b.Navigation("User"); }); modelBuilder.Entity("Memphis.Shared.Models.TrainingTicket", b => { - b.HasOne("Memphis.Shared.Models.User", "Trainer") + b.HasOne("Memphis.Shared.Models.TrainingMilestone", "Milestone") .WithMany() - .HasForeignKey("TrainerId") + .HasForeignKey("MilestoneId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Memphis.Shared.Models.TrainingRequest", "TrainingRequest") + b.HasOne("Memphis.Shared.Models.User", "Trainer") .WithMany() - .HasForeignKey("TrainingRequestId") + .HasForeignKey("TrainerId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); @@ -1090,9 +1203,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.Navigation("Trainer"); + b.Navigation("Milestone"); - b.Navigation("TrainingRequest"); + b.Navigation("Trainer"); b.Navigation("User"); }); diff --git a/Memphis.API/Program.cs b/Memphis.API/Program.cs index 7d2a994..2ecc2e0 100644 --- a/Memphis.API/Program.cs +++ b/Memphis.API/Program.cs @@ -3,7 +3,7 @@ using Memphis.API.Data; using Memphis.API.Services; using Memphis.API.Validators; -using Memphis.Shared.Models; +using Memphis.Shared.Dtos; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.HttpOverrides; using Microsoft.EntityFrameworkCore; @@ -97,11 +97,15 @@ }; }); -builder.Services.AddScoped, AirportValidator>(); -builder.Services.AddScoped, EventPositionValidator>(); -builder.Services.AddScoped, EventRegistrationValidator>(); -builder.Services.AddScoped, EventValidator>(); -builder.Services.AddScoped, FaqValidator>(); +builder.Services.AddScoped, AirportValidator>(); +builder.Services.AddScoped, CommentValidator>(); +builder.Services.AddScoped, EventPositionValidator>(); +builder.Services.AddScoped, EventRegistrationValidator>(); +builder.Services.AddScoped, EventValidator>(); +builder.Services.AddScoped, FaqValidator>(); +builder.Services.AddScoped, FeedbackValidator>(); +builder.Services.AddScoped, FileValidator>(); +builder.Services.AddScoped, OtsValidator>(); builder.Services.AddScoped(); builder.Services.AddScoped(); diff --git a/Memphis.API/Services/EmailService.cs b/Memphis.API/Services/EmailService.cs new file mode 100644 index 0000000..7f4e9e9 --- /dev/null +++ b/Memphis.API/Services/EmailService.cs @@ -0,0 +1,5 @@ +namespace Memphis.API.Services; + +public class EmailService +{ +} diff --git a/Memphis.API/Services/LoggingService.cs b/Memphis.API/Services/LoggingService.cs index bfdd98b..7ad4c6c 100644 --- a/Memphis.API/Services/LoggingService.cs +++ b/Memphis.API/Services/LoggingService.cs @@ -29,4 +29,4 @@ await _context.WebsiteLogs.AddAsync(new WebsiteLog }); await _context.SaveChangesAsync(); } -} +} \ No newline at end of file diff --git a/Memphis.API/Services/RedisService.cs b/Memphis.API/Services/RedisService.cs index 9723ead..fbca3df 100644 --- a/Memphis.API/Services/RedisService.cs +++ b/Memphis.API/Services/RedisService.cs @@ -61,12 +61,7 @@ public async Task SetRoles(IList roles, int userId) public async Task ValidateRoles(ClaimsPrincipal user, string[] roles) { var userRoles = await GetRoles(user); - if (userRoles == null) - return false; - foreach (var entry in userRoles) - if (roles.Any(x => x == entry)) - return true; - return false; + return userRoles != null && userRoles.Any(entry => roles.Any(x => x == entry)); } public async Task RefreshRoles(int userId) @@ -99,4 +94,4 @@ public async Task RemoveCached(string key) { await _redis.StringGetDeleteAsync(key); } -} +} \ No newline at end of file diff --git a/Memphis.API/Services/S3Service.cs b/Memphis.API/Services/S3Service.cs index fb0863d..3937430 100644 --- a/Memphis.API/Services/S3Service.cs +++ b/Memphis.API/Services/S3Service.cs @@ -5,21 +5,16 @@ namespace Memphis.API.Services; public class S3Service { - private readonly AmazonS3Client _client; - - public S3Service() - { - _client = new AmazonS3Client( - Environment.GetEnvironmentVariable("S3_KEY") ?? - throw new ArgumentNullException("S3_KEY env variable not found"), - Environment.GetEnvironmentVariable("S3_SECRET") ?? - throw new ArgumentNullException("S3_SECRET env variable not found"), - new AmazonS3Config - { - ServiceURL = Environment.GetEnvironmentVariable("S3_SERVICE_URL") ?? - throw new ArgumentNullException("S3_SERVICE_URL env variable not found") - }); - } + private readonly AmazonS3Client _client = new( + Environment.GetEnvironmentVariable("S3_KEY") ?? + throw new ArgumentNullException("S3_KEY env variable not found"), + Environment.GetEnvironmentVariable("S3_SECRET") ?? + throw new ArgumentNullException("S3_SECRET env variable not found"), + new AmazonS3Config + { + ServiceURL = Environment.GetEnvironmentVariable("S3_SERVICE_URL") ?? + throw new ArgumentNullException("S3_SERVICE_URL env variable not found") + }); public async Task UploadFile(HttpRequest request, string type) { @@ -31,7 +26,7 @@ public S3Service() var putRequest = new PutObjectRequest { BucketName = Environment.GetEnvironmentVariable("S3_BUCKET_NAME") ?? - throw new ArgumentNullException("S3_BUCKET_NAME env variable not found"), + throw new ArgumentNullException("S3_BUCKET_NAME env variable not found"), Key = $"{type}/{file.FileName.Replace(" ", "-")}", ContentBody = await reader.ReadToEndAsync(), CannedACL = S3CannedACL.PublicRead @@ -39,20 +34,20 @@ public S3Service() await _client.PutObjectAsync(putRequest); var url = Environment.GetEnvironmentVariable("S3_URL") ?? - throw new ArgumentNullException("S3_URL env variable not found"); + throw new ArgumentNullException("S3_URL env variable not found"); return $"{url}/{type}/{file.FileName.Replace(" ", "-")}"; } public async Task DeleteFile(string url) { var bucketUrl = Environment.GetEnvironmentVariable("S3_URL") ?? - throw new ArgumentNullException("S3_URL env variable not found"); + throw new ArgumentNullException("S3_URL env variable not found"); var deleteRequest = new DeleteObjectRequest { BucketName = Environment.GetEnvironmentVariable("S3_BUCKET_NAME") ?? - throw new ArgumentNullException("S3_BUCKET_NAME env variable not found"), + throw new ArgumentNullException("S3_BUCKET_NAME env variable not found"), Key = url.Replace(bucketUrl, string.Empty), }; await _client.DeleteObjectAsync(deleteRequest); } -} +} \ No newline at end of file diff --git a/Memphis.API/Validators/AirportValidator.cs b/Memphis.API/Validators/AirportValidator.cs index f915517..0a87f0e 100644 --- a/Memphis.API/Validators/AirportValidator.cs +++ b/Memphis.API/Validators/AirportValidator.cs @@ -1,9 +1,9 @@ using FluentValidation; -using Memphis.Shared.Models; +using Memphis.Shared.Dtos; namespace Memphis.API.Validators; -public class AirportValidator : AbstractValidator +public class AirportValidator : AbstractValidator { public AirportValidator() { diff --git a/Memphis.API/Validators/CommentValidator.cs b/Memphis.API/Validators/CommentValidator.cs new file mode 100644 index 0000000..3fc5689 --- /dev/null +++ b/Memphis.API/Validators/CommentValidator.cs @@ -0,0 +1,14 @@ +using FluentValidation; +using Memphis.Shared.Dtos; + +namespace Memphis.API.Validators; + +public class CommentValidator : AbstractValidator +{ + public CommentValidator() + { + RuleFor(x => x.UserId).NotEmpty().GreaterThan(0); + RuleFor(x => x.Title).NotEmpty(); + RuleFor(x => x.Description).NotEmpty(); + } +} diff --git a/Memphis.API/Validators/EventPositionValidator.cs b/Memphis.API/Validators/EventPositionValidator.cs index 299bd65..7e85610 100644 --- a/Memphis.API/Validators/EventPositionValidator.cs +++ b/Memphis.API/Validators/EventPositionValidator.cs @@ -1,9 +1,9 @@ using FluentValidation; -using Memphis.Shared.Models; +using Memphis.Shared.Dtos; namespace Memphis.API.Validators; -public class EventPositionValidator : AbstractValidator +public class EventPositionValidator : AbstractValidator { public EventPositionValidator() { diff --git a/Memphis.API/Validators/EventRegistrationValidator.cs b/Memphis.API/Validators/EventRegistrationValidator.cs index 18c5a3e..1e3ef68 100644 --- a/Memphis.API/Validators/EventRegistrationValidator.cs +++ b/Memphis.API/Validators/EventRegistrationValidator.cs @@ -1,9 +1,9 @@ using FluentValidation; -using Memphis.Shared.Models; +using Memphis.Shared.Dtos; namespace Memphis.API.Validators; -public class EventRegistrationValidator : AbstractValidator +public class EventRegistrationValidator : AbstractValidator { public EventRegistrationValidator() { diff --git a/Memphis.API/Validators/EventValidator.cs b/Memphis.API/Validators/EventValidator.cs index 870a41b..9994b12 100644 --- a/Memphis.API/Validators/EventValidator.cs +++ b/Memphis.API/Validators/EventValidator.cs @@ -1,9 +1,9 @@ using FluentValidation; -using Memphis.Shared.Models; +using Memphis.Shared.Dtos; namespace Memphis.API.Validators; -public class EventValidator : AbstractValidator +public class EventValidator : AbstractValidator { public EventValidator() { diff --git a/Memphis.API/Validators/FaqValidator.cs b/Memphis.API/Validators/FaqValidator.cs index 243ecca..1777217 100644 --- a/Memphis.API/Validators/FaqValidator.cs +++ b/Memphis.API/Validators/FaqValidator.cs @@ -1,9 +1,9 @@ using FluentValidation; -using Memphis.Shared.Models; +using Memphis.Shared.Dtos; namespace Memphis.API.Validators; -public class FaqValidator : AbstractValidator +public class FaqValidator : AbstractValidator { public FaqValidator() { diff --git a/Memphis.API/Validators/FeedbackValidator.cs b/Memphis.API/Validators/FeedbackValidator.cs new file mode 100644 index 0000000..a45f927 --- /dev/null +++ b/Memphis.API/Validators/FeedbackValidator.cs @@ -0,0 +1,15 @@ +using FluentValidation; +using Memphis.Shared.Dtos; + +namespace Memphis.API.Validators; + +public class FeedbackValidator : AbstractValidator +{ + public FeedbackValidator() + { + RuleFor(x => x.ControllerId).NotEmpty().GreaterThan(0); + RuleFor(x => x.ControllerCallsign).NotEmpty(); + RuleFor(x => x.Description).NotEmpty(); + RuleFor(x => x.Level).NotEmpty(); + } +} diff --git a/Memphis.API/Validators/FileValidator.cs b/Memphis.API/Validators/FileValidator.cs new file mode 100644 index 0000000..38faccc --- /dev/null +++ b/Memphis.API/Validators/FileValidator.cs @@ -0,0 +1,15 @@ +using FluentValidation; +using Memphis.Shared.Dtos; + +namespace Memphis.API.Validators; + +public class FileValidator : AbstractValidator +{ + public FileValidator() + { + RuleFor(x => x.Title).NotEmpty(); + RuleFor(x => x.Description).NotEmpty(); + RuleFor(x => x.Version).NotEmpty(); + RuleFor(x => x.Type).NotEmpty(); + } +} diff --git a/Memphis.API/Validators/OtsValidator.cs b/Memphis.API/Validators/OtsValidator.cs new file mode 100644 index 0000000..a150f84 --- /dev/null +++ b/Memphis.API/Validators/OtsValidator.cs @@ -0,0 +1,15 @@ +using FluentValidation; +using Memphis.Shared.Dtos; + +namespace Memphis.API.Validators; + +public class OtsValidator : AbstractValidator +{ + public OtsValidator() + { + RuleFor(x => x.UserId).NotEmpty(); + RuleFor(x => x.InstructorId).NotEmpty(); + RuleFor(x => x.TrainingRequestId).NotEmpty(); + RuleFor(x => x.TrainingRequestId).NotEmpty(); + } +} diff --git a/Memphis.Shared/Dtos/AirportDto.cs b/Memphis.Shared/Dtos/AirportDto.cs new file mode 100644 index 0000000..ff42cf9 --- /dev/null +++ b/Memphis.Shared/Dtos/AirportDto.cs @@ -0,0 +1,7 @@ +namespace Memphis.Shared.Dtos; + +public class AirportDto +{ + public required string Name { get; set; } + public required string Icao { get; set; } +} \ No newline at end of file diff --git a/Memphis.Shared/Dtos/VatsimToken.cs b/Memphis.Shared/Dtos/Auth/VatsimToken.cs similarity index 95% rename from Memphis.Shared/Dtos/VatsimToken.cs rename to Memphis.Shared/Dtos/Auth/VatsimToken.cs index 4f2fc67..b68583e 100644 --- a/Memphis.Shared/Dtos/VatsimToken.cs +++ b/Memphis.Shared/Dtos/Auth/VatsimToken.cs @@ -1,7 +1,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace Memphis.Shared.Dtos; +namespace Memphis.Shared.Dtos.auth; public class VatsimTokenDto { @@ -24,4 +24,4 @@ public class VatsimTokenDto [JsonPropertyName("token_type")] [JsonProperty("token_type")] public required string TokenType { get; set; } -} +} \ No newline at end of file diff --git a/Memphis.Shared/Dtos/VatsimUser.cs b/Memphis.Shared/Dtos/Auth/VatsimUser.cs similarity index 98% rename from Memphis.Shared/Dtos/VatsimUser.cs rename to Memphis.Shared/Dtos/Auth/VatsimUser.cs index 150b335..6eebc37 100644 --- a/Memphis.Shared/Dtos/VatsimUser.cs +++ b/Memphis.Shared/Dtos/Auth/VatsimUser.cs @@ -1,7 +1,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace Memphis.Shared.Dtos; +namespace Memphis.Shared.Dtos.auth; public class PersonalDetails { @@ -85,7 +85,6 @@ public class Subdivision public required string Name { get; set; } } - public class VatsimDetails { [JsonPropertyName("rating")] @@ -129,4 +128,4 @@ public class VatsimUserResponseDto [JsonPropertyName("data")] [JsonProperty("data")] public required VatsimUserDto Data { get; set; } -} +} \ No newline at end of file diff --git a/Memphis.Shared/Dtos/CommentDto.cs b/Memphis.Shared/Dtos/CommentDto.cs new file mode 100644 index 0000000..12b9be5 --- /dev/null +++ b/Memphis.Shared/Dtos/CommentDto.cs @@ -0,0 +1,9 @@ +namespace Memphis.Shared.Dtos; + +public class CommentDto +{ + public int UserId { get; set; } + public bool Confidential { get; set; } + public required string Title { get; set; } + public required string Description { get; set; } +} \ No newline at end of file diff --git a/Memphis.Shared/Dtos/EventDto.cs b/Memphis.Shared/Dtos/EventDto.cs new file mode 100644 index 0000000..708213e --- /dev/null +++ b/Memphis.Shared/Dtos/EventDto.cs @@ -0,0 +1,11 @@ +namespace Memphis.Shared.Dtos; + +public class EventDto +{ + public required string Title { get; set; } + public required string Description { get; set; } + public required string Host { get; set; } + public DateTimeOffset Start { get; set; } + public DateTimeOffset End { get; set; } + public bool IsOpen { get; set; } +} \ No newline at end of file diff --git a/Memphis.Shared/Dtos/EventPositionDto.cs b/Memphis.Shared/Dtos/EventPositionDto.cs new file mode 100644 index 0000000..c399c8c --- /dev/null +++ b/Memphis.Shared/Dtos/EventPositionDto.cs @@ -0,0 +1,10 @@ +using Memphis.Shared.Enums; + +namespace Memphis.Shared.Dtos; + +public class EventPositionDto +{ + public int EventId { get; set; } + public required string Name { get; set; } + public Rating MinRating { get; set; } +} \ No newline at end of file diff --git a/Memphis.Shared/Dtos/EventRegistrationDto.cs b/Memphis.Shared/Dtos/EventRegistrationDto.cs new file mode 100644 index 0000000..bbcb39e --- /dev/null +++ b/Memphis.Shared/Dtos/EventRegistrationDto.cs @@ -0,0 +1,9 @@ +namespace Memphis.Shared.Dtos; + +public class EventRegistrationDto +{ + public int EventId { get; set; } + public int EventPositionId { get; set; } + public DateTimeOffset Start { get; set; } + public DateTimeOffset End { get; set; } +} \ No newline at end of file diff --git a/Memphis.Shared/Dtos/FaqDto.cs b/Memphis.Shared/Dtos/FaqDto.cs new file mode 100644 index 0000000..28c35b1 --- /dev/null +++ b/Memphis.Shared/Dtos/FaqDto.cs @@ -0,0 +1,8 @@ +namespace Memphis.Shared.Dtos; + +public class FaqDto +{ + public required string Question { get; set; } + public required string Answer { get; set; } + public int Order { get; set; } +} \ No newline at end of file diff --git a/Memphis.Shared/Dtos/FeedbackDto.cs b/Memphis.Shared/Dtos/FeedbackDto.cs new file mode 100644 index 0000000..ba08729 --- /dev/null +++ b/Memphis.Shared/Dtos/FeedbackDto.cs @@ -0,0 +1,13 @@ +using Memphis.Shared.Enums; + +namespace Memphis.Shared.Dtos; + +public class FeedbackDto +{ + public int ControllerId { get; set; } + public required string ControllerCallsign { get; set; } + public required string Description { get; set; } + public FeedbackLevel Level { get; set; } + public string? Reply { get; set; } + public FeedbackStatus Status { get; set; } = FeedbackStatus.PENDING; +} \ No newline at end of file diff --git a/Memphis.Shared/Dtos/FileDto.cs b/Memphis.Shared/Dtos/FileDto.cs new file mode 100644 index 0000000..6579c39 --- /dev/null +++ b/Memphis.Shared/Dtos/FileDto.cs @@ -0,0 +1,11 @@ +using Memphis.Shared.Enums; + +namespace Memphis.Shared.Dtos; + +public class FileDto +{ + public required string Title { get; set; } + public required string Description { get; set; } + public required string Version { get; set; } + public FileType Type { get; set; } +} \ No newline at end of file diff --git a/Memphis.Shared/Dtos/HoursDto.cs b/Memphis.Shared/Dtos/HoursDto.cs new file mode 100644 index 0000000..61fc79e --- /dev/null +++ b/Memphis.Shared/Dtos/HoursDto.cs @@ -0,0 +1,14 @@ +namespace Memphis.Shared.Dtos; + +public class HoursDto +{ + public int Month { get; set; } + public int Year { get; set; } + public required RosterUserDto User { get; set; } + public double DeliveryHours { get; set; } + public double GroundHours { get; set; } + public double TowerHours { get; set; } + public double ApproachHours { get; set; } + public double CenterHours { get; set; } + public double TotalHours => DeliveryHours + GroundHours + TowerHours + ApproachHours + CenterHours; +} \ No newline at end of file diff --git a/Memphis.Shared/Dtos/NotificationDto.cs b/Memphis.Shared/Dtos/NotificationDto.cs new file mode 100644 index 0000000..4902a68 --- /dev/null +++ b/Memphis.Shared/Dtos/NotificationDto.cs @@ -0,0 +1,10 @@ +namespace Memphis.Shared.Dtos; + +public class NotificationDto +{ + public int Id { get; set; } + public required string Title { get; set; } + public required string Link { get; set; } + public bool Read { get; set; } + public DateTimeOffset Timestamp { get; set; } +} \ No newline at end of file diff --git a/Memphis.Shared/Dtos/OtsDto.cs b/Memphis.Shared/Dtos/OtsDto.cs new file mode 100644 index 0000000..3ad821c --- /dev/null +++ b/Memphis.Shared/Dtos/OtsDto.cs @@ -0,0 +1,15 @@ +using Memphis.Shared.Enums; + +namespace Memphis.Shared.Dtos; + +public class OtsDto +{ + public int UserId { get; set; } + public int InstructorId { get; set; } + public int TrainingRequestId { get; set; } + public DateTimeOffset? Start { get; set; } + public int MilestoneId { get; set; } + public TrainingTicketPosition Position { get; set; } + public required string Facility { get; set; } + public OtsStatus Status { get; set; } = OtsStatus.PENDING; +} \ No newline at end of file diff --git a/Memphis.Shared/Dtos/RosterDto.cs b/Memphis.Shared/Dtos/RosterDto.cs new file mode 100644 index 0000000..4998668 --- /dev/null +++ b/Memphis.Shared/Dtos/RosterDto.cs @@ -0,0 +1,19 @@ +using Memphis.Shared.Enums; +using Memphis.Shared.Models; + +namespace Memphis.Shared.Dtos; + +public class RosterUserDto +{ + public int Cid { get; set; } + public required string Name { get; set; } + public required string Initials { get; set; } + public required string Rating { get; set; } + public UserStatus Status { get; set; } + public bool Visitor { get; set; } + public string? VisitorFrom { get; set; } + public AirportCert Minor { get; set; } + public AirportCert Major { get; set; } + public CenterCert Center { get; set; } + public required IList Roles { get; set; } +} \ No newline at end of file diff --git a/Memphis.Shared/Dtos/RosterUser.cs b/Memphis.Shared/Dtos/RosterUser.cs deleted file mode 100644 index 940306f..0000000 --- a/Memphis.Shared/Dtos/RosterUser.cs +++ /dev/null @@ -1,46 +0,0 @@ -using Memphis.Shared.Enums; -using Memphis.Shared.Models; -using Memphis.Shared.Utils; - -namespace Memphis.Shared.Dtos; - -public class RosterUserDto -{ - public int Id { get; set; } - public required string Name { get; set; } - public required string Initials { get; set; } - public required string Rating { get; set; } - public UserStatus Status { get; set; } - public bool Visitor { get; set; } - public string? VisitorFrom { get; set; } - public AirportCert Minor { get; set; } - public AirportCert Major { get; set; } - public CenterCert Center { get; set; } - public required IList Roles { get; set; } - - public static RosterUserDto Parse(User user) - { - return new RosterUserDto - { - Id = user.Id, - Initials = user.Initials, - Name = $"{user.FirstName} {user.LastName}", - Rating = Helpers.GetRatingName(user.Rating), - Status = user.Status, - Visitor = user.Visitor, - VisitorFrom = user.VisitorFrom, - Minor = user.Minor, - Major = user.Major, - Center = user.Center, - Roles = user.Roles?.ToList() ?? new List() - }; - } - - public static IList ParseMultiple(IList users) - { - var result = new List(); - foreach (var entry in users) - result.Add(Parse(entry)); - return result; - } -} diff --git a/Memphis.Shared/Enums/AirportCert.cs b/Memphis.Shared/Enums/AirportCert.cs index a62ab83..5fe9fab 100644 --- a/Memphis.Shared/Enums/AirportCert.cs +++ b/Memphis.Shared/Enums/AirportCert.cs @@ -8,4 +8,4 @@ public enum AirportCert TOWER, SOLOR_APPROACH, APPROACH -} +} \ No newline at end of file diff --git a/Memphis.Shared/Enums/CenterCert.cs b/Memphis.Shared/Enums/CenterCert.cs index 0e378d8..91e3e5d 100644 --- a/Memphis.Shared/Enums/CenterCert.cs +++ b/Memphis.Shared/Enums/CenterCert.cs @@ -5,4 +5,4 @@ public enum CenterCert NONE, SOLO, CERTIFIED -} +} \ No newline at end of file diff --git a/Memphis.Shared/Enums/EventRegistrationStatus.cs b/Memphis.Shared/Enums/EventRegistrationStatus.cs index bfe3583..2406fcf 100644 --- a/Memphis.Shared/Enums/EventRegistrationStatus.cs +++ b/Memphis.Shared/Enums/EventRegistrationStatus.cs @@ -5,4 +5,4 @@ public enum EventRegistrationStatus PENDING, ASSIGNED, RELIEF -} +} \ No newline at end of file diff --git a/Memphis.Shared/Enums/FeedbackLevel.cs b/Memphis.Shared/Enums/FeedbackLevel.cs index 37fd4d6..b931ebf 100644 --- a/Memphis.Shared/Enums/FeedbackLevel.cs +++ b/Memphis.Shared/Enums/FeedbackLevel.cs @@ -7,4 +7,4 @@ public enum FeedbackLevel FAIR, GOOD, EXCELLENT -} +} \ No newline at end of file diff --git a/Memphis.Shared/Enums/FeedbackStatus.cs b/Memphis.Shared/Enums/FeedbackStatus.cs index a8932ca..16b0142 100644 --- a/Memphis.Shared/Enums/FeedbackStatus.cs +++ b/Memphis.Shared/Enums/FeedbackStatus.cs @@ -5,4 +5,4 @@ public enum FeedbackStatus PENDING, APPROVED, DENIED -} +} \ No newline at end of file diff --git a/Memphis.Shared/Enums/FileType.cs b/Memphis.Shared/Enums/FileType.cs index 0e07b8c..471a14d 100644 --- a/Memphis.Shared/Enums/FileType.cs +++ b/Memphis.Shared/Enums/FileType.cs @@ -6,4 +6,4 @@ public enum FileType TRAINING_STAFF, STAFF, SENIOR_STAFF -} +} \ No newline at end of file diff --git a/Memphis.Shared/Enums/OtsStatus.cs b/Memphis.Shared/Enums/OtsStatus.cs index e7ba333..0d1cce7 100644 --- a/Memphis.Shared/Enums/OtsStatus.cs +++ b/Memphis.Shared/Enums/OtsStatus.cs @@ -7,4 +7,4 @@ public enum OtsStatus SCHEDULED, PASSED, FAILED -} +} \ No newline at end of file diff --git a/Memphis.Shared/Enums/Rating.cs b/Memphis.Shared/Enums/Rating.cs index ba55573..3153c34 100644 --- a/Memphis.Shared/Enums/Rating.cs +++ b/Memphis.Shared/Enums/Rating.cs @@ -16,4 +16,4 @@ public enum Rating I3, SUP, ADM -} +} \ No newline at end of file diff --git a/Memphis.Shared/Enums/TrainingRequestStatus.cs b/Memphis.Shared/Enums/TrainingRequestStatus.cs index b59ea82..b875882 100644 --- a/Memphis.Shared/Enums/TrainingRequestStatus.cs +++ b/Memphis.Shared/Enums/TrainingRequestStatus.cs @@ -6,4 +6,4 @@ public enum TrainingRequestStatus ASSIGNED, COMPLETE, NOT_COMPLETE -} +} \ No newline at end of file diff --git a/Memphis.Shared/Enums/TrainingTicketPerformance.cs b/Memphis.Shared/Enums/TrainingTicketPerformance.cs index caf5937..15b0347 100644 --- a/Memphis.Shared/Enums/TrainingTicketPerformance.cs +++ b/Memphis.Shared/Enums/TrainingTicketPerformance.cs @@ -8,4 +8,4 @@ public enum TrainingTicketPerformance FAIR, GOOD, EXCELLENT -} +} \ No newline at end of file diff --git a/Memphis.Shared/Enums/TrainingTicketPosition.cs b/Memphis.Shared/Enums/TrainingTicketPosition.cs index e70e716..b996d28 100644 --- a/Memphis.Shared/Enums/TrainingTicketPosition.cs +++ b/Memphis.Shared/Enums/TrainingTicketPosition.cs @@ -7,4 +7,4 @@ public enum TrainingTicketPosition TOWER, APPROACH_DEPARTURE, CENTER -} +} \ No newline at end of file diff --git a/Memphis.Shared/Enums/VisitingApplicationStatus.cs b/Memphis.Shared/Enums/VisitingApplicationStatus.cs index b0dac0c..a3bed69 100644 --- a/Memphis.Shared/Enums/VisitingApplicationStatus.cs +++ b/Memphis.Shared/Enums/VisitingApplicationStatus.cs @@ -1,9 +1,8 @@ namespace Memphis.Shared.Enums; - public enum VisitingApplicationStatus { PENDING, APPROVED, DENIED -} +} \ No newline at end of file diff --git a/Memphis.Shared/Models/Airport.cs b/Memphis.Shared/Models/Airport.cs index 8f02f0f..520109c 100644 --- a/Memphis.Shared/Models/Airport.cs +++ b/Memphis.Shared/Models/Airport.cs @@ -13,4 +13,4 @@ public class Airport public string? MetarRaw { get; set; } public DateTimeOffset Created { get; set; } = DateTimeOffset.UtcNow; public DateTimeOffset Updated { get; set; } = DateTimeOffset.UtcNow; -} +} \ No newline at end of file diff --git a/Memphis.Shared/Models/Comment.cs b/Memphis.Shared/Models/Comment.cs index e9d05be..da90744 100644 --- a/Memphis.Shared/Models/Comment.cs +++ b/Memphis.Shared/Models/Comment.cs @@ -3,12 +3,10 @@ public class Comment { public int Id { get; set; } - public int UserId { get; set; } public required User User { get; set; } - public int SubmitterId { get; set; } - public User? Submitter { get; set; } + public required User Submitter { get; set; } public bool Confidential { get; set; } public required string Title { get; set; } public required string Description { get; set; } public DateTimeOffset Timestamp { get; set; } = DateTimeOffset.UtcNow; -} +} \ No newline at end of file diff --git a/Memphis.Shared/Models/EmailLog.cs b/Memphis.Shared/Models/EmailLog.cs index 4b04b57..af96fc3 100644 --- a/Memphis.Shared/Models/EmailLog.cs +++ b/Memphis.Shared/Models/EmailLog.cs @@ -6,4 +6,4 @@ public class EmailLog public required string Email { get; set; } public required string To { get; set; } public DateTimeOffset Timestamp { get; set; } = DateTimeOffset.UtcNow; -} +} \ No newline at end of file diff --git a/Memphis.Shared/Models/Event.cs b/Memphis.Shared/Models/Event.cs index 19f494c..6712c12 100644 --- a/Memphis.Shared/Models/Event.cs +++ b/Memphis.Shared/Models/Event.cs @@ -15,4 +15,4 @@ public class Event public bool IsOpen { get; set; } public DateTimeOffset Created { get; set; } = DateTimeOffset.UtcNow; public DateTimeOffset Updated { get; set; } = DateTimeOffset.UtcNow; -} +} \ No newline at end of file diff --git a/Memphis.Shared/Models/EventPosition.cs b/Memphis.Shared/Models/EventPosition.cs index 39df0ee..29f6170 100644 --- a/Memphis.Shared/Models/EventPosition.cs +++ b/Memphis.Shared/Models/EventPosition.cs @@ -1,18 +1,12 @@ using Memphis.Shared.Enums; -using System.Text.Json.Serialization; namespace Memphis.Shared.Models; public class EventPosition { public int Id { get; set; } - public int EventId { get; set; } - - [JsonIgnore] - [Newtonsoft.Json.JsonIgnore] - public Event? Event { get; set; } + public required Event Event { get; set; } public required string Name { get; set; } public Rating MinRating { get; set; } public bool Available { get; set; } -} - +} \ No newline at end of file diff --git a/Memphis.Shared/Models/EventRegistration.cs b/Memphis.Shared/Models/EventRegistration.cs index 2a381c5..e51dbeb 100644 --- a/Memphis.Shared/Models/EventRegistration.cs +++ b/Memphis.Shared/Models/EventRegistration.cs @@ -1,26 +1,16 @@ using Memphis.Shared.Enums; -using System.Text.Json.Serialization; namespace Memphis.Shared.Models; public class EventRegistration { public int Id { get; set; } - public int UserId { get; set; } - - [JsonIgnore] - [Newtonsoft.Json.JsonIgnore] - public User? User { get; set; } - public int EventId { get; set; } - - [JsonIgnore] - [Newtonsoft.Json.JsonIgnore] - public Event? Event { get; set; } - public int EventPositionId { get; set; } - public EventPosition? EventPosition { get; set; } - public EventRegistrationStatus Status { get; set; } + public required User User { get; set; } + public required Event Event { get; set; } + public required EventPosition EventPosition { get; set; } + public EventRegistrationStatus Status { get; set; } = EventRegistrationStatus.PENDING; public DateTimeOffset Start { get; set; } public DateTimeOffset End { get; set; } public DateTimeOffset Created { get; set; } = DateTimeOffset.UtcNow; public DateTimeOffset Updated { get; set; } = DateTimeOffset.UtcNow; -} +} \ No newline at end of file diff --git a/Memphis.Shared/Models/Faq.cs b/Memphis.Shared/Models/Faq.cs index ce8792a..e24fd8e 100644 --- a/Memphis.Shared/Models/Faq.cs +++ b/Memphis.Shared/Models/Faq.cs @@ -8,4 +8,4 @@ public class Faq public int Order { get; set; } public DateTimeOffset Created { get; set; } = DateTimeOffset.UtcNow; public DateTimeOffset Updated { get; set; } = DateTimeOffset.UtcNow; -} +} \ No newline at end of file diff --git a/Memphis.Shared/Models/Feedback.cs b/Memphis.Shared/Models/Feedback.cs index 0cb7df8..e78f903 100644 --- a/Memphis.Shared/Models/Feedback.cs +++ b/Memphis.Shared/Models/Feedback.cs @@ -8,13 +8,12 @@ public class Feedback public int Cid { get; set; } public required string Name { get; set; } public required string Email { get; set; } - public int ControllerId { get; set; } - public required string ControllerName { get; set; } + public required User Controller { get; set; } public required string ControllerCallsign { get; set; } public required string Description { get; set; } public FeedbackLevel Level { get; set; } public string? Reply { get; set; } - public FeedbackStatus Status { get; set; } + public FeedbackStatus Status { get; set; } = FeedbackStatus.PENDING; public DateTimeOffset Created { get; set; } = DateTimeOffset.UtcNow; public DateTimeOffset Updated { get; set; } = DateTimeOffset.UtcNow; -} +} \ No newline at end of file diff --git a/Memphis.Shared/Models/FeedbackCannedResponse.cs b/Memphis.Shared/Models/FeedbackCannedResponse.cs deleted file mode 100644 index e0bbd4b..0000000 --- a/Memphis.Shared/Models/FeedbackCannedResponse.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Memphis.Shared.Models; - -public class FeedbackCannedResponse -{ - public int Id { get; set; } - public required string Title { get; set; } - public required string Response { get; set; } -} diff --git a/Memphis.Shared/Models/File.cs b/Memphis.Shared/Models/File.cs index 0209dfb..2447574 100644 --- a/Memphis.Shared/Models/File.cs +++ b/Memphis.Shared/Models/File.cs @@ -12,4 +12,4 @@ public class File public FileType Type { get; set; } public DateTimeOffset Created { get; set; } = DateTimeOffset.UtcNow; public DateTimeOffset Updated { get; set; } = DateTimeOffset.UtcNow; -} +} \ No newline at end of file diff --git a/Memphis.Shared/Models/Hours.cs b/Memphis.Shared/Models/Hours.cs index 188a38f..09975cd 100644 --- a/Memphis.Shared/Models/Hours.cs +++ b/Memphis.Shared/Models/Hours.cs @@ -2,18 +2,18 @@ namespace Memphis.Shared.Models; -[Index(nameof(UserId))] [Index(nameof(Month))] [Index(nameof(Year))] public class Hours { public int Id { get; set; } - public int UserId { get; set; } + public required User User { get; set; } public int Month { get; set; } public int Year { get; set; } - public float DeliveryHours { get; set; } - public float GroundHours { get; set; } - public float TowerHours { get; set; } - public float ApproachHours { get; set; } - public float CenterHours { get; set; } -} + public double DeliveryHours { get; set; } + public double GroundHours { get; set; } + public double TowerHours { get; set; } + public double ApproachHours { get; set; } + public double CenterHours { get; set; } + public double TotalHours => DeliveryHours + GroundHours + TowerHours + ApproachHours + CenterHours; +} \ No newline at end of file diff --git a/Memphis.Shared/Models/Notification.cs b/Memphis.Shared/Models/Notification.cs new file mode 100644 index 0000000..9e3d970 --- /dev/null +++ b/Memphis.Shared/Models/Notification.cs @@ -0,0 +1,15 @@ +using Microsoft.EntityFrameworkCore; + +namespace Memphis.Shared.Models; + +[Index(nameof(Title))] +[Index(nameof(Read))] +public class Notification +{ + public int Id { get; set; } + public required User User { get; set; } + public required string Title { get; set; } + public required string Link { get; set; } + public bool Read { get; set; } + public DateTimeOffset Timestamp { get; set; } +} \ No newline at end of file diff --git a/Memphis.Shared/Models/OnlineController.cs b/Memphis.Shared/Models/OnlineController.cs index 32e18e0..73fe50c 100644 --- a/Memphis.Shared/Models/OnlineController.cs +++ b/Memphis.Shared/Models/OnlineController.cs @@ -7,4 +7,4 @@ public class OnlineController public required string Callsign { get; set; } public required string Frequency { get; set; } public TimeSpan Duration { get; set; } -} +} \ No newline at end of file diff --git a/Memphis.Shared/Models/Ots.cs b/Memphis.Shared/Models/Ots.cs index 4f3e2e1..c948db9 100644 --- a/Memphis.Shared/Models/Ots.cs +++ b/Memphis.Shared/Models/Ots.cs @@ -3,22 +3,17 @@ namespace Memphis.Shared.Models; -[Index(nameof(Position))] [Index(nameof(Status))] public class Ots { public int Id { get; set; } - public int UserId { get; set; } - public User? User { get; set; } - public int SubmitterId { get; set; } public required User Submitter { get; set; } - public int? InstructorId { get; set; } - public User? Instructor { get; set; } - public int? TrainingRequestId { get; set; } + public required User User { get; set; } + public required User Instructor { get; set; } public DateTimeOffset? Start { get; set; } - public TrainingTicketPosition Position { get; set; } + public required TrainingMilestone Milestone { get; set; } public required string Facility { get; set; } public OtsStatus Status { get; set; } = OtsStatus.PENDING; public DateTimeOffset Created { get; set; } = DateTimeOffset.UtcNow; public DateTimeOffset Updated { get; set; } = DateTimeOffset.UtcNow; -} +} \ No newline at end of file diff --git a/Memphis.Shared/Models/Role.cs b/Memphis.Shared/Models/Role.cs index 0808c08..5a8da86 100644 --- a/Memphis.Shared/Models/Role.cs +++ b/Memphis.Shared/Models/Role.cs @@ -8,7 +8,8 @@ public class Role public required string Name { get; set; } public required string NameShort { get; set; } public required string Email { get; set; } + [JsonIgnore] [Newtonsoft.Json.JsonIgnore] public ICollection Users { get; set; } = new List(); -} +} \ No newline at end of file diff --git a/Memphis.Shared/Models/Session.cs b/Memphis.Shared/Models/Session.cs index fd8799b..1f0d04c 100644 --- a/Memphis.Shared/Models/Session.cs +++ b/Memphis.Shared/Models/Session.cs @@ -10,12 +10,11 @@ namespace Memphis.Shared.Models; public class Session { public int Id { get; set; } - public int UserId { get; set; } - public User? User { get; set; } + public required User User { get; set; } public required string Name { get; set; } public required string Callsign { get; set; } public required string Frequency { get; set; } public DateTimeOffset Start { get; set; } public DateTimeOffset End { get; set; } public TimeSpan Duration { get; set; } = TimeSpan.Zero; -} +} \ No newline at end of file diff --git a/Memphis.Shared/Models/Settings.cs b/Memphis.Shared/Models/Settings.cs index da137b7..bfaded2 100644 --- a/Memphis.Shared/Models/Settings.cs +++ b/Memphis.Shared/Models/Settings.cs @@ -6,4 +6,4 @@ public class Settings public bool VisitingOpen { get; set; } public int RequiredHours { get; set; } public DateTimeOffset LastUpdated { get; set; } = DateTimeOffset.UtcNow; -} +} \ No newline at end of file diff --git a/Memphis.Shared/Models/TrainingMilestone.cs b/Memphis.Shared/Models/TrainingMilestone.cs new file mode 100644 index 0000000..92c55ca --- /dev/null +++ b/Memphis.Shared/Models/TrainingMilestone.cs @@ -0,0 +1,14 @@ +using Microsoft.EntityFrameworkCore; + +namespace Memphis.Shared.Models; + +[Index(nameof(Code))] +public class TrainingMilestone +{ + public int Id { get; set; } + public required string Code { get; set; } + public required string Name { get; set; } + public required string Facility { get; set; } + public DateTimeOffset Created { get; set; } = DateTimeOffset.UtcNow; + public DateTimeOffset Updated { get; set; } = DateTimeOffset.UtcNow; +} \ No newline at end of file diff --git a/Memphis.Shared/Models/TrainingRequest.cs b/Memphis.Shared/Models/TrainingRequest.cs deleted file mode 100644 index 47f853d..0000000 --- a/Memphis.Shared/Models/TrainingRequest.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Memphis.Shared.Enums; -using Microsoft.EntityFrameworkCore; - -namespace Memphis.Shared.Models; - -[Index(nameof(Start))] -[Index(nameof(Status))] -public class TrainingRequest -{ - public int Id { get; set; } - public int UserId { get; set; } - public required User User { get; set; } - public TrainingTicketPosition Position { get; set; } - public DateTimeOffset Start { get; set; } - public DateTimeOffset End { get; set; } - public TrainingRequestStatus Status { get; set; } - public DateTimeOffset Created { get; set; } = DateTimeOffset.UtcNow; - public DateTimeOffset Updated { get; set; } = DateTimeOffset.UtcNow; -} diff --git a/Memphis.Shared/Models/TrainingSchedule.cs b/Memphis.Shared/Models/TrainingSchedule.cs new file mode 100644 index 0000000..7c0ce8b --- /dev/null +++ b/Memphis.Shared/Models/TrainingSchedule.cs @@ -0,0 +1,12 @@ +namespace Memphis.Shared.Models; + +public class TrainingSchedule +{ + public int Id { get; set; } + public required User User { get; set; } + public User? Student { get; set; } + public required TrainingType Type { get; set; } + public TrainingType? SelectedType { get; set; } + public DateTimeOffset Start { get; set; } + public DateTimeOffset End => Start.AddHours(1.5); +} \ No newline at end of file diff --git a/Memphis.Shared/Models/TrainingTicket.cs b/Memphis.Shared/Models/TrainingTicket.cs index 059916f..7540339 100644 --- a/Memphis.Shared/Models/TrainingTicket.cs +++ b/Memphis.Shared/Models/TrainingTicket.cs @@ -3,19 +3,13 @@ namespace Memphis.Shared.Models; -[Index(nameof(Position))] [Index(nameof(Performance))] public class TrainingTicket { public int Id { get; set; } - public int UserId { get; set; } public required User User { get; set; } - public int TrainerId { get; set; } public required User Trainer { get; set; } - public int TrainingRequestId { get; set; } - public required TrainingRequest TrainingRequest { get; set; } - public TrainingTicketPosition Position { get; set; } - public required string Facility { get; set; } + public required TrainingMilestone Milestone { get; set; } public TrainingTicketPerformance Performance { get; set; } public required string UserNotes { get; set; } public required string TrainingNotes { get; set; } @@ -23,4 +17,4 @@ public class TrainingTicket public DateTimeOffset End { get; set; } public DateTimeOffset Created { get; set; } = DateTimeOffset.UtcNow; public DateTimeOffset Updated { get; set; } = DateTimeOffset.UtcNow; -} +} \ No newline at end of file diff --git a/Memphis.Shared/Models/TrainingType.cs b/Memphis.Shared/Models/TrainingType.cs new file mode 100644 index 0000000..809b430 --- /dev/null +++ b/Memphis.Shared/Models/TrainingType.cs @@ -0,0 +1,7 @@ +namespace Memphis.Shared.Models; + +public class TrainingType +{ + public int Id { get; set; } + public required string Name { get; set; } +} \ No newline at end of file diff --git a/Memphis.Shared/Models/User.cs b/Memphis.Shared/Models/User.cs index 47db47c..a308a41 100644 --- a/Memphis.Shared/Models/User.cs +++ b/Memphis.Shared/Models/User.cs @@ -26,6 +26,7 @@ public class User public AirportCert Minor { get; set; } = AirportCert.NONE; public AirportCert Major { get; set; } = AirportCert.NONE; public CenterCert Center { get; set; } = CenterCert.NONE; + public string? DiscordId { get; set; } public DateTimeOffset Created { get; set; } = DateTimeOffset.UtcNow; public DateTimeOffset Updated { get; set; } = DateTimeOffset.UtcNow; } \ No newline at end of file diff --git a/Memphis.Shared/Models/VisitingApplication.cs b/Memphis.Shared/Models/VisitingApplication.cs index 275384a..cdcaafa 100644 --- a/Memphis.Shared/Models/VisitingApplication.cs +++ b/Memphis.Shared/Models/VisitingApplication.cs @@ -14,4 +14,4 @@ public class VisitingApplication public string? DenialReason { get; set; } public DateTimeOffset Created { get; set; } = DateTimeOffset.UtcNow; public DateTimeOffset Updated { get; set; } = DateTimeOffset.UtcNow; -} +} \ No newline at end of file diff --git a/Memphis.Shared/Models/WebsiteLog.cs b/Memphis.Shared/Models/WebsiteLog.cs index 28830ab..7abec15 100644 --- a/Memphis.Shared/Models/WebsiteLog.cs +++ b/Memphis.Shared/Models/WebsiteLog.cs @@ -10,4 +10,4 @@ public class WebsiteLog public required string OldData { get; set; } public required string NewData { get; set; } public DateTimeOffset Timestamp { get; set; } = DateTimeOffset.UtcNow; -} +} \ No newline at end of file diff --git a/Memphis.Shared/Utils/Constants.cs b/Memphis.Shared/Utils/Constants.cs index 4429c5b..a374d0c 100644 --- a/Memphis.Shared/Utils/Constants.cs +++ b/Memphis.Shared/Utils/Constants.cs @@ -2,16 +2,17 @@ public class Constants { - public static readonly string[] SENIOR_STAFF_LIST = new string[] + public static readonly string[] SeniorStaffList = new string[] { "ATM", "DATM", "TA", "WM" }; - public const string SENIOR_STAFF = "ATM,DATM,TA,WM"; - public static readonly string[] FULL_STAFF_LIST = new string[] + public const string SeniorStaff = "ATM,DATM,TA,WM"; + + public static readonly string[] FullStaffList = new string[] { "ATM", "DATM", @@ -20,9 +21,10 @@ public class Constants "EC", "FE" }; - public const string FULL_STAFF = "ATM,DATM,TA,WM,EC,FE"; - public static readonly string[] ALL_STAFF_LIST = new string[] + public const string FullStaff = "ATM,DATM,TA,WM,EC,FE"; + + public static readonly string[] AllStaffList = new string[] { "ATM", "DATM", @@ -35,18 +37,20 @@ public class Constants "FE", "AFE" }; - public const string ALL_STAFF = "ATM,DATM,TA,ATA,WM,AWM,EC,AEC,FE,AFE"; - public static readonly string[] SENIOR_TRAINING_STAFF_LIST = new string[] + public const string AllStaff = "ATM,DATM,TA,ATA,WM,AWM,EC,AEC,FE,AFE"; + + public static readonly string[] SeniorTrainingStaffList = new string[] { "TA", "ATA", "INS", "WM" }; - public const string SENIOR_TRAINING_STAFF = "TA,ATA,INS,WN"; - public static readonly string[] TRAINING_STAFF_LIST = new string[] + public const string SeniorTrainingStaff = "TA,ATA,INS,WN"; + + public static readonly string[] TrainingStaffList = new string[] { "TA", "ATA", @@ -54,12 +58,13 @@ public class Constants "MTR", "WM" }; - public const string TRAINING_STAFF = "TA,ATA,INS,MTR,WM"; - public const string CAN_REGISTER_FOR_EVENTS = "CanRegisterForEvents"; - public const string CAN_REQUEST_TRAINING = "CanRequestTraining"; + public const string TrainingStaff = "TA,ATA,INS,MTR,WM"; + + public const string CanRegisterForEvents = "CanRegisterForEvents"; + public const string CanRequestTraining = "CanRequestTraining"; - public static readonly string[] CAN_AIRPORTS_LIST = new string[] + public static readonly string[] CanAirportsList = new string[] { "ATM", "DATM", @@ -69,9 +74,10 @@ public class Constants "FE", "AFE" }; - public const string CAN_AIRPORTS = "ATM,DATM,TA,WM,ATM,FE,AFE"; - public static readonly string[] CAN_MANAGE_CERTIFICATIONS_LIST = new string[] + public const string CanAirports = "ATM,DATM,TA,WM,ATM,FE,AFE"; + + public static readonly string[] CanManageCertificationsList = new string[] { "ATM", "DATM", @@ -79,9 +85,10 @@ public class Constants "WM", "AWM" }; - public const string CAN_MANAGE_CERTIFICATIONS = "ATM,DATM,TA,WM,AWM"; - public static readonly string[] CAN_COMMENT_LIST = new string[] + public const string CanManageCertifications = "ATM,DATM,TA,WM,AWM"; + + public static readonly string[] CanCommentList = new string[] { "ATM", "DATM", @@ -96,18 +103,20 @@ public class Constants "INS", "MTR" }; - public const string CAN_COMMENT = "ATM,DATM,TA,ATA,WM,AWM,EX,AEC,FE,AFE,INS,MTR"; - public static readonly string[] CAN_COMMENT_CONFIDENTIAL_LIST = new string[] + public const string CanComment = "ATM,DATM,TA,ATA,WM,AWM,EX,AEC,FE,AFE,INS,MTR"; + + public static readonly string[] CanCommentConfidentialList = new string[] { "ATM", "DATM", "TA", "WM" }; - public const string CAN_COMMENT_CONFIDENTIAL = "ATM,DATM,TA,WM"; - public static readonly string[] CAN_EMAIL_LOG_LIST = new string[] + public const string CanCommentConfidential = "ATM,DATM,TA,WM"; + + public static readonly string[] CanEmailLogList = new string[] { "ATM", "DATM", @@ -115,9 +124,10 @@ public class Constants "WM", "AWM" }; - public const string CAN_EMAIL_LOG = "ATM,DATM,TA,WM,AWM"; - public static readonly string[] CAN_EVENTS_LIST = new string[] + public const string CanEmailLog = "ATM,DATM,TA,WM,AWM"; + + public static readonly string[] CanEventsList = new string[] { "ATM", "DATM", @@ -126,9 +136,10 @@ public class Constants "EC", "AEC" }; - public const string CAN_EVENTS = "ATM,DATM,TA,WM,EC,AEC"; - public static readonly string[] CAN_FAQ_LIST = new string[] + public const string CanEvents = "ATM,DATM,TA,WM,EC,AEC"; + + public static readonly string[] CanFaqList = new string[] { "ATM", "DATM", @@ -141,9 +152,10 @@ public class Constants "FE", "AFE" }; - public const string CAN_FAQ = "ATM,DATM,TA,ATA,WM,AWM,EC,AEC,FE,AFE"; - public static readonly string[] CAN_EMAIL_LOGS_LIST = new string[] + public const string CanFaq = "ATM,DATM,TA,ATA,WM,AWM,EC,AEC,FE,AFE"; + + public static readonly string[] CanEmailLogsList = new string[] { "ATM", "DATM", @@ -151,9 +163,10 @@ public class Constants "WM", "AWM" }; - public const string CAN_EMAIL_LOGS = "ATM,DATM,TA,WM,AWM"; - public static readonly string[] CAN_FEEDBACK_LIST = new string[] + public const string CanEmailLogs = "ATM,DATM,TA,WM,AWM"; + + public static readonly string[] CanFeedbackList = new string[] { "ATM", "DATM", @@ -162,9 +175,10 @@ public class Constants "WM", "INS" }; - public const string CAN_FEEDBACK = "ATM,DATM,TA,ATA,WM,INS"; - public static readonly string[] CAN_FILES_LIST = new string[] + public const string CanFeedback = "ATM,DATM,TA,ATA,WM,INS"; + + public static readonly string[] CanFilesList = new string[] { "ATM", "DATM", @@ -173,9 +187,10 @@ public class Constants "FE", "AFE" }; - public const string CAN_FILES = "ATM,DATM,TA,WM,FE,AFE"; - public static readonly string[] CAN_ANNOUNCEMENT_LIST = new string[] + public const string CanFiles = "ATM,DATM,TA,WM,FE,AFE"; + + public static readonly string[] CanAnnouncementList = new string[] { "ATM", "DATM", @@ -184,9 +199,10 @@ public class Constants "EC", "FE" }; - public const string CAN_ANNOUNCEMENT = "ATM,DATM,TA,WM,EC,FE"; - public static readonly string[] CAN_OTS_LIST = new string[] + public const string CanAnnouncement = "ATM,DATM,TA,WM,EC,FE"; + + public static readonly string[] CanOtsList = new string[] { "ATM", "DATM", @@ -196,5 +212,6 @@ public class Constants "AWM", "INS" }; - public const string CAN_OTS = "ATM,DATM,TA,ATA,WM,AWM,INS"; -} + + public const string CanOts = "ATM,DATM,TA,ATA,WM,AWM,INS"; +} \ No newline at end of file diff --git a/Memphis.Shared/Utils/Helpers.cs b/Memphis.Shared/Utils/Helpers.cs index e81b995..dfc0812 100644 --- a/Memphis.Shared/Utils/Helpers.cs +++ b/Memphis.Shared/Utils/Helpers.cs @@ -25,4 +25,4 @@ public static string GetRatingName(Rating rating) _ => "Unknown", }; } -} +} \ No newline at end of file diff --git a/Memphis.Shared/Utils/Response.cs b/Memphis.Shared/Utils/Response.cs index 0f1b7fe..34914ff 100644 --- a/Memphis.Shared/Utils/Response.cs +++ b/Memphis.Shared/Utils/Response.cs @@ -14,4 +14,4 @@ public class ResponsePaging public int TotalCount { get; set; } public required string Message { get; set; } public T? Data { get; set; } -} +} \ No newline at end of file