From d1b6bc84fac3bf65af6f4cac8a97458851991da5 Mon Sep 17 00:00:00 2001 From: Unai Zorrilla Castro Date: Tue, 15 May 2018 12:42:08 +0200 Subject: [PATCH 01/33] Migrated projects and references to use 2.1 rc1 libraries --- global.json | 10 +++---- src/ApiGateways/ApiGw-Base/OcelotApiGw.csproj | 7 ++--- .../Mobile.Shopping.HttpAggregator.csproj | 10 ++----- .../Web.Bff.Shopping/aggregator/Startup.cs | 2 +- .../Web.Shopping.HttpAggregator.csproj | 13 ++++----- .../EventBus/EventBus/EventBus.csproj | 2 +- .../EventBusRabbitMQ/EventBusRabbitMQ.csproj | 10 +++---- .../EventBusServiceBus.csproj | 6 ++-- .../IntegrationEventLogEF.csproj | 18 ++++-------- .../Microsoft.AspNetCore.HealthChecks.csproj | 2 +- ...xtensions.HealthChecks.AzureStorage.csproj | 4 +-- ...t.Extensions.HealthChecks.SqlServer.csproj | 2 +- .../Microsoft.Extensions.HealthChecks.csproj | 6 ++-- .../Resilience.Http/Resilience.Http.csproj | 8 +++--- .../Resilience.Http/ResilientHttpClient.cs | 12 ++++---- .../WebHost.Customization.csproj | 8 +++--- .../Basket/Basket.API/Basket.API.csproj | 14 ++++++---- .../Catalog/Catalog.API/Catalog.API.csproj | 17 +++++------ .../Identity/Identity.API/Identity.API.csproj | 23 ++++++--------- .../Locations.API/Locations.API.csproj | 18 ++++++------ .../Marketing.API/Marketing.API.csproj | 16 +++++------ .../Ordering/Ordering.API/Ordering.API.csproj | 26 ++++++++--------- .../Ordering.BackgroundTasks.csproj | 10 ++----- .../Ordering.BackgroundTasks/Startup.cs | 2 +- .../Ordering.Infrastructure.csproj | 6 ++-- .../Ordering.SignalrHub/NotificationHub.cs | 4 +-- .../Ordering.SignalrHub.csproj | 17 +++++++---- .../Ordering/Ordering.SignalrHub/Startup.cs | 2 +- .../Payment/Payment.API/Payment.API.csproj | 14 ++++------ .../ResilientHttpClientFactory.cs | 2 +- src/Web/WebMVC/Startup.cs | 1 - src/Web/WebMVC/WebMVC.csproj | 19 +++++-------- src/Web/WebSPA/WebSPA.csproj | 28 +++++++++---------- src/Web/WebStatus/Startup.cs | 1 - src/Web/WebStatus/WebStatus.csproj | 15 +++++----- .../FunctionalTests/FunctionalTests.csproj | 7 ++--- .../IntegrationTests/IntegrationTests.csproj | 10 +++---- test/Services/UnitTest/UnitTest.csproj | 8 +++--- 38 files changed, 170 insertions(+), 210 deletions(-) diff --git a/global.json b/global.json index 00b3f36f2..97e2836a2 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ -{ - "sdk": { - "version": "2.1.4" - } -} \ No newline at end of file +// { +// "sdk": { +// "version": "2.1.4" +// } +// } \ No newline at end of file diff --git a/src/ApiGateways/ApiGw-Base/OcelotApiGw.csproj b/src/ApiGateways/ApiGw-Base/OcelotApiGw.csproj index d72d014b4..d3b1a049b 100644 --- a/src/ApiGateways/ApiGw-Base/OcelotApiGw.csproj +++ b/src/ApiGateways/ApiGw-Base/OcelotApiGw.csproj @@ -1,7 +1,7 @@ - + - netcoreapp2.0 + netcoreapp2.1 @@ -9,8 +9,7 @@ - + - diff --git a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj index bd6d73950..90bd68cda 100644 --- a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj +++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj @@ -1,7 +1,7 @@ - + - netcoreapp2.0 + netcoreapp2.1 Mobile.Shopping.HttpAggregator Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator ..\..\..\docker-compose.dcproj @@ -12,14 +12,10 @@ - + - - - - diff --git a/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs index 17f9f90e6..f303d843d 100644 --- a/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs +++ b/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs @@ -129,7 +129,7 @@ namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator app.UseSwagger().UseSwaggerUI(c => { c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Purchase BFF V1"); - c.ConfigureOAuth2("Microsoft.eShopOnContainers.Web.Shopping.HttpAggregatorwaggerui", "", "", "Purchase BFF Swagger UI"); + //c.ConfigureOAuth2("Microsoft.eShopOnContainers.Web.Shopping.HttpAggregatorwaggerui", "", "", "Purchase BFF Swagger UI"); }); diff --git a/src/ApiGateways/Web.Bff.Shopping/aggregator/Web.Shopping.HttpAggregator.csproj b/src/ApiGateways/Web.Bff.Shopping/aggregator/Web.Shopping.HttpAggregator.csproj index 0b6dbf44b..1e7a1f38c 100644 --- a/src/ApiGateways/Web.Bff.Shopping/aggregator/Web.Shopping.HttpAggregator.csproj +++ b/src/ApiGateways/Web.Bff.Shopping/aggregator/Web.Shopping.HttpAggregator.csproj @@ -1,7 +1,7 @@ - + - netcoreapp2.0 + netcoreapp2.1 Web.Shopping.HttpAggregator Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator ..\..\..\docker-compose.dcproj @@ -12,12 +12,9 @@ - - - - - - + + + diff --git a/src/BuildingBlocks/EventBus/EventBus/EventBus.csproj b/src/BuildingBlocks/EventBus/EventBus/EventBus.csproj index b219dcfa1..9704f6ff5 100644 --- a/src/BuildingBlocks/EventBus/EventBus/EventBus.csproj +++ b/src/BuildingBlocks/EventBus/EventBus/EventBus.csproj @@ -6,7 +6,7 @@ - + \ No newline at end of file diff --git a/src/BuildingBlocks/EventBus/EventBusRabbitMQ/EventBusRabbitMQ.csproj b/src/BuildingBlocks/EventBus/EventBusRabbitMQ/EventBusRabbitMQ.csproj index d6c9fc8e2..ab5285c89 100644 --- a/src/BuildingBlocks/EventBus/EventBusRabbitMQ/EventBusRabbitMQ.csproj +++ b/src/BuildingBlocks/EventBus/EventBusRabbitMQ/EventBusRabbitMQ.csproj @@ -7,12 +7,12 @@ - - - - + + + + - + diff --git a/src/BuildingBlocks/EventBus/EventBusServiceBus/EventBusServiceBus.csproj b/src/BuildingBlocks/EventBus/EventBusServiceBus/EventBusServiceBus.csproj index 8e76a02db..facceac2a 100644 --- a/src/BuildingBlocks/EventBus/EventBusServiceBus/EventBusServiceBus.csproj +++ b/src/BuildingBlocks/EventBus/EventBusServiceBus/EventBusServiceBus.csproj @@ -7,9 +7,9 @@ - - - + + + diff --git a/src/BuildingBlocks/EventBus/IntegrationEventLogEF/IntegrationEventLogEF.csproj b/src/BuildingBlocks/EventBus/IntegrationEventLogEF/IntegrationEventLogEF.csproj index d4f380a14..685cd2735 100644 --- a/src/BuildingBlocks/EventBus/IntegrationEventLogEF/IntegrationEventLogEF.csproj +++ b/src/BuildingBlocks/EventBus/IntegrationEventLogEF/IntegrationEventLogEF.csproj @@ -6,18 +6,12 @@ - - - - - - - - - - - - + + + + + + diff --git a/src/BuildingBlocks/HealthChecks/src/Microsoft.AspNetCore.HealthChecks/Microsoft.AspNetCore.HealthChecks.csproj b/src/BuildingBlocks/HealthChecks/src/Microsoft.AspNetCore.HealthChecks/Microsoft.AspNetCore.HealthChecks.csproj index 5018e198c..1abd12278 100644 --- a/src/BuildingBlocks/HealthChecks/src/Microsoft.AspNetCore.HealthChecks/Microsoft.AspNetCore.HealthChecks.csproj +++ b/src/BuildingBlocks/HealthChecks/src/Microsoft.AspNetCore.HealthChecks/Microsoft.AspNetCore.HealthChecks.csproj @@ -13,7 +13,7 @@ - + \ No newline at end of file diff --git a/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.AzureStorage/Microsoft.Extensions.HealthChecks.AzureStorage.csproj b/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.AzureStorage/Microsoft.Extensions.HealthChecks.AzureStorage.csproj index 007f66f65..dc498e8c1 100644 --- a/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.AzureStorage/Microsoft.Extensions.HealthChecks.AzureStorage.csproj +++ b/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.AzureStorage/Microsoft.Extensions.HealthChecks.AzureStorage.csproj @@ -16,10 +16,10 @@ - + - + diff --git a/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.SqlServer/Microsoft.Extensions.HealthChecks.SqlServer.csproj b/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.SqlServer/Microsoft.Extensions.HealthChecks.SqlServer.csproj index 0aef3c907..17fb3f68d 100644 --- a/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.SqlServer/Microsoft.Extensions.HealthChecks.SqlServer.csproj +++ b/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.SqlServer/Microsoft.Extensions.HealthChecks.SqlServer.csproj @@ -9,7 +9,7 @@ - + diff --git a/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/Microsoft.Extensions.HealthChecks.csproj b/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/Microsoft.Extensions.HealthChecks.csproj index 6c102c33d..2de3689ba 100644 --- a/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/Microsoft.Extensions.HealthChecks.csproj +++ b/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/Microsoft.Extensions.HealthChecks.csproj @@ -9,12 +9,12 @@ - - + + - + diff --git a/src/BuildingBlocks/Resilience/Resilience.Http/Resilience.Http.csproj b/src/BuildingBlocks/Resilience/Resilience.Http/Resilience.Http.csproj index 276c1a23f..4f22ad943 100644 --- a/src/BuildingBlocks/Resilience/Resilience.Http/Resilience.Http.csproj +++ b/src/BuildingBlocks/Resilience/Resilience.Http/Resilience.Http.csproj @@ -6,10 +6,10 @@ - - - - + + + + \ No newline at end of file diff --git a/src/BuildingBlocks/Resilience/Resilience.Http/ResilientHttpClient.cs b/src/BuildingBlocks/Resilience/Resilience.Http/ResilientHttpClient.cs index 9fa38ee8d..aaa709e79 100644 --- a/src/BuildingBlocks/Resilience/Resilience.Http/ResilientHttpClient.cs +++ b/src/BuildingBlocks/Resilience/Resilience.Http/ResilientHttpClient.cs @@ -51,7 +51,7 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http { var origin = GetOriginFromUri(uri); - return HttpInvoker(origin, async () => + return HttpInvoker(origin, async (_) => { var requestMessage = new HttpRequestMessage(HttpMethod.Delete, uri); @@ -75,8 +75,8 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http public Task GetStringAsync(string uri, string authorizationToken = null, string authorizationMethod = "Bearer") { var origin = GetOriginFromUri(uri); - - return HttpInvoker(origin, async () => + + return HttpInvoker(origin, async (_) => { var requestMessage = new HttpRequestMessage(HttpMethod.Get, uri); @@ -117,7 +117,7 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http // as it is disposed after each call var origin = GetOriginFromUri(uri); - return HttpInvoker(origin, async () => + return HttpInvoker(origin, async (_) => { var requestMessage = new HttpRequestMessage(method, uri); @@ -149,7 +149,7 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http }); } - private async Task HttpInvoker(string origin, Func> action) + private async Task HttpInvoker(string origin, Func> action) { var normalizedOrigin = NormalizeOrigin(origin); @@ -161,7 +161,7 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http // Executes the action applying all // the policies defined in the wrapper - return await policyWrap.ExecuteAsync(action, new Context(normalizedOrigin)); + return await policyWrap.ExecuteAsync(action, new Context(normalizedOrigin)); } diff --git a/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Customization.csproj b/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Customization.csproj index 6a6632379..487fd7dc4 100644 --- a/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Customization.csproj +++ b/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Customization.csproj @@ -1,12 +1,12 @@ - + - netcoreapp2.0 + netcoreapp2.1 - - + + diff --git a/src/Services/Basket/Basket.API/Basket.API.csproj b/src/Services/Basket/Basket.API/Basket.API.csproj index 3bc5cee4c..4efca69c1 100644 --- a/src/Services/Basket/Basket.API/Basket.API.csproj +++ b/src/Services/Basket/Basket.API/Basket.API.csproj @@ -1,7 +1,7 @@  - netcoreapp2.0 + netcoreapp2.1 $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; ..\..\..\..\docker-compose.dcproj @@ -14,12 +14,14 @@ - - - - + + + + - + + + diff --git a/src/Services/Catalog/Catalog.API/Catalog.API.csproj b/src/Services/Catalog/Catalog.API/Catalog.API.csproj index ad36cf3b7..c50c32ad0 100644 --- a/src/Services/Catalog/Catalog.API/Catalog.API.csproj +++ b/src/Services/Catalog/Catalog.API/Catalog.API.csproj @@ -1,7 +1,7 @@  - netcoreapp2.0 + netcoreapp2.1 portable true Catalog.API @@ -36,18 +36,15 @@ - - - - - + + + + + + - - - - diff --git a/src/Services/Identity/Identity.API/Identity.API.csproj b/src/Services/Identity/Identity.API/Identity.API.csproj index 84a87a231..f531e418a 100644 --- a/src/Services/Identity/Identity.API/Identity.API.csproj +++ b/src/Services/Identity/Identity.API/Identity.API.csproj @@ -1,8 +1,7 @@  - netcoreapp2.0 - 2.0.0 + netcoreapp2.1 aspnet-eShopOnContainers.Identity-90487118-103c-4ff0-b9da-e5e26f7ab0c5 ..\..\..\..\docker-compose.dcproj @@ -16,14 +15,15 @@ - - - - + + + + + - - + + @@ -31,13 +31,6 @@ - - - - - - - diff --git a/src/Services/Location/Locations.API/Locations.API.csproj b/src/Services/Location/Locations.API/Locations.API.csproj index aef0fe9e9..5ec30d526 100644 --- a/src/Services/Location/Locations.API/Locations.API.csproj +++ b/src/Services/Location/Locations.API/Locations.API.csproj @@ -1,26 +1,24 @@  - netcoreapp2.0 + netcoreapp2.1 ..\..\..\..\docker-compose.dcproj aspnet-Locations.API-20161122013619 - - - - + + + + + - - - - - + + diff --git a/src/Services/Marketing/Marketing.API/Marketing.API.csproj b/src/Services/Marketing/Marketing.API/Marketing.API.csproj index 36da8fceb..5573370f2 100644 --- a/src/Services/Marketing/Marketing.API/Marketing.API.csproj +++ b/src/Services/Marketing/Marketing.API/Marketing.API.csproj @@ -1,7 +1,7 @@  - netcoreapp2.0 + netcoreapp2.1 ..\..\..\..\docker-compose.dcproj Microsoft.eShopOnContainers.Services.Marketing.API $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; @@ -22,18 +22,16 @@ - - - - + + + + + - - - - + diff --git a/src/Services/Ordering/Ordering.API/Ordering.API.csproj b/src/Services/Ordering/Ordering.API/Ordering.API.csproj index c95cff6e1..f48b34a92 100644 --- a/src/Services/Ordering/Ordering.API/Ordering.API.csproj +++ b/src/Services/Ordering/Ordering.API/Ordering.API.csproj @@ -1,7 +1,7 @@  - netcoreapp2.0 + netcoreapp2.1 aspnet-Ordering.API-20161122013547 $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; ..\..\..\..\docker-compose.dcproj @@ -31,25 +31,21 @@ - + - - - - - - + + + + + + + - - + + - - - - - PreserveNewest diff --git a/src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj b/src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj index f2a7ad465..9f832bdfd 100644 --- a/src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj +++ b/src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj @@ -1,7 +1,7 @@ - + - netcoreapp2.0 + netcoreapp2.1 $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; ..\..\..\..\docker-compose.dcproj @@ -13,11 +13,7 @@ - - - - - + diff --git a/src/Services/Ordering/Ordering.BackgroundTasks/Startup.cs b/src/Services/Ordering/Ordering.BackgroundTasks/Startup.cs index bb7ae0902..2bc085dbf 100644 --- a/src/Services/Ordering/Ordering.BackgroundTasks/Startup.cs +++ b/src/Services/Ordering/Ordering.BackgroundTasks/Startup.cs @@ -110,7 +110,7 @@ namespace Ordering.BackgroundTasks // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IHostingEnvironment env) + public void Configure(IApplicationBuilder app, Microsoft.AspNetCore.Hosting.IHostingEnvironment env) { #pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously diff --git a/src/Services/Ordering/Ordering.Infrastructure/Ordering.Infrastructure.csproj b/src/Services/Ordering/Ordering.Infrastructure/Ordering.Infrastructure.csproj index e4731db13..af536efbf 100644 --- a/src/Services/Ordering/Ordering.Infrastructure/Ordering.Infrastructure.csproj +++ b/src/Services/Ordering/Ordering.Infrastructure/Ordering.Infrastructure.csproj @@ -9,9 +9,9 @@ - - - + + + diff --git a/src/Services/Ordering/Ordering.SignalrHub/NotificationHub.cs b/src/Services/Ordering/Ordering.SignalrHub/NotificationHub.cs index 8a4c1c90f..5fd6f3eb9 100644 --- a/src/Services/Ordering/Ordering.SignalrHub/NotificationHub.cs +++ b/src/Services/Ordering/Ordering.SignalrHub/NotificationHub.cs @@ -13,13 +13,13 @@ namespace Ordering.SignalrHub public override async Task OnConnectedAsync() { - await Groups.AddAsync(Context.ConnectionId, Context.User.Identity.Name); + await Groups.AddToGroupAsync(Context.ConnectionId, Context.User.Identity.Name); await base.OnConnectedAsync(); } public override async Task OnDisconnectedAsync(Exception ex) { - await Groups.RemoveAsync(Context.ConnectionId, Context.User.Identity.Name); + await Groups.AddToGroupAsync(Context.ConnectionId, Context.User.Identity.Name); await base.OnDisconnectedAsync(ex); } } diff --git a/src/Services/Ordering/Ordering.SignalrHub/Ordering.SignalrHub.csproj b/src/Services/Ordering/Ordering.SignalrHub/Ordering.SignalrHub.csproj index 8b8aa5832..fa27ad55a 100644 --- a/src/Services/Ordering/Ordering.SignalrHub/Ordering.SignalrHub.csproj +++ b/src/Services/Ordering/Ordering.SignalrHub/Ordering.SignalrHub.csproj @@ -1,7 +1,7 @@ - + - netcoreapp2.0 + netcoreapp2.1 ..\..\..\..\docker-compose.dcproj @@ -11,10 +11,15 @@ - - - - + + + + + + + + + diff --git a/src/Services/Ordering/Ordering.SignalrHub/Startup.cs b/src/Services/Ordering/Ordering.SignalrHub/Startup.cs index b2bc2346a..927bb6d74 100644 --- a/src/Services/Ordering/Ordering.SignalrHub/Startup.cs +++ b/src/Services/Ordering/Ordering.SignalrHub/Startup.cs @@ -134,7 +134,7 @@ namespace Ordering.SignalrHub app.UseSignalR(routes => { routes.MapHub("/notificationhub", options => - options.Transports = Microsoft.AspNetCore.Http.Connections.TransportType.All); + options.Transports = Microsoft.AspNetCore.Http.Connections.HttpTransportType.WebSockets); }); ConfigureEventBus(app); diff --git a/src/Services/Payment/Payment.API/Payment.API.csproj b/src/Services/Payment/Payment.API/Payment.API.csproj index 278dcc6cb..7c4868139 100644 --- a/src/Services/Payment/Payment.API/Payment.API.csproj +++ b/src/Services/Payment/Payment.API/Payment.API.csproj @@ -1,7 +1,7 @@  - netcoreapp2.0 + netcoreapp2.1 ..\..\..\..\docker-compose.dcproj $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; @@ -9,13 +9,11 @@ - - - - - - - + + + + + diff --git a/src/Web/WebMVC/Infrastructure/ResilientHttpClientFactory.cs b/src/Web/WebMVC/Infrastructure/ResilientHttpClientFactory.cs index 43eac7b30..783dae631 100644 --- a/src/Web/WebMVC/Infrastructure/ResilientHttpClientFactory.cs +++ b/src/Web/WebMVC/Infrastructure/ResilientHttpClientFactory.cs @@ -40,7 +40,7 @@ namespace Microsoft.eShopOnContainers.WebMVC.Infrastructure { var msg = $"Retry {retryCount} implemented with Polly's RetryPolicy " + $"of {context.PolicyKey} " + - $"at {context.ExecutionKey}, " + + $"at {context.OperationKey}, " + $"due to: {exception}."; _logger.LogWarning(msg); _logger.LogDebug(msg); diff --git a/src/Web/WebMVC/Startup.cs b/src/Web/WebMVC/Startup.cs index a83bfa644..6d26e5790 100644 --- a/src/Web/WebMVC/Startup.cs +++ b/src/Web/WebMVC/Startup.cs @@ -148,7 +148,6 @@ namespace Microsoft.eShopOnContainers.WebMVC if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); - app.UseBrowserLink(); } else { diff --git a/src/Web/WebMVC/WebMVC.csproj b/src/Web/WebMVC/WebMVC.csproj index 0160c9132..2c102e98f 100644 --- a/src/Web/WebMVC/WebMVC.csproj +++ b/src/Web/WebMVC/WebMVC.csproj @@ -1,7 +1,7 @@  - netcoreapp2.0 + netcoreapp2.1 aspnet-Microsoft.eShopOnContainers-946ae052-8305-4a99-965b-ec8636ddbae3 ..\..\..\docker-compose.dcproj @@ -20,11 +20,12 @@ - - - - - + + + + + + @@ -33,12 +34,6 @@ - - - - - - diff --git a/src/Web/WebSPA/WebSPA.csproj b/src/Web/WebSPA/WebSPA.csproj index f34177d65..99f228ec4 100644 --- a/src/Web/WebSPA/WebSPA.csproj +++ b/src/Web/WebSPA/WebSPA.csproj @@ -1,7 +1,7 @@  - netcoreapp2.0 + netcoreapp2.1 aspnetcorespa-c23d27a4-eb88-4b18-9b77-2a93f3b15119 ..\..\..\docker-compose.dcproj false @@ -85,12 +85,13 @@ - - - - - - + + + + + + + @@ -103,11 +104,6 @@ - - - - - - + @@ -187,6 +183,10 @@ - + + + + + diff --git a/src/Web/WebStatus/Startup.cs b/src/Web/WebStatus/Startup.cs index a4900db30..6a9ed32d1 100644 --- a/src/Web/WebStatus/Startup.cs +++ b/src/Web/WebStatus/Startup.cs @@ -62,7 +62,6 @@ namespace WebStatus if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); - app.UseBrowserLink(); } else { diff --git a/src/Web/WebStatus/WebStatus.csproj b/src/Web/WebStatus/WebStatus.csproj index e31928fe2..d95a60a9b 100644 --- a/src/Web/WebStatus/WebStatus.csproj +++ b/src/Web/WebStatus/WebStatus.csproj @@ -1,19 +1,18 @@  - netcoreapp2.0 + netcoreapp2.1 $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; ..\..\..\docker-compose.dcproj - - - - - - - + + + + + + diff --git a/test/Services/FunctionalTests/FunctionalTests.csproj b/test/Services/FunctionalTests/FunctionalTests.csproj index 96ed1510f..afc1bf422 100644 --- a/test/Services/FunctionalTests/FunctionalTests.csproj +++ b/test/Services/FunctionalTests/FunctionalTests.csproj @@ -1,9 +1,8 @@  - netcoreapp2.0 + netcoreapp2.1 true - false false false @@ -44,8 +43,8 @@ - - + + diff --git a/test/Services/IntegrationTests/IntegrationTests.csproj b/test/Services/IntegrationTests/IntegrationTests.csproj index bf176495a..6bc8221b6 100644 --- a/test/Services/IntegrationTests/IntegrationTests.csproj +++ b/test/Services/IntegrationTests/IntegrationTests.csproj @@ -1,7 +1,7 @@  - netcoreapp2.0 + netcoreapp2.1 IntegrationTests IntegrationTests true @@ -44,13 +44,13 @@ - - + + - + - + diff --git a/test/Services/UnitTest/UnitTest.csproj b/test/Services/UnitTest/UnitTest.csproj index ebc17095f..b8688052c 100644 --- a/test/Services/UnitTest/UnitTest.csproj +++ b/test/Services/UnitTest/UnitTest.csproj @@ -1,7 +1,7 @@  - netcoreapp2.0 + netcoreapp2.1 true $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; false @@ -21,12 +21,12 @@ - + - + - + From b02c1b825dcc83fa31371860028edd5fcc288e05 Mon Sep 17 00:00:00 2001 From: Unai Zorrilla Castro Date: Tue, 15 May 2018 16:27:10 +0200 Subject: [PATCH 02/33] Migrate all dockerfiles to use 2.1 image. Added ApiBehaviorOptions into Catalog --- src/ApiGateways/ApiGw-Base/Dockerfile | 4 +- .../Mobile.Bff.Shopping/aggregator/Dockerfile | 4 +- .../Web.Bff.Shopping/aggregator/Dockerfile | 4 +- src/Services/Basket/Basket.API/Dockerfile | 4 +- .../Controllers/CatalogController.cs | 3 +- .../Catalog.API/Controllers/PicController.cs | 2 +- src/Services/Catalog/Catalog.API/Dockerfile | 4 +- src/Services/Catalog/Catalog.API/Startup.cs | 304 ++++++++++-------- src/Services/Identity/Identity.API/Dockerfile | 4 +- .../Location/Locations.API/Dockerfile | 4 +- .../Marketing/Marketing.API/Dockerfile | 4 +- src/Services/Ordering/Ordering.API/Dockerfile | 4 +- .../Ordering.BackgroundTasks/Dockerfile | 4 +- .../Ordering/Ordering.SignalrHub/Dockerfile | 4 +- src/Services/Payment/Payment.API/Dockerfile | 4 +- src/Web/WebMVC/Dockerfile | 4 +- src/Web/WebSPA/Dockerfile | 4 +- src/Web/WebStatus/Dockerfile | 4 +- 18 files changed, 211 insertions(+), 158 deletions(-) diff --git a/src/ApiGateways/ApiGw-Base/Dockerfile b/src/ApiGateways/ApiGw-Base/Dockerfile index 7f0cf43a6..7fdd5f073 100644 --- a/src/ApiGateways/ApiGw-Base/Dockerfile +++ b/src/ApiGateways/ApiGw-Base/Dockerfile @@ -1,8 +1,8 @@ -FROM microsoft/aspnetcore:2.0 AS base +FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 -FROM microsoft/aspnetcore-build:2.0 AS build +FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY src/ApiGateways/ApiGw-Base/OcelotApiGw.csproj src/ApiGateways/ApiGw-Base/ RUN dotnet restore src/ApiGateways/ApiGw-Base/ diff --git a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Dockerfile b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Dockerfile index 273743cee..6acdac235 100644 --- a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Dockerfile +++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Dockerfile @@ -1,8 +1,8 @@ -FROM microsoft/aspnetcore:2.0.5 AS base +FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 -FROM microsoft/aspnetcore-build:2.0 AS build +FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY . . RUN dotnet restore -nowarn:msb3202,nu1503 diff --git a/src/ApiGateways/Web.Bff.Shopping/aggregator/Dockerfile b/src/ApiGateways/Web.Bff.Shopping/aggregator/Dockerfile index ce6f1b155..96772801a 100644 --- a/src/ApiGateways/Web.Bff.Shopping/aggregator/Dockerfile +++ b/src/ApiGateways/Web.Bff.Shopping/aggregator/Dockerfile @@ -1,8 +1,8 @@ -FROM microsoft/aspnetcore:2.0.5 AS base +FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 -FROM microsoft/aspnetcore-build:2.0 AS build +FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY . . RUN dotnet restore -nowarn:msb3202,nu1503 diff --git a/src/Services/Basket/Basket.API/Dockerfile b/src/Services/Basket/Basket.API/Dockerfile index 03a967a72..21a86a5ed 100644 --- a/src/Services/Basket/Basket.API/Dockerfile +++ b/src/Services/Basket/Basket.API/Dockerfile @@ -1,8 +1,8 @@ -FROM microsoft/aspnetcore:2.0.5 AS base +FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 -FROM microsoft/aspnetcore-build:2.0.5-2.1.4 AS build +FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY . . RUN dotnet restore -nowarn:msb3202,nu1503 diff --git a/src/Services/Catalog/Catalog.API/Controllers/CatalogController.cs b/src/Services/Catalog/Catalog.API/Controllers/CatalogController.cs index 71f700762..20d1b1215 100644 --- a/src/Services/Catalog/Catalog.API/Controllers/CatalogController.cs +++ b/src/Services/Catalog/Catalog.API/Controllers/CatalogController.cs @@ -15,6 +15,7 @@ using System.Threading.Tasks; namespace Microsoft.eShopOnContainers.Services.Catalog.API.Controllers { [Route("api/v1/[controller]")] + [ApiController] public class CatalogController : ControllerBase { private readonly CatalogContext _catalogContext; @@ -25,8 +26,8 @@ namespace Microsoft.eShopOnContainers.Services.Catalog.API.Controllers { _catalogContext = context ?? throw new ArgumentNullException(nameof(context)); _catalogIntegrationEventService = catalogIntegrationEventService ?? throw new ArgumentNullException(nameof(catalogIntegrationEventService)); - _settings = settings.Value; + ((DbContext)context).ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; } diff --git a/src/Services/Catalog/Catalog.API/Controllers/PicController.cs b/src/Services/Catalog/Catalog.API/Controllers/PicController.cs index f8e986e50..c7af86eed 100644 --- a/src/Services/Catalog/Catalog.API/Controllers/PicController.cs +++ b/src/Services/Catalog/Catalog.API/Controllers/PicController.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; // For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860 namespace Microsoft.eShopOnContainers.Services.Catalog.API.Controllers -{ +{ public class PicController : Controller { private readonly IHostingEnvironment _env; diff --git a/src/Services/Catalog/Catalog.API/Dockerfile b/src/Services/Catalog/Catalog.API/Dockerfile index a1279db8c..f7a13f611 100644 --- a/src/Services/Catalog/Catalog.API/Dockerfile +++ b/src/Services/Catalog/Catalog.API/Dockerfile @@ -1,8 +1,8 @@ -FROM microsoft/aspnetcore:2.0.5 AS base +FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 -FROM microsoft/aspnetcore-build:2.0.5-2.1.4 AS build +FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY . . RUN dotnet restore -nowarn:msb3202,nu1503 diff --git a/src/Services/Catalog/Catalog.API/Startup.cs b/src/Services/Catalog/Catalog.API/Startup.cs index 5eec48959..a6c17995b 100644 --- a/src/Services/Catalog/Catalog.API/Startup.cs +++ b/src/Services/Catalog/Catalog.API/Startup.cs @@ -1,35 +1,37 @@ -namespace Microsoft.eShopOnContainers.Services.Catalog.API +using Autofac; +using Autofac.Extensions.DependencyInjection; +using global::Catalog.API.Infrastructure.Filters; +using global::Catalog.API.IntegrationEvents; +using Microsoft.ApplicationInsights.Extensibility; +using Microsoft.ApplicationInsights.ServiceFabric; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Azure.ServiceBus; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.eShopOnContainers.BuildingBlocks.EventBus; +using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions; +using Microsoft.eShopOnContainers.BuildingBlocks.EventBusRabbitMQ; +using Microsoft.eShopOnContainers.BuildingBlocks.EventBusServiceBus; +using Microsoft.eShopOnContainers.BuildingBlocks.IntegrationEventLogEF; +using Microsoft.eShopOnContainers.BuildingBlocks.IntegrationEventLogEF.Services; +using Microsoft.eShopOnContainers.Services.Catalog.API.Infrastructure; +using Microsoft.eShopOnContainers.Services.Catalog.API.IntegrationEvents.EventHandling; +using Microsoft.eShopOnContainers.Services.Catalog.API.IntegrationEvents.Events; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.HealthChecks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using RabbitMQ.Client; +using System; +using System.Data.Common; +using System.Reflection; + +namespace Microsoft.eShopOnContainers.Services.Catalog.API { - using Autofac; - using Autofac.Extensions.DependencyInjection; - using global::Catalog.API.Infrastructure.Filters; - using global::Catalog.API.IntegrationEvents; - using Microsoft.ApplicationInsights.Extensibility; - using Microsoft.ApplicationInsights.ServiceFabric; - using Microsoft.AspNetCore.Builder; - using Microsoft.AspNetCore.Hosting; - using Microsoft.Azure.ServiceBus; - using Microsoft.EntityFrameworkCore; - using Microsoft.EntityFrameworkCore.Diagnostics; - using Microsoft.eShopOnContainers.BuildingBlocks.EventBus; - using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions; - using Microsoft.eShopOnContainers.BuildingBlocks.EventBusRabbitMQ; - using Microsoft.eShopOnContainers.BuildingBlocks.EventBusServiceBus; - using Microsoft.eShopOnContainers.BuildingBlocks.IntegrationEventLogEF; - using Microsoft.eShopOnContainers.BuildingBlocks.IntegrationEventLogEF.Services; - using Microsoft.eShopOnContainers.Services.Catalog.API.Infrastructure; - using Microsoft.eShopOnContainers.Services.Catalog.API.IntegrationEvents.EventHandling; - using Microsoft.eShopOnContainers.Services.Catalog.API.IntegrationEvents.Events; - using Microsoft.Extensions.Configuration; - using Microsoft.Extensions.DependencyInjection; - using Microsoft.Extensions.HealthChecks; - using Microsoft.Extensions.Logging; - using Microsoft.Extensions.Options; - using RabbitMQ.Client; - using System; - using System.Data.Common; - using System.Reflection; - public class Startup { public Startup(IConfiguration configuration) @@ -41,21 +43,94 @@ public IServiceProvider ConfigureServices(IServiceCollection services) { - // Add framework services. + services.AddAppInsight(Configuration) + .AddCustomMVC(Configuration) + .AddCustomDbContext(Configuration) + .AddCustomOptions(Configuration) + .AddEventBus(Configuration) + .AddSwagger(); + + var container = new ContainerBuilder(); + container.Populate(services); + return new AutofacServiceProvider(container.Build()); + + } + + public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) + { + //Configure logs + + loggerFactory.AddAzureWebAppDiagnostics(); + loggerFactory.AddApplicationInsights(app.ApplicationServices, LogLevel.Trace); + + var pathBase = Configuration["PATH_BASE"]; + + if (!string.IsNullOrEmpty(pathBase)) + { + loggerFactory.CreateLogger("init").LogDebug($"Using PATH BASE '{pathBase}'"); + app.UsePathBase(pathBase); + } + +#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously + app.Map("/liveness", lapp => lapp.Run(async ctx => ctx.Response.StatusCode = 200)); +#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously + + app.UseCors("CorsPolicy"); + + app.UseMvcWithDefaultRoute(); - RegisterAppInsights(services); + app.UseSwagger() + .UseSwaggerUI(c => + { + c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Catalog.API V1"); + }); + + ConfigureEventBus(app); + } + protected virtual void ConfigureEventBus(IApplicationBuilder app) + { + var eventBus = app.ApplicationServices.GetRequiredService(); + eventBus.Subscribe(); + eventBus.Subscribe(); + } + } + + public static class CustomExtensionMethods + { + public static IServiceCollection AddAppInsight(this IServiceCollection services, IConfiguration configuration) + { + services.AddApplicationInsightsTelemetry(configuration); + var orchestratorType = configuration.GetValue("OrchestratorType"); + + if (orchestratorType?.ToUpper() == "K8S") + { + // Enable K8s telemetry initializer + services.EnableKubernetes(); + } + if (orchestratorType?.ToUpper() == "SF") + { + // Enable SF telemetry initializer + services.AddSingleton((serviceProvider) => + new FabricTelemetryInitializer()); + } + + return services; + } + + public static IServiceCollection AddCustomMVC(this IServiceCollection services, IConfiguration configuration) + { services.AddHealthChecks(checks => { var minutes = 1; - if (int.TryParse(Configuration["HealthCheck:Timeout"], out var minutesParsed)) + if (int.TryParse(configuration["HealthCheck:Timeout"], out var minutesParsed)) { minutes = minutesParsed; } - checks.AddSqlCheck("CatalogDb", Configuration["ConnectionString"], TimeSpan.FromMinutes(minutes)); + checks.AddSqlCheck("CatalogDb", configuration["ConnectionString"], TimeSpan.FromMinutes(minutes)); - var accountName = Configuration.GetValue("AzureStorageAccountName"); - var accountKey = Configuration.GetValue("AzureStorageAccountKey"); + var accountName = configuration.GetValue("AzureStorageAccountName"); + var accountKey = configuration.GetValue("AzureStorageAccountKey"); if (!string.IsNullOrEmpty(accountName) && !string.IsNullOrEmpty(accountKey)) { checks.AddAzureBlobStorageCheck(accountName, accountKey); @@ -67,9 +142,23 @@ options.Filters.Add(typeof(HttpGlobalExceptionFilter)); }).AddControllersAsServices(); + services.AddCors(options => + { + options.AddPolicy("CorsPolicy", + builder => builder.AllowAnyOrigin() + .AllowAnyMethod() + .AllowAnyHeader() + .AllowCredentials()); + }); + + return services; + } + + public static IServiceCollection AddCustomDbContext(this IServiceCollection services, IConfiguration configuration) + { services.AddDbContext(options => { - options.UseSqlServer(Configuration["ConnectionString"], + options.UseSqlServer(configuration["ConnectionString"], sqlServerOptionsAction: sqlOptions => { sqlOptions.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name); @@ -85,7 +174,7 @@ services.AddDbContext(options => { - options.UseSqlServer(Configuration["ConnectionString"], + options.UseSqlServer(configuration["ConnectionString"], sqlServerOptionsAction: sqlOptions => { sqlOptions.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name); @@ -94,9 +183,35 @@ }); }); - services.Configure(Configuration); + return services; + } - // Add framework services. + public static IServiceCollection AddCustomOptions(this IServiceCollection services, IConfiguration configuration) + { + services.Configure(configuration); + services.Configure(options => + { + options.InvalidModelStateResponseFactory = context => + { + var problemDetails = new ValidationProblemDetails(context.ModelState) + { + Instance = context.HttpContext.Request.Path, + Status = StatusCodes.Status400BadRequest, + Detail = "Please refer to the errors property for additional details." + }; + + return new BadRequestObjectResult(problemDetails) + { + ContentTypes = { "application/problem+json", "application/problem+xml" } + }; + }; + }); + + return services; + } + + public static IServiceCollection AddSwagger(this IServiceCollection services) + { services.AddSwaggerGen(options => { options.DescribeAllEnumsAsStrings(); @@ -109,21 +224,18 @@ }); }); - services.AddCors(options => - { - options.AddPolicy("CorsPolicy", - builder => builder.AllowAnyOrigin() - .AllowAnyMethod() - .AllowAnyHeader() - .AllowCredentials()); - }); + return services; + + } + public static IServiceCollection AddIntegrationServices(IServiceCollection services, IConfiguration configuration) + { services.AddTransient>( - sp => (DbConnection c) => new IntegrationEventLogService(c)); + sp => (DbConnection c) => new IntegrationEventLogService(c)); services.AddTransient(); - if (Configuration.GetValue("AzureServiceBusEnabled")) + if (configuration.GetValue("AzureServiceBusEnabled")) { services.AddSingleton(sp => { @@ -144,93 +256,37 @@ var factory = new ConnectionFactory() { - HostName = Configuration["EventBusConnection"] + HostName = configuration["EventBusConnection"] }; - if (!string.IsNullOrEmpty(Configuration["EventBusUserName"])) + if (!string.IsNullOrEmpty(configuration["EventBusUserName"])) { - factory.UserName = Configuration["EventBusUserName"]; + factory.UserName = configuration["EventBusUserName"]; } - if (!string.IsNullOrEmpty(Configuration["EventBusPassword"])) + if (!string.IsNullOrEmpty(configuration["EventBusPassword"])) { - factory.Password = Configuration["EventBusPassword"]; + factory.Password = configuration["EventBusPassword"]; } var retryCount = 5; - if (!string.IsNullOrEmpty(Configuration["EventBusRetryCount"])) + if (!string.IsNullOrEmpty(configuration["EventBusRetryCount"])) { - retryCount = int.Parse(Configuration["EventBusRetryCount"]); + retryCount = int.Parse(configuration["EventBusRetryCount"]); } return new DefaultRabbitMQPersistentConnection(factory, logger, retryCount); }); } - RegisterEventBus(services); - - var container = new ContainerBuilder(); - container.Populate(services); - return new AutofacServiceProvider(container.Build()); - - } - - public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) - { - //Configure logs - - loggerFactory.AddConsole(Configuration.GetSection("Logging")); - loggerFactory.AddDebug(); - loggerFactory.AddAzureWebAppDiagnostics(); - loggerFactory.AddApplicationInsights(app.ApplicationServices, LogLevel.Trace); - - var pathBase = Configuration["PATH_BASE"]; - if (!string.IsNullOrEmpty(pathBase)) - { - loggerFactory.CreateLogger("init").LogDebug($"Using PATH BASE '{pathBase}'"); - app.UsePathBase(pathBase); - } - -#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously - app.Map("/liveness", lapp => lapp.Run(async ctx => ctx.Response.StatusCode = 200)); -#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously - - app.UseCors("CorsPolicy"); - - app.UseMvcWithDefaultRoute(); - - app.UseSwagger() - .UseSwaggerUI(c => - { - c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Catalog.API V1"); - }); - - ConfigureEventBus(app); + return services; } - private void RegisterAppInsights(IServiceCollection services) + public static IServiceCollection AddEventBus(this IServiceCollection services, IConfiguration configuration) { - services.AddApplicationInsightsTelemetry(Configuration); - var orchestratorType = Configuration.GetValue("OrchestratorType"); + var subscriptionClientName = configuration["SubscriptionClientName"]; - if (orchestratorType?.ToUpper() == "K8S") - { - // Enable K8s telemetry initializer - services.EnableKubernetes(); - } - if (orchestratorType?.ToUpper() == "SF") - { - // Enable SF telemetry initializer - services.AddSingleton((serviceProvider) => - new FabricTelemetryInitializer()); - } - } - - private void RegisterEventBus(IServiceCollection services) - { - var subscriptionClientName = Configuration["SubscriptionClientName"]; - - if (Configuration.GetValue("AzureServiceBusEnabled")) + if (configuration.GetValue("AzureServiceBusEnabled")) { services.AddSingleton(sp => { @@ -254,9 +310,9 @@ var eventBusSubcriptionsManager = sp.GetRequiredService(); var retryCount = 5; - if (!string.IsNullOrEmpty(Configuration["EventBusRetryCount"])) + if (!string.IsNullOrEmpty(configuration["EventBusRetryCount"])) { - retryCount = int.Parse(Configuration["EventBusRetryCount"]); + retryCount = int.Parse(configuration["EventBusRetryCount"]); } return new EventBusRabbitMQ(rabbitMQPersistentConnection, logger, iLifetimeScope, eventBusSubcriptionsManager, subscriptionClientName, retryCount); @@ -266,12 +322,8 @@ services.AddSingleton(); services.AddTransient(); services.AddTransient(); - } - protected virtual void ConfigureEventBus(IApplicationBuilder app) - { - var eventBus = app.ApplicationServices.GetRequiredService(); - eventBus.Subscribe(); - eventBus.Subscribe(); + + return services; } } } diff --git a/src/Services/Identity/Identity.API/Dockerfile b/src/Services/Identity/Identity.API/Dockerfile index ddc884cc2..43174ce03 100644 --- a/src/Services/Identity/Identity.API/Dockerfile +++ b/src/Services/Identity/Identity.API/Dockerfile @@ -1,8 +1,8 @@ -FROM microsoft/aspnetcore:2.0.5 AS base +FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 -FROM microsoft/aspnetcore-build:2.0.5-2.1.4 AS build +FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY . . RUN dotnet restore -nowarn:msb3202,nu1503 diff --git a/src/Services/Location/Locations.API/Dockerfile b/src/Services/Location/Locations.API/Dockerfile index e2b64ba2e..8c946fa5e 100644 --- a/src/Services/Location/Locations.API/Dockerfile +++ b/src/Services/Location/Locations.API/Dockerfile @@ -1,8 +1,8 @@ -FROM microsoft/aspnetcore:2.0.5 AS base +FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 -FROM microsoft/aspnetcore-build:2.0.5-2.1.4 AS build +FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY . . RUN dotnet restore -nowarn:msb3202,nu1503 diff --git a/src/Services/Marketing/Marketing.API/Dockerfile b/src/Services/Marketing/Marketing.API/Dockerfile index b30986406..2fd11e2d6 100644 --- a/src/Services/Marketing/Marketing.API/Dockerfile +++ b/src/Services/Marketing/Marketing.API/Dockerfile @@ -1,8 +1,8 @@ -FROM microsoft/aspnetcore:2.0.5 AS base +FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 -FROM microsoft/aspnetcore-build:2.0.5-2.1.4 AS build +FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY . . RUN dotnet restore -nowarn:msb3202,nu1503 diff --git a/src/Services/Ordering/Ordering.API/Dockerfile b/src/Services/Ordering/Ordering.API/Dockerfile index 6dc5f8122..ecb24f808 100644 --- a/src/Services/Ordering/Ordering.API/Dockerfile +++ b/src/Services/Ordering/Ordering.API/Dockerfile @@ -1,8 +1,8 @@ -FROM microsoft/aspnetcore:2.0.5 AS base +FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 -FROM microsoft/aspnetcore-build:2.0.5-2.1.4 AS build +FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY . . RUN dotnet restore -nowarn:msb3202,nu1503 diff --git a/src/Services/Ordering/Ordering.BackgroundTasks/Dockerfile b/src/Services/Ordering/Ordering.BackgroundTasks/Dockerfile index a675d59ef..80788cd1d 100644 --- a/src/Services/Ordering/Ordering.BackgroundTasks/Dockerfile +++ b/src/Services/Ordering/Ordering.BackgroundTasks/Dockerfile @@ -1,8 +1,8 @@ -FROM microsoft/aspnetcore:2.0.5 AS base +FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 -FROM microsoft/aspnetcore-build:2.0.5-2.1.4 AS build +FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY . . RUN dotnet restore -nowarn:msb3202,nu1503 diff --git a/src/Services/Ordering/Ordering.SignalrHub/Dockerfile b/src/Services/Ordering/Ordering.SignalrHub/Dockerfile index 005eea8cf..f2fa72f8d 100644 --- a/src/Services/Ordering/Ordering.SignalrHub/Dockerfile +++ b/src/Services/Ordering/Ordering.SignalrHub/Dockerfile @@ -1,8 +1,8 @@ -FROM microsoft/aspnetcore:2.0 AS base +FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 -FROM microsoft/aspnetcore-build:2.0 AS build +FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY eShopOnContainers-ServicesAndWebApps.sln ./ COPY src/Services/Ordering/Ordering.SignalrHub/Ordering.SignalrHub.csproj src/Services/Ordering/Ordering.SignalrHub/ diff --git a/src/Services/Payment/Payment.API/Dockerfile b/src/Services/Payment/Payment.API/Dockerfile index 7b19579c1..0f1311671 100644 --- a/src/Services/Payment/Payment.API/Dockerfile +++ b/src/Services/Payment/Payment.API/Dockerfile @@ -1,8 +1,8 @@ -FROM microsoft/aspnetcore:2.0.5 AS base +FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 -FROM microsoft/aspnetcore-build:2.0.5-2.1.4 AS build +FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY . . RUN dotnet restore -nowarn:msb3202,nu1503 diff --git a/src/Web/WebMVC/Dockerfile b/src/Web/WebMVC/Dockerfile index a903387c8..ccf3094fe 100644 --- a/src/Web/WebMVC/Dockerfile +++ b/src/Web/WebMVC/Dockerfile @@ -1,8 +1,8 @@ -FROM microsoft/aspnetcore:2.0.5 AS base +FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 -FROM microsoft/aspnetcore-build:2.0.5-2.1.4 AS build +FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY . . RUN dotnet restore -nowarn:msb3202,nu1503 diff --git a/src/Web/WebSPA/Dockerfile b/src/Web/WebSPA/Dockerfile index 7b7cd47d4..4f8d3ac66 100644 --- a/src/Web/WebSPA/Dockerfile +++ b/src/Web/WebSPA/Dockerfile @@ -1,8 +1,8 @@ -FROM microsoft/aspnetcore:2.0.5 AS base +FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 -FROM microsoft/aspnetcore-build:2.0.5-2.1.4 AS build +FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY . . RUN dotnet restore -nowarn:msb3202,nu1503 diff --git a/src/Web/WebStatus/Dockerfile b/src/Web/WebStatus/Dockerfile index 16d4cbc61..d85386503 100644 --- a/src/Web/WebStatus/Dockerfile +++ b/src/Web/WebStatus/Dockerfile @@ -1,8 +1,8 @@ -FROM microsoft/aspnetcore:2.0.5 AS base +FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 -FROM microsoft/aspnetcore-build:2.0.5-2.1.4 AS build +FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY . . RUN dotnet restore -nowarn:msb3202,nu1503 From 36fb20acea0ab58dfc4564565737a99492f95a49 Mon Sep 17 00:00:00 2001 From: Unai Zorrilla Castro Date: Tue, 15 May 2018 16:58:53 +0200 Subject: [PATCH 03/33] Refactoring Catalog and Order status and add problem details feature from 2.1 --- .../Filters/HttpGlobalExceptionFilter.cs | 11 +- .../Controllers/OrdersController.cs | 2 +- .../Filters/HttpGlobalExceptionFilter.cs | 17 +- src/Services/Ordering/Ordering.API/Startup.cs | 350 ++++++++++-------- 4 files changed, 223 insertions(+), 157 deletions(-) diff --git a/src/Services/Catalog/Catalog.API/Infrastructure/Filters/HttpGlobalExceptionFilter.cs b/src/Services/Catalog/Catalog.API/Infrastructure/Filters/HttpGlobalExceptionFilter.cs index 41d3f08e1..4c4c746a6 100644 --- a/src/Services/Catalog/Catalog.API/Infrastructure/Filters/HttpGlobalExceptionFilter.cs +++ b/src/Services/Catalog/Catalog.API/Infrastructure/Filters/HttpGlobalExceptionFilter.cs @@ -1,6 +1,7 @@ using Catalog.API.Infrastructure.ActionResults; using Catalog.API.Infrastructure.Exceptions; using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.Extensions.Logging; @@ -27,12 +28,16 @@ namespace Catalog.API.Infrastructure.Filters if (context.Exception.GetType() == typeof(CatalogDomainException)) { - var json = new JsonErrorResponse + var problemDetails = new ValidationProblemDetails() { - Messages = new[] { context.Exception.Message } + Instance = context.HttpContext.Request.Path, + Status = StatusCodes.Status400BadRequest, + Detail = "Please refer to the errors property for additional details." }; - context.Result = new BadRequestObjectResult(json); + problemDetails.Errors.Add("DomainValidations", new string[] { context.Exception.Message.ToString() }); + + context.Result = new BadRequestObjectResult(problemDetails); context.HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest; } else diff --git a/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs b/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs index ac179c97f..c93e18400 100644 --- a/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs +++ b/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs @@ -5,7 +5,6 @@ using Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands; using Microsoft.eShopOnContainers.Services.Ordering.API.Application.Queries; using Microsoft.eShopOnContainers.Services.Ordering.API.Infrastructure.Services; using Ordering.API.Application.Commands; -using Ordering.API.Application.Models; using System; using System.Collections.Generic; using System.Net; @@ -15,6 +14,7 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API.Controllers { [Route("api/v1/[controller]")] [Authorize] + [ApiController] public class OrdersController : Controller { private readonly IMediator _mediator; diff --git a/src/Services/Ordering/Ordering.API/Infrastructure/Filters/HttpGlobalExceptionFilter.cs b/src/Services/Ordering/Ordering.API/Infrastructure/Filters/HttpGlobalExceptionFilter.cs index 69faf8e42..a4ce415ea 100644 --- a/src/Services/Ordering/Ordering.API/Infrastructure/Filters/HttpGlobalExceptionFilter.cs +++ b/src/Services/Ordering/Ordering.API/Infrastructure/Filters/HttpGlobalExceptionFilter.cs @@ -3,6 +3,7 @@ using AspNetCore.Mvc; using global::Ordering.Domain.Exceptions; using Microsoft.AspNetCore.Hosting; + using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.eShopOnContainers.Services.Ordering.API.Infrastructure.ActionResults; using Microsoft.Extensions.Logging; @@ -25,16 +26,18 @@ context.Exception, context.Exception.Message); - if (context.Exception.GetType() == typeof(OrderingDomainException)) + if (context.Exception.GetType() == typeof(OrderingDomainException)) { - var json = new JsonErrorResponse + var problemDetails = new ValidationProblemDetails() { - Messages = new[] { context.Exception.Message } + Instance = context.HttpContext.Request.Path, + Status = StatusCodes.Status400BadRequest, + Detail = "Please refer to the errors property for additional details." }; - // Result asigned to a result object but in destiny the response is empty. This is a known bug of .net core 1.1 - //It will be fixed in .net core 1.1.2. See https://github.com/aspnet/Mvc/issues/5594 for more information - context.Result = new BadRequestObjectResult(json); + problemDetails.Errors.Add("DomainValidations", new string[] { context.Exception.Message.ToString() }); + + context.Result = new BadRequestObjectResult(problemDetails); context.HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest; } else @@ -52,7 +55,7 @@ // Result asigned to a result object but in destiny the response is empty. This is a known bug of .net core 1.1 // It will be fixed in .net core 1.1.2. See https://github.com/aspnet/Mvc/issues/5594 for more information context.Result = new InternalServerErrorObjectResult(json); - context.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError; + context.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError; } context.ExceptionHandled = true; } diff --git a/src/Services/Ordering/Ordering.API/Startup.cs b/src/Services/Ordering/Ordering.API/Startup.cs index 2948a3997..42567641a 100644 --- a/src/Services/Ordering/Ordering.API/Startup.cs +++ b/src/Services/Ordering/Ordering.API/Startup.cs @@ -15,6 +15,7 @@ using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; + using Microsoft.AspNetCore.Mvc; using Microsoft.Azure.ServiceBus; using Microsoft.EntityFrameworkCore; using Microsoft.eShopOnContainers.BuildingBlocks.EventBus; @@ -47,8 +48,110 @@ public IServiceProvider ConfigureServices(IServiceCollection services) { - RegisterAppInsights(services); + services.AddApplicationInsights(Configuration) + .AddCustomMvc() + .AddHealthChecks(Configuration) + .AddCustomDbContext(Configuration) + .AddCustomSwagger(Configuration) + .AddCustomIntegrations(Configuration) + .AddCustomConfiguration(Configuration) + .AddEventBus(Configuration) + .AddCustomAuthentication(Configuration); + //configure autofac + + var container = new ContainerBuilder(); + container.Populate(services); + + container.RegisterModule(new MediatorModule()); + container.RegisterModule(new ApplicationModule(Configuration["ConnectionString"])); + + return new AutofacServiceProvider(container.Build()); + } + + + public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) + { + loggerFactory.AddAzureWebAppDiagnostics(); + loggerFactory.AddApplicationInsights(app.ApplicationServices, LogLevel.Trace); + + var pathBase = Configuration["PATH_BASE"]; + if (!string.IsNullOrEmpty(pathBase)) + { + loggerFactory.CreateLogger("init").LogDebug($"Using PATH BASE '{pathBase}'"); + app.UsePathBase(pathBase); + } + +#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously + app.Map("/liveness", lapp => lapp.Run(async ctx => ctx.Response.StatusCode = 200)); +#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously + + app.UseCors("CorsPolicy"); + + ConfigureAuth(app); + + app.UseMvcWithDefaultRoute(); + + app.UseSwagger() + .UseSwaggerUI(c => + { + c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Ordering.API V1"); + c.OAuthClientId("orderingswaggerui"); + c.OAuthAppName("Ordering Swagger UI"); + }); + + ConfigureEventBus(app); + } + + + private void ConfigureEventBus(IApplicationBuilder app) + { + var eventBus = app.ApplicationServices.GetRequiredService(); + + eventBus.Subscribe>(); + eventBus.Subscribe>(); + eventBus.Subscribe>(); + eventBus.Subscribe>(); + eventBus.Subscribe>(); + eventBus.Subscribe>(); + } + + + protected virtual void ConfigureAuth(IApplicationBuilder app) + { + if (Configuration.GetValue("UseLoadTest")) + { + app.UseMiddleware(); + } + + app.UseAuthentication(); + } + } + + static class CustomExtensionsMethods + { + public static IServiceCollection AddApplicationInsights(this IServiceCollection services, IConfiguration configuration) + { + services.AddApplicationInsightsTelemetry(configuration); + var orchestratorType = configuration.GetValue("OrchestratorType"); + + if (orchestratorType?.ToUpper() == "K8S") + { + // Enable K8s telemetry initializer + services.EnableKubernetes(); + } + if (orchestratorType?.ToUpper() == "SF") + { + // Enable SF telemetry initializer + services.AddSingleton((serviceProvider) => + new FabricTelemetryInitializer()); + } + + return services; + } + + public static IServiceCollection AddCustomMvc(this IServiceCollection services) + { // Add framework services. services.AddMvc(options => { @@ -56,34 +159,51 @@ }).AddControllersAsServices(); //Injecting Controllers themselves thru DI //For further info see: http://docs.autofac.org/en/latest/integration/aspnetcore.html#controllers-as-services - services.AddTransient(); + services.AddCors(options => + { + options.AddPolicy("CorsPolicy", + builder => builder.AllowAnyOrigin() + .AllowAnyMethod() + .AllowAnyHeader() + .AllowCredentials()); + }); + + return services; + } + public static IServiceCollection AddHealthChecks(this IServiceCollection services, IConfiguration configuration) + { services.AddHealthChecks(checks => { var minutes = 1; - if (int.TryParse(Configuration["HealthCheck:Timeout"], out var minutesParsed)) + if (int.TryParse(configuration["HealthCheck:Timeout"], out var minutesParsed)) { minutes = minutesParsed; } - checks.AddSqlCheck("OrderingDb", Configuration["ConnectionString"], TimeSpan.FromMinutes(minutes)); + checks.AddSqlCheck("OrderingDb", configuration["ConnectionString"], TimeSpan.FromMinutes(minutes)); }); + return services; + } + + public static IServiceCollection AddCustomDbContext(this IServiceCollection services, IConfiguration configuration) + { services.AddEntityFrameworkSqlServer() - .AddDbContext(options => - { - options.UseSqlServer(Configuration["ConnectionString"], - sqlServerOptionsAction: sqlOptions => - { - sqlOptions.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name); - sqlOptions.EnableRetryOnFailure(maxRetryCount: 10, maxRetryDelay: TimeSpan.FromSeconds(30), errorNumbersToAdd: null); - }); - }, - ServiceLifetime.Scoped //Showing explicitly that the DbContext is shared across the HTTP request scope (graph of objects started in the HTTP request) - ); + .AddDbContext(options => + { + options.UseSqlServer(configuration["ConnectionString"], + sqlServerOptionsAction: sqlOptions => + { + sqlOptions.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name); + sqlOptions.EnableRetryOnFailure(maxRetryCount: 10, maxRetryDelay: TimeSpan.FromSeconds(30), errorNumbersToAdd: null); + }); + }, + ServiceLifetime.Scoped //Showing explicitly that the DbContext is shared across the HTTP request scope (graph of objects started in the HTTP request) + ); services.AddDbContext(options => { - options.UseSqlServer(Configuration["ConnectionString"], + options.UseSqlServer(configuration["ConnectionString"], sqlServerOptionsAction: sqlOptions => { sqlOptions.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name); @@ -91,10 +211,12 @@ sqlOptions.EnableRetryOnFailure(maxRetryCount: 10, maxRetryDelay: TimeSpan.FromSeconds(30), errorNumbersToAdd: null); }); }); - - services.Configure(Configuration); + return services; + } + public static IServiceCollection AddCustomSwagger(this IServiceCollection services, IConfiguration configuration) + { services.AddSwaggerGen(options => { options.DescribeAllEnumsAsStrings(); @@ -110,8 +232,8 @@ { Type = "oauth2", Flow = "implicit", - AuthorizationUrl = $"{Configuration.GetValue("IdentityUrlExternal")}/connect/authorize", - TokenUrl = $"{Configuration.GetValue("IdentityUrlExternal")}/connect/token", + AuthorizationUrl = $"{configuration.GetValue("IdentityUrlExternal")}/connect/authorize", + TokenUrl = $"{configuration.GetValue("IdentityUrlExternal")}/connect/token", Scopes = new Dictionary() { { "orders", "Ordering API" } @@ -121,16 +243,11 @@ options.OperationFilter(); }); - services.AddCors(options => - { - options.AddPolicy("CorsPolicy", - builder => builder.AllowAnyOrigin() - .AllowAnyMethod() - .AllowAnyHeader() - .AllowCredentials()); - }); + return services; + } - // Add application services. + public static IServiceCollection AddCustomIntegrations(this IServiceCollection services, IConfiguration configuration) + { services.AddSingleton(); services.AddTransient(); services.AddTransient>( @@ -138,13 +255,13 @@ services.AddTransient(); - if (Configuration.GetValue("AzureServiceBusEnabled")) + if (configuration.GetValue("AzureServiceBusEnabled")) { services.AddSingleton(sp => { var logger = sp.GetRequiredService>(); - var serviceBusConnectionString = Configuration["EventBusConnection"]; + var serviceBusConnectionString = configuration["EventBusConnection"]; var serviceBusConnection = new ServiceBusConnectionStringBuilder(serviceBusConnectionString); return new DefaultServiceBusPersisterConnection(serviceBusConnection, logger); @@ -159,152 +276,69 @@ var factory = new ConnectionFactory() { - HostName = Configuration["EventBusConnection"] + HostName = configuration["EventBusConnection"] }; - if (!string.IsNullOrEmpty(Configuration["EventBusUserName"])) + if (!string.IsNullOrEmpty(configuration["EventBusUserName"])) { - factory.UserName = Configuration["EventBusUserName"]; + factory.UserName = configuration["EventBusUserName"]; } - if (!string.IsNullOrEmpty(Configuration["EventBusPassword"])) + if (!string.IsNullOrEmpty(configuration["EventBusPassword"])) { - factory.Password = Configuration["EventBusPassword"]; + factory.Password = configuration["EventBusPassword"]; } var retryCount = 5; - if (!string.IsNullOrEmpty(Configuration["EventBusRetryCount"])) + if (!string.IsNullOrEmpty(configuration["EventBusRetryCount"])) { - retryCount = int.Parse(Configuration["EventBusRetryCount"]); + retryCount = int.Parse(configuration["EventBusRetryCount"]); } return new DefaultRabbitMQPersistentConnection(factory, logger, retryCount); }); } - RegisterEventBus(services); - ConfigureAuthService(services); - services.AddOptions(); - - //configure autofac - - var container = new ContainerBuilder(); - container.Populate(services); - - container.RegisterModule(new MediatorModule()); - container.RegisterModule(new ApplicationModule(Configuration["ConnectionString"])); - - return new AutofacServiceProvider(container.Build()); - } - - - public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) - { - loggerFactory.AddConsole(Configuration.GetSection("Logging")); - loggerFactory.AddDebug(); - loggerFactory.AddAzureWebAppDiagnostics(); - loggerFactory.AddApplicationInsights(app.ApplicationServices, LogLevel.Trace); - - var pathBase = Configuration["PATH_BASE"]; - if (!string.IsNullOrEmpty(pathBase)) - { - loggerFactory.CreateLogger("init").LogDebug($"Using PATH BASE '{pathBase}'"); - app.UsePathBase(pathBase); - } - -#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously - app.Map("/liveness", lapp => lapp.Run(async ctx => ctx.Response.StatusCode = 200)); -#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously - - app.UseCors("CorsPolicy"); - - ConfigureAuth(app); - - app.UseMvcWithDefaultRoute(); - - app.UseSwagger() - .UseSwaggerUI(c => - { - c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Ordering.API V1"); - c.OAuthClientId("orderingswaggerui"); - c.OAuthAppName("Ordering Swagger UI"); - }); - - ConfigureEventBus(app); - } - - private void RegisterAppInsights(IServiceCollection services) - { - services.AddApplicationInsightsTelemetry(Configuration); - var orchestratorType = Configuration.GetValue("OrchestratorType"); - - if (orchestratorType?.ToUpper() == "K8S") - { - // Enable K8s telemetry initializer - services.EnableKubernetes(); - } - if (orchestratorType?.ToUpper() == "SF") - { - // Enable SF telemetry initializer - services.AddSingleton((serviceProvider) => - new FabricTelemetryInitializer()); - } + return services; } - private void ConfigureEventBus(IApplicationBuilder app) + public static IServiceCollection AddCustomConfiguration(this IServiceCollection services, IConfiguration configuration) { - var eventBus = app.ApplicationServices.GetRequiredService(); - - eventBus.Subscribe>(); - eventBus.Subscribe>(); - eventBus.Subscribe>(); - eventBus.Subscribe>(); - eventBus.Subscribe>(); - eventBus.Subscribe>(); - } - - private void ConfigureAuthService(IServiceCollection services) - { - // prevent from mapping "sub" claim to nameidentifier. - JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Remove("sub"); - - var identityUrl = Configuration.GetValue("IdentityUrl"); - - services.AddAuthentication(options => + services.AddOptions(); + services.Configure(configuration); + services.Configure(options => { - options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; - options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; + options.InvalidModelStateResponseFactory = context => + { + var problemDetails = new ValidationProblemDetails(context.ModelState) + { + Instance = context.HttpContext.Request.Path, + Status = StatusCodes.Status400BadRequest, + Detail = "Please refer to the errors property for additional details." + }; - }).AddJwtBearer(options => - { - options.Authority = identityUrl; - options.RequireHttpsMetadata = false; - options.Audience = "orders"; + return new BadRequestObjectResult(problemDetails) + { + ContentTypes = { "application/problem+json", "application/problem+xml" } + }; + }; }); - } - - protected virtual void ConfigureAuth(IApplicationBuilder app) - { - if (Configuration.GetValue("UseLoadTest")) - { - app.UseMiddleware(); - } - app.UseAuthentication(); + return services; } - private void RegisterEventBus(IServiceCollection services) + public static IServiceCollection AddEventBus(this IServiceCollection services, IConfiguration configuration) { - var subscriptionClientName = Configuration["SubscriptionClientName"]; + var subscriptionClientName = configuration["SubscriptionClientName"]; - if (Configuration.GetValue("AzureServiceBusEnabled")) + if (configuration.GetValue("AzureServiceBusEnabled")) { services.AddSingleton(sp => { var serviceBusPersisterConnection = sp.GetRequiredService(); var iLifetimeScope = sp.GetRequiredService(); var logger = sp.GetRequiredService>(); - var eventBusSubcriptionsManager = sp.GetRequiredService(); + var eventBusSubcriptionsManager = sp.GetRequiredService(); return new EventBusServiceBus(serviceBusPersisterConnection, logger, eventBusSubcriptionsManager, subscriptionClientName, iLifetimeScope); @@ -320,9 +354,9 @@ var eventBusSubcriptionsManager = sp.GetRequiredService(); var retryCount = 5; - if (!string.IsNullOrEmpty(Configuration["EventBusRetryCount"])) + if (!string.IsNullOrEmpty(configuration["EventBusRetryCount"])) { - retryCount = int.Parse(Configuration["EventBusRetryCount"]); + retryCount = int.Parse(configuration["EventBusRetryCount"]); } return new EventBusRabbitMQ(rabbitMQPersistentConnection, logger, iLifetimeScope, eventBusSubcriptionsManager, subscriptionClientName, retryCount); @@ -330,6 +364,30 @@ } services.AddSingleton(); + + return services; + } + + public static IServiceCollection AddCustomAuthentication(this IServiceCollection services, IConfiguration configuration) + { + // prevent from mapping "sub" claim to nameidentifier. + JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Remove("sub"); + + var identityUrl = configuration.GetValue("IdentityUrl"); + + services.AddAuthentication(options => + { + options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; + options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; + + }).AddJwtBearer(options => + { + options.Authority = identityUrl; + options.RequireHttpsMetadata = false; + options.Audience = "orders"; + }); + + return services; } } } From cf4b7ff47ffa239df0b59ee0741e30424ae8aea0 Mon Sep 17 00:00:00 2001 From: Unai Zorrilla Castro Date: Wed, 16 May 2018 12:44:32 +0200 Subject: [PATCH 04/33] Added sample for use new IHttpClientFactory feature on WebMVC --- src/Web/WebMVC/Controllers/CartController.cs | 1 - ...ttpClientAuthorizationDelegatingHandler.cs | 49 ++++ .../HttpClientDefaultPolicies.cs | 60 +++++ src/Web/WebMVC/Services/BasketService.cs | 63 ++--- src/Web/WebMVC/Startup.cs | 253 +++++++++++------- src/Web/WebMVC/WebMVC.csproj | 1 + 6 files changed, 288 insertions(+), 139 deletions(-) create mode 100644 src/Web/WebMVC/Infrastructure/HttpClientAuthorizationDelegatingHandler.cs create mode 100644 src/Web/WebMVC/Infrastructure/HttpClientDefaultPolicies.cs diff --git a/src/Web/WebMVC/Controllers/CartController.cs b/src/Web/WebMVC/Controllers/CartController.cs index 660da1d56..30ac77e8b 100644 --- a/src/Web/WebMVC/Controllers/CartController.cs +++ b/src/Web/WebMVC/Controllers/CartController.cs @@ -71,7 +71,6 @@ namespace Microsoft.eShopOnContainers.WebMVC.Controllers { var user = _appUserParser.Parse(HttpContext.User); await _basketSvc.AddItemToBasket(user, productDetails.Id); - //await _basketSvc.AddItemToBasket(user, product); } return RedirectToAction("Index", "Catalog"); } diff --git a/src/Web/WebMVC/Infrastructure/HttpClientAuthorizationDelegatingHandler.cs b/src/Web/WebMVC/Infrastructure/HttpClientAuthorizationDelegatingHandler.cs new file mode 100644 index 000000000..255bd1649 --- /dev/null +++ b/src/Web/WebMVC/Infrastructure/HttpClientAuthorizationDelegatingHandler.cs @@ -0,0 +1,49 @@ +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Http; +using System.Collections.Generic; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Threading; +using System.Threading.Tasks; + +namespace WebMVC.Infrastructure +{ + public class HttpClientAuthorizationDelegatingHandler + : DelegatingHandler + { + private readonly IHttpContextAccessor _httpContextAccesor; + + public HttpClientAuthorizationDelegatingHandler(IHttpContextAccessor httpContextAccesor) + { + _httpContextAccesor = httpContextAccesor; + } + + protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) + { + var authorizationHeader = _httpContextAccesor.HttpContext + .Request.Headers["Authorization"]; + + if (!string.IsNullOrEmpty(authorizationHeader)) + { + request.Headers.Add("Authorization", new List() { authorizationHeader }); + } + + var token = await GetToken(); + + if (token != null) + { + request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token); + } + + return await base.SendAsync(request, cancellationToken); + } + + async Task GetToken() + { + const string ACCESS_TOKEN = "access_token"; + + return await _httpContextAccesor.HttpContext + .GetTokenAsync(ACCESS_TOKEN); + } + } +} diff --git a/src/Web/WebMVC/Infrastructure/HttpClientDefaultPolicies.cs b/src/Web/WebMVC/Infrastructure/HttpClientDefaultPolicies.cs new file mode 100644 index 000000000..2340febd9 --- /dev/null +++ b/src/Web/WebMVC/Infrastructure/HttpClientDefaultPolicies.cs @@ -0,0 +1,60 @@ +using Microsoft.Extensions.Logging; +using Polly; +using System; +using System.Net.Http; + +namespace WebMVC.Infrastructure +{ + public class HttpClientDefaultPolicies + { + const int RETRY_COUNT = 6; + const int EXCEPTIONS_ALLOWED_BEFORE_CIRCUIT_BREAKER = 5; + + private readonly ILogger _logger; + + public HttpClientDefaultPolicies(ILogger logger) + { + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + } + + public Policy GetWaitAndRetryPolicy() + { + return Policy.Handle() + .WaitAndRetryAsync( + // number of retries + RETRY_COUNT, + // exponential backofff + retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), + // on retry + (exception, timeSpan, retryCount, context) => + { + var msg = $"Retry {retryCount} implemented with Polly's RetryPolicy " + + $"of {context.PolicyKey} " + + $"at {context.OperationKey}, " + + $"due to: {exception}."; + _logger.LogWarning(msg); + _logger.LogDebug(msg); + }); + } + + public Policy GetCircuitBreakerPolicy() + { + return Policy.Handle() + .CircuitBreakerAsync( + // number of exceptions before breaking circuit + EXCEPTIONS_ALLOWED_BEFORE_CIRCUIT_BREAKER, + // time circuit opened before retry + TimeSpan.FromMinutes(1), + (exception, duration) => + { + // on circuit opened + _logger.LogTrace("Circuit breaker opened"); + }, + () => + { + // on circuit closed + _logger.LogTrace("Circuit breaker reset"); + }); + } + } +} diff --git a/src/Web/WebMVC/Services/BasketService.cs b/src/Web/WebMVC/Services/BasketService.cs index 54287a796..4a0719f1b 100644 --- a/src/Web/WebMVC/Services/BasketService.cs +++ b/src/Web/WebMVC/Services/BasketService.cs @@ -1,11 +1,9 @@ -using Microsoft.AspNetCore.Authentication; -using Microsoft.AspNetCore.Http; -using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; -using Microsoft.eShopOnContainers.WebMVC.ViewModels; +using Microsoft.eShopOnContainers.WebMVC.ViewModels; using Microsoft.Extensions.Options; using Newtonsoft.Json; using System.Collections.Generic; using System.Linq; +using System.Net.Http; using System.Threading.Tasks; using WebMVC.Infrastructure; using WebMVC.Models; @@ -15,29 +13,26 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services public class BasketService : IBasketService { private readonly IOptionsSnapshot _settings; - private readonly IHttpClient _apiClient; + private readonly HttpClient _apiClient; private readonly string _basketByPassUrl; private readonly string _purchaseUrl; - private readonly IHttpContextAccessor _httpContextAccesor; private readonly string _bffUrl; - public BasketService(IOptionsSnapshot settings, - IHttpContextAccessor httpContextAccesor, IHttpClient httpClient) + public BasketService(HttpClient httpClient,IOptionsSnapshot settings) { + _apiClient = httpClient; _settings = settings; + _basketByPassUrl = $"{_settings.Value.PurchaseUrl}/api/v1/b/basket"; _purchaseUrl = $"{_settings.Value.PurchaseUrl}/api/v1"; - _httpContextAccesor = httpContextAccesor; - _apiClient = httpClient; } public async Task GetBasket(ApplicationUser user) { - var token = await GetUserTokenAsync(); var getBasketUri = API.Basket.GetBasket(_basketByPassUrl, user.Id); - var dataString = await _apiClient.GetStringAsync(getBasketUri, token); + var dataString = await _apiClient.GetStringAsync(getBasketUri); return string.IsNullOrEmpty(dataString) ? new Basket() { BuyerId = user.Id} : @@ -46,10 +41,10 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services public async Task UpdateBasket(Basket basket) { - var token = await GetUserTokenAsync(); var updateBasketUri = API.Basket.UpdateBasket(_basketByPassUrl); + var content = new StringContent(JsonConvert.SerializeObject(basket), System.Text.Encoding.UTF8, "application/json"); - var response = await _apiClient.PostAsync(updateBasketUri, basket, token); + var response = await _apiClient.PostAsync(updateBasketUri, content); response.EnsureSuccessStatusCode(); @@ -58,10 +53,10 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services public async Task Checkout(BasketDTO basket) { - var token = await GetUserTokenAsync(); var updateBasketUri = API.Basket.CheckoutBasket(_basketByPassUrl); + var content = new StringContent(JsonConvert.SerializeObject(basket), System.Text.Encoding.UTF8, "application/json"); - var response = await _apiClient.PostAsync(updateBasketUri, basket, token); + var response = await _apiClient.PostAsync(updateBasketUri, content); response.EnsureSuccessStatusCode(); } @@ -69,54 +64,52 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services public async Task SetQuantities(ApplicationUser user, Dictionary quantities) { - var token = await GetUserTokenAsync(); var updateBasketUri = API.Purchase.UpdateBasketItem(_purchaseUrl); - var userId = user.Id; - - var response = await _apiClient.PutAsync(updateBasketUri, new + var basketUpdate = new { - BasketId = userId, + BasketId = user.Id, Updates = quantities.Select(kvp => new { BasketItemId = kvp.Key, NewQty = kvp.Value }).ToArray() - }, token); + }; + + var content = new StringContent(JsonConvert.SerializeObject(basketUpdate), System.Text.Encoding.UTF8, "application/json"); + + var response = await _apiClient.PutAsync(updateBasketUri,content); response.EnsureSuccessStatusCode(); + var jsonResponse = await response.Content.ReadAsStringAsync(); + return JsonConvert.DeserializeObject(jsonResponse); } public async Task GetOrderDraft(string basketId) { - var token = await GetUserTokenAsync(); var draftOrderUri = API.Purchase.GetOrderDraft(_purchaseUrl, basketId); - var json = await _apiClient.GetStringAsync(draftOrderUri, token); - return JsonConvert.DeserializeObject(json); + var response = await _apiClient.GetStringAsync(draftOrderUri); + + return JsonConvert.DeserializeObject(response); } public async Task AddItemToBasket(ApplicationUser user, int productId) { - var token = await GetUserTokenAsync(); var updateBasketUri = API.Purchase.AddItemToBasket(_purchaseUrl); - var userId = user.Id; - var response = await _apiClient.PostAsync(updateBasketUri, new + var newItem = new { CatalogItemId = productId, - BasketId = userId, + BasketId = user.Id, Quantity = 1 - }, token); + }; - } + var content = new StringContent(JsonConvert.SerializeObject(newItem), System.Text.Encoding.UTF8, "application/json"); - async Task GetUserTokenAsync() - { - var context = _httpContextAccesor.HttpContext; - return await context.GetTokenAsync("access_token"); + var response = await _apiClient.PostAsync(updateBasketUri, content); } } } diff --git a/src/Web/WebMVC/Startup.cs b/src/Web/WebMVC/Startup.cs index 6d26e5790..b8be7a4e5 100644 --- a/src/Web/WebMVC/Startup.cs +++ b/src/Web/WebMVC/Startup.cs @@ -14,9 +14,12 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.HealthChecks; using Microsoft.Extensions.Logging; +using Polly; +using Polly.Registry; using StackExchange.Redis; using System; using System.IdentityModel.Tokens.Jwt; +using System.Net.Http; using WebMVC.Infrastructure; using WebMVC.Infrastructure.Middlewares; using WebMVC.Services; @@ -35,48 +38,156 @@ namespace Microsoft.eShopOnContainers.WebMVC // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { - RegisterAppInsights(services); + services.AddAppInsight(Configuration) + .AddHealthChecks(Configuration) + .AddCustomMvc(Configuration) + .AddCustomApplicationServices(Configuration) + .AddCustomAuthentication(Configuration); + } - services.AddMvc(); + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) + { + JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); - services.AddSession(); + loggerFactory.AddAzureWebAppDiagnostics(); + loggerFactory.AddApplicationInsights(app.ApplicationServices, LogLevel.Trace); - if (Configuration.GetValue("IsClusterEnv") == bool.TrueString) + if (env.IsDevelopment()) { - services.AddDataProtection(opts => - { - opts.ApplicationDiscriminator = "eshop.webmvc"; - }) - .PersistKeysToRedis(ConnectionMultiplexer.Connect(Configuration["DPConnectionString"]), "DataProtection-Keys"); + app.UseDeveloperExceptionPage(); + } + else + { + app.UseExceptionHandler("/Error"); + } + + var pathBase = Configuration["PATH_BASE"]; + if (!string.IsNullOrEmpty(pathBase)) + { + loggerFactory.CreateLogger("init").LogDebug($"Using PATH BASE '{pathBase}'"); + app.UsePathBase(pathBase); + } + + +#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously + app.Map("/liveness", lapp => lapp.Run(async ctx => ctx.Response.StatusCode = 200)); +#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously + + app.UseSession(); + app.UseStaticFiles(); + + if (Configuration.GetValue("UseLoadTest")) + { + app.UseMiddleware(); } - services.Configure(Configuration); + app.UseAuthentication(); + + var log = loggerFactory.CreateLogger("identity"); + + WebContextSeed.Seed(app, env, loggerFactory); + app.UseMvc(routes => + { + routes.MapRoute( + name: "default", + template: "{controller=Catalog}/{action=Index}/{id?}"); + + routes.MapRoute( + name: "defaultError", + template: "{controller=Error}/{action=Error}"); + }); + } + } + + static class ServiceCollectionExtensions + { + + public static IServiceCollection AddAppInsight(this IServiceCollection services, IConfiguration configuration) + { + services.AddApplicationInsightsTelemetry(configuration); + var orchestratorType = configuration.GetValue("OrchestratorType"); + + if (orchestratorType?.ToUpper() == "K8S") + { + // Enable K8s telemetry initializer + services.EnableKubernetes(); + } + + if (orchestratorType?.ToUpper() == "SF") + { + // Enable SF telemetry initializer + services.AddSingleton((serviceProvider) => + new FabricTelemetryInitializer()); + } + + return services; + } + + public static IServiceCollection AddHealthChecks(this IServiceCollection services, IConfiguration configuration) + { services.AddHealthChecks(checks => { var minutes = 1; - if (int.TryParse(Configuration["HealthCheck:Timeout"], out var minutesParsed)) + if (int.TryParse(configuration["HealthCheck:Timeout"], out var minutesParsed)) { minutes = minutesParsed; } - checks.AddUrlCheck(Configuration["CatalogUrlHC"], TimeSpan.FromMinutes(minutes)); - checks.AddUrlCheck(Configuration["OrderingUrlHC"], TimeSpan.FromMinutes(minutes)); - checks.AddUrlCheck(Configuration["BasketUrlHC"], TimeSpan.Zero); //No cache for this HealthCheck, better just for demos - checks.AddUrlCheck(Configuration["IdentityUrlHC"], TimeSpan.FromMinutes(minutes)); - checks.AddUrlCheck(Configuration["MarketingUrlHC"], TimeSpan.FromMinutes(minutes)); + checks.AddUrlCheck(configuration["CatalogUrlHC"], TimeSpan.FromMinutes(minutes)); + checks.AddUrlCheck(configuration["OrderingUrlHC"], TimeSpan.FromMinutes(minutes)); + checks.AddUrlCheck(configuration["BasketUrlHC"], TimeSpan.Zero); //No cache for this HealthCheck, better just for demos + checks.AddUrlCheck(configuration["IdentityUrlHC"], TimeSpan.FromMinutes(minutes)); + checks.AddUrlCheck(configuration["MarketingUrlHC"], TimeSpan.FromMinutes(minutes)); }); - // Add application services. + return services; + } + + public static IServiceCollection AddCustomMvc(this IServiceCollection services, IConfiguration configuration) + { + services.AddMvc(); + + services.AddSession(); + + if (configuration.GetValue("IsClusterEnv") == bool.TrueString) + { + services.AddDataProtection(opts => + { + opts.ApplicationDiscriminator = "eshop.webmvc"; + }) + .PersistKeysToRedis(ConnectionMultiplexer.Connect(configuration["DPConnectionString"]), "DataProtection-Keys"); + } + + services.Configure(configuration); + + return services; + } + + public static IServiceCollection AddCustomApplicationServices(this IServiceCollection services, IConfiguration configuration) + { services.AddSingleton(); + services.AddSingleton(); + var defaultPolicies = services.BuildServiceProvider().GetService(); + + var registry = services.AddPolicyRegistry(); + registry.Add("WaitAndRetry", defaultPolicies.GetWaitAndRetryPolicy()); + registry.Add("CircuitBreaker", defaultPolicies.GetCircuitBreakerPolicy()); + + services.AddHttpClient() + .AddHttpMessageHandler() + .AddPolicyHandlerFromRegistry("WaitAndRetry") + .AddPolicyHandlerFromRegistry("CircuitBreaker"); + services.AddTransient(); services.AddTransient(); - services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient, IdentityParser>(); - if (Configuration.GetValue("UseResilientHttp") == bool.TrueString) + if (configuration.GetValue("UseResilientHttp") == bool.TrueString) { services.AddSingleton(sp => { @@ -84,15 +195,15 @@ namespace Microsoft.eShopOnContainers.WebMVC var httpContextAccessor = sp.GetRequiredService(); var retryCount = 6; - if (!string.IsNullOrEmpty(Configuration["HttpClientRetryCount"])) + if (!string.IsNullOrEmpty(configuration["HttpClientRetryCount"])) { - retryCount = int.Parse(Configuration["HttpClientRetryCount"]); + retryCount = int.Parse(configuration["HttpClientRetryCount"]); } var exceptionsAllowedBeforeBreaking = 5; - if (!string.IsNullOrEmpty(Configuration["HttpClientExceptionsAllowedBeforeBreaking"])) + if (!string.IsNullOrEmpty(configuration["HttpClientExceptionsAllowedBeforeBreaking"])) { - exceptionsAllowedBeforeBreaking = int.Parse(Configuration["HttpClientExceptionsAllowedBeforeBreaking"]); + exceptionsAllowedBeforeBreaking = int.Parse(configuration["HttpClientExceptionsAllowedBeforeBreaking"]); } return new ResilientHttpClientFactory(logger, httpContextAccessor, exceptionsAllowedBeforeBreaking, retryCount); @@ -103,18 +214,25 @@ namespace Microsoft.eShopOnContainers.WebMVC { services.AddSingleton(); } - var useLoadTest = Configuration.GetValue("UseLoadTest"); - var identityUrl = Configuration.GetValue("IdentityUrl"); - var callBackUrl = Configuration.GetValue("CallBackUrl"); - + + return services; + } + public static IServiceCollection AddCustomAuthentication(this IServiceCollection services, IConfiguration configuration) + { + var useLoadTest = configuration.GetValue("UseLoadTest"); + var identityUrl = configuration.GetValue("IdentityUrl"); + var callBackUrl = configuration.GetValue("CallBackUrl"); + // Add Authentication services - - services.AddAuthentication(options => { + + services.AddAuthentication(options => + { options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; }) .AddCookie() - .AddOpenIdConnect(options => { + .AddOpenIdConnect(options => + { options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.Authority = identityUrl.ToString(); options.SignedOutRedirectUri = callBackUrl.ToString(); @@ -133,81 +251,10 @@ namespace Microsoft.eShopOnContainers.WebMVC options.Scope.Add("webshoppingagg"); options.Scope.Add("orders.signalrhub"); }); - } - - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) - { - JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); - - loggerFactory.AddConsole(Configuration.GetSection("Logging")); - loggerFactory.AddDebug(); - loggerFactory.AddAzureWebAppDiagnostics(); - loggerFactory.AddApplicationInsights(app.ApplicationServices, LogLevel.Trace); - - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - else - { - app.UseExceptionHandler("/Error"); - } - - var pathBase = Configuration["PATH_BASE"]; - if (!string.IsNullOrEmpty(pathBase)) - { - loggerFactory.CreateLogger("init").LogDebug($"Using PATH BASE '{pathBase}'"); - app.UsePathBase(pathBase); - } - -#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously - app.Map("/liveness", lapp => lapp.Run(async ctx => ctx.Response.StatusCode = 200)); -#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously - - app.UseSession(); - app.UseStaticFiles(); - - if (Configuration.GetValue("UseLoadTest")) - { - app.UseMiddleware(); - } - - app.UseAuthentication(); - - var log = loggerFactory.CreateLogger("identity"); - - WebContextSeed.Seed(app, env, loggerFactory); - - app.UseMvc(routes => - { - routes.MapRoute( - name: "default", - template: "{controller=Catalog}/{action=Index}/{id?}"); - - routes.MapRoute( - name: "defaultError", - template: "{controller=Error}/{action=Error}"); - }); + return services; } - private void RegisterAppInsights(IServiceCollection services) - { - services.AddApplicationInsightsTelemetry(Configuration); - var orchestratorType = Configuration.GetValue("OrchestratorType"); - - if (orchestratorType?.ToUpper() == "K8S") - { - // Enable K8s telemetry initializer - services.EnableKubernetes(); - } - if (orchestratorType?.ToUpper() == "SF") - { - // Enable SF telemetry initializer - services.AddSingleton((serviceProvider) => - new FabricTelemetryInitializer()); - } - } } + } diff --git a/src/Web/WebMVC/WebMVC.csproj b/src/Web/WebMVC/WebMVC.csproj index 2c102e98f..771225c06 100644 --- a/src/Web/WebMVC/WebMVC.csproj +++ b/src/Web/WebMVC/WebMVC.csproj @@ -23,6 +23,7 @@ + From 684aa4927f2234105a4e058acb482989cf9edef7 Mon Sep 17 00:00:00 2001 From: eiximenis Date: Wed, 16 May 2018 14:45:15 +0200 Subject: [PATCH 05/33] Updates to make it work with Docker - Dockerfiles changes - Minor csproj updates to bring back "dotnet bundle" cli - Enable all protocols in SignalR - Update package-lock.json in spa --- .../Mobile.Bff.Shopping/aggregator/Dockerfile | 2 +- .../Web.Bff.Shopping/aggregator/Dockerfile | 2 +- src/Services/Basket/Basket.API/Dockerfile | 2 +- src/Services/Catalog/Catalog.API/Dockerfile | 2 +- src/Services/Catalog/Catalog.API/Startup.cs | 3 +- src/Services/Identity/Identity.API/Dockerfile | 5 +- .../Identity/Identity.API/Identity.API.csproj | 4 + .../Location/Locations.API/Dockerfile | 2 +- .../Marketing/Marketing.API/Dockerfile | 2 +- src/Services/Ordering/Ordering.API/Dockerfile | 2 +- .../Ordering.BackgroundTasks/Dockerfile | 2 +- .../Ordering/Ordering.SignalrHub/Dockerfile | 8 +- .../Ordering/Ordering.SignalrHub/Startup.cs | 2 +- src/Services/Payment/Payment.API/Dockerfile | 2 +- src/Web/WebMVC/Dockerfile | 5 +- src/Web/WebMVC/WebMVC.csproj | 5 + src/Web/WebSPA/Dockerfile | 5 +- src/Web/WebSPA/package-lock.json | 16823 +++++++--------- src/Web/WebStatus/Dockerfile | 2 +- 19 files changed, 6883 insertions(+), 9997 deletions(-) diff --git a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Dockerfile b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Dockerfile index 6acdac235..7787dd159 100644 --- a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Dockerfile +++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Dockerfile @@ -5,8 +5,8 @@ EXPOSE 80 FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY . . -RUN dotnet restore -nowarn:msb3202,nu1503 WORKDIR /src/src/ApiGateways/Mobile.Bff.Shopping/aggregator +RUN dotnet restore -nowarn:msb3202,nu1503 RUN dotnet build --no-restore -c Release -o /app FROM build AS publish diff --git a/src/ApiGateways/Web.Bff.Shopping/aggregator/Dockerfile b/src/ApiGateways/Web.Bff.Shopping/aggregator/Dockerfile index 96772801a..d4940d436 100644 --- a/src/ApiGateways/Web.Bff.Shopping/aggregator/Dockerfile +++ b/src/ApiGateways/Web.Bff.Shopping/aggregator/Dockerfile @@ -5,8 +5,8 @@ EXPOSE 80 FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY . . -RUN dotnet restore -nowarn:msb3202,nu1503 WORKDIR /src/src/ApiGateways/Web.Bff.Shopping/aggregator +RUN dotnet restore -nowarn:msb3202,nu1503 RUN dotnet build --no-restore -c Release -o /app FROM build AS publish diff --git a/src/Services/Basket/Basket.API/Dockerfile b/src/Services/Basket/Basket.API/Dockerfile index 21a86a5ed..7027cfc2d 100644 --- a/src/Services/Basket/Basket.API/Dockerfile +++ b/src/Services/Basket/Basket.API/Dockerfile @@ -5,8 +5,8 @@ EXPOSE 80 FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY . . -RUN dotnet restore -nowarn:msb3202,nu1503 WORKDIR /src/src/Services/Basket/Basket.API +RUN dotnet restore -nowarn:msb3202,nu1503 RUN dotnet build --no-restore -c Release -o /app FROM build AS publish diff --git a/src/Services/Catalog/Catalog.API/Dockerfile b/src/Services/Catalog/Catalog.API/Dockerfile index f7a13f611..4cbc9c8aa 100644 --- a/src/Services/Catalog/Catalog.API/Dockerfile +++ b/src/Services/Catalog/Catalog.API/Dockerfile @@ -5,8 +5,8 @@ EXPOSE 80 FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY . . -RUN dotnet restore -nowarn:msb3202,nu1503 WORKDIR /src/src/Services/Catalog/Catalog.API +RUN dotnet restore -nowarn:msb3202,nu1503 RUN dotnet build --no-restore -c Release -o /app FROM build AS publish diff --git a/src/Services/Catalog/Catalog.API/Startup.cs b/src/Services/Catalog/Catalog.API/Startup.cs index a6c17995b..408f870af 100644 --- a/src/Services/Catalog/Catalog.API/Startup.cs +++ b/src/Services/Catalog/Catalog.API/Startup.cs @@ -47,6 +47,7 @@ namespace Microsoft.eShopOnContainers.Services.Catalog.API .AddCustomMVC(Configuration) .AddCustomDbContext(Configuration) .AddCustomOptions(Configuration) + .AddIntegrationServices(Configuration) .AddEventBus(Configuration) .AddSwagger(); @@ -228,7 +229,7 @@ namespace Microsoft.eShopOnContainers.Services.Catalog.API } - public static IServiceCollection AddIntegrationServices(IServiceCollection services, IConfiguration configuration) + public static IServiceCollection AddIntegrationServices(this IServiceCollection services, IConfiguration configuration) { services.AddTransient>( sp => (DbConnection c) => new IntegrationEventLogService(c)); diff --git a/src/Services/Identity/Identity.API/Dockerfile b/src/Services/Identity/Identity.API/Dockerfile index 43174ce03..cdb915d3a 100644 --- a/src/Services/Identity/Identity.API/Dockerfile +++ b/src/Services/Identity/Identity.API/Dockerfile @@ -2,11 +2,12 @@ FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 -FROM microsoft/dotnet:2.1-sdk AS build +FROM microsoft/aspnetcore-build:2.1.300-preview1 as build +RUN npm install -g bower@1.8.4 WORKDIR /src COPY . . -RUN dotnet restore -nowarn:msb3202,nu1503 WORKDIR /src/src/Services/Identity/Identity.API +RUN dotnet restore -nowarn:msb3202,nu1503 RUN dotnet build --no-restore -c Release -o /app FROM build AS publish diff --git a/src/Services/Identity/Identity.API/Identity.API.csproj b/src/Services/Identity/Identity.API/Identity.API.csproj index f531e418a..1eea44cee 100644 --- a/src/Services/Identity/Identity.API/Identity.API.csproj +++ b/src/Services/Identity/Identity.API/Identity.API.csproj @@ -31,6 +31,10 @@ + + + + diff --git a/src/Services/Location/Locations.API/Dockerfile b/src/Services/Location/Locations.API/Dockerfile index 8c946fa5e..12ac0e442 100644 --- a/src/Services/Location/Locations.API/Dockerfile +++ b/src/Services/Location/Locations.API/Dockerfile @@ -5,8 +5,8 @@ EXPOSE 80 FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY . . -RUN dotnet restore -nowarn:msb3202,nu1503 WORKDIR /src/src/Services/Location/Locations.API +RUN dotnet restore -nowarn:msb3202,nu1503 RUN dotnet build --no-restore -c Release -o /app FROM build AS publish diff --git a/src/Services/Marketing/Marketing.API/Dockerfile b/src/Services/Marketing/Marketing.API/Dockerfile index 2fd11e2d6..75d698bfe 100644 --- a/src/Services/Marketing/Marketing.API/Dockerfile +++ b/src/Services/Marketing/Marketing.API/Dockerfile @@ -5,8 +5,8 @@ EXPOSE 80 FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY . . -RUN dotnet restore -nowarn:msb3202,nu1503 WORKDIR /src/src/Services/Marketing/Marketing.API +RUN dotnet restore -nowarn:msb3202,nu1503 RUN dotnet build --no-restore -c Release -o /app FROM build AS publish diff --git a/src/Services/Ordering/Ordering.API/Dockerfile b/src/Services/Ordering/Ordering.API/Dockerfile index ecb24f808..78c153641 100644 --- a/src/Services/Ordering/Ordering.API/Dockerfile +++ b/src/Services/Ordering/Ordering.API/Dockerfile @@ -5,8 +5,8 @@ EXPOSE 80 FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY . . -RUN dotnet restore -nowarn:msb3202,nu1503 WORKDIR /src/src/Services/Ordering/Ordering.API +RUN dotnet restore -nowarn:msb3202,nu1503 RUN dotnet build --no-restore -c Release -o /app FROM build AS publish diff --git a/src/Services/Ordering/Ordering.BackgroundTasks/Dockerfile b/src/Services/Ordering/Ordering.BackgroundTasks/Dockerfile index 80788cd1d..0c01dcb96 100644 --- a/src/Services/Ordering/Ordering.BackgroundTasks/Dockerfile +++ b/src/Services/Ordering/Ordering.BackgroundTasks/Dockerfile @@ -5,8 +5,8 @@ EXPOSE 80 FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY . . -RUN dotnet restore -nowarn:msb3202,nu1503 WORKDIR /src/src/Services/Ordering/Ordering.BackgroundTasks +RUN dotnet restore -nowarn:msb3202,nu1503 RUN dotnet build --no-restore -c Release -o /app FROM build AS publish diff --git a/src/Services/Ordering/Ordering.SignalrHub/Dockerfile b/src/Services/Ordering/Ordering.SignalrHub/Dockerfile index f2fa72f8d..367b8db36 100644 --- a/src/Services/Ordering/Ordering.SignalrHub/Dockerfile +++ b/src/Services/Ordering/Ordering.SignalrHub/Dockerfile @@ -4,15 +4,13 @@ EXPOSE 80 FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src -COPY eShopOnContainers-ServicesAndWebApps.sln ./ -COPY src/Services/Ordering/Ordering.SignalrHub/Ordering.SignalrHub.csproj src/Services/Ordering/Ordering.SignalrHub/ -RUN dotnet restore -nowarn:msb3202,nu1503 COPY . . WORKDIR /src/src/Services/Ordering/Ordering.SignalrHub -RUN dotnet build Ordering.SignalrHub.csproj -c Release -o /app +RUN dotnet restore -nowarn:msb3202,nu1503 +RUN dotnet build --no-restore Ordering.SignalrHub.csproj -c Release -o /app FROM build AS publish -RUN dotnet publish Ordering.SignalrHub.csproj -c Release -o /app +RUN dotnet publish --no-restore Ordering.SignalrHub.csproj -c Release -o /app FROM base AS final WORKDIR /app diff --git a/src/Services/Ordering/Ordering.SignalrHub/Startup.cs b/src/Services/Ordering/Ordering.SignalrHub/Startup.cs index 927bb6d74..25a8b22d9 100644 --- a/src/Services/Ordering/Ordering.SignalrHub/Startup.cs +++ b/src/Services/Ordering/Ordering.SignalrHub/Startup.cs @@ -134,7 +134,7 @@ namespace Ordering.SignalrHub app.UseSignalR(routes => { routes.MapHub("/notificationhub", options => - options.Transports = Microsoft.AspNetCore.Http.Connections.HttpTransportType.WebSockets); + options.Transports = Microsoft.AspNetCore.Http.Connections.HttpTransports.All); }); ConfigureEventBus(app); diff --git a/src/Services/Payment/Payment.API/Dockerfile b/src/Services/Payment/Payment.API/Dockerfile index 0f1311671..d644417c6 100644 --- a/src/Services/Payment/Payment.API/Dockerfile +++ b/src/Services/Payment/Payment.API/Dockerfile @@ -5,8 +5,8 @@ EXPOSE 80 FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY . . -RUN dotnet restore -nowarn:msb3202,nu1503 WORKDIR /src/src/Services/Payment/Payment.API +RUN dotnet restore -nowarn:msb3202,nu1503 RUN dotnet build --no-restore -c Release -o /app FROM build AS publish diff --git a/src/Web/WebMVC/Dockerfile b/src/Web/WebMVC/Dockerfile index ccf3094fe..f7d3dbcc0 100644 --- a/src/Web/WebMVC/Dockerfile +++ b/src/Web/WebMVC/Dockerfile @@ -2,11 +2,12 @@ FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 -FROM microsoft/dotnet:2.1-sdk AS build +FROM microsoft/aspnetcore-build:2.1.300-preview1 AS build +RUN npm install -g bower@1.8.4 WORKDIR /src COPY . . -RUN dotnet restore -nowarn:msb3202,nu1503 WORKDIR /src/src/Web/WebMVC +RUN dotnet restore -nowarn:msb3202,nu1503 RUN dotnet build --no-restore -c Release -o /app FROM build AS publish diff --git a/src/Web/WebMVC/WebMVC.csproj b/src/Web/WebMVC/WebMVC.csproj index 2c102e98f..74d57c24e 100644 --- a/src/Web/WebMVC/WebMVC.csproj +++ b/src/Web/WebMVC/WebMVC.csproj @@ -34,6 +34,11 @@ + + + + + diff --git a/src/Web/WebSPA/Dockerfile b/src/Web/WebSPA/Dockerfile index 4f8d3ac66..7399a5b87 100644 --- a/src/Web/WebSPA/Dockerfile +++ b/src/Web/WebSPA/Dockerfile @@ -2,11 +2,12 @@ FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 -FROM microsoft/dotnet:2.1-sdk AS build +FROM microsoft/aspnetcore-build:2.1.300-preview1 AS build +RUN npm i -g npm WORKDIR /src COPY . . -RUN dotnet restore -nowarn:msb3202,nu1503 WORKDIR /src/src/Web/WebSPA +RUN dotnet restore -nowarn:msb3202,nu1503 RUN dotnet build --no-restore -c Release -o /app FROM build AS publish diff --git a/src/Web/WebSPA/package-lock.json b/src/Web/WebSPA/package-lock.json index 029914660..4d3876bf6 100644 --- a/src/Web/WebSPA/package-lock.json +++ b/src/Web/WebSPA/package-lock.json @@ -5,266 +5,300 @@ "requires": true, "dependencies": { "@angular-devkit/build-optimizer": { - "version": "0.0.13", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.0.13.tgz", - "integrity": "sha1-zzl692q+iZqpCdSnNRBmlMofCM8=", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.3.2.tgz", + "integrity": "sha512-U0BCZtThq5rUfY08shHXpxe8ZhSsiYB/cJjUvAWRTs/ORrs8pbngS6xwseQws8d/vHoVrtqGD9GU9h8AmFRERQ==", "dev": true, "requires": { "loader-utils": "1.1.0", - "source-map": "0.5.6", - "typescript": "2.4.2" + "source-map": "0.5.7", + "typescript": "2.6.2", + "webpack-sources": "1.1.0" }, "dependencies": { + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + }, "typescript": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.4.2.tgz", - "integrity": "sha1-+DlfhdRZJ2BnyYiqQYN6j4KHCEQ=", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", + "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", "dev": true } } }, + "@angular-devkit/core": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.3.2.tgz", + "integrity": "sha512-zABk/iP7YX5SVbmK4e+IX7j2d0D37MQJQiKgWdV3JzfvVJhNJzddiirtT980pIafoq+KyvTgVwXtc+vnux0oeQ==", + "dev": true, + "requires": { + "ajv": "5.5.2", + "chokidar": "1.7.0", + "rxjs": "5.5.10", + "source-map": "0.5.7" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + } + } + }, + "@angular-devkit/schematics": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.3.2.tgz", + "integrity": "sha512-B6zZoqvHaTJy+vVdA6EtlxnCdGMa5elCa4j9lQLC3JI8DLvMXUWkCIPVbPzJ/GSRR9nsKWpvYMYaJyfBDUqfhw==", + "dev": true, + "requires": { + "@ngtools/json-schema": "1.2.0", + "rxjs": "5.5.10" + } + }, "@angular/animations": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-4.4.3.tgz", - "integrity": "sha1-OWxKW/sihH+eRYJFuplfnBMMDPM=", + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-4.4.7.tgz", + "integrity": "sha512-clP1xZw3KCfdj5rGDies5L5iwLgXzVFQ/B66Yj9oc24mJyK9oZARmuXdHfu+y8YtlW2b3wNSK2JH3qygaxbNLA==", "requires": { - "tslib": "1.7.1" + "tslib": "1.9.1" } }, "@angular/cli": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-1.3.0.tgz", - "integrity": "sha1-FA/mmFCKjAI7S32gHAzAY89xEBg=", - "dev": true, - "requires": { - "@angular-devkit/build-optimizer": "0.0.13", - "@ngtools/json-schema": "1.1.0", - "@ngtools/webpack": "1.6.0", - "autoprefixer": "6.7.7", - "chalk": "2.1.0", - "circular-dependency-plugin": "3.0.0", - "common-tags": "1.4.0", - "core-object": "3.1.4", - "css-loader": "0.28.4", - "cssnano": "3.10.0", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-1.7.4.tgz", + "integrity": "sha512-URdb1QtnQf+Ievy93wjq7gE81s25BkWUwJFPey+YkphBA3G1lbCAQPiEh2pntBwaIKavgEuCw+Sf2YZdgTVhDA==", + "dev": true, + "requires": { + "@angular-devkit/build-optimizer": "0.3.2", + "@angular-devkit/core": "0.3.2", + "@angular-devkit/schematics": "0.3.2", + "@ngtools/json-schema": "1.2.0", + "@ngtools/webpack": "1.10.2", + "@schematics/angular": "0.3.2", + "@schematics/package-update": "0.3.2", + "ajv": "6.5.0", + "autoprefixer": "7.2.6", + "cache-loader": "1.2.2", + "chalk": "2.2.2", + "circular-dependency-plugin": "4.4.0", + "clean-css": "4.1.11", + "common-tags": "1.7.2", + "copy-webpack-plugin": "4.4.3", + "core-object": "3.1.5", "denodeify": "1.2.1", - "diff": "3.3.0", - "ember-cli-normalize-entity-name": "1.0.0", "ember-cli-string-utils": "1.1.0", - "exports-loader": "0.6.4", - "extract-text-webpack-plugin": "3.0.0", - "file-loader": "0.10.1", - "fs-extra": "4.0.1", - "get-caller-file": "1.0.2", + "extract-text-webpack-plugin": "3.0.2", + "file-loader": "1.1.11", + "fs-extra": "4.0.3", "glob": "7.1.2", - "heimdalljs": "0.2.5", - "heimdalljs-logger": "0.1.9", "html-webpack-plugin": "2.30.1", - "inflection": "1.12.0", - "inquirer": "3.2.1", - "isbinaryfile": "3.0.2", - "istanbul-instrumenter-loader": "2.0.0", - "karma-source-map-support": "1.2.0", - "less": "2.7.2", - "less-loader": "4.0.5", - "license-webpack-plugin": "0.5.1", - "lodash": "4.17.4", + "istanbul-instrumenter-loader": "3.0.1", + "karma-source-map-support": "1.3.0", + "less": "2.7.3", + "less-loader": "4.1.0", + "license-webpack-plugin": "1.3.1", + "loader-utils": "1.1.0", + "lodash": "4.17.10", "memory-fs": "0.4.1", "minimatch": "3.0.4", "node-modules-path": "1.0.1", - "node-sass": "4.5.3", + "node-sass": "4.9.0", "nopt": "4.0.1", "opn": "5.1.0", "portfinder": "1.0.13", - "postcss-loader": "1.3.3", - "postcss-url": "5.1.2", + "postcss": "6.0.22", + "postcss-import": "11.1.0", + "postcss-loader": "2.1.5", + "postcss-url": "7.3.2", "raw-loader": "0.5.1", - "resolve": "1.4.0", - "rsvp": "3.6.2", - "rxjs": "5.4.2", - "sass-loader": "6.0.6", - "script-loader": "0.7.0", - "semver": "5.4.1", + "resolve": "1.7.1", + "rxjs": "5.5.10", + "sass-loader": "6.0.7", + "semver": "5.5.0", "silent-error": "1.1.0", - "source-map-loader": "0.2.1", - "source-map-support": "0.4.15", - "style-loader": "0.13.2", + "source-map-support": "0.4.18", + "style-loader": "0.19.1", "stylus": "0.54.5", - "stylus-loader": "3.0.1", - "temp": "0.8.3", - "typescript": "2.4.2", - "url-loader": "0.5.7", - "walk-sync": "0.3.2", - "webpack": "3.4.1", - "webpack-dev-middleware": "1.12.0", - "webpack-dev-server": "2.5.1", - "webpack-merge": "4.1.0", - "zone.js": "0.8.16" + "stylus-loader": "3.0.2", + "uglifyjs-webpack-plugin": "1.2.5", + "url-loader": "0.6.2", + "webpack": "3.11.0", + "webpack-dev-middleware": "1.12.2", + "webpack-dev-server": "2.11.2", + "webpack-merge": "4.1.2", + "webpack-sources": "1.1.0", + "webpack-subresource-integrity": "1.0.4" }, "dependencies": { "file-loader": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-0.10.1.tgz", - "integrity": "sha1-gVA0EZiR/GRB+1pkwRvJPCLd2EI=", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", + "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", "dev": true, "requires": { - "loader-utils": "1.1.0" + "loader-utils": "1.1.0", + "schema-utils": "0.4.5" } }, - "typescript": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.4.2.tgz", - "integrity": "sha1-+DlfhdRZJ2BnyYiqQYN6j4KHCEQ=", - "dev": true + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + }, + "url-loader": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz", + "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "mime": "1.6.0", + "schema-utils": "0.3.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "5.5.2" + } + } + } } } }, "@angular/common": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-4.3.3.tgz", - "integrity": "sha1-H6++ozr066TN3YZ371eg92pQSIw=", + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-4.4.7.tgz", + "integrity": "sha512-5R0POjbT4CR+8vXS7P33SiozJpTEKDsHq07EMm90OCwoofU5DIKDLNyEqr362zsbpzGUTmhGbSiLZib5Qt4djA==", "requires": { - "tslib": "1.7.1" + "tslib": "1.9.1" } }, "@angular/compiler": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-4.3.3.tgz", - "integrity": "sha1-jBWC/iinhEATJeUaBKmza2cSAz4=", + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-4.4.7.tgz", + "integrity": "sha512-aiRh86RqHMTgJ7xckQWzG2UTnq23+WuDVhYh/QL19R43areZLglqgtKSkfezg9aatO5CGzxDA3qL5WGhccQ5EQ==", "requires": { - "tslib": "1.7.1" + "tslib": "1.9.1" } }, "@angular/compiler-cli": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-4.3.3.tgz", - "integrity": "sha1-s+OZkdGirBRFpKehIuKdzlSSxjc=", + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-4.4.7.tgz", + "integrity": "sha512-vzphs9galtMV29CW+ihp6v0HwSQrjAFqs04swqt9o0jEJET6/mPi1EFjJRNZiFn6ghh6lxUPr3vThy7CrSNxHg==", "dev": true, "requires": { - "@angular/tsc-wrapped": "4.3.3", + "@angular/tsc-wrapped": "4.4.7", "minimist": "1.2.0", - "reflect-metadata": "0.1.10" + "reflect-metadata": "0.1.12" }, "dependencies": { - "@angular/tsc-wrapped": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@angular/tsc-wrapped/-/tsc-wrapped-4.3.3.tgz", - "integrity": "sha1-xYkPdDZkvmS3nCAK5unaXSqAH1s=", - "dev": true, - "requires": { - "tsickle": "0.21.6" - } - }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "reflect-metadata": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.10.tgz", - "integrity": "sha1-tPg3BEFqytiZiMmxVjXUfgO5NEo=", - "dev": true - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, - "source-map-support": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", - "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=", - "dev": true, - "requires": { - "source-map": "0.5.6" - } - }, - "tsickle": { - "version": "0.21.6", - "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.21.6.tgz", - "integrity": "sha1-U7Abl5xcE/2xOvs/uVgXflmRWI0=", - "dev": true, - "requires": { - "minimist": "1.2.0", - "mkdirp": "0.5.1", - "source-map": "0.5.6", - "source-map-support": "0.4.15" - } } } }, "@angular/core": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-4.3.3.tgz", - "integrity": "sha1-jmp2kUZh20B/otiN0kQcTAFv9iU=", + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-4.4.7.tgz", + "integrity": "sha512-Jxs6gNTl5KjXflg5vi5rlnokq1johFccN94qSOgDv+Mg1iuGF2i9p7EHkw3Y8jBCVaSLw1qgHE+wMb6KTlJDLA==", "requires": { - "tslib": "1.7.1" + "tslib": "1.9.1" } }, "@angular/forms": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-4.3.3.tgz", - "integrity": "sha1-CRKuu4GKF29OCLffDsn9QCHvy2s=", + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-4.4.7.tgz", + "integrity": "sha512-EXGutI4GNBptpwkCQdCTxWAlJll8aCV7m3cA1FHZgFP7VNSgYF0pD+PscM5jSeajG30cRjaKxgL4cqj6yMMtww==", "requires": { - "tslib": "1.7.1" + "tslib": "1.9.1" } }, "@angular/http": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@angular/http/-/http-4.3.3.tgz", - "integrity": "sha1-y+NjkBA2K2gQdvC2Bmc6DmL9lA0=", + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/@angular/http/-/http-4.4.7.tgz", + "integrity": "sha512-9XrvXFVuHsAfVlIbM6Em2EouKiRyV2y4nPA+dAUd/9uB9i/i+FzZlmmeSIvP7ePnm6QyAC6nlvy9FMQYwvrtNA==", "requires": { - "tslib": "1.7.1" + "tslib": "1.9.1" } }, "@angular/platform-browser": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-4.3.3.tgz", - "integrity": "sha1-Yjtll5TweQltT3aFtL68tJ47mnE=", + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-4.4.7.tgz", + "integrity": "sha512-5WGMhUbaepmNoE597N/6R4jDdSqe4wwJblfi6bOJI34QStmD6QRnmg3H7ujr8lLhRBo9P3zH+hn7bM3RxUIEJg==", "requires": { - "tslib": "1.7.1" + "tslib": "1.9.1" } }, "@angular/platform-browser-dynamic": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-4.3.3.tgz", - "integrity": "sha1-sWwJ3+l7W4PaoFgbIz9eo8Pu+zo=", + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-4.4.7.tgz", + "integrity": "sha512-or6CB+LzK8zYn7K4rif32UvVadnbdrqBiT+5Yai1szNUUKuseqx2h1dsEgJQamkajsOUM7zjLYq4LrKJEEcm8A==", "requires": { - "tslib": "1.7.1" + "tslib": "1.9.1" } }, "@angular/router": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-4.3.3.tgz", - "integrity": "sha1-8/kATsMbT+TRVHfh5j4RjfNq1G0=", + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-4.4.7.tgz", + "integrity": "sha512-WaVnBP41UdrUwReSUgB5YE6C37PrYFSaiFAoPRTx4RC0jeRE+ncFWwessVIh0kvfEK4ROkO3QK2BtLzMUY5GNg==", "requires": { - "tslib": "1.7.1" + "tslib": "1.9.1" + } + }, + "@angular/tsc-wrapped": { + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/@angular/tsc-wrapped/-/tsc-wrapped-4.4.7.tgz", + "integrity": "sha512-R9w7sTU+HSTMPOa4NgvPL753qB6aqnPc1AVh2rwSl5FOpLS/AeeyzIhRnBsVXGrZrTcBQVLp/Cxg1oUSXE2k4Q==", + "dev": true, + "requires": { + "tsickle": "0.21.6" } }, "@aspnet/signalr": { "version": "1.0.0-preview2-final", "resolved": "https://registry.npmjs.org/@aspnet/signalr/-/signalr-1.0.0-preview2-final.tgz", - "integrity": "sha1-d2Uv0LWiLeZESl6XRVznv/vJIRY=" + "integrity": "sha512-XbqGbAG9Ow4L5Sc4n81A2S8lHSlxBNTjFm3WZQA94cIolPnW0bPK2u14UMooXRXxzjBtJViJMN/aoxWRwTWxig==" }, "@ng-bootstrap/ng-bootstrap": { "version": "1.0.0-alpha.22", @@ -272,20 +306,66 @@ "integrity": "sha1-qq0FjMOSk+phhOS5uEnymMCxGoY=" }, "@ngtools/json-schema": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@ngtools/json-schema/-/json-schema-1.1.0.tgz", - "integrity": "sha1-w6DFRNYjkqzCgTpCyKDcb1j4aSI=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ngtools/json-schema/-/json-schema-1.2.0.tgz", + "integrity": "sha512-pMh+HDc6mOjUO3agRfB1tInimo7hf67u+0Cska2bfXFe6oU7rSMnr5PLVtiZVgwMoBHpx/6XjBymvcnWPo2Uzg==", "dev": true }, "@ngtools/webpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-1.6.0.tgz", - "integrity": "sha1-YmLxECg/y/76KtRbx5wshVw5Y7s=", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-1.10.2.tgz", + "integrity": "sha512-3u2zg2rarG3qNLSukBClGADWuq/iNn5SQtlSeAbfKzwBeyLGbF0gN1z1tVx1Bcr8YwFzR6NdRePQmJGcoqq1fg==", "dev": true, "requires": { + "chalk": "2.2.2", + "enhanced-resolve": "3.4.1", "loader-utils": "1.1.0", - "magic-string": "0.22.4", - "source-map": "0.5.6" + "magic-string": "0.22.5", + "semver": "5.5.0", + "source-map": "0.5.7", + "tree-kill": "1.2.0", + "webpack-sources": "1.1.0" + }, + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + } + } + }, + "@schematics/angular": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.3.2.tgz", + "integrity": "sha512-Elrk0BA951s0ScFZU0AWrpUeJBYVR52DZ1QTIO5R0AhwEd1PW4olI8szPLGQlVW5Sd6H0FA/fyFLIvn2r9v6Rw==", + "dev": true, + "requires": { + "typescript": "2.6.2" + }, + "dependencies": { + "typescript": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", + "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", + "dev": true + } + } + }, + "@schematics/package-update": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@schematics/package-update/-/package-update-0.3.2.tgz", + "integrity": "sha512-7aVP4994Hu8vRdTTohXkfGWEwLhrdNP3EZnWyBootm5zshWqlQojUGweZe5zwewsKcixeVOiy2YtW+aI4aGSLA==", + "dev": true, + "requires": { + "rxjs": "5.5.10", + "semver": "5.5.0", + "semver-intersect": "1.3.1" } }, "@types/core-js": { @@ -307,9 +387,9 @@ "dev": true }, "@types/node": { - "version": "6.0.85", - "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.85.tgz", - "integrity": "sha1-7AK/5UphBE8r5E8Ts4nGoOjuBa4=", + "version": "6.0.110", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.110.tgz", + "integrity": "sha512-LiaH3mF+OAqR+9Wo1OTJDbZDtCewAVjTbMhF1ZgUJ3fc8xqOJq6VqbpBh9dJVCVzByGmYIg2fREbuXNX0TKiJA==", "dev": true }, "@types/protractor": { @@ -328,25 +408,25 @@ "dev": true }, "abbrev": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", - "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, "accepts": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", - "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "dev": true, "requires": { - "mime-types": "2.1.16", + "mime-types": "2.1.18", "negotiator": "0.6.1" } }, "acorn": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", - "integrity": "sha1-U/4WERH5EquZnuiHqQoLxSgi/XU=", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", + "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", "dev": true }, "acorn-dynamic-import": { @@ -366,22 +446,47 @@ } } }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "3.3.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, "ajv": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.2.tgz", - "integrity": "sha1-R8aNaehvXZUxA7AHSpQw3GPaXjk=", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.0.tgz", + "integrity": "sha512-VDUX1oSajablmiyFyED9L1DFndg0P9h7p1F+NO8FkIzei6EPrR6Zu1n18rd5P8PqaSRd/FrWv3G1TVBqpM83gA==", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", + "fast-deep-equal": "2.0.1", + "fast-json-stable-stringify": "2.0.0", "json-schema-traverse": "0.3.1", - "json-stable-stringify": "1.0.1" + "uri-js": "4.2.1" + }, + "dependencies": { + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + } } }, "ajv-keywords": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.0.tgz", - "integrity": "sha1-opbhf3v658HOT34N5T0pyzIWLfA=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", "dev": true }, "align-text": { @@ -395,22 +500,58 @@ "repeat-string": "1.6.1" } }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, "amdefine": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true }, - "ansi-escapes": { + "ansi-align": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", - "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", "dev": true }, "ansi-html": { @@ -426,25 +567,40 @@ "dev": true }, "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", "dev": true }, "anymatch": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "dev": true, "requires": { "micromatch": "2.3.11", "normalize-path": "2.1.1" } }, + "app-root-path": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.0.1.tgz", + "integrity": "sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y=", + "dev": true + }, "aproba": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.2.tgz", - "integrity": "sha1-RcZikJTeTpb2k+9+q3SuB5wkD8E=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, "are-we-there-yet": { @@ -454,75 +610,13 @@ "dev": true, "requires": { "delegates": "1.0.0", - "readable-stream": "2.3.3" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - } + "readable-stream": "2.3.6" } }, "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { "sprintf-js": "1.0.3" @@ -540,7 +634,13 @@ "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, "array-find-index": { @@ -555,6 +655,16 @@ "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", "dev": true }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.11.0" + } + }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -576,6 +686,12 @@ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", "dev": true }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -587,18 +703,17 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true, - "optional": true + "dev": true }, "asn1.js": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz", - "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "requires": { "bn.js": "4.11.8", "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "minimalistic-assert": "1.0.1" } }, "assert": { @@ -614,16 +729,21 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true, - "optional": true + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true }, "async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha1-hDGQ/WtzV6C54clW7d3V7IRitU0=", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "dev": true, "requires": { - "lodash": "4.17.4" + "lodash": "4.17.10" } }, "async-each": { @@ -643,20 +763,25 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true, - "optional": true + "dev": true + }, + "atob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", + "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", + "dev": true }, "autoprefixer": { - "version": "6.7.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", - "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", + "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==", "dev": true, "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000713", + "browserslist": "2.11.3", + "caniuse-lite": "1.0.30000841", "normalize-range": "0.1.2", "num2fraction": "1.2.2", - "postcss": "5.2.17", + "postcss": "6.0.22", "postcss-value-parser": "3.3.0" } }, @@ -664,20 +789,18 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true, - "optional": true + "dev": true }, "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", - "dev": true, - "optional": true + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", + "dev": true }, "babel-code-frame": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { "chalk": "1.1.3", @@ -685,6 +808,12 @@ "js-tokens": "3.0.2" }, "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", @@ -707,27 +836,19 @@ } }, "babel-generator": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz", - "integrity": "sha1-M6GvcNXyiQrrRlpKd5PB32qeqfw=", + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { "babel-messages": "6.23.0", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", "detect-indent": "4.0.0", "jsesc": "1.3.0", - "lodash": "4.17.4", - "source-map": "0.5.6", + "lodash": "4.17.10", + "source-map": "0.5.7", "trim-right": "1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - } } }, "babel-messages": { @@ -736,77 +857,144 @@ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "babel-runtime": "6.25.0" + "babel-runtime": "6.26.0" } }, "babel-runtime": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.25.0.tgz", - "integrity": "sha1-M7mOql1IK7AajRqmtDetKwGuxBw=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.0", - "regenerator-runtime": "0.10.5" + "core-js": "2.5.6", + "regenerator-runtime": "0.11.1" } }, "babel-template": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "babel-runtime": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "lodash": "4.17.4" + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.10" } }, "babel-traverse": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "babel-code-frame": "6.22.0", + "babel-code-frame": "6.26.0", "babel-messages": "6.23.0", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "debug": "2.6.8", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" + "invariant": "2.2.4", + "lodash": "4.17.10" } }, "babel-types": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "babel-runtime": "6.25.0", + "babel-runtime": "6.26.0", "esutils": "2.0.2", - "lodash": "4.17.4", + "lodash": "4.17.10", "to-fast-properties": "1.0.3" } }, "babylon": { - "version": "6.17.4", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", - "integrity": "sha1-Pot0AriNIsNCPhN6FXeIOxX/hpo=", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", "dev": true }, "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, "base64-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha1-qRlH2h9KUW6jjltOwOw3c2deCIY=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", "dev": true }, "batch": { @@ -826,15 +1014,14 @@ } }, "big.js": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", - "integrity": "sha1-TK2iGTZS6zyp7I5VyQFWacmAaXg=", - "dev": true + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" }, "binary-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.9.0.tgz", - "integrity": "sha1-ZlBsFs5vTWkopbPNajPKQelB43s=", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", "dev": true }, "block-stream": { @@ -845,29 +1032,52 @@ "optional": true, "requires": { "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true, - "optional": true - } } }, "bluebird": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", - "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", "dev": true }, "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", "dev": true }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.2", + "http-errors": "1.6.3", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.16" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + } + } + }, "bonjour": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", @@ -878,7 +1088,7 @@ "deep-equal": "1.0.1", "dns-equal": "1.0.0", "dns-txt": "2.0.2", - "multicast-dns": "6.1.1", + "multicast-dns": "6.2.3", "multicast-dns-service-types": "1.1.0" } }, @@ -902,38 +1112,72 @@ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.0.0-alpha.5.tgz", "integrity": "sha1-oSa2SMO9L1K4+tS7xeLQrSq/cGQ=", "requires": { - "jquery": "3.2.1", - "tether": "1.4.0" + "jquery": "3.3.1", + "tether": "1.4.4" + } + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "requires": { + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.2.2", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "2.0.0" }, "dependencies": { - "jquery": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz", - "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=" + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true }, - "tether": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/tether/-/tether-1.4.0.tgz", - "integrity": "sha1-D5+hcfdb9YSF2BSelHmdeudNHBo=" + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } } } }, "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - } } }, "braces": { @@ -954,33 +1198,34 @@ "dev": true }, "browserify-aes": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", - "integrity": "sha1-Xncl297x/Vkw1OurSFZ85FHEigo=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { "buffer-xor": "1.0.3", "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.0", - "inherits": "2.0.3" + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.3", + "safe-buffer": "5.1.2" } }, "browserify-cipher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "requires": { - "browserify-aes": "1.0.6", - "browserify-des": "1.0.0", - "evp_bytestokey": "1.0.0" + "browserify-aes": "1.2.0", + "browserify-des": "1.0.1", + "evp_bytestokey": "1.0.3" } }, "browserify-des": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", + "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", "dev": true, "requires": { "cipher-base": "1.0.4", @@ -995,7 +1240,7 @@ "dev": true, "requires": { "bn.js": "4.11.8", - "randombytes": "2.0.5" + "randombytes": "2.0.6" } }, "browserify-sign": { @@ -1006,30 +1251,30 @@ "requires": { "bn.js": "4.11.8", "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", "elliptic": "6.4.0", "inherits": "2.0.3", - "parse-asn1": "5.1.0" + "parse-asn1": "5.1.1" } }, "browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { - "pako": "0.2.9" + "pako": "1.0.6" } }, "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", + "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", "dev": true, "requires": { - "caniuse-db": "1.0.30000713", - "electron-to-chromium": "1.3.18" + "caniuse-lite": "1.0.30000841", + "electron-to-chromium": "1.3.46" } }, "buffer": { @@ -1038,23 +1283,21 @@ "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { - "base64-js": "1.2.1", - "ieee754": "1.1.8", + "base64-js": "1.3.0", + "ieee754": "1.1.11", "isarray": "1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } } }, + "buffer-from": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", + "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", + "dev": true + }, "buffer-indexof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.0.tgz", - "integrity": "sha1-9U9kfE9OJSKLqmVqLlfkPV8nCYI=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", "dev": true }, "buffer-xor": { @@ -1076,9 +1319,95 @@ "dev": true }, "bytes": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.5.0.tgz", - "integrity": "sha1-TJQj6i0lLCcMQbK97+/5u2tiwGo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "chownr": "1.0.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lru-cache": "4.1.3", + "mississippi": "2.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.6.2", + "ssri": "5.3.0", + "unique-filename": "1.1.0", + "y18n": "4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "cache-loader": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-1.2.2.tgz", + "integrity": "sha512-rsGh4SIYyB9glU+d0OcHwiXHXBoUgDhHZaQ1KAbiXqfz1CDPxtTboh1gPbJ0q2qdO8a9lfcjgC5CJ2Ms32y5bw==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "mkdirp": "0.5.1", + "neo-async": "2.5.1", + "schema-utils": "0.4.5" + }, + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + } + } + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", "dev": true }, "camel-case": { @@ -1087,7 +1416,7 @@ "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", "dev": true, "requires": { - "no-case": "2.3.1", + "no-case": "2.3.2", "upper-case": "1.1.3" } }, @@ -1107,22 +1436,16 @@ "map-obj": "1.0.1" } }, - "caniuse-api": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", - "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", - "dev": true, - "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000713", - "lodash.memoize": "4.1.2", - "lodash.uniq": "4.5.0" - } + "caniuse-lite": { + "version": "1.0.30000841", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000841.tgz", + "integrity": "sha512-LeOGLEY4hl6xZc/xMYOrVmSrHOybyHWNShFN51qCmDXo69nEGKHTJTfe6jdWe4hLxSJcwEIYtKHFFh93fF/kNA==", + "dev": true }, - "caniuse-db": { - "version": "1.0.30000713", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000713.tgz", - "integrity": "sha1-6gF2GEC18Uj6+U7F800KodMhlm8=", + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", "dev": true }, "caseless": { @@ -1140,51 +1463,17 @@ "requires": { "align-text": "0.1.4", "lazy-cache": "1.0.4" - }, - "dependencies": { - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - } } }, "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha1-rFvs8U+iG5nGySynp9fP1bF+dD4=", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.2.tgz", + "integrity": "sha512-LvixLAQ4MYhbf7hgL4o5PeK32gJKvVzDRiSNIApDofQvyhl8adgG2lJVXn4+ekQoK7HL9RF8lqxwerpe0x2pCw==", "dev": true, "requires": { - "ansi-styles": "3.2.0", + "ansi-styles": "3.2.1", "escape-string-regexp": "1.0.5", - "supports-color": "4.2.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", - "dev": true, - "requires": { - "color-convert": "1.9.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "supports-color": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", - "integrity": "sha1-ZaS7JjHpDgJCDbpVVMN1pHVLuDY=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "supports-color": "4.5.0" } }, "chokidar": { @@ -1195,7 +1484,7 @@ "requires": { "anymatch": "1.3.2", "async-each": "1.0.1", - "fsevents": "1.1.3", + "fsevents": "1.2.4", "glob-parent": "2.0.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -1204,111 +1493,143 @@ "readdirp": "2.1.0" } }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "dev": true + }, + "ci-info": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", + "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==", + "dev": true + }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "safe-buffer": "5.1.2" } }, "circular-dependency-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-3.0.0.tgz", - "integrity": "sha1-m2hpLjWw41EJmNAWS2rlARvqV2A=", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-4.4.0.tgz", + "integrity": "sha512-yEFtUNUYT4jBykEX5ZOHw+5goA3glGZr9wAXIQqoyakjz5H5TeUmScnWRc52douAhb9eYzK3s7V6bXfNnjFdzg==", "dev": true }, - "clap": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.0.tgz", - "integrity": "sha1-WckP4+E3EEdG/xlGmiemNP9oyFc=", + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "chalk": "1.1.3" + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" }, "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "is-descriptor": "0.1.6" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true } } }, "clean-css": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.7.tgz", - "integrity": "sha1-ua6k+FZ5iJzz6ui0A0nsTr390DI=", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", + "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=", "dev": true, "requires": { - "source-map": "0.5.6" + "source-map": "0.5.7" } }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "2.0.0" + "restore-cursor": "1.0.1" } }, "cli-width": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", - "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - } + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" } }, "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", "dev": true }, "clone-deep": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.3.0.tgz", - "integrity": "sha1-NIxhrpzb4O3+BT2R/0zFIdeQ7eg=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", + "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", "dev": true, "requires": { "for-own": "1.0.0", "is-plain-object": "2.0.4", - "kind-of": "3.2.2", - "shallow-clone": "0.1.2" + "kind-of": "6.0.2", + "shallow-clone": "1.0.0" + }, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } } }, "co": { @@ -1317,15 +1638,6 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, - "coa": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", - "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", - "dev": true, - "requires": { - "q": "1.5.0" - } - }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -1342,136 +1654,24 @@ "css-selector-tokenizer": "0.7.0", "cssauron": "1.4.0", "semver-dsl": "1.0.1", - "source-map": "0.5.6", - "sprintf-js": "1.1.1" - }, - "dependencies": { - "app-root-path": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.0.1.tgz", - "integrity": "sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y=", - "dev": true - }, - "css-selector-tokenizer": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", - "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", - "dev": true, - "requires": { - "cssesc": "0.1.0", - "fastparse": "1.1.1", - "regexpu-core": "1.0.0" - } - }, - "cssauron": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", - "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", - "dev": true, - "requires": { - "through": "2.3.8" - } - }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", - "dev": true - }, - "fastparse": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", - "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", - "dev": true - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "regenerate": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", - "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=", - "dev": true - }, - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "dev": true, - "requires": { - "regenerate": "1.3.2", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "0.5.0" - } - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "dev": true - }, - "semver-dsl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", - "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", - "dev": true, - "requires": { - "semver": "5.4.1" - } - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, - "sprintf-js": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz", - "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - } + "source-map": "0.5.7", + "sprintf-js": "1.0.3" } }, - "color": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", - "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { - "clone": "1.0.2", - "color-convert": "1.9.0", - "color-string": "0.3.0" + "map-visit": "1.0.0", + "object-visit": "1.0.1" } }, "color-convert": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", - "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "dev": true, "requires": { "color-name": "1.1.3" @@ -1483,78 +1683,78 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "colormin": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", - "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", - "dev": true, - "requires": { - "color": "0.11.4", - "css-color-names": "0.0.4", - "has": "1.0.1" - } - }, "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", "dev": true }, "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "dev": true, "requires": { "delayed-stream": "1.0.0" } }, "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha1-FXFS/R56bI2YpbcVzzdt+SgARWM=", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", "dev": true }, "common-tags": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.4.0.tgz", - "integrity": "sha1-EYe+Tz1M8MBCfUP3Tu8fc1AWFMA=", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.7.2.tgz", + "integrity": "sha512-joj9ZlUOjCrwdbmiLqafeUSgkUM74NqhLsZtSqDmhKudaIY197zTrb8JMl31fMnCUuxwFT23eC/oWvrZzDLRJQ==", "dev": true, "requires": { - "babel-runtime": "6.25.0" + "babel-runtime": "6.26.0" } }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, "compressible": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.11.tgz", - "integrity": "sha1-FnGKdd4oPtjmBAQWJaIGRYZ5fYo=", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz", + "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=", "dev": true, "requires": { - "mime-db": "1.29.0" + "mime-db": "1.33.0" } }, "compression": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.0.tgz", - "integrity": "sha1-AwyfGY8WQ6BX13anOOki2kNzAS0=", + "version": "1.7.2", + "resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz", + "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=", "dev": true, "requires": { - "accepts": "1.3.3", - "bytes": "2.5.0", - "compressible": "2.0.11", - "debug": "2.6.8", + "accepts": "1.3.5", + "bytes": "3.0.0", + "compressible": "2.0.13", + "debug": "2.6.9", "on-headers": "1.0.1", "safe-buffer": "5.1.1", - "vary": "1.1.1" + "vary": "1.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + } } }, "concat-map": { @@ -1563,10 +1763,36 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "1.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" + } + }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "dev": true, + "requires": { + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.3.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" + } + }, "connect-history-api-fallback": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz", - "integrity": "sha1-5R0X+PDvDbkKZP20feMFFVbp8Wk=", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", "dev": true }, "console-browserify": { @@ -1597,15 +1823,15 @@ "dev": true }, "content-type": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", - "integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "dev": true }, "convert-source-map": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", "dev": true }, "cookie": { @@ -1620,18 +1846,82 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", "dev": true }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "1.2.0", + "fs-write-stream-atomic": "1.0.10", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.4.3.tgz", + "integrity": "sha512-v4THQ24Tks2NkyOvZuFDgZVfDD9YaA9rwYLZTrWg2GHIA8lrH5DboEyeoorh5Skki+PUbgSmnsCwhMWqYrQZrA==", + "dev": true, + "requires": { + "cacache": "10.0.4", + "find-cache-dir": "1.0.0", + "globby": "7.1.1", + "is-glob": "4.0.0", + "loader-utils": "1.1.0", + "minimatch": "3.0.4", + "p-limit": "1.2.0", + "serialize-javascript": "1.5.0" + }, + "dependencies": { + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + } + } + }, "core-js": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.0.tgz", - "integrity": "sha1-VpwFCRi+ZIazg3VSAorgRmtxcIY=" + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.6.tgz", + "integrity": "sha512-lQUVfQi0aLix2xpyjrrJEvfuYCqPc/HwmTKsC/VNf8q0zsjX7SQZtp4+oRONN5Tsur9GDETPjj+Ub2iDiGZfSQ==" }, "core-object": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/core-object/-/core-object-3.1.4.tgz", - "integrity": "sha1-bfQB6FgSS+n3Vy9MSjTGFQlS1LY=", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/core-object/-/core-object-3.1.5.tgz", + "integrity": "sha512-sA2/4+/PZ/KV6CKgjrVrrUVBKCkdDO02CUlQ0YKTQoYUwPYNOtOAcWlbYhd5v/1JqYaA6oZ4sDlOU4ppVw6Wbg==", "dev": true, "requires": { - "chalk": "2.1.0" + "chalk": "2.2.2" } }, "core-util-is": { @@ -1643,11 +1933,11 @@ "cosmiconfig": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha1-YXPOvVb6wELB9DkO33r2wHx8uJI=", + "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", "dev": true, "requires": { "is-directory": "0.3.1", - "js-yaml": "3.7.0", + "js-yaml": "3.11.0", "minimist": "1.2.0", "object-assign": "4.1.1", "os-homedir": "1.0.2", @@ -1664,39 +1954,49 @@ } }, "create-ecdh": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "dev": true, "requires": { "bn.js": "4.11.8", "elliptic": "6.4.0" } }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "1.0.0" + } + }, "create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { "cipher-base": "1.0.4", "inherits": "2.0.3", - "ripemd160": "2.0.1", - "sha.js": "2.4.8" + "md5.js": "1.3.4", + "ripemd160": "2.0.2", + "sha.js": "2.4.11" } }, "create-hmac": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { "cipher-base": "1.0.4", - "create-hash": "1.1.3", + "create-hash": "1.2.0", "inherits": "2.0.3", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.8" + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" } }, "cross-spawn": { @@ -1706,52 +2006,8 @@ "dev": true, "optional": true, "requires": { - "lru-cache": "4.1.1", + "lru-cache": "4.1.3", "which": "1.3.0" - }, - "dependencies": { - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true, - "optional": true - }, - "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", - "dev": true, - "optional": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true, - "optional": true - }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, - "optional": true, - "requires": { - "isexe": "2.0.0" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true, - "optional": true - } } }, "cryptiles": { @@ -1759,57 +2015,35 @@ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", "dev": true, - "optional": true, "requires": { "boom": "2.10.1" } }, "crypto-browserify": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", - "integrity": "sha1-lIlF78Z1ekANbl5a9HGU0QBkJ58=", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { - "browserify-cipher": "1.0.0", + "browserify-cipher": "1.0.1", "browserify-sign": "4.0.4", - "create-ecdh": "4.0.0", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "diffie-hellman": "5.0.2", + "create-ecdh": "4.0.3", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "diffie-hellman": "5.0.3", "inherits": "2.0.3", - "pbkdf2": "3.0.13", - "public-encrypt": "4.0.0", - "randombytes": "2.0.5" + "pbkdf2": "3.0.16", + "public-encrypt": "4.0.2", + "randombytes": "2.0.6", + "randomfill": "1.0.4" } }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", "dev": true }, - "css-loader": { - "version": "0.28.4", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.4.tgz", - "integrity": "sha1-bPNXkZLONV6LONX0Ldeh8uyJjQ8=", - "dev": true, - "requires": { - "babel-code-frame": "6.22.0", - "css-selector-tokenizer": "0.7.0", - "cssnano": "3.10.0", - "icss-utils": "2.1.0", - "loader-utils": "1.1.0", - "lodash.camelcase": "4.3.0", - "object-assign": "4.1.1", - "postcss": "5.2.17", - "postcss-modules-extract-imports": "1.1.0", - "postcss-modules-local-by-default": "1.2.0", - "postcss-modules-scope": "1.1.0", - "postcss-modules-values": "1.3.0", - "postcss-value-parser": "3.3.0", - "source-list-map": "0.1.8" - } - }, "css-parse": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", @@ -1845,78 +2079,49 @@ "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", "dev": true }, + "cssauron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", + "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, "cssesc": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", "dev": true }, - "cssnano": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", - "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", - "dev": true, - "requires": { - "autoprefixer": "6.7.7", - "decamelize": "1.2.0", - "defined": "1.0.0", - "has": "1.0.1", - "object-assign": "4.1.1", - "postcss": "5.2.17", - "postcss-calc": "5.3.1", - "postcss-colormin": "2.2.2", - "postcss-convert-values": "2.6.1", - "postcss-discard-comments": "2.0.4", - "postcss-discard-duplicates": "2.1.0", - "postcss-discard-empty": "2.1.0", - "postcss-discard-overridden": "0.1.1", - "postcss-discard-unused": "2.2.3", - "postcss-filter-plugins": "2.0.2", - "postcss-merge-idents": "2.1.7", - "postcss-merge-longhand": "2.0.2", - "postcss-merge-rules": "2.1.2", - "postcss-minify-font-values": "1.0.5", - "postcss-minify-gradients": "1.0.5", - "postcss-minify-params": "1.2.2", - "postcss-minify-selectors": "2.1.1", - "postcss-normalize-charset": "1.1.1", - "postcss-normalize-url": "3.0.8", - "postcss-ordered-values": "2.2.3", - "postcss-reduce-idents": "2.4.0", - "postcss-reduce-initial": "1.0.1", - "postcss-reduce-transforms": "1.0.4", - "postcss-svgo": "2.1.6", - "postcss-unique-selectors": "2.0.2", - "postcss-value-parser": "3.3.0", - "postcss-zindex": "2.2.0" - } - }, - "csso": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", - "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", - "dev": true, - "requires": { - "clap": "1.2.0", - "source-map": "0.5.6" - } - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "dev": true, "requires": { "array-find-index": "1.0.2" } }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, "d": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { - "es5-ext": "0.10.26" + "es5-ext": "0.10.42" } }, "dashdash": { @@ -1924,7 +2129,6 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, - "optional": true, "requires": { "assert-plus": "1.0.0" }, @@ -1933,8 +2137,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true + "dev": true } } }, @@ -1945,9 +2148,9 @@ "dev": true }, "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -1959,18 +2162,93 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, "deep-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", "dev": true }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "deep-extend": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", + "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "2.0.5", + "object-keys": "1.0.11" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, "del": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", @@ -1979,17 +2257,32 @@ "requires": { "globby": "6.1.0", "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "p-map": "1.1.1", + "is-path-in-cwd": "1.0.1", + "p-map": "1.2.0", "pify": "3.0.0", - "rimraf": "2.6.1" + "rimraf": "2.6.2" }, "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } } } }, @@ -2012,9 +2305,9 @@ "dev": true }, "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true }, "des.js": { @@ -2024,7 +2317,7 @@ "dev": true, "requires": { "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "minimalistic-assert": "1.0.1" } }, "destroy": { @@ -2049,54 +2342,30 @@ "dev": true }, "diff": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.0.tgz", - "integrity": "sha1-BWaVFQ16qTI3yn43isOxaCt5Y7k=", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, "diffie-hellman": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { "bn.js": "4.11.8", - "miller-rabin": "4.0.0", - "randombytes": "2.0.5" + "miller-rabin": "4.0.1", + "randombytes": "2.0.6" } }, - "directory-encoder": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/directory-encoder/-/directory-encoder-0.7.2.tgz", - "integrity": "sha1-WbTiqk8lQi9sY7UntGL14tDdLFg=", + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", "dev": true, "requires": { - "fs-extra": "0.23.1", - "handlebars": "1.3.0", - "img-stats": "0.5.2" - }, - "dependencies": { - "fs-extra": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.23.1.tgz", - "integrity": "sha1-ZhHbpq3yq43Jxp+rN83fiBgVfj0=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "path-is-absolute": "1.0.1", - "rimraf": "2.6.1" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11" - } - } + "arrify": "1.0.1", + "path-type": "3.0.0" } }, "dns-equal": { @@ -2106,13 +2375,13 @@ "dev": true }, "dns-packet": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.1.1.tgz", - "integrity": "sha1-I2nUUDivBF84mOb6VoYq7T9AKWw=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", "dev": true, "requires": { "ip": "1.1.5", - "safe-buffer": "5.1.1" + "safe-buffer": "5.1.2" } }, "dns-txt": { @@ -2121,7 +2390,17 @@ "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", "dev": true, "requires": { - "buffer-indexof": "1.1.0" + "buffer-indexof": "1.1.1" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" } }, "dom-converter": { @@ -2159,16 +2438,10 @@ } } }, - "dom-walk": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=", - "dev": true - }, "domain-browser": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, "domelementtype": { @@ -2196,6 +2469,33 @@ "domelementtype": "1.3.0" } }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "duplexify": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", + "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "stream-shift": "1.0.0" + } + }, "ecc-jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", @@ -2212,10 +2512,16 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, + "ejs": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", + "dev": true + }, "electron-to-chromium": { - "version": "1.3.18", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.18.tgz", - "integrity": "sha1-PcyZ2j5rZl9qu8ccKK1Ros1zGpw=", + "version": "1.3.46", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.46.tgz", + "integrity": "sha1-AOheIidUFaiHUF5KtJc3GU8YubA=", "dev": true }, "elliptic": { @@ -2229,19 +2535,10 @@ "hash.js": "1.1.3", "hmac-drbg": "1.0.1", "inherits": "2.0.3", - "minimalistic-assert": "1.0.0", + "minimalistic-assert": "1.0.1", "minimalistic-crypto-utils": "1.0.1" } }, - "ember-cli-normalize-entity-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ember-cli-normalize-entity-name/-/ember-cli-normalize-entity-name-1.0.0.tgz", - "integrity": "sha1-CxT3vLxZmqEXtf3cgeT9A8S61bc=", - "dev": true, - "requires": { - "silent-error": "1.1.0" - } - }, "ember-cli-string-utils": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz", @@ -2251,15 +2548,31 @@ "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" }, "encodeurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", - "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "dev": true }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "0.4.23" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, "enhanced-resolve": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", @@ -2272,12 +2585,6 @@ "tapable": "0.2.8" } }, - "ensure-posix-path": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ensure-posix-path/-/ensure-posix-path-1.0.2.tgz", - "integrity": "sha1-pls+QtC3HPxYXrd0+ZQ8jZuRsMI=", - "dev": true - }, "entities": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", @@ -2285,12 +2592,12 @@ "dev": true }, "errno": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", - "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { - "prr": "0.0.0" + "prr": "1.0.1" } }, "error-ex": { @@ -2302,24 +2609,49 @@ "is-arrayish": "0.2.1" } }, + "es-abstract": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.11.0.tgz", + "integrity": "sha512-ZnQrE/lXTTQ39ulXZ+J1DTFazV9qBy61x2bY071B+qGco8Z8q1QddsLdt/EF8Ai9hcWH72dWS0kFqXLxOxqslA==", + "dev": true, + "requires": { + "es-to-primitive": "1.1.1", + "function-bind": "1.1.1", + "has": "1.0.1", + "is-callable": "1.1.3", + "is-regex": "1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" + } + }, "es5-ext": { - "version": "0.10.26", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.26.tgz", - "integrity": "sha1-UbISilMbcMT2dkCTpzy+u4IYY3I=", + "version": "0.10.42", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.42.tgz", + "integrity": "sha512-AJxO1rmPe1bDEfSR6TJ/FgMFYuTBhR5R57KW58iCkYACMyFbrkqVyzXSurYoScDGvgyMpk7uRF/lPUPPTmsRSA==", "dev": true, "requires": { - "es6-iterator": "2.0.1", - "es6-symbol": "3.1.1" + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "next-tick": "1.0.0" } }, "es6-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", - "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.26", + "es5-ext": "0.10.42", "es6-symbol": "3.1.1" } }, @@ -2330,8 +2662,8 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.26", - "es6-iterator": "2.0.1", + "es5-ext": "0.10.42", + "es6-iterator": "2.0.3", "es6-set": "0.1.5", "es6-symbol": "3.1.1", "event-emitter": "0.3.5" @@ -2344,8 +2676,8 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.26", - "es6-iterator": "2.0.1", + "es5-ext": "0.10.42", + "es6-iterator": "2.0.3", "es6-symbol": "3.1.1", "event-emitter": "0.3.5" } @@ -2357,7 +2689,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.26" + "es5-ext": "0.10.42" } }, "es6-weak-map": { @@ -2367,8 +2699,8 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.26", - "es6-iterator": "2.0.1", + "es5-ext": "0.10.42", + "es6-iterator": "2.0.3", "es6-symbol": "3.1.1" } }, @@ -2392,24 +2724,101 @@ "requires": { "es6-map": "0.1.5", "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", + "esrecurse": "4.2.1", "estraverse": "4.2.0" } }, + "eslint": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-2.13.1.tgz", + "integrity": "sha1-5MyPoPAJ+4KaquI4VaKTYL4fbBE=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "concat-stream": "1.6.2", + "debug": "2.6.9", + "doctrine": "1.5.0", + "es6-map": "0.1.5", + "escope": "3.6.0", + "espree": "3.5.4", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "1.3.1", + "glob": "7.1.2", + "globals": "9.18.0", + "ignore": "3.3.8", + "imurmurhash": "0.1.4", + "inquirer": "0.12.0", + "is-my-json-valid": "2.17.2", + "is-resolvable": "1.1.0", + "js-yaml": "3.11.0", + "json-stable-stringify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.10", + "mkdirp": "0.5.1", + "optionator": "0.8.2", + "path-is-absolute": "1.0.1", + "path-is-inside": "1.0.2", + "pluralize": "1.2.1", + "progress": "1.1.8", + "require-uncached": "1.0.3", + "shelljs": "0.6.1", + "strip-json-comments": "1.0.4", + "table": "3.8.3", + "text-table": "0.2.0", + "user-home": "2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "espree": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "dev": true, + "requires": { + "acorn": "5.5.3", + "acorn-jsx": "3.0.1" + } + }, "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", "dev": true }, "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" + "estraverse": "4.2.0" } }, "estraverse": { @@ -2425,9 +2834,9 @@ "dev": true }, "etag": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz", - "integrity": "sha1-b2Ma7zNtbEY2K1F2QETOIWvjwFE=", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "dev": true }, "event-emitter": { @@ -2437,13 +2846,13 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.26" + "es5-ext": "0.10.42" } }, "eventemitter3": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", - "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", + "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", "dev": true }, "events": { @@ -2458,16 +2867,17 @@ "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", "dev": true, "requires": { - "original": "1.0.0" + "original": "1.0.1" } }, "evp_bytestokey": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", - "integrity": "sha1-SXtmrZ/vZc18CKYYCCS6FHa2blM=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { - "create-hash": "1.1.3" + "md5.js": "1.3.4", + "safe-buffer": "5.1.2" } }, "execa": { @@ -2491,13 +2901,19 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "4.1.1", + "lru-cache": "4.1.3", "shebang-command": "1.2.0", "which": "1.3.0" } } } }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, "expand-brackets": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", @@ -2513,53 +2929,45 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "2.2.3" - } - }, - "exports-loader": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/exports-loader/-/exports-loader-0.6.4.tgz", - "integrity": "sha1-1w/GEhl1s1/BKDDPUnVL4nQPyIY=", - "dev": true, - "requires": { - "loader-utils": "1.1.0", - "source-map": "0.5.6" + "fill-range": "2.2.4" } }, "express": { - "version": "4.15.4", - "resolved": "https://registry.npmjs.org/express/-/express-4.15.4.tgz", - "integrity": "sha1-Ay4iU0ic+PzgJma+yj0R7XotrtE=", + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", "dev": true, "requires": { - "accepts": "1.3.3", + "accepts": "1.3.5", "array-flatten": "1.1.1", + "body-parser": "1.18.2", "content-disposition": "0.5.2", - "content-type": "1.0.2", + "content-type": "1.0.4", "cookie": "0.3.1", "cookie-signature": "1.0.6", - "debug": "2.6.8", - "depd": "1.1.1", - "encodeurl": "1.0.1", + "debug": "2.6.9", + "depd": "1.1.2", + "encodeurl": "1.0.2", "escape-html": "1.0.3", - "etag": "1.8.0", - "finalhandler": "1.0.4", - "fresh": "0.5.0", + "etag": "1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", "merge-descriptors": "1.0.1", "methods": "1.1.2", "on-finished": "2.3.0", - "parseurl": "1.3.1", + "parseurl": "1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "1.1.5", - "qs": "6.5.0", + "proxy-addr": "2.0.3", + "qs": "6.5.1", "range-parser": "1.2.0", - "send": "0.15.4", - "serve-static": "1.12.4", - "setprototypeof": "1.0.3", - "statuses": "1.3.1", - "type-is": "1.6.15", - "utils-merge": "1.0.0", - "vary": "1.1.1" + "safe-buffer": "5.1.1", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "1.4.0", + "type-is": "1.6.16", + "utils-merge": "1.0.1", + "vary": "1.1.2" }, "dependencies": { "array-flatten": { @@ -2569,9 +2977,15 @@ "dev": true }, "qs": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.0.tgz", - "integrity": "sha1-jQSVTTZN7z78VbWgeT4eLIsebkk=", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", "dev": true } } @@ -2580,18 +2994,27 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true, - "optional": true + "dev": true }, - "external-editor": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.4.tgz", - "integrity": "sha1-HtkZnanL/i7y96MbL96LDRI2iXI=", + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "iconv-lite": "0.4.18", - "jschardet": "1.5.1", - "tmp": "0.0.31" + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } } }, "extglob": { @@ -2604,15 +3027,49 @@ } }, "extract-text-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.0.tgz", - "integrity": "sha1-kMqnkHvESfM1AF46x1MrQbAN5hI=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", + "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", "dev": true, "requires": { - "async": "2.5.0", + "async": "2.6.0", "loader-utils": "1.1.0", "schema-utils": "0.3.0", - "webpack-sources": "1.0.1" + "webpack-sources": "1.1.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "5.5.2" + } + } } }, "extsprintf": { @@ -2622,9 +3079,21 @@ "dev": true }, "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, "fastparse": { @@ -2639,16 +3108,27 @@ "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", "dev": true, "requires": { - "websocket-driver": "0.6.5" + "websocket-driver": "0.7.0" } }, "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "file-entry-cache": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.3.1.tgz", + "integrity": "sha1-RMYepgeuS+nBQC9B9EJwy/4zT/g=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5" + "flat-cache": "1.3.0", + "object-assign": "4.1.1" } }, "file-loader": { @@ -2657,39 +3137,6 @@ "integrity": "sha1-HS2t3UJM5tGwfP4/eXMb7TYXq0I=", "requires": { "loader-utils": "0.2.17" - }, - "dependencies": { - "big.js": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", - "integrity": "sha1-TK2iGTZS6zyp7I5VyQFWacmAaXg=" - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "requires": { - "big.js": "3.1.3", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } } }, "filename-regex": { @@ -2699,50 +3146,44 @@ "dev": true }, "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "dev": true, "requires": { "is-number": "2.1.0", "isobject": "2.1.0", - "randomatic": "1.1.7", + "randomatic": "3.0.0", "repeat-element": "1.1.2", "repeat-string": "1.6.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } } }, "finalhandler": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.4.tgz", - "integrity": "sha1-GFdPLnxLmLiuOyMMIfIB8xvbP7c=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "dev": true, "requires": { - "debug": "2.6.8", - "encodeurl": "1.0.1", + "debug": "2.6.9", + "encodeurl": "1.0.2", "escape-html": "1.0.3", "on-finished": "2.3.0", - "parseurl": "1.3.1", - "statuses": "1.3.1", + "parseurl": "1.3.2", + "statuses": "1.4.0", "unpipe": "1.0.0" } }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "1.0.1", + "make-dir": "1.3.0", + "pkg-dir": "2.0.0" + } + }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -2752,11 +3193,108 @@ "locate-path": "2.0.0" } }, - "flatten": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", - "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", - "dev": true + "findup-sync": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", + "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "dev": true, + "requires": { + "glob": "5.0.15" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + } + } + }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + }, + "dependencies": { + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.1", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "flush-write-stream": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", + "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, + "follow-redirects": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz", + "integrity": "sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg==", + "dev": true, + "requires": { + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } }, "font-awesome": { "version": "4.6.3", @@ -2770,56 +3308,100 @@ "dev": true }, "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { "for-in": "1.0.2" } }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, - "optional": true + "dev": true }, "form-data": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", "dev": true, - "optional": true, "requires": { "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.16" + "combined-stream": "1.0.6", + "mime-types": "2.1.18" } }, "forwarded": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", - "integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M=", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", "dev": true }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "0.2.2" + } + }, "fresh": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", - "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, + "front-matter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-2.1.0.tgz", + "integrity": "sha1-C9/0LLrSs1wHrHCFgReJdZ+YWMA=", + "dev": true, + "requires": { + "js-yaml": "3.11.0" + } + }, "fs-extra": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.1.tgz", - "integrity": "sha1-f8DGyJV/mD9X8waiTlud3Y0N2IA=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", "dev": true, "requires": { "graceful-fs": "4.1.11", - "jsonfile": "3.0.1", + "jsonfile": "4.0.0", "universalify": "0.1.1" } }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "readable-stream": "2.3.6" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2827,39 +3409,29 @@ "dev": true }, "fsevents": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", - "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", "dev": true, "optional": true, "requires": { - "nan": "2.6.2", - "node-pre-gyp": "0.6.39" + "nan": "2.10.0", + "node-pre-gyp": "0.10.0" }, "dependencies": { "abbrev": { - "version": "1.1.0", + "version": "1.1.1", "bundled": true, "dev": true, "optional": true }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, "ansi-regex": { "version": "2.1.1", "bundled": true, "dev": true }, "aproba": { - "version": "1.1.1", + "version": "1.2.0", "bundled": true, "dev": true, "optional": true @@ -2871,243 +3443,91 @@ "optional": true, "requires": { "delegates": "1.0.0", - "readable-stream": "2.2.9" + "readable-stream": "2.3.6" } }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", + "balanced-match": { + "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, - "asynckit": { - "version": "0.4.0", + "brace-expansion": { + "version": "1.1.11", "bundled": true, "dev": true, - "optional": true + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } }, - "aws-sign2": { - "version": "0.6.0", + "chownr": { + "version": "1.0.1", "bundled": true, "dev": true, "optional": true }, - "aws4": { - "version": "1.6.0", + "code-point-at": { + "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, - "balanced-match": { - "version": "0.4.2", + "concat-map": { + "version": "0.0.1", "bundled": true, "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.1", + "console-control-strings": { + "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } + "dev": true }, - "block-stream": { - "version": "0.0.9", + "core-util-is": { + "version": "1.0.2", "bundled": true, "dev": true, - "requires": { - "inherits": "2.0.3" - } + "optional": true }, - "boom": { - "version": "2.10.1", + "debug": { + "version": "2.6.9", "bundled": true, "dev": true, + "optional": true, "requires": { - "hoek": "2.16.3" + "ms": "2.0.0" } }, - "brace-expansion": { - "version": "1.1.7", + "deep-extend": { + "version": "0.5.1", "bundled": true, "dev": true, - "requires": { - "balanced-match": "0.4.2", - "concat-map": "0.0.1" - } + "optional": true }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "debug": { - "version": "2.6.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "dev": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "delegates": { + "delegates": { "version": "1.0.0", "bundled": true, "dev": true, "optional": true }, "detect-libc": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", + "version": "1.0.3", "bundled": true, "dev": true, "optional": true }, - "form-data": { - "version": "2.1.4", + "fs-minipass": { + "version": "1.2.5", "bundled": true, "dev": true, "optional": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" + "minipass": "2.2.4" } }, "fs.realpath": { "version": "1.0.0", "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } + "optional": true }, "gauge": { "version": "2.7.4", @@ -3115,7 +3535,7 @@ "dev": true, "optional": true, "requires": { - "aproba": "1.1.1", + "aproba": "1.2.0", "console-control-strings": "1.1.0", "has-unicode": "2.0.1", "object-assign": "4.1.1", @@ -3125,27 +3545,11 @@ "wide-align": "1.1.2" } }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, "glob": { "version": "7.1.2", "bundled": true, "dev": true, + "optional": true, "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -3155,64 +3559,35 @@ "path-is-absolute": "1.0.1" } }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, "has-unicode": { "version": "2.0.1", "bundled": true, "dev": true, "optional": true }, - "hawk": { - "version": "3.1.3", + "iconv-lite": { + "version": "0.4.21", "bundled": true, "dev": true, + "optional": true, "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" + "safer-buffer": "2.1.2" } }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", + "ignore-walk": { + "version": "3.0.1", "bundled": true, "dev": true, "optional": true, "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" + "minimatch": "3.0.4" } }, "inflight": { "version": "1.0.6", "bundled": true, "dev": true, + "optional": true, "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -3224,7 +3599,7 @@ "dev": true }, "ini": { - "version": "1.3.4", + "version": "1.3.5", "bundled": true, "dev": true, "optional": true @@ -3237,111 +3612,43 @@ "number-is-nan": "1.0.1" } }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, "isarray": { "version": "1.0.0", "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, "dev": true, "optional": true }, - "jsprim": { - "version": "1.4.0", + "minimatch": { + "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } + "brace-expansion": "1.1.11" } }, - "mime-db": { - "version": "1.27.0", + "minimist": { + "version": "0.0.8", "bundled": true, "dev": true }, - "mime-types": { - "version": "2.1.15", + "minipass": { + "version": "2.2.4", "bundled": true, "dev": true, "requires": { - "mime-db": "1.27.0" + "safe-buffer": "5.1.1", + "yallist": "3.0.2" } }, - "minimatch": { - "version": "3.0.4", + "minizlib": { + "version": "1.1.0", "bundled": true, "dev": true, + "optional": true, "requires": { - "brace-expansion": "1.1.7" + "minipass": "2.2.4" } }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, "mkdirp": { "version": "0.5.1", "bundled": true, @@ -3356,23 +3663,33 @@ "dev": true, "optional": true }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.9", + "iconv-lite": "0.4.21", + "sax": "1.2.4" + } + }, "node-pre-gyp": { - "version": "0.6.39", + "version": "0.10.0", "bundled": true, "dev": true, "optional": true, "requires": { - "detect-libc": "1.0.2", - "hawk": "3.1.3", + "detect-libc": "1.0.3", "mkdirp": "0.5.1", + "needle": "2.2.0", "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" + "npm-packlist": "1.1.10", + "npmlog": "4.1.2", + "rc": "1.2.7", + "rimraf": "2.6.2", + "semver": "5.5.0", + "tar": "4.4.1" } }, "nopt": { @@ -3381,12 +3698,28 @@ "dev": true, "optional": true, "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" + "abbrev": "1.1.1", + "osenv": "0.1.5" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.3" } }, "npmlog": { - "version": "4.1.0", + "version": "4.1.2", "bundled": true, "dev": true, "optional": true, @@ -3402,12 +3735,6 @@ "bundled": true, "dev": true }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "dev": true, - "optional": true - }, "object-assign": { "version": "4.1.1", "bundled": true, @@ -3435,7 +3762,7 @@ "optional": true }, "osenv": { - "version": "0.1.4", + "version": "0.1.5", "bundled": true, "dev": true, "optional": true, @@ -3447,39 +3774,23 @@ "path-is-absolute": { "version": "1.0.1", "bundled": true, - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, "dev": true, "optional": true }, "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "dev": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", + "version": "2.0.0", "bundled": true, "dev": true, "optional": true }, "rc": { - "version": "1.2.1", + "version": "1.2.7", "bundled": true, "dev": true, "optional": true, "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", + "deep-extend": "0.5.1", + "ini": "1.3.5", "minimist": "1.2.0", "strip-json-comments": "2.0.1" }, @@ -3493,112 +3804,63 @@ } }, "readable-stream": { - "version": "2.2.9", + "version": "2.3.6", "bundled": true, "dev": true, + "optional": true, "requires": { - "buffer-shims": "1.0.0", "core-util-is": "1.0.2", "inherits": "2.0.3", "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", "util-deprecate": "1.0.2" } }, - "request": { - "version": "2.81.0", + "rimraf": { + "version": "2.6.2", "bundled": true, "dev": true, "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" - } - }, - "rimraf": { - "version": "2.6.1", - "bundled": true, - "dev": true, "requires": { "glob": "7.1.2" } }, "safe-buffer": { - "version": "5.0.1", + "version": "5.1.1", "bundled": true, "dev": true }, - "semver": { - "version": "5.3.0", + "safer-buffer": { + "version": "2.1.2", "bundled": true, "dev": true, "optional": true }, - "set-blocking": { - "version": "2.0.0", + "sax": { + "version": "1.2.4", "bundled": true, "dev": true, "optional": true }, - "signal-exit": { - "version": "3.0.2", + "semver": { + "version": "5.5.0", "bundled": true, "dev": true, "optional": true }, - "sntp": { - "version": "1.0.9", + "set-blocking": { + "version": "2.0.0", "bundled": true, "dev": true, - "requires": { - "hoek": "2.16.3" - } + "optional": true }, - "sshpk": { - "version": "1.13.0", + "signal-exit": { + "version": "3.0.2", "bundled": true, "dev": true, - "optional": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } + "optional": true }, "string-width": { "version": "1.0.2", @@ -3611,19 +3873,14 @@ } }, "string_decoder": { - "version": "1.0.1", + "version": "1.1.1", "bundled": true, "dev": true, + "optional": true, "requires": { - "safe-buffer": "5.0.1" + "safe-buffer": "5.1.1" } }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "dev": true, - "optional": true - }, "strip-ansi": { "version": "3.0.1", "bundled": true, @@ -3639,81 +3896,26 @@ "optional": true }, "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", + "version": "4.4.1", "bundled": true, "dev": true, "optional": true, "requires": { - "safe-buffer": "5.0.1" + "chownr": "1.0.1", + "fs-minipass": "1.2.5", + "minipass": "2.2.4", + "minizlib": "1.1.0", + "mkdirp": "0.5.1", + "safe-buffer": "5.1.1", + "yallist": "3.0.2" } }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true, - "optional": true - }, "util-deprecate": { "version": "1.0.2", "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, "dev": true, "optional": true }, - "verror": { - "version": "1.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, "wide-align": { "version": "1.1.2", "bundled": true, @@ -3727,6 +3929,11 @@ "version": "1.0.2", "bundled": true, "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true } } }, @@ -3739,133 +3946,13 @@ "graceful-fs": "4.1.11", "inherits": "2.0.3", "mkdirp": "0.5.1", - "rimraf": "2.6.1" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "rimraf": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } + "rimraf": "2.6.2" } }, "function-bind": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", - "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "gauge": { @@ -3874,7 +3961,7 @@ "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "requires": { - "aproba": "1.1.2", + "aproba": "1.2.0", "console-control-strings": "1.1.0", "has-unicode": "2.0.1", "object-assign": "4.1.1", @@ -3882,67 +3969,6 @@ "string-width": "1.0.2", "strip-ansi": "3.0.1", "wide-align": "1.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - } } }, "gaze": { @@ -3953,120 +3979,21 @@ "optional": true, "requires": { "globule": "1.2.0" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "globule": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", - "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", - "dev": true, - "optional": true, - "requires": { - "glob": "7.1.2", - "lodash": "4.17.4", - "minimatch": "3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "optional": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true, - "optional": true - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "1.1.8" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "optional": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } + } + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "1.0.2" } }, "get-caller-file": { @@ -4087,12 +4014,17 @@ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, - "optional": true, "requires": { "assert-plus": "1.0.0" }, @@ -4101,15 +4033,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true + "dev": true } } }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { "fs.realpath": "1.0.0", @@ -4139,41 +4070,80 @@ "is-glob": "2.0.1" } }, - "global": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", - "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", "dev": true, "requires": { - "min-document": "2.19.0", - "process": "0.5.2" - }, - "dependencies": { - "process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=", - "dev": true - } + "ini": "1.3.5" } }, "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", "dev": true, "requires": { "array-union": "1.0.2", + "dir-glob": "2.0.0", "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "ignore": "3.3.8", + "pify": "3.0.0", + "slash": "1.0.0" + } + }, + "globule": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", + "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", + "dev": true, + "requires": { + "glob": "7.1.2", + "lodash": "4.17.10", + "minimatch": "3.0.4" + } + }, + "gonzales-pe": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-3.4.7.tgz", + "integrity": "sha1-F8e+Z61sr/Ynej44esc26YPSgOw=", + "dev": true, + "requires": { + "minimist": "1.1.3" + }, + "dependencies": { + "minimist": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz", + "integrity": "sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag=", + "dev": true + } + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.1", + "safe-buffer": "5.1.2", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" } }, "graceful-fs": { @@ -4189,42 +4159,83 @@ "dev": true }, "handlebars": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-1.3.0.tgz", - "integrity": "sha1-npsTCpPjiUkTItl1zz7BgYw3zjQ=", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.5.tgz", + "integrity": "sha1-ksbta7FkEQxQ1NjQ+93HCAbG+Oc=", "dev": true, "requires": { - "optimist": "0.3.7", - "uglify-js": "2.3.6" + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" }, "dependencies": { "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", "dev": true, "optional": true }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "dev": true, "optional": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, "requires": { "amdefine": "1.0.1" } }, "uglify-js": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.3.6.tgz", - "integrity": "sha1-+gmEdwtCi3qbKoBY9GNV0U/vIRo=", + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "optional": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "optional": true + } + } + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "optional": true, "requires": { - "async": "0.2.10", - "optimist": "0.3.7", - "source-map": "0.1.43" + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" } } } @@ -4266,7 +4277,7 @@ "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", "dev": true, "requires": { - "function-bind": "1.1.0" + "function-bind": "1.1.1" } }, "has-ansi": { @@ -4279,9 +4290,9 @@ } }, "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", "dev": true }, "has-unicode": { @@ -4290,23 +4301,84 @@ "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, "hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "dev": true, "requires": { - "inherits": "2.0.3" + "inherits": "2.0.3", + "safe-buffer": "5.1.2" } }, "hash.js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha1-NA3tvmKQGHFRweodd3o0SJNd+EY=", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", "dev": true, "requires": { "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "minimalistic-assert": "1.0.1" } }, "hawk": { @@ -4314,7 +4386,6 @@ "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "dev": true, - "optional": true, "requires": { "boom": "2.10.1", "cryptiles": "2.0.5", @@ -4328,32 +4399,11 @@ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "dev": true }, - "heimdalljs": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/heimdalljs/-/heimdalljs-0.2.5.tgz", - "integrity": "sha1-aqVDCO7nk7ZCz/nPlHgURfN3MKw=", - "dev": true, - "requires": { - "rsvp": "3.2.1" - }, - "dependencies": { - "rsvp": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.2.1.tgz", - "integrity": "sha1-B8tKXfJa3Z6Cbrxn3Mn9idsn2Eo=", - "dev": true - } - } - }, - "heimdalljs-logger": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/heimdalljs-logger/-/heimdalljs-logger-0.1.9.tgz", - "integrity": "sha1-12raTkW3u294b8nAEKaOsuL68XY=", - "dev": true, - "requires": { - "debug": "2.6.8", - "heimdalljs": "0.2.5" - } + "highlight.js": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.12.0.tgz", + "integrity": "sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4=", + "dev": true }, "hmac-drbg": { "version": "1.0.1", @@ -4362,7 +4412,7 @@ "dev": true, "requires": { "hash.js": "1.1.3", - "minimalistic-assert": "1.0.0", + "minimalistic-assert": "1.0.1", "minimalistic-crypto-utils": "1.0.1" } }, @@ -4373,9 +4423,9 @@ "dev": true }, "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw=", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", "dev": true }, "hpack.js": { @@ -4385,49 +4435,11 @@ "dev": true, "requires": { "inherits": "2.0.3", - "obuf": "1.1.1", - "readable-stream": "2.3.3", - "wbuf": "1.7.2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - } + "obuf": "1.1.2", + "readable-stream": "2.3.6", + "wbuf": "1.7.3" } }, - "html-comment-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", - "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=", - "dev": true - }, "html-entities": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", @@ -4435,19 +4447,18 @@ "dev": true }, "html-minifier": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.3.tgz", - "integrity": "sha1-SideOxoWY5q7ebTBEZH/DQ/PGrk=", + "version": "3.5.15", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.15.tgz", + "integrity": "sha512-OZa4rfb6tZOZ3Z8Xf0jKxXkiDcFWldQePGYFDcgKqES2sXeWaEv9y6QQvWUtX3ySI3feApQi5uCsHLINQ6NoAw==", "dev": true, "requires": { "camel-case": "3.0.0", - "clean-css": "4.1.7", - "commander": "2.11.0", + "clean-css": "4.1.11", + "commander": "2.15.1", "he": "1.1.1", - "ncname": "1.0.0", "param-case": "2.1.1", "relateurl": "0.2.7", - "uglify-js": "3.0.27" + "uglify-js": "3.3.25" } }, "html-webpack-plugin": { @@ -4456,26 +4467,12 @@ "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", "dev": true, "requires": { - "bluebird": "3.5.0", - "html-minifier": "3.5.3", + "bluebird": "3.5.1", + "html-minifier": "3.5.15", "loader-utils": "0.2.17", - "lodash": "4.17.4", + "lodash": "4.17.10", "pretty-error": "2.1.1", - "toposort": "1.0.3" - }, - "dependencies": { - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "3.1.3", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - } + "toposort": "1.0.7" } }, "htmlparser2": { @@ -4498,6 +4495,30 @@ "requires": { "domelementtype": "1.3.0" } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true } } }, @@ -4508,24 +4529,31 @@ "dev": true }, "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, "requires": { - "depd": "1.1.1", + "depd": "1.1.2", "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": "1.3.1" + "setprototypeof": "1.1.0", + "statuses": "1.4.0" } }, + "http-parser-js": { + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.12.tgz", + "integrity": "sha1-uc+/Sizybw/DSxDKFImid3HjR08=", + "dev": true + }, "http-proxy": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", - "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", "dev": true, "requires": { - "eventemitter3": "1.2.0", + "eventemitter3": "3.1.0", + "follow-redirects": "1.4.1", "requires-port": "1.0.0" } }, @@ -4535,9 +4563,9 @@ "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", "dev": true, "requires": { - "http-proxy": "1.16.2", + "http-proxy": "1.17.0", "is-glob": "3.1.0", - "lodash": "4.17.4", + "lodash": "4.17.10", "micromatch": "2.3.11" }, "dependencies": { @@ -4563,72 +4591,42 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", "dev": true, - "optional": true, "requires": { "assert-plus": "0.2.0", "jsprim": "1.4.1", - "sshpk": "1.13.1" + "sshpk": "1.14.1" } }, "https-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", - "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, "iconv-lite": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", - "integrity": "sha1-I9hlaxaq5nQqwpcy6o8DNqR4nPI=", - "dev": true - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "dev": true, + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", "requires": { - "postcss": "6.0.8" - }, - "dependencies": { - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "postcss": { - "version": "6.0.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.8.tgz", - "integrity": "sha1-iQZ6nOixH4qEy8URfvwwQZoIV7M=", - "dev": true, - "requires": { - "chalk": "2.1.0", - "source-map": "0.5.6", - "supports-color": "4.2.1" - } - }, - "supports-color": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", - "integrity": "sha1-ZaS7JjHpDgJCDbpVVMN1pHVLuDY=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "safer-buffer": "2.1.2" } }, "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.11.tgz", + "integrity": "sha512-VhDzCKN7K8ufStx/CLj5/PDTMgph+qwN5Pkd5i0sGnVwk56zJ0lkT8Qzi1xqWLS0Wp29DgDtNeS7v8/wMoZeHg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", + "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==", "dev": true }, "image-size": { @@ -4638,21 +4636,28 @@ "dev": true, "optional": true }, - "img-stats": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/img-stats/-/img-stats-0.5.2.tgz", - "integrity": "sha1-wgNJbELy2esuWrgjL6dWurMsnis=", - "dev": true, - "requires": { - "xmldom": "0.1.27" - } - }, "import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", "dev": true }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "2.0.0", + "resolve-cwd": "2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, "in-publish": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", @@ -4667,52 +4672,14 @@ "dev": true, "requires": { "repeating": "2.0.1" - }, - "dependencies": { - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "1.0.2" - } - } } }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, "indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", "dev": true }, - "inflection": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", - "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=", - "dev": true - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -4729,48 +4696,57 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, "inquirer": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.2.1.tgz", - "integrity": "sha1-Bs6w9UD0XKVIwX1oQJWYeCZfoXU=", - "dev": true, - "requires": { - "ansi-escapes": "2.0.0", - "chalk": "2.1.0", - "cli-cursor": "2.1.0", - "cli-width": "2.1.0", - "external-editor": "2.0.4", - "figures": "2.0.0", - "lodash": "4.17.4", - "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, + "requires": { + "ansi-escapes": "1.4.0", + "ansi-regex": "2.1.1", + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "cli-width": "2.2.0", + "figures": "1.7.0", + "lodash": "4.17.10", + "readline2": "1.0.1", + "run-async": "0.1.0", + "rx-lite": "3.1.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", "through": "2.3.8" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true } } }, @@ -4784,15 +4760,15 @@ } }, "interpret": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", - "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", "dev": true }, "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, "requires": { "loose-envify": "1.3.1" @@ -4811,16 +4787,19 @@ "dev": true }, "ipaddr.js": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz", - "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA=", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", "dev": true }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } }, "is-arrayish": { "version": "0.2.1", @@ -4834,13 +4813,13 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "1.9.0" + "binary-extensions": "1.11.0" } }, "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, "is-builtin-module": { @@ -4852,6 +4831,55 @@ "builtin-modules": "1.1.1" } }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "dev": true + }, + "is-ci": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", + "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", + "dev": true, + "requires": { + "ci-info": "1.1.3" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, "is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", @@ -4895,10 +4923,13 @@ } }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } }, "is-glob": { "version": "2.0.1", @@ -4909,6 +4940,41 @@ "is-extglob": "1.0.0" } }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "0.1.1", + "is-path-inside": "1.0.1" + } + }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", + "dev": true + }, + "is-my-json-valid": { + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", + "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", + "dev": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "is-my-ip-valid": "1.0.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, "is-number": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", @@ -4918,6 +4984,29 @@ "kind-of": "3.2.2" } }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "dev": true, + "requires": { + "is-number": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -4925,36 +5014,38 @@ "dev": true }, "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", "dev": true, "requires": { - "is-path-inside": "1.0.0" + "is-path-inside": "1.0.1" } }, "is-path-inside": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", - "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "dev": true, "requires": { "path-is-inside": "1.0.2" } }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } } }, "is-posix-bracket": { @@ -4969,33 +5060,55 @@ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", "dev": true }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", "dev": true }, - "is-svg": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", - "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true, "requires": { - "html-comment-regex": "1.1.1" + "has": "1.0.1" } }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true, - "optional": true + "dev": true }, "is-utf8": { "version": "0.2.1", @@ -5003,6 +5116,12 @@ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, "is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", @@ -5010,15 +5129,9 @@ "dev": true }, "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "isbinaryfile": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", - "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "isexe": { @@ -5028,113 +5141,107 @@ "dev": true }, "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } }, "isomorphic-fetch": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", "requires": { - "node-fetch": "1.7.2", - "whatwg-fetch": "2.0.3" - }, - "dependencies": { - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "requires": { - "iconv-lite": "0.4.18" - } - }, - "iconv-lite": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", - "integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA==" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "node-fetch": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.2.tgz", - "integrity": "sha512-xZZUq2yDhKMIn/UgG5q//IZSNLJIwW2QxS14CNH5spuiXkITM2pUitjdq58yLSaU7m4M0wBNaM2Gh/ggY4YJig==", - "requires": { - "encoding": "0.1.12", - "is-stream": "1.1.0" - } - }, - "whatwg-fetch": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", - "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" - } + "node-fetch": "1.7.3", + "whatwg-fetch": "2.0.4" } }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true, - "optional": true + "dev": true }, "istanbul-instrumenter-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-2.0.0.tgz", - "integrity": "sha1-5UkpAKsLuoNe+oAkywC+mz7qJwA=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz", + "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==", "dev": true, "requires": { - "convert-source-map": "1.5.0", - "istanbul-lib-instrument": "1.7.4", - "loader-utils": "0.2.17", - "object-assign": "4.1.1" + "convert-source-map": "1.5.1", + "istanbul-lib-instrument": "1.10.1", + "loader-utils": "1.1.0", + "schema-utils": "0.3.0" }, "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "dev": true, "requires": { - "big.js": "3.1.3", + "big.js": "3.2.0", "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" + "json5": "0.5.1" + } + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "5.5.2" } } } }, "istanbul-lib-coverage": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", - "integrity": "sha1-c7+5mIhSmUFck9OKPprfeEp3qdo=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", + "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==", "dev": true }, "istanbul-lib-instrument": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.4.tgz", - "integrity": "sha1-6f2SDkdn89Ge3HZeLWs/XMvQ7qg=", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", + "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", "dev": true, "requires": { - "babel-generator": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "istanbul-lib-coverage": "1.1.1", - "semver": "5.4.1" + "babel-generator": "6.26.1", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "istanbul-lib-coverage": "1.2.0", + "semver": "5.5.0" } }, + "jquery": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz", + "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==" + }, "js-base64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "integrity": "sha1-8OgK4DmkvWVLXygfyT8EqRSn/M4=", - "dev": true + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", + "integrity": "sha512-H7ErYLM34CvDMto3GbD6xD0JLUGYXR3QTcH6B/tr4Hi/QpSThnCsIp+Sy5FRTw3B0d6py4HcNkW7nO/wdtGWEw==", + "dev": true, + "optional": true }, "js-tokens": { "version": "3.0.2", @@ -5143,13 +5250,13 @@ "dev": true }, "js-yaml": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", + "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", "dev": true, "requires": { - "argparse": "1.0.9", - "esprima": "2.7.3" + "argparse": "1.0.10", + "esprima": "4.0.0" } }, "jsbn": { @@ -5159,30 +5266,23 @@ "dev": true, "optional": true }, - "jschardet": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.5.1.tgz", - "integrity": "sha1-xRn2KfhrOlvtuliojTETCe7Al/k=", - "dev": true - }, "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "dev": true }, "json-loader": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha1-3KFKcCNf+C8KyaOr62DTN6NlGF0=", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", "dev": true }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true, - "optional": true + "dev": true }, "json-schema-traverse": { "version": "0.3.1", @@ -5203,8 +5303,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true, - "optional": true + "dev": true }, "json3": { "version": "3.3.2", @@ -5215,13 +5314,12 @@ "json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" }, "jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "dev": true, "requires": { "graceful-fs": "4.1.11" @@ -5233,12 +5331,17 @@ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "dev": true }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "dev": true, - "optional": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -5250,33 +5353,74 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true + "dev": true } } }, "karma-source-map-support": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.2.0.tgz", - "integrity": "sha1-G/gee7SwiWJ6s1LsQXnhF8QGpUA=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.3.0.tgz", + "integrity": "sha512-HcPqdAusNez/ywa+biN4EphGz62MmQyPggUsDfsHqa7tSe4jdsxgvTKuDfIazjL+IOxpVWyT7Pr4dhAV+sxX5Q==", "dev": true, "requires": { - "source-map-support": "0.4.15" + "source-map-support": "0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "dev": true, + "requires": { + "buffer-from": "1.0.0", + "source-map": "0.6.1" + } + } } }, + "killable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz", + "integrity": "sha1-2ouEvUfeU5WHj5XWTQLyRJ/gXms=", + "dev": true + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.5" + "is-buffer": "1.1.6" + } + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "4.0.1" } }, "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", "dev": true }, "lcid": { @@ -5289,59 +5433,83 @@ } }, "less": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/less/-/less-2.7.2.tgz", - "integrity": "sha1-No1sxz4fsDmBGDKAkYdDxdz5s98=", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", + "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==", "dev": true, "requires": { - "errno": "0.1.4", + "errno": "0.1.7", "graceful-fs": "4.1.11", "image-size": "0.5.5", - "mime": "1.3.6", + "mime": "1.6.0", "mkdirp": "0.5.1", "promise": "7.3.1", "request": "2.81.0", - "source-map": "0.5.6" + "source-map": "0.5.7" } }, "less-loader": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.0.5.tgz", - "integrity": "sha1-rhVadAbKxqzSk9eFWH/P8PR4xN0=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz", + "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==", "dev": true, "requires": { "clone": "2.1.1", "loader-utils": "1.1.0", - "pify": "2.3.0" + "pify": "3.0.0" }, "dependencies": { - "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", - "dev": true + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } } } }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, "license-webpack-plugin": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-0.5.1.tgz", - "integrity": "sha1-aNivEDSGqcTrzt237V071h84O+Q=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-1.3.1.tgz", + "integrity": "sha512-NqAFodJdpBUuf1iD+Ij8hQvF0rCFKlO2KaieoQzAPhFgzLCtJnC7Z7x5gQbGNjoe++wOKAtAmwVEIBLqq2Yp1A==", "dev": true, "requires": { - "object-assign": "4.1.1" + "ejs": "2.6.1" } }, "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { "graceful-fs": "4.1.11", "parse-json": "2.2.0", "pify": "2.3.0", - "strip-bom": "3.0.0" + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } } }, "loader-runner": { @@ -5351,14 +5519,14 @@ "dev": true }, "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "requires": { - "big.js": "3.1.3", + "big.js": "3.2.0", "emojis-list": "2.1.0", - "json5": "0.5.1" + "json5": "0.5.1", + "object-assign": "4.1.1" } }, "locate-path": { @@ -5372,9 +5540,9 @@ } }, "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, "lodash.assign": { @@ -5384,10 +5552,10 @@ "dev": true, "optional": true }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", + "lodash.capitalize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=", "dev": true }, "lodash.clonedeep": { @@ -5396,16 +5564,16 @@ "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", "dev": true }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", "dev": true }, "lodash.mergewith": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz", - "integrity": "sha1-FQzwoWeR9ZA7iJHqsVRgknS96lU=", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", + "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==", "dev": true, "optional": true }, @@ -5415,10 +5583,10 @@ "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", "dev": true }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "loglevel": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", + "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", "dev": true }, "longest": { @@ -5444,14 +5612,6 @@ "requires": { "currently-unhandled": "0.4.1", "signal-exit": "3.0.2" - }, - "dependencies": { - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - } } }, "lower-case": { @@ -5460,52 +5620,89 @@ "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", "dev": true }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", "dev": true, "requires": { "pseudomap": "1.0.2", "yallist": "2.1.2" } }, - "macaddress": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz", - "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=", - "dev": true - }, "magic-string": { - "version": "0.22.4", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.4.tgz", - "integrity": "sha1-MQObTkA2Y5VhjB1s+Bk8U5F0df8=", + "version": "0.22.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", + "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", + "dev": true, + "requires": { + "vlq": "0.2.3" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { - "vlq": "0.2.2" + "pify": "3.0.0" } }, + "make-error": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", + "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", + "dev": true + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", "dev": true }, - "matcher-collection": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/matcher-collection/-/matcher-collection-1.0.4.tgz", - "integrity": "sha1-L2auCGmZbynkPQtiyD3R1D5YF1U=", + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "minimatch": "3.0.4" + "object-visit": "1.0.1" } }, - "math-expression-evaluator": { - "version": "1.2.17", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", - "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=", + "marked": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", + "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", + "dev": true + }, + "math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", "dev": true }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "dev": true, + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.3" + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -5518,7 +5715,7 @@ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "dev": true, "requires": { - "mimic-fn": "1.1.0" + "mimic-fn": "1.2.0" } }, "memory-fs": { @@ -5527,40 +5724,8 @@ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { - "errno": "0.1.4", - "readable-stream": "2.3.3" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - } + "errno": "0.1.7", + "readable-stream": "2.3.6" } }, "meow": { @@ -5581,226 +5746,20 @@ "trim-newlines": "1.0.0" }, "dependencies": { - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "requires": { - "is-arrayish": "0.2.1" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "1.3.1" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - } - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "dev": true - }, - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "requires": { - "spdx-license-ids": "1.2.2" - } - }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", - "dev": true - }, - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" - } } } }, + "merge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", + "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", + "dev": true + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -5831,13 +5790,13 @@ "normalize-path": "2.1.1", "object.omit": "2.0.1", "parse-glob": "3.0.4", - "regex-cache": "0.4.3" + "regex-cache": "0.4.4" } }, "miller-rabin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", - "integrity": "sha1-SmL7HUKTPAVYOYL0xxb2+55sbT0=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { "bn.js": "4.11.8", @@ -5845,45 +5804,36 @@ } }, "mime": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.6.tgz", - "integrity": "sha1-WR2E02U6awtKO5343lqoEI5y5eA=", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true }, "mime-db": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz", - "integrity": "sha1-SNJtI1WJZRcErFkWygYAGRQmaHg=", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", "dev": true }, "mime-types": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", - "integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=", + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "dev": true, "requires": { - "mime-db": "1.29.0" + "mime-db": "1.33.0" } }, "mimic-fn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "dev": true, - "requires": { - "dom-walk": "0.1.1" - } - }, "minimalistic-assert": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true }, "minimalistic-crypto-utils": { @@ -5895,10 +5845,10 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "1.1.11" } }, "minimist": { @@ -5907,6 +5857,45 @@ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "duplexify": "3.6.0", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.3", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "2.0.1", + "pumpify": "1.5.0", + "stream-each": "1.2.2", + "through2": "2.0.3" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, "mixin-object": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", @@ -5934,6 +5923,20 @@ "minimist": "0.0.8" } }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "1.2.0", + "copy-concurrently": "1.0.5", + "fs-write-stream-atomic": "1.0.10", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -5941,13 +5944,13 @@ "dev": true }, "multicast-dns": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.1.1.tgz", - "integrity": "sha1-bn3oalcIcqsXBYrepxYLvsqBTd4=", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", "dev": true, "requires": { - "dns-packet": "1.1.1", - "thunky": "0.1.0" + "dns-packet": "1.3.1", + "thunky": "1.0.2" } }, "multicast-dns-service-types": { @@ -5957,25 +5960,56 @@ "dev": true }, "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", "dev": true }, "nan": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", - "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", "dev": true, "optional": true }, - "ncname": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", - "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", - "dev": true, - "requires": { - "xml-char-classes": "1.0.0" + "nanomatch": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } } }, "negotiator": { @@ -5984,24 +6018,45 @@ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", "dev": true }, + "neo-async": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", + "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, "ng2-toastr": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/ng2-toastr/-/ng2-toastr-4.1.2.tgz", "integrity": "sha1-G0UvBxOZYcOPhmxuJKBiR++iGxE=" }, "no-case": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.1.tgz", - "integrity": "sha1-euuhxzpSGEJlVUt9wDuvcg34AIE=", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "dev": true, "requires": { "lower-case": "1.1.4" } }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "0.1.12", + "is-stream": "1.1.0" + } + }, "node-forge": { - "version": "0.6.33", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.6.33.tgz", - "integrity": "sha1-RjgRh59XPUUVWtap9D3ClujoXrw=", + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", + "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", "dev": true }, "node-gyp": { @@ -6018,6177 +6073,2612 @@ "mkdirp": "0.5.1", "nopt": "3.0.6", "npmlog": "4.1.2", - "osenv": "0.1.4", + "osenv": "0.1.5", "request": "2.81.0", - "rimraf": "2.6.1", + "rimraf": "2.6.2", "semver": "5.3.0", "tar": "2.2.1", "which": "1.3.0" }, "dependencies": { - "abbrev": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", - "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", - "dev": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "dev": true, "optional": true, "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "abbrev": "1.1.1" } }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", "dev": true, "optional": true + } + } + }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, + "requires": { + "assert": "1.4.1", + "browserify-zlib": "0.2.0", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "domain-browser": "1.2.0", + "events": "1.1.1", + "https-browserify": "1.0.0", + "os-browserify": "0.3.0", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.6", + "stream-browserify": "2.0.1", + "stream-http": "2.8.2", + "string_decoder": "1.1.1", + "timers-browserify": "2.0.10", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.10.3", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-modules-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/node-modules-path/-/node-modules-path-1.0.1.tgz", + "integrity": "sha1-QAlrCM560OoUaAhjr0ScfHWl0cg=", + "dev": true + }, + "node-sass": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.0.tgz", + "integrity": "sha512-QFHfrZl6lqRU3csypwviz2XLgGNOoWQbo2GOvtsfQqOfL4cy1BtWnhx/XUeAO9LT3ahBzSRXcEO6DdvAH9DzSg==", + "dev": true, + "optional": true, + "requires": { + "async-foreach": "0.1.3", + "chalk": "1.1.3", + "cross-spawn": "3.0.1", + "gaze": "1.1.2", + "get-stdin": "4.0.1", + "glob": "7.1.2", + "in-publish": "2.0.0", + "lodash.assign": "4.2.0", + "lodash.clonedeep": "4.5.0", + "lodash.mergewith": "4.6.1", + "meow": "3.7.0", + "mkdirp": "0.5.1", + "nan": "2.10.0", + "node-gyp": "3.6.2", + "npmlog": "4.1.2", + "request": "2.79.0", + "sass-graph": "2.2.4", + "stdout-stream": "1.4.0", + "true-case-path": "1.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", "dev": true, "optional": true }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, - "optional": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", "dev": true, "optional": true, "requires": { - "tweetnacl": "0.14.5" + "chalk": "1.1.3", + "commander": "2.15.1", + "is-my-json-valid": "2.17.2", + "pinkie-promise": "2.0.1" } }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", "dev": true, - "requires": { - "hoek": "2.16.3" - } + "optional": true }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", "dev": true, + "optional": true, "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true, - "optional": true - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "dev": true, - "requires": { - "delayed-stream": "1.0.0" + "aws-sign2": "0.6.0", + "aws4": "1.7.0", + "caseless": "0.11.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "qs": "6.3.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.4.3", + "uuid": "3.2.1" } }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", "dev": true, "optional": true - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "optional": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + } + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "dev": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.5" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.6.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize.css": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-5.0.0.tgz", + "integrity": "sha1-fOyHXOgXilMzxN6Ato6pwYudfDc=" + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "dev": true, + "requires": { + "boolbase": "1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, - "optional": true, "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } + "is-descriptor": "0.1.6" } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + } + } + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { + } + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.16" - } - }, - "fs.realpath": { + } + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "opn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", + "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", + "dev": true, + "requires": { + "is-wsl": "1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "0.0.8", + "wordwrap": "0.0.2" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + }, + "dependencies": { + "wordwrap": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true, - "optional": true - }, - "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "dev": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "optional": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true, - "optional": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true, - "optional": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true, - "optional": true - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz", - "integrity": "sha1-SNJtI1WJZRcErFkWygYAGRQmaHg=", - "dev": true - }, - "mime-types": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", - "integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=", - "dev": true, - "requires": { - "mime-db": "1.29.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.0" - } - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", - "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", - "dev": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true, - "optional": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true, - "optional": true - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.16", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" - } - }, - "rimraf": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", - "dev": true, - "optional": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "optional": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "dev": true, - "optional": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true, - "optional": true - }, - "tough-cookie": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", - "dev": true, - "optional": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", - "dev": true, - "optional": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, - "optional": true, - "requires": { - "isexe": "2.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "node-libs-browser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz", - "integrity": "sha1-o6WeyXAkmFtG6Vg3lkb5bEthZkY=", - "dev": true, - "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.1.4", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.11.1", - "domain-browser": "1.1.7", - "events": "1.1.1", - "https-browserify": "0.0.1", - "os-browserify": "0.2.1", - "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.3", - "stream-browserify": "2.0.1", - "stream-http": "2.7.2", - "string_decoder": "0.10.31", - "timers-browserify": "2.0.3", - "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - }, - "dependencies": { - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - } - } - } - } - }, - "node-modules-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/node-modules-path/-/node-modules-path-1.0.1.tgz", - "integrity": "sha1-QAlrCM560OoUaAhjr0ScfHWl0cg=", - "dev": true - }, - "node-sass": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.5.3.tgz", - "integrity": "sha1-0JydEXlkEjnRuX/8YjH9zsU+FWg=", - "dev": true, - "optional": true, - "requires": { - "async-foreach": "0.1.3", - "chalk": "1.1.3", - "cross-spawn": "3.0.1", - "gaze": "1.1.2", - "get-stdin": "4.0.1", - "glob": "7.1.2", - "in-publish": "2.0.0", - "lodash.assign": "4.2.0", - "lodash.clonedeep": "4.5.0", - "lodash.mergewith": "4.6.0", - "meow": "3.7.0", - "mkdirp": "0.5.1", - "nan": "2.6.2", - "node-gyp": "3.6.2", - "npmlog": "4.1.2", - "request": "2.81.0", - "sass-graph": "2.2.4", - "stdout-stream": "1.4.0" - }, - "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "optional": true - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", - "dev": true, - "optional": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "optional": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, - "optional": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true, - "optional": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "optional": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true, - "optional": true - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "optional": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "optional": true - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.16" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "dev": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "optional": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "optional": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true, - "optional": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true, - "optional": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true, - "optional": true - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true, - "optional": true - }, - "mime-db": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz", - "integrity": "sha1-SNJtI1WJZRcErFkWygYAGRQmaHg=", - "dev": true - }, - "mime-types": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", - "integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=", - "dev": true, - "requires": { - "mime-db": "1.29.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "optional": true - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true, - "optional": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true, - "optional": true - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.16", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "optional": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "dev": true, - "optional": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "optional": true - }, - "tough-cookie": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", - "dev": true, - "optional": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", - "dev": true, - "optional": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", - "dev": true, - "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "1.0.2" - } - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "4.1.1", - "prepend-http": "1.0.4", - "query-string": "4.3.4", - "sort-keys": "1.1.2" - } - }, - "normalize.css": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-5.0.0.tgz", - "integrity": "sha1-fOyHXOgXilMzxN6Ato6pwYudfDc=" - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "2.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=", - "dev": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - }, - "dependencies": { - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - } - } - }, - "nth-check": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", - "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", - "dev": true, - "requires": { - "boolbase": "1.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" - }, - "dependencies": { - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - } - } - }, - "obuf": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.1.tgz", - "integrity": "sha1-EEEktsYCxnlogaBCVB0220OlJk4=", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "1.1.0" - } - }, - "opn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", - "integrity": "sha1-cs4jBqF9vqWP8QQYUzUrSo/HdRk=", - "dev": true, - "requires": { - "is-wsl": "1.1.0" - } - }, - "optimist": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", - "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", - "dev": true, - "requires": { - "wordwrap": "0.0.3" - } - }, - "original": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", - "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", - "dev": true, - "requires": { - "url-parse": "1.0.5" - }, - "dependencies": { - "url-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", - "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", - "dev": true, - "requires": { - "querystringify": "0.0.4", - "requires-port": "1.0.0" - } - } - } - }, - "os-browserify": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", - "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", - "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", - "dev": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", - "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", - "dev": true - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "1.1.0" - } - }, - "p-map": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.1.1.tgz", - "integrity": "sha1-BfXkrpegaDcbwqXMhr+9vBnErno=", - "dev": true - }, - "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", - "dev": true - }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "dev": true, - "requires": { - "no-case": "2.3.1" - } - }, - "parse-asn1": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", - "dev": true, - "requires": { - "asn1.js": "4.9.1", - "browserify-aes": "1.0.6", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.0", - "pbkdf2": "3.0.13" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "1.3.1" - } - }, - "parseurl": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", - "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=", - "dev": true - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" - } - }, - "pbkdf2": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.13.tgz", - "integrity": "sha1-w30pVTHnhrHaPj6tyEBCasywriU=", - "dev": true, - "requires": { - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.8" - } - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true, - "optional": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "portfinder": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", - "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", - "dev": true, - "requires": { - "async": "1.5.2", - "debug": "2.6.8", - "mkdirp": "0.5.1" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - } - } - }, - "postcss": { - "version": "5.2.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.1.9", - "source-map": "0.5.6", - "supports-color": "3.2.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - } - } - }, - "postcss-calc": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", - "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", - "dev": true, - "requires": { - "postcss": "5.2.17", - "postcss-message-helpers": "2.0.0", - "reduce-css-calc": "1.3.0" - } - }, - "postcss-colormin": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", - "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", - "dev": true, - "requires": { - "colormin": "1.1.2", - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-convert-values": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", - "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", - "dev": true, - "requires": { - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-discard-comments": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", - "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", - "dev": true, - "requires": { - "postcss": "5.2.17" - } - }, - "postcss-discard-duplicates": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", - "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", - "dev": true, - "requires": { - "postcss": "5.2.17" - } - }, - "postcss-discard-empty": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", - "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", - "dev": true, - "requires": { - "postcss": "5.2.17" - } - }, - "postcss-discard-overridden": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", - "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", - "dev": true, - "requires": { - "postcss": "5.2.17" - } - }, - "postcss-discard-unused": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", - "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", - "dev": true, - "requires": { - "postcss": "5.2.17", - "uniqs": "2.0.0" - } - }, - "postcss-filter-plugins": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", - "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", - "dev": true, - "requires": { - "postcss": "5.2.17", - "uniqid": "4.1.1" - } - }, - "postcss-load-config": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", - "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", - "dev": true, - "requires": { - "cosmiconfig": "2.2.2", - "object-assign": "4.1.1", - "postcss-load-options": "1.2.0", - "postcss-load-plugins": "2.3.0" - } - }, - "postcss-load-options": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", - "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", - "dev": true, - "requires": { - "cosmiconfig": "2.2.2", - "object-assign": "4.1.1" - } - }, - "postcss-load-plugins": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", - "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", - "dev": true, - "requires": { - "cosmiconfig": "2.2.2", - "object-assign": "4.1.1" - } - }, - "postcss-loader": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-1.3.3.tgz", - "integrity": "sha1-piHqH6KQYqg5cqRvVEhncTAZFus=", - "dev": true, - "requires": { - "loader-utils": "1.1.0", - "object-assign": "4.1.1", - "postcss": "5.2.17", - "postcss-load-config": "1.2.0" - } - }, - "postcss-merge-idents": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", - "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", - "dev": true, - "requires": { - "has": "1.0.1", - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-merge-longhand": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", - "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", - "dev": true, - "requires": { - "postcss": "5.2.17" - } - }, - "postcss-merge-rules": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", - "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", - "dev": true, - "requires": { - "browserslist": "1.7.7", - "caniuse-api": "1.6.1", - "postcss": "5.2.17", - "postcss-selector-parser": "2.2.3", - "vendors": "1.0.1" - } - }, - "postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", - "dev": true - }, - "postcss-minify-font-values": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", - "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", - "dev": true, - "requires": { - "object-assign": "4.1.1", - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-minify-gradients": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", - "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", - "dev": true, - "requires": { - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-minify-params": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", - "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", - "dev": true, - "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0", - "uniqs": "2.0.0" - } - }, - "postcss-minify-selectors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", - "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", - "dev": true, - "requires": { - "alphanum-sort": "1.0.2", - "has": "1.0.1", - "postcss": "5.2.17", - "postcss-selector-parser": "2.2.3" - } - }, - "postcss-modules-extract-imports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", - "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", - "dev": true, - "requires": { - "postcss": "6.0.8" - }, - "dependencies": { - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "postcss": { - "version": "6.0.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.8.tgz", - "integrity": "sha1-iQZ6nOixH4qEy8URfvwwQZoIV7M=", - "dev": true, - "requires": { - "chalk": "2.1.0", - "source-map": "0.5.6", - "supports-color": "4.2.1" - } - }, - "supports-color": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", - "integrity": "sha1-ZaS7JjHpDgJCDbpVVMN1pHVLuDY=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "dev": true, - "requires": { - "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.8" - }, - "dependencies": { - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "postcss": { - "version": "6.0.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.8.tgz", - "integrity": "sha1-iQZ6nOixH4qEy8URfvwwQZoIV7M=", - "dev": true, - "requires": { - "chalk": "2.1.0", - "source-map": "0.5.6", - "supports-color": "4.2.1" - } - }, - "supports-color": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", - "integrity": "sha1-ZaS7JjHpDgJCDbpVVMN1pHVLuDY=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "dev": true, - "requires": { - "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.8" - }, - "dependencies": { - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "postcss": { - "version": "6.0.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.8.tgz", - "integrity": "sha1-iQZ6nOixH4qEy8URfvwwQZoIV7M=", - "dev": true, - "requires": { - "chalk": "2.1.0", - "source-map": "0.5.6", - "supports-color": "4.2.1" - } - }, - "supports-color": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", - "integrity": "sha1-ZaS7JjHpDgJCDbpVVMN1pHVLuDY=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "dev": true, - "requires": { - "icss-replace-symbols": "1.1.0", - "postcss": "6.0.8" - }, - "dependencies": { - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "postcss": { - "version": "6.0.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.8.tgz", - "integrity": "sha1-iQZ6nOixH4qEy8URfvwwQZoIV7M=", - "dev": true, - "requires": { - "chalk": "2.1.0", - "source-map": "0.5.6", - "supports-color": "4.2.1" - } - }, - "supports-color": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", - "integrity": "sha1-ZaS7JjHpDgJCDbpVVMN1pHVLuDY=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "postcss-normalize-charset": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", - "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", - "dev": true, - "requires": { - "postcss": "5.2.17" - } - }, - "postcss-normalize-url": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", - "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", - "dev": true, - "requires": { - "is-absolute-url": "2.1.0", - "normalize-url": "1.9.1", - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-ordered-values": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", - "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", - "dev": true, - "requires": { - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-reduce-idents": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", - "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", - "dev": true, - "requires": { - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-reduce-initial": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", - "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", - "dev": true, - "requires": { - "postcss": "5.2.17" - } - }, - "postcss-reduce-transforms": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", - "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", - "dev": true, - "requires": { - "has": "1.0.1", - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", - "dev": true, - "requires": { - "flatten": "1.0.2", - "indexes-of": "1.0.1", - "uniq": "1.0.1" - } - }, - "postcss-svgo": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", - "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", - "dev": true, - "requires": { - "is-svg": "2.1.0", - "postcss": "5.2.17", - "postcss-value-parser": "3.3.0", - "svgo": "0.7.2" - } - }, - "postcss-unique-selectors": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", - "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", - "dev": true, - "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.17", - "uniqs": "2.0.0" - } - }, - "postcss-url": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-5.1.2.tgz", - "integrity": "sha1-mLMWW+jVkkccsMqt3iwNH4MvEz4=", - "dev": true, - "requires": { - "directory-encoder": "0.7.2", - "js-base64": "2.1.9", - "mime": "1.3.6", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "path-is-absolute": "1.0.1", - "postcss": "5.2.17" - } - }, - "postcss-value-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", - "dev": true - }, - "postcss-zindex": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", - "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", - "dev": true, - "requires": { - "has": "1.0.1", - "postcss": "5.2.17", - "uniqs": "2.0.0" - } - }, - "preboot": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/preboot/-/preboot-4.5.2.tgz", - "integrity": "sha1-yzSSCZWMK0jX90E3s0mbu+VHKl4=" - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", - "dev": true, - "requires": { - "renderkid": "2.0.1", - "utila": "0.4.0" - } - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=", - "dev": true, - "optional": true, - "requires": { - "asap": "2.0.6" - } - }, - "proxy-addr": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", - "integrity": "sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg=", - "dev": true, - "requires": { - "forwarded": "0.1.0", - "ipaddr.js": "1.4.0" - } - }, - "prr": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "public-encrypt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "parse-asn1": "5.1.0", - "randombytes": "2.0.5" - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "q": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.0.tgz", - "integrity": "sha1-3QG6ydBtMObyGa7LglPunr3DCPE=", - "dev": true - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true, - "optional": true - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", - "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=", - "dev": true - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", - "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.5" - } - } - } - }, - "randombytes": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", - "integrity": "sha1-3ACaJGuNCaF3tLegrne8Vw9LG3k=", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "dev": true - }, - "raw-loader": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", - "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - } - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.3", - "set-immediate-shim": "1.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - } - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" - } - }, - "reduce-css-calc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", - "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", - "dev": true, - "requires": { - "balanced-match": "0.4.2", - "math-expression-evaluator": "1.2.17", - "reduce-function-call": "1.0.2" - } - }, - "reduce-function-call": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", - "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", - "dev": true, - "requires": { - "balanced-match": "0.4.2" - } - }, - "regenerate": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", - "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=", - "dev": true - }, - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true - }, - "regex-cache": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", - "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", - "dev": true, - "requires": { - "is-equal-shallow": "0.1.3", - "is-primitive": "2.0.0" - } - }, - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "dev": true, - "requires": { - "regenerate": "1.3.2", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "0.5.0" - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", - "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=", - "dev": true - }, - "renderkid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", - "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", - "dev": true, - "requires": { - "css-select": "1.2.0", - "dom-converter": "0.1.4", - "htmlparser2": "3.3.0", - "strip-ansi": "3.0.1", - "utila": "0.3.3" - }, - "dependencies": { - "utila": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", - "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", - "dev": true - } - } - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.16", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha1-p1vgHFPaJdk0qY69DkxKcxL5KoY=", - "dev": true, - "requires": { - "path-parse": "1.0.5" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" - } - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "requires": { - "align-text": "0.1.4" - } - }, - "rimraf": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "ripemd160": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", - "dev": true, - "requires": { - "hash-base": "2.0.2", - "inherits": "2.0.3" - } - }, - "rsvp": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", - "integrity": "sha1-LpZJFZmpbN4bUV1WdKj3qRRSkmo=", - "dev": true - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "2.1.0" - } - }, - "rx-lite": { - "version": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, - "requires": { - "rx-lite": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz" - } - }, - "rxjs": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.4.2.tgz", - "integrity": "sha1-KjI2/L8D31e64G/Wly/ZnlwI/Pc=", - "requires": { - "symbol-observable": "1.0.4" - }, - "dependencies": { - "symbol-observable": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz", - "integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0=" - } - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=", - "dev": true - }, - "sass-graph": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", - "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", - "dev": true, - "optional": true, - "requires": { - "glob": "7.1.2", - "lodash": "4.17.4", - "scss-tokenizer": "0.2.3", - "yargs": "7.1.0" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, - "optional": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "optional": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "optional": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true, - "optional": true - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "1.1.8" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "optional": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "sass-lint": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/sass-lint/-/sass-lint-1.10.2.tgz", - "integrity": "sha1-glvWsNp53dNqQv+uW21ErEkiUCs=", - "dev": true, - "requires": { - "commander": "2.11.0", - "eslint": "2.13.1", - "front-matter": "2.1.0", - "fs-extra": "1.0.0", - "glob": "7.1.2", - "globule": "1.2.0", - "gonzales-pe": "3.4.7", - "js-yaml": "3.9.1", - "lodash.capitalize": "4.2.1", - "lodash.kebabcase": "4.1.1", - "merge": "1.2.0", - "path-is-absolute": "1.0.1", - "util": "0.10.3" - }, - "dependencies": { - "acorn": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", - "integrity": "sha512-vOk6uEMctu0vQrvuSqFdJyqj1Q0S5VTDL79qtjo+DhRr+1mmaD+tluFSCZqhvi/JUhXSzoZN2BhtstaPEeE8cw==", - "dev": true - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "3.3.0" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } - }, - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", - "dev": true - }, - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "dev": true, - "requires": { - "sprintf-js": "1.0.3" - } - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "1.0.3" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "1.0.1" - } - }, - "cli-width": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", - "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=", - "dev": true - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "0.10.26" - } - }, - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.1" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" - } - }, - "es5-ext": { - "version": "0.10.26", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.26.tgz", - "integrity": "sha1-UbISilMbcMT2dkCTpzy+u4IYY3I=", - "dev": true, - "requires": { - "es6-iterator": "2.0.1", - "es6-symbol": "3.1.1" - } - }, - "es6-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", - "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.26", - "es6-symbol": "3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.26", - "es6-iterator": "2.0.1", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.26", - "es6-iterator": "2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.26" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.26", - "es6-iterator": "2.0.1", - "es6-symbol": "3.1.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", - "estraverse": "4.2.0" - } - }, - "eslint": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-2.13.1.tgz", - "integrity": "sha1-5MyPoPAJ+4KaquI4VaKTYL4fbBE=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "concat-stream": "1.6.0", - "debug": "2.6.8", - "doctrine": "1.5.0", - "es6-map": "0.1.5", - "escope": "3.6.0", - "espree": "3.5.0", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "file-entry-cache": "1.3.1", - "glob": "7.1.2", - "globals": "9.18.0", - "ignore": "3.3.3", - "imurmurhash": "0.1.4", - "inquirer": "0.12.0", - "is-my-json-valid": "2.16.0", - "is-resolvable": "1.0.0", - "js-yaml": "3.9.1", - "json-stable-stringify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "optionator": "0.8.2", - "path-is-absolute": "1.0.1", - "path-is-inside": "1.0.2", - "pluralize": "1.2.1", - "progress": "1.1.8", - "require-uncached": "1.0.3", - "shelljs": "0.6.1", - "strip-json-comments": "1.0.4", - "table": "3.8.3", - "text-table": "0.2.0", - "user-home": "2.0.0" - } - }, - "espree": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.0.tgz", - "integrity": "sha1-mDWGJb3QVYYeon4oZ+pyn69GPY0=", - "dev": true, - "requires": { - "acorn": "5.1.1", - "acorn-jsx": "3.0.1" - } - }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true - }, - "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", - "dev": true, - "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.26" - } - }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" - } - }, - "file-entry-cache": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.3.1.tgz", - "integrity": "sha1-RMYepgeuS+nBQC9B9EJwy/4zT/g=", - "dev": true, - "requires": { - "flat-cache": "1.2.2", - "object-assign": "4.1.1" - } - }, - "flat-cache": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", - "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", - "dev": true, - "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" - } - }, - "front-matter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-2.1.0.tgz", - "integrity": "sha1-C9/0LLrSs1wHrHCFgReJdZ+YWMA=", - "dev": true, - "requires": { - "js-yaml": "3.9.1" - } - }, - "fs-extra": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "1.0.2" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "globule": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", - "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", - "dev": true, - "requires": { - "glob": "7.1.2", - "lodash": "4.17.4", - "minimatch": "3.0.4" - } - }, - "gonzales-pe": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-3.4.7.tgz", - "integrity": "sha1-F8e+Z61sr/Ynej44esc26YPSgOw=", - "dev": true, - "requires": { - "minimist": "1.1.3" - }, - "dependencies": { - "minimist": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz", - "integrity": "sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag=", - "dev": true - } - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "ignore": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.3.tgz", - "integrity": "sha1-QyNS5XrM2HqzEQ6C0/6g5HgSFW0=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "inquirer": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", - "dev": true, - "requires": { - "ansi-escapes": "1.4.0", - "ansi-regex": "2.1.1", - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-width": "2.1.0", - "figures": "1.7.0", - "lodash": "4.17.4", - "readline2": "1.0.1", - "run-async": "0.1.0", - "rx-lite": "3.1.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "through": "2.3.8" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-my-json-valid": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz", - "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=", - "dev": true, - "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" - } - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", - "dev": true, - "requires": { - "is-path-inside": "1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", - "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", - "dev": true, - "requires": { - "path-is-inside": "1.0.2" - } - }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true - }, - "is-resolvable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", - "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", - "dev": true, - "requires": { - "tryit": "1.0.3" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "js-yaml": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.9.1.tgz", - "integrity": "sha512-CbcG379L1e+mWBnLvHWWeLs8GyV/EMw862uLI3c+GxVyDHWZcjZinwuBd3iW2pgxgIlksW/1vNJa4to+RvDOww==", - "dev": true, - "requires": { - "argparse": "1.0.9", - "esprima": "4.0.0" - } - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" - } - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - }, - "lodash.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=", - "dev": true - }, - "lodash.kebabcase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", - "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", - "dev": true - }, - "merge": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", - "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "mute-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", - "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "pluralize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "readline2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "mute-stream": "0.0.5" - } - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" - } - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" - } - }, - "rimraf": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "run-async": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", - "dev": true, - "requires": { - "once": "1.4.0" - } - }, - "rx-lite": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", - "dev": true - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - }, - "shelljs": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz", - "integrity": "sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=", - "dev": true - }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "table": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", - "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", - "dev": true, - "requires": { - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "chalk": "1.1.3", - "lodash": "4.17.4", - "slice-ansi": "0.0.4", - "string-width": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "tryit": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", - "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "1.1.2" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "user-home": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", - "dev": true, - "requires": { - "os-homedir": "1.0.2" - } - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "0.5.1" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true } } }, - "sass-loader": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-6.0.6.tgz", - "integrity": "sha1-6dXmwfFV+qMqSybXqbcQfCJeQPk=", + "original": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.1.tgz", + "integrity": "sha512-IEvtB5vM5ULvwnqMxWBLxkS13JIEXbakizMSo3yoPNPCIWzg8TG3Usn/UhXoZFM/m+FuEA20KdzPSFq/0rS+UA==", + "dev": true, + "requires": { + "url-parse": "1.4.0" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "dev": true, + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.2.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "6.7.1", + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0", + "semver": "5.5.0" + } + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "2.3.2" + } + }, + "parse-asn1": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "dev": true, + "requires": { + "asn1.js": "4.10.1", + "browserify-aes": "1.2.0", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.16" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { - "async": "2.5.0", - "clone-deep": "0.3.0", - "loader-utils": "1.1.0", - "lodash.tail": "4.1.1", "pify": "3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } } }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", + "pbkdf2": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", + "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", + "dev": true, + "requires": { + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" + } + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "dev": true, + "optional": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, - "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "ajv": "5.2.2" + "find-up": "2.1.0" } }, - "script-loader": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/script-loader/-/script-loader-0.7.0.tgz", - "integrity": "sha1-aF3H5waeDe56kmdPDrxbD1W6pew=", + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true + }, + "portfinder": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", + "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", "dev": true, "requires": { - "raw-loader": "0.5.1" + "async": "1.5.2", + "debug": "2.6.9", + "mkdirp": "0.5.1" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } } }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "6.0.22", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", + "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", "dev": true, - "optional": true, "requires": { - "js-base64": "2.1.9", - "source-map": "0.4.4" + "chalk": "2.4.1", + "source-map": "0.6.1", + "supports-color": "5.4.0" }, "dependencies": { - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, - "optional": true + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } }, - "js-base64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "integrity": "sha1-8OgK4DmkvWVLXygfyT8EqRSn/M4=", - "dev": true, - "optional": true + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true }, "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, - "optional": true, "requires": { - "amdefine": "1.0.1" + "has-flag": "3.0.0" } } } }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selfsigned": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.9.1.tgz", - "integrity": "sha1-zdpEktcNSGVw+HxlVGAjVY4d+lo=", - "dev": true, - "requires": { - "node-forge": "0.6.33" - } - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=", - "dev": true - }, - "send": { - "version": "0.15.4", - "resolved": "https://registry.npmjs.org/send/-/send-0.15.4.tgz", - "integrity": "sha1-mF+qPihLAnPHkzZKNcZze9k5Bbk=", + "postcss-import": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-11.1.0.tgz", + "integrity": "sha512-5l327iI75POonjxkXgdRCUS+AlzAdBx4pOvMEhTKTCjb1p8IEeVR9yx3cPbmN7LIWJLbfnIXxAhoB4jpD0c/Cw==", "dev": true, "requires": { - "debug": "2.6.8", - "depd": "1.1.1", - "destroy": "1.0.4", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "etag": "1.8.0", - "fresh": "0.5.0", - "http-errors": "1.6.2", - "mime": "1.3.4", - "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.3.1" - }, - "dependencies": { - "mime": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", - "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=", - "dev": true - } + "postcss": "6.0.22", + "postcss-value-parser": "3.3.0", + "read-cache": "1.0.0", + "resolve": "1.7.1" } }, - "serve-index": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.0.tgz", - "integrity": "sha1-0rKA/FYNYW7oG0i/D6gqvtJIXOc=", + "postcss-load-config": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", + "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", "dev": true, "requires": { - "accepts": "1.3.3", - "batch": "0.6.1", - "debug": "2.6.8", - "escape-html": "1.0.3", - "http-errors": "1.6.2", - "mime-types": "2.1.16", - "parseurl": "1.3.1" + "cosmiconfig": "2.2.2", + "object-assign": "4.1.1", + "postcss-load-options": "1.2.0", + "postcss-load-plugins": "2.3.0" } }, - "serve-static": { - "version": "1.12.4", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.4.tgz", - "integrity": "sha1-m2qpjutyU8Tu3Ewfb9vKYJkBqWE=", + "postcss-load-options": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", + "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", "dev": true, "requires": { - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "parseurl": "1.3.1", - "send": "0.15.4" + "cosmiconfig": "2.2.2", + "object-assign": "4.1.1" } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", - "dev": true - }, - "sha.js": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz", - "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=", + "postcss-load-plugins": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", + "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", "dev": true, "requires": { - "inherits": "2.0.3" + "cosmiconfig": "2.2.2", + "object-assign": "4.1.1" } }, - "shallow-clone": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", - "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", + "postcss-loader": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.5.tgz", + "integrity": "sha512-pV7kB5neJ0/1tZ8L1uGOBNTVBCSCXQoIsZMsrwvO8V2rKGa2tBl/f80GGVxow2jJnRJ2w1ocx693EKhZAb9Isg==", "dev": true, "requires": { - "is-extendable": "0.1.1", - "kind-of": "2.0.1", - "lazy-cache": "0.2.7", - "mixin-object": "2.0.1" + "loader-utils": "1.1.0", + "postcss": "6.0.22", + "postcss-load-config": "1.2.0", + "schema-utils": "0.4.5" }, "dependencies": { - "kind-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", - "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "dev": true, "requires": { - "is-buffer": "1.1.5" + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" } } } }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "postcss-url": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-7.3.2.tgz", + "integrity": "sha512-QMV5mA+pCYZQcUEPQkmor9vcPQ2MT+Ipuu8qdi1gVxbNiIiErEGft+eny1ak19qALoBkccS5AHaCaCDzh7b9MA==", "dev": true, "requires": { - "shebang-regex": "1.0.0" + "mime": "1.6.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "postcss": "6.0.22", + "xxhashjs": "0.2.2" } }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "postcss-value-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", "dev": true }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "preboot": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/preboot/-/preboot-4.5.2.tgz", + "integrity": "sha1-yzSSCZWMK0jX90E3s0mbu+VHKl4=" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, - "silent-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/silent-error/-/silent-error-1.1.0.tgz", - "integrity": "sha1-IglwbxyFCp8dENDYQJGLRvJuG8k=", + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", "dev": true, "requires": { - "debug": "2.6.8" + "renderkid": "2.0.1", + "utila": "0.4.0" } }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "dev": true, "optional": true, "requires": { - "hoek": "2.16.3" + "asap": "2.0.6" } }, - "sockjs": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.18.tgz", - "integrity": "sha1-2bKJMWyn33dZXvKZ4HXw+TfrQgc=", + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "proxy-addr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", "dev": true, "requires": { - "faye-websocket": "0.10.0", - "uuid": "2.0.3" - }, - "dependencies": { - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", - "dev": true - } + "forwarded": "0.1.2", + "ipaddr.js": "1.6.0" } }, - "sockjs-client": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.2.tgz", - "integrity": "sha1-8CEqhVDkyUaMjM6u79LjSTwDOtU=", + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", + "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", "dev": true, "requires": { - "debug": "2.6.8", - "eventsource": "0.1.6", - "faye-websocket": "0.11.1", - "inherits": "2.0.3", - "json3": "3.3.2", - "url-parse": "1.1.9" - }, - "dependencies": { - "faye-websocket": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", - "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", - "dev": true, - "requires": { - "websocket-driver": "0.6.5" - } - } + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "parse-asn1": "5.1.1", + "randombytes": "2.0.6" } }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.0.tgz", + "integrity": "sha512-UWi0klDoq8xtVzlMRgENV9F7iCTZExaJQSQL187UXsxpk9NnrKGqTqqUNYAKGOzucSOxs2+jUnRNI+rLviPhJg==", "dev": true, "requires": { - "is-plain-obj": "1.1.0" + "duplexify": "3.6.0", + "inherits": "2.0.3", + "pump": "2.0.1" } }, - "source-list-map": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", - "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", "dev": true }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "dev": true, + "optional": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", "dev": true }, - "source-map-loader": { + "querystring-es3": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.1.tgz", - "integrity": "sha1-SBJr6SML1H+tBeRqjDwuPS2r5Qc=", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", + "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==", + "dev": true + }, + "randomatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", + "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", "dev": true, "requires": { - "async": "0.9.2", - "loader-utils": "0.2.17", - "source-map": "0.1.43" + "is-number": "4.0.0", + "kind-of": "6.0.2", + "math-random": "1.0.1" }, "dependencies": { - "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", "dev": true }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "3.1.3", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true } } }, - "source-map-support": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", - "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=", + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", "dev": true, "requires": { - "source-map": "0.5.6" + "safe-buffer": "5.1.2" } }, - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, "requires": { - "spdx-license-ids": "1.2.2" + "randombytes": "2.0.6", + "safe-buffer": "5.1.2" } }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", - "dev": true - }, - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", "dev": true }, - "spdy": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", - "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", - "dev": true, - "requires": { - "debug": "2.6.8", - "handle-thing": "1.2.5", - "http-deceiver": "1.2.7", - "safe-buffer": "5.1.1", - "select-hose": "2.0.0", - "spdy-transport": "2.0.20" - } - }, - "spdy-transport": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.0.20.tgz", - "integrity": "sha1-c15yBUxIayNU/onnAiVgBKOazk0=", + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", "dev": true, "requires": { - "debug": "2.6.8", - "detect-node": "2.0.3", - "hpack.js": "2.1.6", - "obuf": "1.1.1", - "readable-stream": "2.3.3", - "safe-buffer": "5.1.1", - "wbuf": "1.7.2" + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", "dev": true }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", "dev": true, "requires": { - "core-util-is": "1.0.2", + "depd": "1.1.1", "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "setprototypeof": "1.0.3", + "statuses": "1.4.0" } }, - "string_decoder": { + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "setprototypeof": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true } } }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", "dev": true }, - "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "rc": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz", + "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==", "dev": true, - "optional": true, "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "deep-extend": "0.5.1", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" }, "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true } } }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", - "dev": true - }, - "stdout-stream": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz", - "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=", + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", "dev": true, - "optional": true, "requires": { - "readable-stream": "2.3.3" + "pify": "2.3.0" }, "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true, - "optional": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true } } }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3" + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" } }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true } } }, - "stream-http": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", - "integrity": "sha1-QKBQ7I3DtTsz2ZCUFcAsC/Gr+60=", + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" + "find-up": "1.1.2", + "read-pkg": "1.1.0" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" } }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "pinkie-promise": "2.0.1" } } } }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.6", + "set-immediate-shim": "1.0.1" } }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true + "readline2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "mute-stream": "0.0.5" + } }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, - "optional": true + "requires": { + "resolve": "1.7.1" + } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "indent-string": "2.1.0", + "strip-indent": "1.0.1" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "reflect-metadata": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.12.tgz", + "integrity": "sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A==", "dev": true }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", "dev": true }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { - "get-stdin": "4.0.1" + "is-equal-shallow": "0.1.3" } }, - "style-loader": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.13.2.tgz", - "integrity": "sha1-dFMzhM9pjHEEx5URULSXF63C87s=", + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "loader-utils": "1.1.0" + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" } }, - "stylus": { - "version": "0.54.5", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", - "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", "dev": true, "requires": { - "css-parse": "1.7.0", - "debug": "2.6.8", - "glob": "7.0.6", - "mkdirp": "0.5.1", - "sax": "0.5.8", - "source-map": "0.1.43" - }, - "dependencies": { - "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "sax": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", - "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", - "dev": true - }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - } + "regenerate": "1.4.0", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" } }, - "stylus-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.1.tgz", - "integrity": "sha1-d/SzT9Aw0lsmF7z1UT21sHMMQIk=", + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", "dev": true, "requires": { - "loader-utils": "1.1.0", - "lodash.clonedeep": "4.5.0", - "when": "3.6.4" + "rc": "1.2.7", + "safe-buffer": "5.1.2" } }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "dev": true, "requires": { - "has-flag": "1.0.0" + "rc": "1.2.7" } }, - "svgo": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", - "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "coa": "1.0.4", - "colors": "1.1.2", - "csso": "2.3.2", - "js-yaml": "3.7.0", - "mkdirp": "0.5.1", - "sax": "1.2.4", - "whet.extend": "0.9.9" + "jsesc": "0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } } }, - "tapable": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", - "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", "dev": true }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "renderkid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", + "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", "dev": true, - "optional": true, "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" + "css-select": "1.2.0", + "dom-converter": "0.1.4", + "htmlparser2": "3.3.0", + "strip-ansi": "3.0.1", + "utila": "0.3.3" }, "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true, - "optional": true + "utila": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", + "dev": true } } }, - "temp": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", - "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.7.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.1.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { - "os-tmpdir": "1.0.2", - "rimraf": "2.2.8" + "caller-path": "0.1.0", + "resolve-from": "1.0.1" }, "dependencies": { - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", "dev": true } } }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "thunky": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz", - "integrity": "sha1-vzAUaCTituZ7Dy16Ssi+smkIaE4=", - "dev": true - }, - "time-stamp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", - "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=", + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", "dev": true }, - "timers-browserify": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.3.tgz", - "integrity": "sha1-Qf0L3JJqX+7cM6F6jh99SRkl9/w=", + "resolve": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, "requires": { - "global": "4.3.2", - "setimmediate": "1.0.5" + "path-parse": "1.0.5" } }, - "tmp": { - "version": "0.0.31", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", - "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "dev": true, "requires": { - "os-tmpdir": "1.0.2" + "resolve-from": "3.0.0" } }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, - "toposort": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.3.tgz", - "integrity": "sha1-8CzYp0vYvi/A6YYRw7rLlaFxhpw=", + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, - "tough-cookie": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "dev": true, - "optional": true, "requires": { - "punycode": "1.4.1" + "align-text": "0.1.4" } }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.1.2" + } }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.3" + } }, - "ts-helpers": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ts-helpers/-/ts-helpers-1.1.1.tgz", - "integrity": "sha1-iVU9K40xPn8OPgyFwI1tPwNAH1c=", - "dev": true + "run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true, + "requires": { + "once": "1.4.0" + } }, - "ts-node": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-2.0.0.tgz", - "integrity": "sha1-FuT+zJSQiCOLTL8cOclYJSa2b3Q=", + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "dev": true, "requires": { - "arrify": "1.0.1", - "chalk": "1.1.3", - "diff": "3.3.0", - "make-error": "1.3.0", - "minimist": "1.2.0", - "mkdirp": "0.5.1", - "pinkie": "2.0.4", - "source-map-support": "0.4.15", - "tsconfig": "5.0.3", - "v8flags": "2.1.1", - "xtend": "4.0.1", - "yn": "1.3.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "diff": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.0.tgz", - "integrity": "sha512-w0XZubFWn0Adlsapj9EAWX0FqWdO4tz8kc3RiYdWLh4k/V8PTb6i0SMgXt0vRM3zyKnT8tKO7mUlieRQHIjMNg==", - "dev": true - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "requires": { - "is-arrayish": "0.2.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "make-error": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.0.tgz", - "integrity": "sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y=", - "dev": true - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "1.3.1" - } - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, - "source-map-support": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", - "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=", - "dev": true, - "requires": { - "source-map": "0.5.6" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "tsconfig": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-5.0.3.tgz", - "integrity": "sha1-X0J45wGACWeo/Dg/0ZZIh48qbjo=", - "dev": true, - "requires": { - "any-promise": "1.3.0", - "parse-json": "2.2.0", - "strip-bom": "2.0.0", - "strip-json-comments": "2.0.1" - } - }, - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true - }, - "v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", - "dev": true, - "requires": { - "user-home": "1.1.1" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "yn": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-1.3.0.tgz", - "integrity": "sha1-GwgSq7jYBdSJZvjfOF3J2syaGdg=", - "dev": true, - "requires": { - "object-assign": "4.1.1" - } - } + "aproba": "1.2.0" + } + }, + "rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "dev": true + }, + "rxjs": { + "version": "5.5.10", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.10.tgz", + "integrity": "sha512-SRjimIDUHJkon+2hFo7xnvNC4ZEHGzCRwh9P7nzX3zPkCGFEg/tuElrNR7L/rZMagnK2JeH2jQwPRpmyXyLB6A==", + "requires": { + "symbol-observable": "1.0.1" } }, - "tslib": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.7.1.tgz", - "integrity": "sha1-vIAEFkaRkjp5/oN4u+s9ogF1OOw=" + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, - "tslint": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-4.5.1.tgz", - "integrity": "sha1-BTVocb7yOkNJBnNABvwYgza6gks=", + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "babel-code-frame": "6.22.0", - "colors": "1.1.2", - "diff": "3.3.0", - "findup-sync": "0.3.0", + "ret": "0.1.15" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "dev": true, + "optional": true, + "requires": { "glob": "7.1.2", - "optimist": "0.6.1", - "resolve": "1.4.0", - "tsutils": "1.9.1", - "update-notifier": "2.2.0" + "lodash": "4.17.10", + "scss-tokenizer": "0.2.3", + "yargs": "7.1.0" + } + }, + "sass-lint": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/sass-lint/-/sass-lint-1.10.2.tgz", + "integrity": "sha1-glvWsNp53dNqQv+uW21ErEkiUCs=", + "dev": true, + "requires": { + "commander": "2.15.1", + "eslint": "2.13.1", + "front-matter": "2.1.0", + "fs-extra": "1.0.0", + "glob": "7.1.2", + "globule": "1.2.0", + "gonzales-pe": "3.4.7", + "js-yaml": "3.11.0", + "lodash.capitalize": "4.2.1", + "lodash.kebabcase": "4.1.1", + "merge": "1.2.0", + "path-is-absolute": "1.0.1", + "util": "0.10.3" }, "dependencies": { - "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "dev": true, - "requires": { - "string-width": "2.1.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "babel-code-frame": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "boxen": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.2.1.tgz", - "integrity": "sha1-DxHn/jRO25OXl3/BPt5/ZNlWSB0=", - "dev": true, - "requires": { - "ansi-align": "2.0.0", - "camelcase": "4.1.0", - "chalk": "2.1.0", - "cli-boxes": "1.0.0", - "string-width": "2.1.1", - "term-size": "1.2.0", - "widest-line": "1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.0" - } - }, - "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.2.1" - } - }, - "supports-color": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", - "integrity": "sha512-qxzYsob3yv6U+xMzPrv170y8AwGP7i74g+pbixCfD6rgso8BscLT2qXIuz6TpOaiJZ3mFgT5O9lyT9nMU4LfaA==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "capture-stack-trace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "cli-boxes": { + "fs-extra": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "color-convert": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", - "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "configstore": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", - "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", "dev": true, "requires": { - "dot-prop": "4.2.0", "graceful-fs": "4.1.11", - "make-dir": "1.0.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.1.0", - "xdg-basedir": "3.0.0" - } - }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "dev": true, - "requires": { - "capture-stack-trace": "1.0.0" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", - "dev": true - }, - "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", - "dev": true - }, - "diff": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.0.tgz", - "integrity": "sha512-w0XZubFWn0Adlsapj9EAWX0FqWdO4tz8kc3RiYdWLh4k/V8PTb6i0SMgXt0vRM3zyKnT8tKO7mUlieRQHIjMNg==", - "dev": true - }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "dev": true, - "requires": { - "is-obj": "1.0.1" + "jsonfile": "2.4.0", + "klaw": "1.3.1" } }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "dev": true, "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "graceful-fs": "4.1.11" } - }, - "findup-sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + } + } + }, + "sass-loader": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-6.0.7.tgz", + "integrity": "sha512-JoiyD00Yo1o61OJsoP2s2kb19L1/Y2p3QFcCdWdF6oomBGKVYuZyqHWemRBfQ2uGYsk+CH3eCguXNfpjzlcpaA==", + "dev": true, + "requires": { + "clone-deep": "2.0.2", + "loader-utils": "1.1.0", + "lodash.tail": "4.1.1", + "neo-async": "2.5.1", + "pify": "3.0.0" + }, + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "dev": true, "requires": { - "glob": "5.0.15" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + } + } + }, + "sax": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", + "dev": true + }, + "schema-utils": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz", + "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==", + "dev": true, + "requires": { + "ajv": "6.5.0", + "ajv-keywords": "3.2.0" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "optional": true, + "requires": { + "js-base64": "2.4.3", + "source-map": "0.4.4" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, + "optional": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "amdefine": "1.0.1" } - }, - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + } + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.3.tgz", + "integrity": "sha512-vmZenZ+8Al3NLHkWnhBQ0x6BkML1eCP2xEi3JE+f3D9wW9fipD9NNJHYtE9XJM4TsPaHGZJIamrSI6MTg1dU2Q==", + "dev": true, + "requires": { + "node-forge": "0.7.5" + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "5.5.0" + } + }, + "semver-dsl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", + "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", + "dev": true, + "requires": { + "semver": "5.5.0" + } + }, + "semver-intersect": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.3.1.tgz", + "integrity": "sha1-j6hKnhAovSOeRTDRo+GB5pjYhLo=", + "dev": true, + "requires": { + "semver": "5.5.0" + } + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "requires": { + "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.3", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.4.0" + }, + "dependencies": { + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", + "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", + "dev": true + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "1.3.5", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "1.0.3", + "http-errors": "1.6.3", + "mime-types": "2.1.18", + "parseurl": "1.3.2" + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "requires": { + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.16.2" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.0", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" + "is-extendable": "0.1.1" } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "shallow-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", + "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "dev": true, + "requires": { + "is-extendable": "0.1.1", + "kind-of": "5.1.0", + "mixin-object": "2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shelljs": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz", + "integrity": "sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "silent-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/silent-error/-/silent-error-1.1.0.tgz", + "integrity": "sha1-IglwbxyFCp8dENDYQJGLRvJuG8k=", + "dev": true, + "requires": { + "debug": "2.6.9" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.2", + "use": "3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "is-descriptor": "0.1.6" } }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "is-extendable": "0.1.1" } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", - "dev": true - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-redirect": { + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "dev": true - }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "package-json": "4.0.1" + "is-descriptor": "1.0.2" } }, - "lowercase-keys": { + "is-accessor-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", - "dev": true - }, - "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "kind-of": "6.0.2" } }, - "make-dir": { + "is-data-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz", - "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "pify": "2.3.0" + "kind-of": "6.0.2" } }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } }, - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "0.10.0", + "uuid": "3.2.1" + } + }, + "sockjs-client": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", + "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "eventsource": "0.1.6", + "faye-websocket": "0.11.1", + "inherits": "2.0.3", + "json3": "3.3.2", + "url-parse": "1.4.0" + }, + "dependencies": { + "faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", "dev": true, "requires": { - "path-key": "2.0.1" + "websocket-driver": "0.7.0" } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + } + } + }, + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "2.1.1", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "dev": true, + "requires": { + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "dev": true + }, + "spdy": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", + "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "dev": true, + "requires": { + "debug": "2.6.9", + "handle-thing": "1.2.5", + "http-deceiver": "1.2.7", + "safe-buffer": "5.1.2", + "select-hose": "2.0.0", + "spdy-transport": "2.1.0" + } + }, + "spdy-transport": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz", + "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==", + "dev": true, + "requires": { + "debug": "2.6.9", + "detect-node": "2.0.3", + "hpack.js": "2.1.6", + "obuf": "1.1.2", + "readable-stream": "2.3.6", + "safe-buffer": "5.1.2", + "wbuf": "1.7.3" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", + "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "0.0.10", - "wordwrap": "0.0.3" - } - }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + } + } + }, + "ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "got": "6.7.1", - "registry-auth-token": "3.3.1", - "registry-url": "3.1.0", - "semver": "5.4.1" + "is-descriptor": "0.1.6" } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "rc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", - "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + } + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + }, + "stdout-stream": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz", + "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "2.3.6" + } + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, + "stream-each": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", + "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" + } + }, + "stream-http": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.2.tgz", + "integrity": "sha512-QllfrBhqF1DPcz46WxKTs6Mz1Bpc+8Qm6vbqOpVav5odAXwbyzwnEczoWqtxrsmlO+cJqtPrp/8gWKWjaKLLlA==", + "dev": true, + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true + }, + "style-loader": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.1.tgz", + "integrity": "sha512-IRE+ijgojrygQi3rsqT0U4dd+UcPCqcVvauZpCnQrGAlEe+FUIyrK93bUDScamesjP08JlQNsFJU+KmPedP5Og==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "schema-utils": "0.3.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" } }, - "registry-auth-token": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", - "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "dev": true, "requires": { - "rc": "1.2.1", - "safe-buffer": "5.1.1" + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" } }, - "registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "5.5.2" + } + } + } + }, + "stylus": { + "version": "0.54.5", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", + "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "dev": true, + "requires": { + "css-parse": "1.7.0", + "debug": "2.6.9", + "glob": "7.0.6", + "mkdirp": "0.5.1", + "sax": "0.5.8", + "source-map": "0.1.43" + }, + "dependencies": { + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", "dev": true, "requires": { - "rc": "1.2.1" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, - "resolve": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "stylus-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", + "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "lodash.clonedeep": "4.5.0", + "when": "3.6.4" + }, + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + } + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" + }, + "table": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "dev": true, + "requires": { + "ajv": "4.11.8", + "ajv-keywords": "1.5.1", + "chalk": "1.1.3", + "lodash": "4.17.10", + "slice-ansi": "0.0.4", + "string-width": "2.1.1" + }, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "dev": true, "requires": { - "path-parse": "1.0.5" + "co": "4.6.0", + "json-stable-stringify": "1.0.1" } }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", "dev": true }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "semver": "5.4.1" + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" } }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "string-width": { @@ -12201,12 +8691,6 @@ "strip-ansi": "4.0.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -12218,313 +8702,409 @@ } } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true - }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "dev": true, - "requires": { - "execa": "0.7.0" - } - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true - }, - "tsutils": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-1.9.1.tgz", - "integrity": "sha1-ufmrROVa+WgYMdXyjQrur1x1DLA=", - "dev": true - }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "dev": true, - "requires": { - "crypto-random-string": "1.0.0" - } - }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", - "dev": true - }, - "update-notifier": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.2.0.tgz", - "integrity": "sha1-G1g3z5DAc22IYncytmHBOPht5y8=", - "dev": true, - "requires": { - "boxen": "1.2.1", - "chalk": "1.1.3", - "configstore": "3.1.1", - "import-lazy": "2.1.0", - "is-npm": "1.0.0", - "latest-version": "3.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "3.0.0" - } - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "requires": { - "prepend-http": "1.0.4" - } - }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, - "requires": { - "isexe": "2.0.0" - } - }, - "widest-line": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", - "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", - "dev": true, - "requires": { - "string-width": "1.0.2" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.1.0.tgz", - "integrity": "sha512-0TZ20a+xcIl4u0+Mj5xDH2yOWdmQiXlKf9Hm+TgDXjTMsEYb+gDrmb8e8UNAzMCitX8NBqG4Z/FUQIyzv/R1JQ==", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" - } - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true } } }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "tapable": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", + "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", + "dev": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "optional": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "0.7.0" + } + }, + "tether": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/tether/-/tether-1.4.4.tgz", + "integrity": "sha512-bagKeRRo3vEynHnO3GB7/jB3Q4YIf0mN7gXM/nR0wZvNHkPrwmZemg1w0C32JZP0prHZUwxGwoX5CdA7tuIDEw==" + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.3.6", + "xtend": "4.0.1" + } + }, + "thunky": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", + "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=", "dev": true }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "time-stamp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", + "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=", + "dev": true + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", "dev": true, - "optional": true, "requires": { - "safe-buffer": "5.1.1" + "setimmediate": "1.0.5" } }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, - "optional": true + "requires": { + "kind-of": "3.2.2" + } }, - "type-is": { - "version": "1.6.15", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", - "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { - "media-typer": "0.3.0", - "mime-types": "2.1.16" + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" } }, - "typedoc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.5.0.tgz", - "integrity": "sha1-O/K46pHrP9Mb/2gA9KOZxdNf9bM=", + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "fs-extra": "0.30.0", - "handlebars": "4.0.5", - "highlight.js": "9.12.0", - "lodash": "4.17.4", - "marked": "0.3.6", - "minimatch": "3.0.4", - "progress": "1.1.8", - "shelljs": "0.7.8", - "typedoc-default-themes": "0.4.4", - "typescript": "2.0.3" + "is-number": "3.0.0", + "repeat-string": "1.6.1" }, "dependencies": { - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" + "kind-of": "3.2.2" } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + } + } + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": true, + "requires": { + "punycode": "1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + } + } + }, + "tree-kill": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz", + "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==", + "dev": true + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "true-case-path": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz", + "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=", + "dev": true, + "optional": true, + "requires": { + "glob": "6.0.4" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", "dev": true, "optional": true, "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } + } + } + }, + "ts-helpers": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ts-helpers/-/ts-helpers-1.1.1.tgz", + "integrity": "sha1-iVU9K40xPn8OPgyFwI1tPwNAH1c=", + "dev": true + }, + "ts-node": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-2.0.0.tgz", + "integrity": "sha1-FuT+zJSQiCOLTL8cOclYJSa2b3Q=", + "dev": true, + "requires": { + "arrify": "1.0.1", + "chalk": "1.1.3", + "diff": "3.5.0", + "make-error": "1.3.4", + "minimist": "1.2.0", + "mkdirp": "0.5.1", + "pinkie": "2.0.4", + "source-map-support": "0.4.18", + "tsconfig": "5.0.3", + "v8flags": "2.1.1", + "xtend": "4.0.1", + "yn": "1.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, - "optional": true, "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "optional": true - } + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" } }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, - "decamelize": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "tsconfig": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-5.0.3.tgz", + "integrity": "sha1-X0J45wGACWeo/Dg/0ZZIh48qbjo=", + "dev": true, + "requires": { + "any-promise": "1.3.0", + "parse-json": "2.2.0", + "strip-bom": "2.0.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + } + } + }, + "tsickle": { + "version": "0.21.6", + "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.21.6.tgz", + "integrity": "sha1-U7Abl5xcE/2xOvs/uVgXflmRWI0=", + "dev": true, + "requires": { + "minimist": "1.2.0", + "mkdirp": "0.5.1", + "source-map": "0.5.7", + "source-map-support": "0.4.18" + }, + "dependencies": { + "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "optional": true - }, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "tslib": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.1.tgz", + "integrity": "sha512-avfPS28HmGLLc2o4elcc2EIq2FcH++Yo5YxpBZi9Yw93BCTGFthI4HPE4Rpep6vSYQaK8e69PelM44tPj+RaQg==" + }, + "tslint": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-4.5.1.tgz", + "integrity": "sha1-BTVocb7yOkNJBnNABvwYgza6gks=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "colors": "1.2.5", + "diff": "3.5.0", + "findup-sync": "0.3.0", + "glob": "7.1.2", + "optimist": "0.6.1", + "resolve": "1.7.1", + "tsutils": "1.9.1", + "update-notifier": "2.5.0" + } + }, + "tsutils": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-1.9.1.tgz", + "integrity": "sha1-ufmrROVa+WgYMdXyjQrur1x1DLA=", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2" + } + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.18" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typedoc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.5.0.tgz", + "integrity": "sha1-O/K46pHrP9Mb/2gA9KOZxdNf9bM=", + "dev": true, + "requires": { + "fs-extra": "0.30.0", + "handlebars": "4.0.5", + "highlight.js": "9.12.0", + "lodash": "4.17.10", + "marked": "0.3.19", + "minimatch": "3.0.4", + "progress": "1.1.8", + "shelljs": "0.7.8", + "typedoc-default-themes": "0.4.4", + "typescript": "2.0.3" + }, + "dependencies": { "fs-extra": { "version": "0.30.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", @@ -12535,81 +9115,9 @@ "jsonfile": "2.4.0", "klaw": "1.3.1", "path-is-absolute": "1.0.1", - "rimraf": "2.6.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "handlebars": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.5.tgz", - "integrity": "sha1-ksbta7FkEQxQ1NjQ+93HCAbG+Oc=", - "dev": true, - "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" - } - }, - "highlight.js": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.12.0.tgz", - "integrity": "sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "rimraf": "2.6.2" } }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "interpret": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", - "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", - "dev": true - }, - "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", - "dev": true - }, "jsonfile": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", @@ -12619,144 +9127,6 @@ "graceful-fs": "4.1.11" } }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.5" - } - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true, - "optional": true - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "marked": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.6.tgz", - "integrity": "sha1-ssbGGPzOzk74bE/Gy4p8v1rtqNc=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "0.0.10", - "wordwrap": "0.0.3" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", - "dev": true - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "1.4.0" - } - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "resolve": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", - "dev": true, - "requires": { - "path-parse": "1.0.5" - } - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "optional": true, - "requires": { - "align-text": "0.1.4" - } - }, - "rimraf": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, "shelljs": { "version": "0.7.8", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", @@ -12764,107 +9134,46 @@ "dev": true, "requires": { "glob": "7.1.2", - "interpret": "1.0.3", + "interpret": "1.1.0", "rechoir": "0.6.2" } }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - }, - "typedoc-default-themes": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.4.4.tgz", - "integrity": "sha1-q+mX3PF0YrYnQ4vGO2XFDTY8JS8=", - "dev": true - }, "typescript": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.0.3.tgz", "integrity": "sha1-M97J6uhrju4yfdQZygUMhTyr1RQ=", "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "optional": true, - "requires": { - "source-map": "0.5.6", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true, - "optional": true - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true, - "optional": true - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } } } }, + "typedoc-default-themes": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.4.4.tgz", + "integrity": "sha1-q+mX3PF0YrYnQ4vGO2XFDTY8JS8=", + "dev": true + }, "typescript": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.1.tgz", - "integrity": "sha1-YWDk+PGV1bqB1IdvnAzB+8CCBiQ=", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.3.tgz", + "integrity": "sha512-K7g15Bb6Ra4lKf7Iq2l/I5/En+hLIHmxWZGq3D4DIRNFxMNV6j2SHSvDOqs2tGd4UvD/fJvrwopzQXjLrT7Itw==", "dev": true }, "uglify-js": { - "version": "3.0.27", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.0.27.tgz", - "integrity": "sha1-qX24yLprnbpOL4jYaqlUj6YyADQ=", + "version": "3.3.25", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.25.tgz", + "integrity": "sha512-hobogryjDV36VrLK3Y69ou4REyrTApzUblVFmdQOYRe8cYaSmFJXMb4dR9McdvYDSbeNdzUgYr2YVukJaErJcA==", "dev": true, "requires": { - "commander": "2.11.0", - "source-map": "0.5.6" + "commander": "2.15.1", + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "uglify-to-browserify": { @@ -12875,67 +9184,106 @@ "optional": true }, "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", - "dev": true, - "requires": { - "source-map": "0.5.6", - "uglify-js": "2.8.29", - "webpack-sources": "1.0.1" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.5.tgz", + "integrity": "sha512-hIQJ1yxAPhEA2yW/i7Fr+SXZVMp+VEI3d42RTHBgQd2yhp/1UdBcR3QEWPV5ahBxlqQDMEMTuTEvDHSFINfwSw==", + "dev": true, + "requires": { + "cacache": "10.0.4", + "find-cache-dir": "1.0.0", + "schema-utils": "0.4.5", + "serialize-javascript": "1.5.0", + "source-map": "0.6.1", + "uglify-es": "3.3.9", + "webpack-sources": "1.1.0", + "worker-farm": "1.6.0" }, "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", "dev": true }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "dev": true, + "requires": { + "commander": "2.13.0", + "source-map": "0.6.1" + } + } + } + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "source-map": "0.5.6", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "is-extendable": "0.1.1" } }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "dev": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" } } } }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "uniqid": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", - "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", + "unique-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", + "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", "dev": true, "requires": { - "macaddress": "0.2.8" + "unique-slug": "2.0.0" } }, - "uniqs": { + "unique-slug": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", + "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "dev": true, + "requires": { + "imurmurhash": "0.1.4" + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "1.0.0" + } }, "universalify": { "version": "0.1.1", @@ -12949,12 +9297,103 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, + "requires": { + "boxen": "1.3.0", + "chalk": "2.2.2", + "configstore": "3.1.2", + "import-lazy": "2.1.0", + "is-ci": "1.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" + } + }, "upper-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", "dev": true }, + "uri-js": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.1.tgz", + "integrity": "sha512-jpKCA3HjsBfSDOEgxRDAxQCNyHfCPSbq57PqCkd3gAyBuPb3IWxw54EHncqESznIdqSetHfw3D7ylThu2Kcc9A==", + "dev": true, + "requires": { + "punycode": "2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -12983,68 +9422,59 @@ "mime": "1.2.11" }, "dependencies": { - "big.js": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", - "integrity": "sha1-TK2iGTZS6zyp7I5VyQFWacmAaXg=", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "3.1.3", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - }, "mime": { "version": "1.2.11", "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=", "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true } } }, "url-parse": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.1.9.tgz", - "integrity": "sha1-xn8dd11R8KGJEd17P/rSe7nlvRk=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.0.tgz", + "integrity": "sha512-ERuGxDiQ6Xw/agN4tuoCRbmwRuZP0cJ1lJxJubXr5Q/5cDa78+Dc4wfvtxzhzhkm5VvmW6Mf8EVj9SPGN4l8Lg==", "dev": true, "requires": { - "querystringify": "1.0.0", + "querystringify": "2.0.0", "requires-port": "1.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "1.0.4" + } + }, + "use": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", + "dev": true, + "requires": { + "kind-of": "6.0.2" }, "dependencies": { - "querystringify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", - "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=", + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true } } }, + "user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, "util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", @@ -13075,38 +9505,48 @@ "dev": true }, "utils-merge": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", - "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha1-PdPT55Crwk17DToDT/q6vijrvAQ=", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "dev": true + }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", "dev": true, - "optional": true + "requires": { + "user-home": "1.1.1" + }, + "dependencies": { + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + } + } }, "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", "dev": true, "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" } }, "vary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.1.tgz", - "integrity": "sha1-Z1Neu2lMHVIldFeYRmUyP1h+jTc=", - "dev": true - }, - "vendors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz", - "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, "verror": { @@ -13114,7 +9554,6 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, - "optional": true, "requires": { "assert-plus": "1.0.0", "core-util-is": "1.0.2", @@ -13123,142 +9562,593 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "vlq": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", + "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", + "dev": true + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "2.0.3", + "graceful-fs": "4.1.11", + "neo-async": "2.5.1" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "3.1.10", + "normalize-path": "2.1.1" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "chokidar": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", + "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", + "dev": true, + "requires": { + "anymatch": "2.0.0", + "async-each": "1.0.1", + "braces": "2.3.2", + "fsevents": "1.2.4", + "glob-parent": "3.1.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "4.0.0", + "normalize-path": "2.1.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0", + "upath": "1.1.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, - "optional": true + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } } } }, - "vlq": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.2.tgz", - "integrity": "sha1-4xbVJXtAuGu0PLjV/qXX9U1rDKE=", - "dev": true - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" - } - }, - "walk-sync": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/walk-sync/-/walk-sync-0.3.2.tgz", - "integrity": "sha1-SCcoCvxC0OA1NnxKTjHurA0Tb3U=", - "dev": true, - "requires": { - "ensure-posix-path": "1.0.2", - "matcher-collection": "1.0.4" - } - }, - "watchpack": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", - "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", - "dev": true, - "requires": { - "async": "2.5.0", - "chokidar": "1.7.0", - "graceful-fs": "4.1.11" - } - }, "wbuf": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.2.tgz", - "integrity": "sha1-1pe5nx9ZUS3ydRvkJ2nBWAtYAf4=", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, "requires": { - "minimalistic-assert": "1.0.0" + "minimalistic-assert": "1.0.1" } }, "webpack": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.4.1.tgz", - "integrity": "sha1-TD9PP7MYFVpNsMtqNv8FxWl0GPQ=", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz", + "integrity": "sha512-3kOFejWqj5ISpJk4Qj/V7w98h9Vl52wak3CLiw/cDOfbVTq7FeoZ0SdoHHY9PYlHr50ZS42OfvzE2vB4nncKQg==", "dev": true, "requires": { - "acorn": "5.1.1", + "acorn": "5.5.3", "acorn-dynamic-import": "2.0.2", - "ajv": "5.2.2", - "ajv-keywords": "2.1.0", - "async": "2.5.0", + "ajv": "6.5.0", + "ajv-keywords": "3.2.0", + "async": "2.6.0", "enhanced-resolve": "3.4.1", "escope": "3.6.0", - "interpret": "1.0.3", + "interpret": "1.1.0", "json-loader": "0.5.7", "json5": "0.5.1", "loader-runner": "2.3.0", "loader-utils": "1.1.0", "memory-fs": "0.4.1", "mkdirp": "0.5.1", - "node-libs-browser": "2.0.0", - "source-map": "0.5.6", - "supports-color": "4.2.1", + "node-libs-browser": "2.1.0", + "source-map": "0.5.7", + "supports-color": "4.5.0", "tapable": "0.2.8", "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.4.0", - "webpack-sources": "1.0.1", + "watchpack": "1.6.0", + "webpack-sources": "1.1.0", "yargs": "8.0.2" }, "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", "dev": true }, "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" }, "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "ansi-regex": "3.0.0" } } } }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } } }, - "supports-color": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", - "integrity": "sha1-ZaS7JjHpDgJCDbpVVMN1pHVLuDY=", + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", "dev": true, "requires": { - "has-flag": "2.0.0" + "source-map": "0.5.7", + "uglify-js": "2.8.29", + "webpack-sources": "1.1.0" } }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, "yargs": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", @@ -13278,6 +10168,38 @@ "which-module": "2.0.0", "y18n": "3.2.1", "yargs-parser": "7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + } } }, "yargs-parser": { @@ -13287,185 +10209,476 @@ "dev": true, "requires": { "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + } + } + }, + "webpack-core": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", + "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", + "dev": true, + "requires": { + "source-list-map": "0.1.8", + "source-map": "0.4.4" + }, + "dependencies": { + "source-list-map": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" } } } }, "webpack-dev-middleware": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz", - "integrity": "sha1-007++y7dp+HTtdvgcolRMhllFwk=", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", + "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", "dev": true, "requires": { "memory-fs": "0.4.1", - "mime": "1.3.6", + "mime": "1.6.0", "path-is-absolute": "1.0.1", "range-parser": "1.2.0", "time-stamp": "2.0.0" } }, "webpack-dev-server": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.5.1.tgz", - "integrity": "sha1-oC5yaoe7YD211xq7fW0mSb8Qx2k=", + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.2.tgz", + "integrity": "sha512-zrPoX97bx47vZiAXfDrkw8pe9QjJ+lunQl3dypojyWwWr1M5I2h0VSrMPfTjopHQPRNn+NqfjcMmhoLcUJe2gA==", "dev": true, "requires": { "ansi-html": "0.0.7", + "array-includes": "3.0.3", "bonjour": "3.5.0", - "chokidar": "1.7.0", - "compression": "1.7.0", - "connect-history-api-fallback": "1.3.0", + "chokidar": "2.0.3", + "compression": "1.7.2", + "connect-history-api-fallback": "1.5.0", + "debug": "3.1.0", "del": "3.0.0", - "express": "4.15.4", + "express": "4.16.3", "html-entities": "1.2.1", "http-proxy-middleware": "0.17.4", + "import-local": "1.0.0", "internal-ip": "1.2.0", - "opn": "4.0.2", + "ip": "1.1.5", + "killable": "1.0.0", + "loglevel": "1.6.1", + "opn": "5.1.0", "portfinder": "1.0.13", - "selfsigned": "1.9.1", - "serve-index": "1.9.0", - "sockjs": "0.3.18", - "sockjs-client": "1.1.2", + "selfsigned": "1.10.3", + "serve-index": "1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.1.4", "spdy": "3.4.7", "strip-ansi": "3.0.1", - "supports-color": "3.2.3", - "webpack-dev-middleware": "1.12.0", + "supports-color": "5.4.0", + "webpack-dev-middleware": "1.12.2", "yargs": "6.6.0" }, "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "3.1.10", + "normalize-path": "2.1.1" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, "camelcase": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", "dev": true }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "chokidar": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", + "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "anymatch": "2.0.0", + "async-each": "1.0.1", + "braces": "2.3.2", + "fsevents": "1.2.4", + "glob-parent": "3.1.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "4.0.0", + "normalize-path": "2.1.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0", + "upath": "1.1.0" } }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "ms": "2.0.0" } }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } } }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } } }, - "opn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", - "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "object-assign": "4.1.1", - "pinkie-promise": "2.0.1" + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } } }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "lcid": "1.0.0" + "kind-of": "6.0.2" } }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "kind-of": "6.0.2" } }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "is-extglob": "2.1.1" } }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } } }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "is-utf8": "0.2.1" + "has-flag": "3.0.0" } }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", "dev": true }, "yargs": { @@ -13501,128 +10714,130 @@ } }, "webpack-merge": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.0.tgz", - "integrity": "sha1-atciI7PguDflMeRZfBmfkJNhUR4=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.2.tgz", + "integrity": "sha512-/0QYwW/H1N/CdXYA2PNPVbsxO3u2Fpz34vs72xm03SRfg6bMNGfMJIQEpQjKRvkG2JvT6oRJFpDtSrwbX8Jzvw==", "dev": true, "requires": { - "lodash": "4.17.4" + "lodash": "4.17.10" } }, "webpack-sources": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.1.tgz", - "integrity": "sha1-xzVkNqTRMSO+LiQmoF0drZy+Zc8=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", + "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", "dev": true, "requires": { "source-list-map": "2.0.0", - "source-map": "0.5.6" + "source-map": "0.6.1" }, "dependencies": { - "source-list-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha1-qqR0A/eyRakvvJfqCPJQ1gh+0IU=", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, + "webpack-subresource-integrity": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.0.4.tgz", + "integrity": "sha1-j6yKfo61n8ahZ2ioXJ2U7n+dDts=", + "dev": true, + "requires": { + "webpack-core": "0.6.9" + } + }, "websocket-driver": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", - "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", "dev": true, "requires": { - "websocket-extensions": "0.1.1" + "http-parser-js": "0.4.12", + "websocket-extensions": "0.1.3" } }, "websocket-extensions": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz", - "integrity": "sha1-domUmcGEtu91Q3fC27DNbLVdKec=", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", "dev": true }, + "whatwg-fetch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + }, "when": { "version": "3.6.4", "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", "dev": true }, - "whet.extend": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", - "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", - "dev": true - }, "which": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { "isexe": "2.0.0" } }, "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", "dev": true }, "wide-align": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha1-Vx4PGwYEY268DfwhsDObvjE0FxA=", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "dev": true, "requires": { "string-width": "1.0.2" + } + }, + "widest-line": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", + "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", + "dev": true, + "requires": { + "string-width": "2.1.1" }, "dependencies": { "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "3.0.0" } } } @@ -13634,11 +10849,20 @@ "dev": true }, "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", "dev": true }, + "worker-farm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", + "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", + "dev": true, + "requires": { + "errno": "0.1.7" + } + }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", @@ -13647,28 +10871,6 @@ "requires": { "string-width": "1.0.2", "strip-ansi": "3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } } }, "wrappy": { @@ -13677,16 +10879,30 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "xml-char-classes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", - "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=", - "dev": true + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "0.5.1" + } + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" + } }, - "xmldom": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", - "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=", + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", "dev": true }, "xtend": { @@ -13695,10 +10911,19 @@ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", "dev": true }, + "xxhashjs": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", + "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", + "dev": true, + "requires": { + "cuint": "0.2.2" + } + }, "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, "yallist": { @@ -13729,19 +10954,6 @@ "yargs-parser": "5.0.0" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true, - "optional": true - }, "camelcase": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", @@ -13749,352 +10961,6 @@ "dev": true, "optional": true }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "optional": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "optional": true - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "optional": true, - "requires": { - "is-arrayish": "0.2.1" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "optional": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true, - "optional": true - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", - "dev": true, - "optional": true - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true, - "optional": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true, - "optional": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "optional": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true, - "optional": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "optional": true, - "requires": { - "invert-kv": "1.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "optional": true, - "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "optional": true, - "requires": { - "lcid": "1.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "optional": true, - "requires": { - "error-ex": "1.3.1" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "optional": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "optional": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "optional": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "optional": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true, - "optional": true - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "optional": true - }, - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "optional": true, - "requires": { - "spdx-license-ids": "1.2.2" - } - }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", - "dev": true, - "optional": true - }, - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "optional": true, - "requires": { - "is-utf8": "0.2.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "optional": true, - "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true, - "optional": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "optional": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - } - }, "y18n": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", @@ -14123,10 +10989,19 @@ } } }, + "yn": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-1.3.0.tgz", + "integrity": "sha1-GwgSq7jYBdSJZvjfOF3J2syaGdg=", + "dev": true, + "requires": { + "object-assign": "4.1.1" + } + }, "zone.js": { - "version": "0.8.16", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.16.tgz", - "integrity": "sha1-rDG2xBj4jA+Ritas2KQCrKkxOrs=" + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.26.tgz", + "integrity": "sha512-W9Nj+UmBJG251wkCacIkETgra4QgBo/vgoEkb4a2uoLzpQG7qF9nzwoLXWU5xj3Fg2mxGvEDh47mg24vXccYjA==" } } } diff --git a/src/Web/WebStatus/Dockerfile b/src/Web/WebStatus/Dockerfile index d85386503..10cfa25e5 100644 --- a/src/Web/WebStatus/Dockerfile +++ b/src/Web/WebStatus/Dockerfile @@ -5,8 +5,8 @@ EXPOSE 80 FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY . . -RUN dotnet restore -nowarn:msb3202,nu1503 WORKDIR /src/src/Web/WebStatus +RUN dotnet restore -nowarn:msb3202,nu1503 RUN dotnet build --no-restore -c Release -o /app FROM build AS publish From dc5de837478dbdfea6880ce70b0ab608ed51337c Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Llorente Date: Wed, 16 May 2018 20:30:05 -0700 Subject: [PATCH 06/33] Changes using fluent configuration API from Polly. Still to be cleaned up and old Policy code to be removed, etc. --- .../HttpClientDefaultPolicies.cs | 86 +++++++++++-------- src/Web/WebMVC/Startup.cs | 84 ++++++++++++++++-- 2 files changed, 125 insertions(+), 45 deletions(-) diff --git a/src/Web/WebMVC/Infrastructure/HttpClientDefaultPolicies.cs b/src/Web/WebMVC/Infrastructure/HttpClientDefaultPolicies.cs index 2340febd9..0cacb8a65 100644 --- a/src/Web/WebMVC/Infrastructure/HttpClientDefaultPolicies.cs +++ b/src/Web/WebMVC/Infrastructure/HttpClientDefaultPolicies.cs @@ -1,5 +1,7 @@ using Microsoft.Extensions.Logging; using Polly; +using Polly.CircuitBreaker; +using Polly.Retry; using System; using System.Net.Http; @@ -7,8 +9,13 @@ namespace WebMVC.Infrastructure { public class HttpClientDefaultPolicies { - const int RETRY_COUNT = 6; - const int EXCEPTIONS_ALLOWED_BEFORE_CIRCUIT_BREAKER = 5; + //Config for Retries with exponential backoff policy + const int MAX_RETRIES = 6; + const int SECONDS_BASE_FOR_EXPONENTIAL_BACKOFF = 2; + + //Config for Circuit Breaker policy + const int EXCEPTIONS_ALLOWED_BEFORE_CIRCUIT_BREAKES = 5; + const int DURATION_OF_BREAK_IN_MINUTES = 1; private readonly ILogger _logger; @@ -17,44 +24,51 @@ namespace WebMVC.Infrastructure _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } - public Policy GetWaitAndRetryPolicy() + public IAsyncPolicy GetWaitAndRetryPolicy() { - return Policy.Handle() - .WaitAndRetryAsync( - // number of retries - RETRY_COUNT, - // exponential backofff - retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), - // on retry - (exception, timeSpan, retryCount, context) => - { - var msg = $"Retry {retryCount} implemented with Polly's RetryPolicy " + - $"of {context.PolicyKey} " + - $"at {context.OperationKey}, " + - $"due to: {exception}."; - _logger.LogWarning(msg); - _logger.LogDebug(msg); - }); + RetryPolicy retryPolicy = + Policy.Handle() + .WaitAndRetryAsync( + // Maximum number of retries + MAX_RETRIES, + // exponential backofff (2sg, 4sg, 8sg, 16sg, 32sg. etc.) + retryAttempt => TimeSpan.FromSeconds(Math.Pow(SECONDS_BASE_FOR_EXPONENTIAL_BACKOFF, retryAttempt)), + // on retry + (exception, timeSpan, retryCount, context) => + { + var msg = $"Retry {retryCount} implemented with Polly's RetryPolicy " + + $"of {context.PolicyKey} " + + $"at {context.OperationKey}, " + + $"due to: {exception}."; + _logger.LogWarning(msg); + _logger.LogDebug(msg); + }); + + return retryPolicy.AsAsyncPolicy(); } - public Policy GetCircuitBreakerPolicy() + public IAsyncPolicy GetCircuitBreakerPolicy() { - return Policy.Handle() - .CircuitBreakerAsync( - // number of exceptions before breaking circuit - EXCEPTIONS_ALLOWED_BEFORE_CIRCUIT_BREAKER, - // time circuit opened before retry - TimeSpan.FromMinutes(1), - (exception, duration) => - { - // on circuit opened - _logger.LogTrace("Circuit breaker opened"); - }, - () => - { - // on circuit closed - _logger.LogTrace("Circuit breaker reset"); - }); + CircuitBreakerPolicy circuitBreakerPolicy = + Policy.Handle() + .CircuitBreakerAsync( + // Number of exceptions before breaking the circuit + EXCEPTIONS_ALLOWED_BEFORE_CIRCUIT_BREAKES, + // Duration of break + TimeSpan.FromMinutes(DURATION_OF_BREAK_IN_MINUTES), + (exception, duration) => + { + // On circuit opened (Circuit is broken) + _logger.LogTrace("Circuit has been broken"); + }, + () => + { + // on circuit closed + _logger.LogTrace("Circuit has been reset"); + }); + + + return circuitBreakerPolicy.AsAsyncPolicy(); } } } diff --git a/src/Web/WebMVC/Startup.cs b/src/Web/WebMVC/Startup.cs index b8be7a4e5..f93532852 100644 --- a/src/Web/WebMVC/Startup.cs +++ b/src/Web/WebMVC/Startup.cs @@ -15,7 +15,11 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.HealthChecks; using Microsoft.Extensions.Logging; using Polly; +using Polly.CircuitBreaker; +using Polly.Extensions.Http; using Polly.Registry; +using Polly.Retry; +using Polly.Timeout; using StackExchange.Redis; using System; using System.IdentityModel.Tokens.Jwt; @@ -35,13 +39,13 @@ namespace Microsoft.eShopOnContainers.WebMVC public IConfiguration Configuration { get; } - // This method gets called by the runtime. Use this method to add services to the container. + // This method gets called by the runtime. Use this method to add services to the IoC container. public void ConfigureServices(IServiceCollection services) { services.AddAppInsight(Configuration) .AddHealthChecks(Configuration) .AddCustomMvc(Configuration) - .AddCustomApplicationServices(Configuration) + .AddHttpClientServices(Configuration) .AddCustomAuthentication(Configuration); } @@ -165,28 +169,89 @@ namespace Microsoft.eShopOnContainers.WebMVC return services; } - public static IServiceCollection AddCustomApplicationServices(this IServiceCollection services, IConfiguration configuration) + // Adds all Http client services (like Service-Agents) using resilient Http requests based on HttpClient factory and Polly's policies + public static IServiceCollection AddHttpClientServices(this IServiceCollection services, IConfiguration configuration) { + // (CDLTLL) TEMPORAL COMMENT: Do we need this line of code if using HttpClient factory? services.AddSingleton(); + + // (CDLTLL) I don't think we need this HttpClientDefaultPolicies if using fluent configuration ,as below... + // Create a singleton object with the by default policies services.AddSingleton(); var defaultPolicies = services.BuildServiceProvider().GetService(); - var registry = services.AddPolicyRegistry(); - registry.Add("WaitAndRetry", defaultPolicies.GetWaitAndRetryPolicy()); - registry.Add("CircuitBreaker", defaultPolicies.GetCircuitBreakerPolicy()); + // Create a Polly-Policy-Registry with the by default policies for resilient Http requests + var pollyPolicyRegistry = services.AddPolicyRegistry(); + + + //Using fluent client configuration of Polly policies + + var retriesWithExponentialBackoff = HttpPolicyExtensions + .HandleTransientHttpError() + .WaitAndRetryAsync(7, + retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)) + ); + //(CDLTLL) Instead of hardcoded values, use: configuration["HttpClientMaxNumberRetries"], configuration["SecondsBaseForExponentialBackoff"] + + var circuitBreaker = HttpPolicyExtensions + .HandleTransientHttpError() + .CircuitBreakerAsync(6, + TimeSpan.FromSeconds(30) + ); + //(CDLTLL) Instead of hardcoded values, use: configuration["HttpClientExceptionsAllowedBeforeBreaking"], configuration["DurationOfBreakInMinutes"] + + + pollyPolicyRegistry.Add("DefaultRetriesWithExponentialBackoff", retriesWithExponentialBackoff); + pollyPolicyRegistry.Add("DefaultCircuitBreaker", circuitBreaker); + + + // (CDLTLL) Using "OLD" policies. I don't like it much... + //pollyPolicyRegistry.Add("DefaultRetriesWithExponentialBackoff", defaultPolicies.GetWaitAndRetryPolicy()); // (CDLTLL) TEMPORAL COMMENT: Arguments here would be a good place to propagate the configuration values --> GetWaitAndRetryPolicy(configuration["HttpClientMaxNumberRetries"], configuration["SecondsBaseForExponentialBackoff"]) + //pollyPolicyRegistry.Add("DefaultCircuitBreaker", defaultPolicies.GetCircuitBreakerPolicy()); // (CDLTLL) TEMPORAL COMMENT: Arguments here would be a good place to propagate the configuration values --> GetCircuitBreakerPolicy(configuration["HttpClientExceptionsAllowedBeforeBreaking"], configuration["DurationOfBreakInMinutes"]) + + + // (CDLTLL) Handlers need to be transient. //(CDLTLL) TEMPORAL COMMENT: This registration was missing, hence the error "InvalidOperationException: No service for type 'WebMVC.Infrastructure.HttpClientAuthorizationDelegatingHandler' has been registered" + services.AddTransient(); + + //Add all Typed-Clients (Service-Agents) through the HttpClient factory to implement Resilient Http requests + // + + //Add BasketService typed client (Service Agent) services.AddHttpClient() - .AddHttpMessageHandler() - .AddPolicyHandlerFromRegistry("WaitAndRetry") - .AddPolicyHandlerFromRegistry("CircuitBreaker"); + .AddHttpMessageHandler() //Additional Authentication-Delegating-Handler to add the OAuth-Bearer-token to the Http headers + .AddPolicyHandlerFromRegistry("DefaultRetriesWithExponentialBackoff") + .AddPolicyHandlerFromRegistry("DefaultCircuitBreaker"); + + //Add CatalogService typed client (Service Agent) + //services.AddHttpClient() ... + + //Add OrderingService typed client (Service Agent) + //services.AddHttpClient() ... + + //Add CampaignService typed client (Service Agent) + //services.AddHttpClient() ... + + //Add LocationService typed client (Service Agent) + //services.AddHttpClient() ... + + //Add IdentityParser typed client (Service Agent) + //services.AddHttpClient() ... + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // (CDLTLL) TEMPORAL COMMENT: The following Typed-Clients (Service-Agents) have to be coded as BasketService by using AddHttpClient<>(), right? + // This code will be deleted services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient, IdentityParser>(); + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // TEMPORAL COMMENT: This code will be deleted when using HttpClientFactory, right? if (configuration.GetValue("UseResilientHttp") == bool.TrueString) { services.AddSingleton(sp => @@ -214,6 +279,7 @@ namespace Microsoft.eShopOnContainers.WebMVC { services.AddSingleton(); } + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// return services; } From 2f9fa4dccafd99aaeb079f24246b45a107dc19ed Mon Sep 17 00:00:00 2001 From: Unai Zorrilla Castro Date: Fri, 18 May 2018 12:36:33 +0200 Subject: [PATCH 07/33] Added HTTPClient services and review application on WebMVC --- .../Controllers/BasketController.cs | 2 +- src/Web/WebMVC/AppSettings.cs | 3 +- .../HttpClientRequestIdDelegatingHandler.cs | 26 ++++ .../IResilientHttpClientFactory.cs | 8 +- .../ResilientHttpClientFactory.cs | 104 ++++++------- src/Web/WebMVC/Services/BasketService.cs | 48 +++--- src/Web/WebMVC/Services/CampaignService.cs | 44 ++---- src/Web/WebMVC/Services/CatalogService.cs | 32 ++-- src/Web/WebMVC/Services/LocationService.cs | 31 ++-- src/Web/WebMVC/Services/OrderingService.cs | 92 +++++------ src/Web/WebMVC/Startup.cs | 146 +++++------------- 11 files changed, 225 insertions(+), 311 deletions(-) create mode 100644 src/Web/WebMVC/Infrastructure/HttpClientRequestIdDelegatingHandler.cs diff --git a/src/Services/Basket/Basket.API/Controllers/BasketController.cs b/src/Services/Basket/Basket.API/Controllers/BasketController.cs index b6dd5a4b0..ccb81d25f 100644 --- a/src/Services/Basket/Basket.API/Controllers/BasketController.cs +++ b/src/Services/Basket/Basket.API/Controllers/BasketController.cs @@ -36,7 +36,7 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.Controllers var basket = await _repository.GetBasketAsync(id); if (basket == null) { - return NotFound(); + return Ok(new CustomerBasket(id) { }); } return Ok(basket); diff --git a/src/Web/WebMVC/AppSettings.cs b/src/Web/WebMVC/AppSettings.cs index 30403aa9d..a705c5a90 100644 --- a/src/Web/WebMVC/AppSettings.cs +++ b/src/Web/WebMVC/AppSettings.cs @@ -7,9 +7,8 @@ namespace Microsoft.eShopOnContainers.WebMVC { public class AppSettings { - public Connectionstrings ConnectionStrings { get; set; } + //public Connectionstrings ConnectionStrings { get; set; } public string MarketingUrl { get; set; } - public string PurchaseUrl { get; set; } public string SignalrHubUrl { get; set; } public bool ActivateCampaignDetailFunction { get; set; } diff --git a/src/Web/WebMVC/Infrastructure/HttpClientRequestIdDelegatingHandler.cs b/src/Web/WebMVC/Infrastructure/HttpClientRequestIdDelegatingHandler.cs new file mode 100644 index 000000000..17e4591a1 --- /dev/null +++ b/src/Web/WebMVC/Infrastructure/HttpClientRequestIdDelegatingHandler.cs @@ -0,0 +1,26 @@ +using System; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +namespace WebMVC.Infrastructure +{ + public class HttpClientRequestIdDelegatingHandler + : DelegatingHandler + { + + public HttpClientRequestIdDelegatingHandler() + { + } + + protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) + { + if (request.Method == HttpMethod.Post || request.Method == HttpMethod.Put) + { + request.Headers.Add("x-requestid", Guid.NewGuid().ToString()); + } + + return await base.SendAsync(request, cancellationToken); + } + } +} diff --git a/src/Web/WebMVC/Infrastructure/IResilientHttpClientFactory.cs b/src/Web/WebMVC/Infrastructure/IResilientHttpClientFactory.cs index aa1d31c9b..39b36f141 100644 --- a/src/Web/WebMVC/Infrastructure/IResilientHttpClientFactory.cs +++ b/src/Web/WebMVC/Infrastructure/IResilientHttpClientFactory.cs @@ -3,8 +3,8 @@ using System; namespace Microsoft.eShopOnContainers.WebMVC.Infrastructure { - public interface IResilientHttpClientFactory - { - ResilientHttpClient CreateResilientHttpClient(); - } + //public interface IResilientHttpClientFactory + //{ + // ResilientHttpClient CreateResilientHttpClient(); + //} } \ No newline at end of file diff --git a/src/Web/WebMVC/Infrastructure/ResilientHttpClientFactory.cs b/src/Web/WebMVC/Infrastructure/ResilientHttpClientFactory.cs index 783dae631..09b596f1c 100644 --- a/src/Web/WebMVC/Infrastructure/ResilientHttpClientFactory.cs +++ b/src/Web/WebMVC/Infrastructure/ResilientHttpClientFactory.cs @@ -7,60 +7,60 @@ using System.Net.Http; namespace Microsoft.eShopOnContainers.WebMVC.Infrastructure { - public class ResilientHttpClientFactory : IResilientHttpClientFactory - { - private readonly ILogger _logger; - private readonly int _retryCount; - private readonly int _exceptionsAllowedBeforeBreaking; - private readonly IHttpContextAccessor _httpContextAccessor; + //public class ResilientHttpClientFactory : IResilientHttpClientFactory + //{ + // private readonly ILogger _logger; + // private readonly int _retryCount; + // private readonly int _exceptionsAllowedBeforeBreaking; + // private readonly IHttpContextAccessor _httpContextAccessor; - public ResilientHttpClientFactory(ILogger logger, IHttpContextAccessor httpContextAccessor, int exceptionsAllowedBeforeBreaking = 5, int retryCount = 6) - { - _logger = logger; - _exceptionsAllowedBeforeBreaking = exceptionsAllowedBeforeBreaking; - _retryCount = retryCount; - _httpContextAccessor = httpContextAccessor; - } + // public ResilientHttpClientFactory(ILogger logger, IHttpContextAccessor httpContextAccessor, int exceptionsAllowedBeforeBreaking = 5, int retryCount = 6) + // { + // _logger = logger; + // _exceptionsAllowedBeforeBreaking = exceptionsAllowedBeforeBreaking; + // _retryCount = retryCount; + // _httpContextAccessor = httpContextAccessor; + // } - public ResilientHttpClient CreateResilientHttpClient() - => new ResilientHttpClient((origin) => CreatePolicies(), _logger, _httpContextAccessor); + // public ResilientHttpClient CreateResilientHttpClient() + // => new ResilientHttpClient((origin) => CreatePolicies(), _logger, _httpContextAccessor); - private Policy[] CreatePolicies() - => new Policy[] - { - Policy.Handle() - .WaitAndRetryAsync( - // number of retries - _retryCount, - // exponential backofff - retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), - // on retry - (exception, timeSpan, retryCount, context) => - { - var msg = $"Retry {retryCount} implemented with Polly's RetryPolicy " + - $"of {context.PolicyKey} " + - $"at {context.OperationKey}, " + - $"due to: {exception}."; - _logger.LogWarning(msg); - _logger.LogDebug(msg); - }), - Policy.Handle() - .CircuitBreakerAsync( - // number of exceptions before breaking circuit - _exceptionsAllowedBeforeBreaking, - // time circuit opened before retry - TimeSpan.FromMinutes(1), - (exception, duration) => - { - // on circuit opened - _logger.LogTrace("Circuit breaker opened"); - }, - () => - { - // on circuit closed - _logger.LogTrace("Circuit breaker reset"); - }) - }; - } + // private Policy[] CreatePolicies() + // => new Policy[] + // { + // Policy.Handle() + // .WaitAndRetryAsync( + // // number of retries + // _retryCount, + // // exponential backofff + // retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), + // // on retry + // (exception, timeSpan, retryCount, context) => + // { + // var msg = $"Retry {retryCount} implemented with Polly's RetryPolicy " + + // $"of {context.PolicyKey} " + + // $"at {context.OperationKey}, " + + // $"due to: {exception}."; + // _logger.LogWarning(msg); + // _logger.LogDebug(msg); + // }), + // Policy.Handle() + // .CircuitBreakerAsync( + // // number of exceptions before breaking circuit + // _exceptionsAllowedBeforeBreaking, + // // time circuit opened before retry + // TimeSpan.FromMinutes(1), + // (exception, duration) => + // { + // // on circuit opened + // _logger.LogTrace("Circuit breaker opened"); + // }, + // () => + // { + // // on circuit closed + // _logger.LogTrace("Circuit breaker reset"); + // }) + // }; + //} } diff --git a/src/Web/WebMVC/Services/BasketService.cs b/src/Web/WebMVC/Services/BasketService.cs index 4a0719f1b..7dffd934b 100644 --- a/src/Web/WebMVC/Services/BasketService.cs +++ b/src/Web/WebMVC/Services/BasketService.cs @@ -12,14 +12,14 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services { public class BasketService : IBasketService { - private readonly IOptionsSnapshot _settings; + private readonly IOptions _settings; private readonly HttpClient _apiClient; private readonly string _basketByPassUrl; private readonly string _purchaseUrl; private readonly string _bffUrl; - public BasketService(HttpClient httpClient,IOptionsSnapshot settings) + public BasketService(HttpClient httpClient, IOptions settings) { _apiClient = httpClient; _settings = settings; @@ -30,21 +30,22 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services public async Task GetBasket(ApplicationUser user) { - var getBasketUri = API.Basket.GetBasket(_basketByPassUrl, user.Id); + var uri = API.Basket.GetBasket(_basketByPassUrl, user.Id); - var dataString = await _apiClient.GetStringAsync(getBasketUri); + var responseString = await _apiClient.GetStringAsync(uri); - return string.IsNullOrEmpty(dataString) ? - new Basket() { BuyerId = user.Id} : - JsonConvert.DeserializeObject(dataString); + return string.IsNullOrEmpty(responseString) ? + new Basket() { BuyerId = user.Id } : + JsonConvert.DeserializeObject(responseString); } public async Task UpdateBasket(Basket basket) { - var updateBasketUri = API.Basket.UpdateBasket(_basketByPassUrl); - var content = new StringContent(JsonConvert.SerializeObject(basket), System.Text.Encoding.UTF8, "application/json"); + var uri = API.Basket.UpdateBasket(_basketByPassUrl); - var response = await _apiClient.PostAsync(updateBasketUri, content); + var basketContent = new StringContent(JsonConvert.SerializeObject(basket), System.Text.Encoding.UTF8, "application/json"); + + var response = await _apiClient.PostAsync(uri, basketContent); response.EnsureSuccessStatusCode(); @@ -53,18 +54,18 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services public async Task Checkout(BasketDTO basket) { - var updateBasketUri = API.Basket.CheckoutBasket(_basketByPassUrl); - var content = new StringContent(JsonConvert.SerializeObject(basket), System.Text.Encoding.UTF8, "application/json"); + var uri = API.Basket.CheckoutBasket(_basketByPassUrl); + var basketContent = new StringContent(JsonConvert.SerializeObject(basket), System.Text.Encoding.UTF8, "application/json"); - var response = await _apiClient.PostAsync(updateBasketUri, content); + var response = await _apiClient.PostAsync(uri, basketContent); response.EnsureSuccessStatusCode(); } public async Task SetQuantities(ApplicationUser user, Dictionary quantities) { + var uri = API.Purchase.UpdateBasketItem(_purchaseUrl); - var updateBasketUri = API.Purchase.UpdateBasketItem(_purchaseUrl); var basketUpdate = new { BasketId = user.Id, @@ -75,9 +76,9 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services }).ToArray() }; - var content = new StringContent(JsonConvert.SerializeObject(basketUpdate), System.Text.Encoding.UTF8, "application/json"); + var basketContent = new StringContent(JsonConvert.SerializeObject(basketUpdate), System.Text.Encoding.UTF8, "application/json"); - var response = await _apiClient.PutAsync(updateBasketUri,content); + var response = await _apiClient.PutAsync(uri, basketContent); response.EnsureSuccessStatusCode(); @@ -88,17 +89,18 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services public async Task GetOrderDraft(string basketId) { - var draftOrderUri = API.Purchase.GetOrderDraft(_purchaseUrl, basketId); - var response = await _apiClient.GetStringAsync(draftOrderUri); + var uri = API.Purchase.GetOrderDraft(_purchaseUrl, basketId); - return JsonConvert.DeserializeObject(response); - } + var responseString = await _apiClient.GetStringAsync(uri); + var response = JsonConvert.DeserializeObject(responseString); + return response; + } public async Task AddItemToBasket(ApplicationUser user, int productId) { - var updateBasketUri = API.Purchase.AddItemToBasket(_purchaseUrl); + var uri = API.Purchase.AddItemToBasket(_purchaseUrl); var newItem = new { @@ -107,9 +109,9 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services Quantity = 1 }; - var content = new StringContent(JsonConvert.SerializeObject(newItem), System.Text.Encoding.UTF8, "application/json"); + var basketContent = new StringContent(JsonConvert.SerializeObject(newItem), System.Text.Encoding.UTF8, "application/json"); - var response = await _apiClient.PostAsync(updateBasketUri, content); + var response = await _apiClient.PostAsync(uri, basketContent); } } } diff --git a/src/Web/WebMVC/Services/CampaignService.cs b/src/Web/WebMVC/Services/CampaignService.cs index 7d61c9e7a..6521fd4ae 100644 --- a/src/Web/WebMVC/Services/CampaignService.cs +++ b/src/Web/WebMVC/Services/CampaignService.cs @@ -1,69 +1,49 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services { using global::WebMVC.Infrastructure; - using AspNetCore.Authentication; - using AspNetCore.Http; - using BuildingBlocks.Resilience.Http; - using ViewModels; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Newtonsoft.Json; - using System; + using System.Net.Http; using System.Threading.Tasks; + using ViewModels; public class CampaignService : ICampaignService { - private readonly IOptionsSnapshot _settings; - private readonly IHttpClient _apiClient; + private readonly IOptions _settings; + private readonly HttpClient _httpClient; private readonly ILogger _logger; private readonly string _remoteServiceBaseUrl; - private readonly IHttpContextAccessor _httpContextAccesor; - public CampaignService(IOptionsSnapshot settings, IHttpClient httpClient, - ILogger logger, IHttpContextAccessor httpContextAccesor) + public CampaignService(IOptions settings, HttpClient httpClient, ILogger logger) { _settings = settings; - _apiClient = httpClient; + _httpClient = httpClient; _logger = logger; _remoteServiceBaseUrl = $"{_settings.Value.MarketingUrl}/api/v1/m/campaigns/"; - _httpContextAccesor = httpContextAccesor ?? throw new ArgumentNullException(nameof(httpContextAccesor)); } public async Task GetCampaigns(int pageSize, int pageIndex) { - var allCampaignItemsUri = API.Marketing.GetAllCampaigns(_remoteServiceBaseUrl, - pageSize, pageIndex); + var uri = API.Marketing.GetAllCampaigns(_remoteServiceBaseUrl, pageSize, pageIndex); - var authorizationToken = await GetUserTokenAsync(); - var dataString = await _apiClient.GetStringAsync(allCampaignItemsUri, authorizationToken); + var responseString = await _httpClient.GetStringAsync(uri); - var response = JsonConvert.DeserializeObject(dataString); + var response = JsonConvert.DeserializeObject(responseString); return response; } public async Task GetCampaignById(int id) { - var campaignByIdItemUri = API.Marketing.GetAllCampaignById(_remoteServiceBaseUrl, id); + var uri = API.Marketing.GetAllCampaignById(_remoteServiceBaseUrl, id); - var authorizationToken = await GetUserTokenAsync(); - var dataString = await _apiClient.GetStringAsync(campaignByIdItemUri, authorizationToken); + var responseString = await _httpClient.GetStringAsync(uri); - var response = JsonConvert.DeserializeObject(dataString); + var response = JsonConvert.DeserializeObject(responseString); return response; } - - private string GetUserIdentity() - { - return _httpContextAccesor.HttpContext.User.FindFirst("sub").Value; - } - - private async Task GetUserTokenAsync() - { - var context = _httpContextAccesor.HttpContext; - return await context.GetTokenAsync("access_token"); - } } } \ No newline at end of file diff --git a/src/Web/WebMVC/Services/CatalogService.cs b/src/Web/WebMVC/Services/CatalogService.cs index 5b6fbe26b..d4899b453 100644 --- a/src/Web/WebMVC/Services/CatalogService.cs +++ b/src/Web/WebMVC/Services/CatalogService.cs @@ -1,11 +1,11 @@ using Microsoft.AspNetCore.Mvc.Rendering; -using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; using Microsoft.eShopOnContainers.WebMVC.ViewModels; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.Collections.Generic; +using System.Net.Http; using System.Threading.Tasks; using WebMVC.Infrastructure; @@ -13,16 +13,16 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services { public class CatalogService : ICatalogService { - private readonly IOptionsSnapshot _settings; - private readonly IHttpClient _apiClient; + private readonly IOptions _settings; + private readonly HttpClient _httpClient; private readonly ILogger _logger; private readonly string _remoteServiceBaseUrl; - public CatalogService(IOptionsSnapshot settings, IHttpClient httpClient, ILogger logger) + public CatalogService(HttpClient httpClient, ILogger logger, IOptions settings) { + _httpClient = httpClient; _settings = settings; - _apiClient = httpClient; _logger = logger; _remoteServiceBaseUrl = $"{_settings.Value.PurchaseUrl}/api/v1/c/catalog/"; @@ -30,25 +30,26 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services public async Task GetCatalogItems(int page, int take, int? brand, int? type) { - var allcatalogItemsUri = API.Catalog.GetAllCatalogItems(_remoteServiceBaseUrl, page, take, brand, type); + var uri = API.Catalog.GetAllCatalogItems(_remoteServiceBaseUrl, page, take, brand, type); - var dataString = await _apiClient.GetStringAsync(allcatalogItemsUri); + var responseString = await _httpClient.GetStringAsync(uri); - var response = JsonConvert.DeserializeObject(dataString); + var catalog = JsonConvert.DeserializeObject(responseString); - return response; + return catalog; } public async Task> GetBrands() { - var getBrandsUri = API.Catalog.GetAllBrands(_remoteServiceBaseUrl); + var uri = API.Catalog.GetAllBrands(_remoteServiceBaseUrl); - var dataString = await _apiClient.GetStringAsync(getBrandsUri); + var responseString = await _httpClient.GetStringAsync(uri); var items = new List(); + items.Add(new SelectListItem() { Value = null, Text = "All", Selected = true }); - var brands = JArray.Parse(dataString); + var brands = JArray.Parse(responseString); foreach (var brand in brands.Children()) { @@ -64,14 +65,14 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services public async Task> GetTypes() { - var getTypesUri = API.Catalog.GetAllTypes(_remoteServiceBaseUrl); + var uri = API.Catalog.GetAllTypes(_remoteServiceBaseUrl); - var dataString = await _apiClient.GetStringAsync(getTypesUri); + var responseString = await _httpClient.GetStringAsync(uri); var items = new List(); items.Add(new SelectListItem() { Value = null, Text = "All", Selected = true }); - var brands = JArray.Parse(dataString); + var brands = JArray.Parse(responseString); foreach (var brand in brands.Children()) { items.Add(new SelectListItem() @@ -80,6 +81,7 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services Text = brand.Value("type") }); } + return items; } } diff --git a/src/Web/WebMVC/Services/LocationService.cs b/src/Web/WebMVC/Services/LocationService.cs index 8bbdf743a..3e58ef125 100644 --- a/src/Web/WebMVC/Services/LocationService.cs +++ b/src/Web/WebMVC/Services/LocationService.cs @@ -1,11 +1,9 @@ -using Microsoft.AspNetCore.Authentication; -using Microsoft.AspNetCore.Http; -using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; -using Microsoft.eShopOnContainers.WebMVC; +using Microsoft.eShopOnContainers.WebMVC; using Microsoft.eShopOnContainers.WebMVC.Services; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using System; +using Newtonsoft.Json; +using System.Net.Http; using System.Threading.Tasks; using WebMVC.Infrastructure; using WebMVC.Models; @@ -14,36 +12,27 @@ namespace WebMVC.Services { public class LocationService : ILocationService { - private readonly IOptionsSnapshot _settings; - private readonly IHttpClient _apiClient; + private readonly IOptions _settings; + private readonly HttpClient _httpClient; private readonly ILogger _logger; private readonly string _remoteServiceBaseUrl; - private readonly IHttpContextAccessor _httpContextAccesor; - public LocationService(IOptionsSnapshot settings, IHttpClient httpClient, - ILogger logger, IHttpContextAccessor httpContextAccesor) + public LocationService(HttpClient httpClient, IOptions settings, ILogger logger) { + _httpClient = httpClient; _settings = settings; - _apiClient = httpClient; _logger = logger; _remoteServiceBaseUrl = $"{_settings.Value.MarketingUrl}/api/v1/l/locations/"; - _httpContextAccesor = httpContextAccesor ?? throw new ArgumentNullException(nameof(httpContextAccesor)); } public async Task CreateOrUpdateUserLocation(LocationDTO location) { - var createOrUpdateUserLocationUri = API.Locations.CreateOrUpdateUserLocation(_remoteServiceBaseUrl); + var uri = API.Locations.CreateOrUpdateUserLocation(_remoteServiceBaseUrl); + var locationContent = new StringContent(JsonConvert.SerializeObject(location), System.Text.Encoding.UTF8, "application/json"); - var authorizationToken = await GetUserTokenAsync(); - var response = await _apiClient.PostAsync(createOrUpdateUserLocationUri, location, authorizationToken); + var response = await _httpClient.PostAsync(uri, locationContent); response.EnsureSuccessStatusCode(); - } - - private async Task GetUserTokenAsync() - { - var context = _httpContextAccesor.HttpContext; - return await context.GetTokenAsync("access_token"); } } } diff --git a/src/Web/WebMVC/Services/OrderingService.cs b/src/Web/WebMVC/Services/OrderingService.cs index ec9d2e8fd..e3d24422f 100644 --- a/src/Web/WebMVC/Services/OrderingService.cs +++ b/src/Web/WebMVC/Services/OrderingService.cs @@ -1,11 +1,9 @@ -using Microsoft.AspNetCore.Authentication; -using Microsoft.AspNetCore.Http; -using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; -using Microsoft.eShopOnContainers.WebMVC.ViewModels; +using Microsoft.eShopOnContainers.WebMVC.ViewModels; using Microsoft.Extensions.Options; using Newtonsoft.Json; using System; using System.Collections.Generic; +using System.Net.Http; using System.Threading.Tasks; using WebMVC.Infrastructure; using WebMVC.Models; @@ -14,69 +12,54 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services { public class OrderingService : IOrderingService { - private IHttpClient _apiClient; + private HttpClient _httpClient; private readonly string _remoteServiceBaseUrl; - private readonly IOptionsSnapshot _settings; - private readonly IHttpContextAccessor _httpContextAccesor; + private readonly IOptions _settings; - public OrderingService(IOptionsSnapshot settings, IHttpContextAccessor httpContextAccesor, IHttpClient httpClient) + + public OrderingService(HttpClient httpClient, IOptions settings) { - _remoteServiceBaseUrl = $"{settings.Value.PurchaseUrl}/api/v1/o/orders"; + _httpClient = httpClient; _settings = settings; - _httpContextAccesor = httpContextAccesor; - _apiClient = httpClient; + + _remoteServiceBaseUrl = $"{settings.Value.PurchaseUrl}/api/v1/o/orders"; } async public Task GetOrder(ApplicationUser user, string id) { - var token = await GetUserTokenAsync(); - var getOrderUri = API.Order.GetOrder(_remoteServiceBaseUrl, id); + var uri = API.Order.GetOrder(_remoteServiceBaseUrl, id); - var dataString = await _apiClient.GetStringAsync(getOrderUri, token); + var responseString = await _httpClient.GetStringAsync(uri); - var response = JsonConvert.DeserializeObject(dataString); + var response = JsonConvert.DeserializeObject(responseString); return response; } async public Task> GetMyOrders(ApplicationUser user) { - var token = await GetUserTokenAsync(); - var allMyOrdersUri = API.Order.GetAllMyOrders(_remoteServiceBaseUrl); + var uri = API.Order.GetAllMyOrders(_remoteServiceBaseUrl); + + var responseString = await _httpClient.GetStringAsync(uri); - var dataString = await _apiClient.GetStringAsync(allMyOrdersUri, token); - var response = JsonConvert.DeserializeObject>(dataString); + var response = JsonConvert.DeserializeObject>(responseString); return response; } - public Order MapUserInfoIntoOrder(ApplicationUser user, Order order) - { - order.City = user.City; - order.Street = user.Street; - order.State = user.State; - order.Country = user.Country; - order.ZipCode = user.ZipCode; - - order.CardNumber = user.CardNumber; - order.CardHolderName = user.CardHolderName; - order.CardExpiration = new DateTime(int.Parse("20" + user.Expiration.Split('/')[1]), int.Parse(user.Expiration.Split('/')[0]), 1); - order.CardSecurityNumber = user.SecurityNumber; - return order; - } async public Task CancelOrder(string orderId) { - var token = await GetUserTokenAsync(); var order = new OrderDTO() { OrderNumber = orderId }; - var cancelOrderUri = API.Order.CancelOrder(_remoteServiceBaseUrl); - - var response = await _apiClient.PutAsync(cancelOrderUri, order, token, Guid.NewGuid().ToString()); + var uri = API.Order.CancelOrder(_remoteServiceBaseUrl); + var orderContent = new StringContent(JsonConvert.SerializeObject(order), System.Text.Encoding.UTF8, "application/json"); + + var response = await _httpClient.PutAsync(uri, orderContent); if (response.StatusCode == System.Net.HttpStatusCode.InternalServerError) { @@ -88,15 +71,15 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services async public Task ShipOrder(string orderId) { - var token = await GetUserTokenAsync(); var order = new OrderDTO() { OrderNumber = orderId }; - var shipOrderUri = API.Order.ShipOrder(_remoteServiceBaseUrl); + var uri = API.Order.ShipOrder(_remoteServiceBaseUrl); + var orderContent = new StringContent(JsonConvert.SerializeObject(order), System.Text.Encoding.UTF8, "application/json"); - var response = await _apiClient.PutAsync(shipOrderUri, order, token, Guid.NewGuid().ToString()); + var response = await _httpClient.PutAsync(uri, orderContent); if (response.StatusCode == System.Net.HttpStatusCode.InternalServerError) { @@ -120,6 +103,22 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services destination.CardSecurityNumber = original.CardSecurityNumber; } + public Order MapUserInfoIntoOrder(ApplicationUser user, Order order) + { + order.City = user.City; + order.Street = user.Street; + order.State = user.State; + order.Country = user.Country; + order.ZipCode = user.ZipCode; + + order.CardNumber = user.CardNumber; + order.CardHolderName = user.CardHolderName; + order.CardExpiration = new DateTime(int.Parse("20" + user.Expiration.Split('/')[1]), int.Parse(user.Expiration.Split('/')[0]), 1); + order.CardSecurityNumber = user.SecurityNumber; + + return order; + } + public BasketDTO MapOrderToBasket(Order order) { order.CardExpirationApiFormat(); @@ -140,18 +139,5 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services RequestId = order.RequestId }; } - - void SetFakeIdToProducts(Order order) - { - var id = 1; - order.OrderItems.ForEach(x => { x.ProductId = id; id++; }); - } - - async Task GetUserTokenAsync() - { - var context = _httpContextAccesor.HttpContext; - - return await context.GetTokenAsync("access_token"); - } } } diff --git a/src/Web/WebMVC/Startup.cs b/src/Web/WebMVC/Startup.cs index f93532852..9cc5921a2 100644 --- a/src/Web/WebMVC/Startup.cs +++ b/src/Web/WebMVC/Startup.cs @@ -6,8 +6,6 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.DataProtection; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; -using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; -using Microsoft.eShopOnContainers.WebMVC.Infrastructure; using Microsoft.eShopOnContainers.WebMVC.Services; using Microsoft.eShopOnContainers.WebMVC.ViewModels; using Microsoft.Extensions.Configuration; @@ -15,15 +13,10 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.HealthChecks; using Microsoft.Extensions.Logging; using Polly; -using Polly.CircuitBreaker; using Polly.Extensions.Http; -using Polly.Registry; -using Polly.Retry; -using Polly.Timeout; using StackExchange.Redis; using System; using System.IdentityModel.Tokens.Jwt; -using System.Net.Http; using WebMVC.Infrastructure; using WebMVC.Infrastructure.Middlewares; using WebMVC.Services; @@ -151,6 +144,9 @@ namespace Microsoft.eShopOnContainers.WebMVC public static IServiceCollection AddCustomMvc(this IServiceCollection services, IConfiguration configuration) { + services.AddOptions(); + services.Configure(configuration); + services.AddMvc(); services.AddSession(); @@ -163,124 +159,58 @@ namespace Microsoft.eShopOnContainers.WebMVC }) .PersistKeysToRedis(ConnectionMultiplexer.Connect(configuration["DPConnectionString"]), "DataProtection-Keys"); } - - services.Configure(configuration); - return services; } // Adds all Http client services (like Service-Agents) using resilient Http requests based on HttpClient factory and Polly's policies public static IServiceCollection AddHttpClientServices(this IServiceCollection services, IConfiguration configuration) { - // (CDLTLL) TEMPORAL COMMENT: Do we need this line of code if using HttpClient factory? services.AddSingleton(); - // (CDLTLL) I don't think we need this HttpClientDefaultPolicies if using fluent configuration ,as below... - // Create a singleton object with the by default policies - services.AddSingleton(); - var defaultPolicies = services.BuildServiceProvider().GetService(); - - // Create a Polly-Policy-Registry with the by default policies for resilient Http requests - var pollyPolicyRegistry = services.AddPolicyRegistry(); - - //Using fluent client configuration of Polly policies - - var retriesWithExponentialBackoff = HttpPolicyExtensions - .HandleTransientHttpError() - .WaitAndRetryAsync(7, - retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)) - ); //(CDLTLL) Instead of hardcoded values, use: configuration["HttpClientMaxNumberRetries"], configuration["SecondsBaseForExponentialBackoff"] + var retriesWithExponentialBackoff = HttpPolicyExtensions + .HandleTransientHttpError() + .WaitAndRetryAsync(7,retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); + var circuitBreaker = HttpPolicyExtensions - .HandleTransientHttpError() - .CircuitBreakerAsync(6, - TimeSpan.FromSeconds(30) - ); - //(CDLTLL) Instead of hardcoded values, use: configuration["HttpClientExceptionsAllowedBeforeBreaking"], configuration["DurationOfBreakInMinutes"] - - - pollyPolicyRegistry.Add("DefaultRetriesWithExponentialBackoff", retriesWithExponentialBackoff); - pollyPolicyRegistry.Add("DefaultCircuitBreaker", circuitBreaker); - - - // (CDLTLL) Using "OLD" policies. I don't like it much... - //pollyPolicyRegistry.Add("DefaultRetriesWithExponentialBackoff", defaultPolicies.GetWaitAndRetryPolicy()); // (CDLTLL) TEMPORAL COMMENT: Arguments here would be a good place to propagate the configuration values --> GetWaitAndRetryPolicy(configuration["HttpClientMaxNumberRetries"], configuration["SecondsBaseForExponentialBackoff"]) - //pollyPolicyRegistry.Add("DefaultCircuitBreaker", defaultPolicies.GetCircuitBreakerPolicy()); // (CDLTLL) TEMPORAL COMMENT: Arguments here would be a good place to propagate the configuration values --> GetCircuitBreakerPolicy(configuration["HttpClientExceptionsAllowedBeforeBreaking"], configuration["DurationOfBreakInMinutes"]) - - + .HandleTransientHttpError() + .CircuitBreakerAsync(6, TimeSpan.FromSeconds(30)); - // (CDLTLL) Handlers need to be transient. //(CDLTLL) TEMPORAL COMMENT: This registration was missing, hence the error "InvalidOperationException: No service for type 'WebMVC.Infrastructure.HttpClientAuthorizationDelegatingHandler' has been registered" + //register delegating handlers services.AddTransient(); + services.AddTransient(); - //Add all Typed-Clients (Service-Agents) through the HttpClient factory to implement Resilient Http requests - // - - //Add BasketService typed client (Service Agent) + //add http client servicse services.AddHttpClient() - .AddHttpMessageHandler() //Additional Authentication-Delegating-Handler to add the OAuth-Bearer-token to the Http headers - .AddPolicyHandlerFromRegistry("DefaultRetriesWithExponentialBackoff") - .AddPolicyHandlerFromRegistry("DefaultCircuitBreaker"); - - //Add CatalogService typed client (Service Agent) - //services.AddHttpClient() ... - - //Add OrderingService typed client (Service Agent) - //services.AddHttpClient() ... - - //Add CampaignService typed client (Service Agent) - //services.AddHttpClient() ... - - //Add LocationService typed client (Service Agent) - //services.AddHttpClient() ... - - //Add IdentityParser typed client (Service Agent) - //services.AddHttpClient() ... - - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // (CDLTLL) TEMPORAL COMMENT: The following Typed-Clients (Service-Agents) have to be coded as BasketService by using AddHttpClient<>(), right? - // This code will be deleted - services.AddTransient(); - services.AddTransient(); - - services.AddTransient(); - services.AddTransient(); + .AddHttpMessageHandler() + .AddPolicyHandler(retriesWithExponentialBackoff) + .AddPolicyHandler(circuitBreaker); + + services.AddHttpClient() + .AddPolicyHandler(retriesWithExponentialBackoff) + .AddPolicyHandler(circuitBreaker); + + services.AddHttpClient() + .AddHttpMessageHandler() + .AddHttpMessageHandler() + .AddPolicyHandler(retriesWithExponentialBackoff) + .AddPolicyHandler(circuitBreaker); + + services.AddHttpClient() + .AddHttpMessageHandler() + .AddPolicyHandler(retriesWithExponentialBackoff) + .AddPolicyHandler(circuitBreaker); + + services.AddHttpClient() + .AddHttpMessageHandler() + .AddPolicyHandler(retriesWithExponentialBackoff) + .AddPolicyHandler(circuitBreaker); + + //add custom application services services.AddTransient, IdentityParser>(); - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // TEMPORAL COMMENT: This code will be deleted when using HttpClientFactory, right? - if (configuration.GetValue("UseResilientHttp") == bool.TrueString) - { - services.AddSingleton(sp => - { - var logger = sp.GetRequiredService>(); - var httpContextAccessor = sp.GetRequiredService(); - - var retryCount = 6; - if (!string.IsNullOrEmpty(configuration["HttpClientRetryCount"])) - { - retryCount = int.Parse(configuration["HttpClientRetryCount"]); - } - - var exceptionsAllowedBeforeBreaking = 5; - if (!string.IsNullOrEmpty(configuration["HttpClientExceptionsAllowedBeforeBreaking"])) - { - exceptionsAllowedBeforeBreaking = int.Parse(configuration["HttpClientExceptionsAllowedBeforeBreaking"]); - } - - return new ResilientHttpClientFactory(logger, httpContextAccessor, exceptionsAllowedBeforeBreaking, retryCount); - }); - services.AddSingleton(sp => sp.GetService().CreateResilientHttpClient()); - } - else - { - services.AddSingleton(); - } - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - + return services; } public static IServiceCollection AddCustomAuthentication(this IServiceCollection services, IConfiguration configuration) From 554b4e4a0ce17c64588815f40b293e6fa7911e4e Mon Sep 17 00:00:00 2001 From: Unai Zorrilla Castro Date: Fri, 18 May 2018 12:43:33 +0200 Subject: [PATCH 08/33] Remove unused tables --- .../IResilientHttpClientFactory.cs | 10 --- .../ResilientHttpClientFactory.cs | 66 ------------------- 2 files changed, 76 deletions(-) delete mode 100644 src/Web/WebMVC/Infrastructure/IResilientHttpClientFactory.cs delete mode 100644 src/Web/WebMVC/Infrastructure/ResilientHttpClientFactory.cs diff --git a/src/Web/WebMVC/Infrastructure/IResilientHttpClientFactory.cs b/src/Web/WebMVC/Infrastructure/IResilientHttpClientFactory.cs deleted file mode 100644 index 39b36f141..000000000 --- a/src/Web/WebMVC/Infrastructure/IResilientHttpClientFactory.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; -using System; - -namespace Microsoft.eShopOnContainers.WebMVC.Infrastructure -{ - //public interface IResilientHttpClientFactory - //{ - // ResilientHttpClient CreateResilientHttpClient(); - //} -} \ No newline at end of file diff --git a/src/Web/WebMVC/Infrastructure/ResilientHttpClientFactory.cs b/src/Web/WebMVC/Infrastructure/ResilientHttpClientFactory.cs deleted file mode 100644 index 09b596f1c..000000000 --- a/src/Web/WebMVC/Infrastructure/ResilientHttpClientFactory.cs +++ /dev/null @@ -1,66 +0,0 @@ -using Microsoft.AspNetCore.Http; -using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; -using Microsoft.Extensions.Logging; -using Polly; -using System; -using System.Net.Http; - -namespace Microsoft.eShopOnContainers.WebMVC.Infrastructure -{ - //public class ResilientHttpClientFactory : IResilientHttpClientFactory - //{ - // private readonly ILogger _logger; - // private readonly int _retryCount; - // private readonly int _exceptionsAllowedBeforeBreaking; - // private readonly IHttpContextAccessor _httpContextAccessor; - - // public ResilientHttpClientFactory(ILogger logger, IHttpContextAccessor httpContextAccessor, int exceptionsAllowedBeforeBreaking = 5, int retryCount = 6) - // { - // _logger = logger; - // _exceptionsAllowedBeforeBreaking = exceptionsAllowedBeforeBreaking; - // _retryCount = retryCount; - // _httpContextAccessor = httpContextAccessor; - // } - - - // public ResilientHttpClient CreateResilientHttpClient() - // => new ResilientHttpClient((origin) => CreatePolicies(), _logger, _httpContextAccessor); - - // private Policy[] CreatePolicies() - // => new Policy[] - // { - // Policy.Handle() - // .WaitAndRetryAsync( - // // number of retries - // _retryCount, - // // exponential backofff - // retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), - // // on retry - // (exception, timeSpan, retryCount, context) => - // { - // var msg = $"Retry {retryCount} implemented with Polly's RetryPolicy " + - // $"of {context.PolicyKey} " + - // $"at {context.OperationKey}, " + - // $"due to: {exception}."; - // _logger.LogWarning(msg); - // _logger.LogDebug(msg); - // }), - // Policy.Handle() - // .CircuitBreakerAsync( - // // number of exceptions before breaking circuit - // _exceptionsAllowedBeforeBreaking, - // // time circuit opened before retry - // TimeSpan.FromMinutes(1), - // (exception, duration) => - // { - // // on circuit opened - // _logger.LogTrace("Circuit breaker opened"); - // }, - // () => - // { - // // on circuit closed - // _logger.LogTrace("Circuit breaker reset"); - // }) - // }; - //} -} From 96816e7bf73907e859b4344a81a0a52ae5aca6ea Mon Sep 17 00:00:00 2001 From: Unai Zorrilla Castro Date: Fri, 18 May 2018 14:02:18 +0200 Subject: [PATCH 09/33] Refactor aggregators to use AddHttpClient like on WebMVC --- ...ttpClientAuthorizationDelegatingHandler.cs | 49 +++++ .../Mobile.Shopping.HttpAggregator.csproj | 1 + .../aggregator/Services/BasketService.cs | 36 ++-- .../aggregator/Services/CatalogService.cs | 32 ++-- .../aggregator/Services/OrderApiClient.cs | 28 +-- .../Mobile.Bff.Shopping/aggregator/Startup.cs | 104 +++++++---- ...ttpClientAuthorizationDelegatingHandler.cs | 49 +++++ .../aggregator/Services/BasketService.cs | 32 +--- .../aggregator/Services/CatalogService.cs | 31 ++-- .../aggregator/Services/OrderApiClient.cs | 25 +-- .../Web.Bff.Shopping/aggregator/Startup.cs | 171 +++++++++++------- .../Web.Shopping.HttpAggregator.csproj | 1 + 12 files changed, 356 insertions(+), 203 deletions(-) create mode 100644 src/ApiGateways/Mobile.Bff.Shopping/aggregator/Infrastructure/HttpClientAuthorizationDelegatingHandler.cs create mode 100644 src/ApiGateways/Web.Bff.Shopping/aggregator/Infrastructure/HttpClientAuthorizationDelegatingHandler.cs diff --git a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Infrastructure/HttpClientAuthorizationDelegatingHandler.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Infrastructure/HttpClientAuthorizationDelegatingHandler.cs new file mode 100644 index 000000000..967a8c826 --- /dev/null +++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Infrastructure/HttpClientAuthorizationDelegatingHandler.cs @@ -0,0 +1,49 @@ +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Http; +using System.Collections.Generic; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Infrastructure +{ + public class HttpClientAuthorizationDelegatingHandler + : DelegatingHandler + { + private readonly IHttpContextAccessor _httpContextAccesor; + + public HttpClientAuthorizationDelegatingHandler(IHttpContextAccessor httpContextAccesor) + { + _httpContextAccesor = httpContextAccesor; + } + + protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) + { + var authorizationHeader = _httpContextAccesor.HttpContext + .Request.Headers["Authorization"]; + + if (!string.IsNullOrEmpty(authorizationHeader)) + { + request.Headers.Add("Authorization", new List() { authorizationHeader }); + } + + var token = await GetToken(); + + if (token != null) + { + request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token); + } + + return await base.SendAsync(request, cancellationToken); + } + + async Task GetToken() + { + const string ACCESS_TOKEN = "access_token"; + + return await _httpContextAccesor.HttpContext + .GetTokenAsync(ACCESS_TOKEN); + } + } +} diff --git a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj index 90bd68cda..439da6f4c 100644 --- a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj +++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj @@ -14,6 +14,7 @@ + diff --git a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/BasketService.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/BasketService.cs index b00fbb52c..8339ee44b 100644 --- a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/BasketService.cs +++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/BasketService.cs @@ -1,53 +1,41 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Authentication; -using Microsoft.AspNetCore.Http; -using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; +using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Config; +using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Models; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Newtonsoft.Json; -using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Config; -using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Models; +using System.Net.Http; +using System.Threading.Tasks; namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Services { public class BasketService : IBasketService { - private readonly IHttpClient _apiClient; + private readonly HttpClient _httpClient; private readonly ILogger _logger; private readonly UrlsConfig _urls; - private readonly IHttpContextAccessor _httpContextAccessor; - public BasketService(IHttpClient httpClient, IHttpContextAccessor httpContextAccessor, ILogger logger, IOptionsSnapshot config) + public BasketService(HttpClient httpClient, ILogger logger, IOptions config) { - _apiClient = httpClient; + _httpClient = httpClient; _logger = logger; _urls = config.Value; - _httpContextAccessor = httpContextAccessor; } public async Task GetById(string id) { - var token = await GetUserTokenAsync(); - var data = await _apiClient.GetStringAsync(_urls.Basket + UrlsConfig.BasketOperations.GetItemById(id), token); + var data = await _httpClient.GetStringAsync(_urls.Basket + UrlsConfig.BasketOperations.GetItemById(id)); + var basket = !string.IsNullOrEmpty(data) ? JsonConvert.DeserializeObject(data) : null; + return basket; } public async Task Update(BasketData currentBasket) { - var token = await GetUserTokenAsync(); - var data = await _apiClient.PostAsync(_urls.Basket + UrlsConfig.BasketOperations.UpdateBasket(), currentBasket, token); - int i = 0; - } + var basketContent = new StringContent(JsonConvert.SerializeObject(currentBasket), System.Text.Encoding.UTF8, "application/json"); - async Task GetUserTokenAsync() - { - var context = _httpContextAccessor.HttpContext; - return await context.GetTokenAsync("access_token"); + var data = await _httpClient.PostAsync(_urls.Basket + UrlsConfig.BasketOperations.UpdateBasket(), basketContent); } } } diff --git a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/CatalogService.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/CatalogService.cs index d37b67679..6c59f0c49 100644 --- a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/CatalogService.cs +++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/CatalogService.cs @@ -1,43 +1,41 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; +using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Config; +using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Models; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Newtonsoft.Json; -using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Config; -using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Models; +using System.Collections.Generic; +using System.Net.Http; +using System.Threading.Tasks; namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Services { public class CatalogService : ICatalogService { - - private readonly IHttpClient _apiClient; + private readonly HttpClient _httpClient; private readonly ILogger _logger; private readonly UrlsConfig _urls; - public CatalogService(IHttpClient httpClient, ILogger logger, IOptionsSnapshot config) + public CatalogService(HttpClient httpClient, ILogger logger, IOptions config) { - _apiClient = httpClient; + _httpClient = httpClient; _logger = logger; _urls = config.Value; } public async Task GetCatalogItem(int id) { - var data = await _apiClient.GetStringAsync(_urls.Catalog + UrlsConfig.CatalogOperations.GetItemById(id)); - var item = JsonConvert.DeserializeObject(data); - return item; + var stringContent = await _httpClient.GetStringAsync(_urls.Catalog + UrlsConfig.CatalogOperations.GetItemById(id)); + var catalogItem = JsonConvert.DeserializeObject(stringContent); + + return catalogItem; } public async Task> GetCatalogItems(IEnumerable ids) { - var data = await _apiClient.GetStringAsync(_urls.Catalog + UrlsConfig.CatalogOperations.GetItemsById(ids)); - var item = JsonConvert.DeserializeObject(data); - return item; + var stringContent = await _httpClient.GetStringAsync(_urls.Catalog + UrlsConfig.CatalogOperations.GetItemsById(ids)); + var catalogItems = JsonConvert.DeserializeObject(stringContent); + return catalogItems; } } } diff --git a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/OrderApiClient.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/OrderApiClient.cs index 2659e11cc..03644c110 100644 --- a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/OrderApiClient.cs +++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/OrderApiClient.cs @@ -1,24 +1,20 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; +using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Config; +using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Models; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Newtonsoft.Json; -using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Config; -using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Models; +using System.Net.Http; +using System.Threading.Tasks; namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Services { public class OrderApiClient : IOrderApiClient { - - private readonly IHttpClient _apiClient; + private readonly HttpClient _apiClient; private readonly ILogger _logger; private readonly UrlsConfig _urls; - public OrderApiClient(IHttpClient httpClient, ILogger logger, IOptionsSnapshot config) + public OrderApiClient(HttpClient httpClient, ILogger logger, IOptions config) { _apiClient = httpClient; _logger = logger; @@ -27,11 +23,15 @@ namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Services public async Task GetOrderDraftFromBasket(BasketData basket) { - var url = _urls.Orders + UrlsConfig.OrdersOperations.GetOrderDraft(); - var response = await _apiClient.PostAsync(url, basket); + var uri = _urls.Orders + UrlsConfig.OrdersOperations.GetOrderDraft(); + var content = new StringContent(JsonConvert.SerializeObject(basket), System.Text.Encoding.UTF8, "application/json"); + var response = await _apiClient.PostAsync(uri, content); + response.EnsureSuccessStatusCode(); - var jsonResponse = await response.Content.ReadAsStringAsync(); - return JsonConvert.DeserializeObject(jsonResponse); + + var ordersDraftResponse = await response.Content.ReadAsStringAsync(); + + return JsonConvert.DeserializeObject(ordersDraftResponse); } } } diff --git a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Startup.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Startup.cs index 73b736519..7c95205a7 100644 --- a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Startup.cs +++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Startup.cs @@ -16,6 +16,9 @@ using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Config; using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Filters.Basket.API.Infrastructure.Filters; using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Services; using Swashbuckle.AspNetCore.Swagger; +using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Infrastructure; +using Polly.Extensions.Http; +using Polly; namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator { @@ -31,14 +34,47 @@ namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { - services.AddSingleton(); - services.AddSingleton(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + services.AddCustomMvc(Configuration) + .AddCustomAuthentication(Configuration) + .AddHttpServices(); + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) + { + var pathBase = Configuration["PATH_BASE"]; + + if (!string.IsNullOrEmpty(pathBase)) + { + loggerFactory.CreateLogger("init").LogDebug($"Using PATH BASE '{pathBase}'"); + app.UsePathBase(pathBase); + } + + app.UseCors("CorsPolicy"); + + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + app.UseAuthentication(); + + app.UseMvc(); + + app.UseSwagger().UseSwaggerUI(c => + { + c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Purchase BFF V1"); + c.ConfigureOAuth2("Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregatorwaggerui", "", "", "Purchase BFF Swagger UI"); + }); + } + } + public static class ServiceCollectionExtensions + { + public static IServiceCollection AddCustomMvc(this IServiceCollection services, IConfiguration configuration) + { services.AddOptions(); - services.Configure(Configuration.GetSection("urls")); + services.Configure(configuration.GetSection("urls")); services.AddMvc(); @@ -57,8 +93,8 @@ namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator { Type = "oauth2", Flow = "implicit", - AuthorizationUrl = $"{Configuration.GetValue("IdentityUrlExternal")}/connect/authorize", - TokenUrl = $"{Configuration.GetValue("IdentityUrlExternal")}/connect/token", + AuthorizationUrl = $"{configuration.GetValue("IdentityUrlExternal")}/connect/authorize", + TokenUrl = $"{configuration.GetValue("IdentityUrlExternal")}/connect/token", Scopes = new Dictionary() { { "mobileshoppingagg", "Shopping Aggregator for Mobile Clients" } @@ -77,9 +113,12 @@ namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator .AllowCredentials()); }); - + return services; + } + public static IServiceCollection AddCustomAuthentication(this IServiceCollection services, IConfiguration configuration) + { JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); - var identityUrl = Configuration.GetValue("urls:identity"); + var identityUrl = configuration.GetValue("urls:identity"); services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; @@ -102,37 +141,40 @@ namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator } }; }); - } - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) + return services; + } + public static IServiceCollection AddHttpServices(this IServiceCollection services) { + //register delegating handlers + services.AddTransient(); + services.AddSingleton(); - var pathBase = Configuration["PATH_BASE"]; - if (!string.IsNullOrEmpty(pathBase)) - { - loggerFactory.CreateLogger("init").LogDebug($"Using PATH BASE '{pathBase}'"); - app.UsePathBase(pathBase); - } + //register http services + var retriesWithExponentialBackoff = HttpPolicyExtensions + .HandleTransientHttpError() + .WaitAndRetryAsync(7, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); - app.UseCors("CorsPolicy"); + var circuitBreaker = HttpPolicyExtensions + .HandleTransientHttpError() + .CircuitBreakerAsync(6, TimeSpan.FromSeconds(30)); - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } + services.AddHttpClient() + .AddHttpMessageHandler() + .AddPolicyHandler(retriesWithExponentialBackoff) + .AddPolicyHandler(circuitBreaker); - app.UseAuthentication(); + services.AddHttpClient() + .AddPolicyHandler(retriesWithExponentialBackoff) + .AddPolicyHandler(circuitBreaker); - app.UseMvc(); + services.AddHttpClient() + .AddPolicyHandler(retriesWithExponentialBackoff) + .AddPolicyHandler(circuitBreaker); - app.UseSwagger().UseSwaggerUI(c => - { - c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Purchase BFF V1"); - c.ConfigureOAuth2("Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregatorwaggerui", "", "", "Purchase BFF Swagger UI"); - }); + return services; } } } diff --git a/src/ApiGateways/Web.Bff.Shopping/aggregator/Infrastructure/HttpClientAuthorizationDelegatingHandler.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Infrastructure/HttpClientAuthorizationDelegatingHandler.cs new file mode 100644 index 000000000..4e54829f8 --- /dev/null +++ b/src/ApiGateways/Web.Bff.Shopping/aggregator/Infrastructure/HttpClientAuthorizationDelegatingHandler.cs @@ -0,0 +1,49 @@ +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Http; +using System.Collections.Generic; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Infrastructure +{ + public class HttpClientAuthorizationDelegatingHandler + : DelegatingHandler + { + private readonly IHttpContextAccessor _httpContextAccesor; + + public HttpClientAuthorizationDelegatingHandler(IHttpContextAccessor httpContextAccesor) + { + _httpContextAccesor = httpContextAccesor; + } + + protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) + { + var authorizationHeader = _httpContextAccesor.HttpContext + .Request.Headers["Authorization"]; + + if (!string.IsNullOrEmpty(authorizationHeader)) + { + request.Headers.Add("Authorization", new List() { authorizationHeader }); + } + + var token = await GetToken(); + + if (token != null) + { + request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token); + } + + return await base.SendAsync(request, cancellationToken); + } + + async Task GetToken() + { + const string ACCESS_TOKEN = "access_token"; + + return await _httpContextAccesor.HttpContext + .GetTokenAsync(ACCESS_TOKEN); + } + } +} diff --git a/src/ApiGateways/Web.Bff.Shopping/aggregator/Services/BasketService.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Services/BasketService.cs index 5ca89a408..291e98fd3 100644 --- a/src/ApiGateways/Web.Bff.Shopping/aggregator/Services/BasketService.cs +++ b/src/ApiGateways/Web.Bff.Shopping/aggregator/Services/BasketService.cs @@ -1,53 +1,39 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Authentication; -using Microsoft.AspNetCore.Http; -using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; +using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Config; +using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Models; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Newtonsoft.Json; -using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Config; -using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Models; +using System.Net.Http; +using System.Threading.Tasks; namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Services { public class BasketService : IBasketService { - private readonly IHttpClient _apiClient; + private readonly HttpClient _apiClient; private readonly ILogger _logger; private readonly UrlsConfig _urls; - private readonly IHttpContextAccessor _httpContextAccessor; - public BasketService(IHttpClient httpClient, IHttpContextAccessor httpContextAccessor, ILogger logger, IOptionsSnapshot config) + public BasketService(HttpClient httpClient,ILogger logger, IOptions config) { _apiClient = httpClient; _logger = logger; _urls = config.Value; - _httpContextAccessor = httpContextAccessor; } public async Task GetById(string id) { - var token = await GetUserTokenAsync(); - var data = await _apiClient.GetStringAsync(_urls.Basket + UrlsConfig.BasketOperations.GetItemById(id), token); + var data = await _apiClient.GetStringAsync(_urls.Basket + UrlsConfig.BasketOperations.GetItemById(id)); var basket = !string.IsNullOrEmpty(data) ? JsonConvert.DeserializeObject(data) : null; return basket; } public async Task Update(BasketData currentBasket) { - var token = await GetUserTokenAsync(); - var data = await _apiClient.PostAsync(_urls.Basket + UrlsConfig.BasketOperations.UpdateBasket(), currentBasket, token); - int i = 0; - } + var basketContent = new StringContent(JsonConvert.SerializeObject(currentBasket), System.Text.Encoding.UTF8, "application/json"); - async Task GetUserTokenAsync() - { - var context = _httpContextAccessor.HttpContext; - return await context.GetTokenAsync("access_token"); + var data = await _apiClient.PostAsync(_urls.Basket + UrlsConfig.BasketOperations.UpdateBasket(), basketContent); } } } diff --git a/src/ApiGateways/Web.Bff.Shopping/aggregator/Services/CatalogService.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Services/CatalogService.cs index 46d895f68..ba67b7c1e 100644 --- a/src/ApiGateways/Web.Bff.Shopping/aggregator/Services/CatalogService.cs +++ b/src/ApiGateways/Web.Bff.Shopping/aggregator/Services/CatalogService.cs @@ -1,43 +1,42 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; +using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Config; +using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Models; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Newtonsoft.Json; -using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Config; -using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Models; +using System.Collections.Generic; +using System.Net.Http; +using System.Threading.Tasks; namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Services { public class CatalogService : ICatalogService { - private readonly IHttpClient _apiClient; + private readonly HttpClient _httpClient; private readonly ILogger _logger; private readonly UrlsConfig _urls; - public CatalogService(IHttpClient httpClient, ILogger logger, IOptionsSnapshot config) + public CatalogService(HttpClient httpClient, ILogger logger, IOptions config) { - _apiClient = httpClient; + _httpClient = httpClient; _logger = logger; _urls = config.Value; } public async Task GetCatalogItem(int id) { - var data = await _apiClient.GetStringAsync(_urls.Catalog + UrlsConfig.CatalogOperations.GetItemById(id)); - var item = JsonConvert.DeserializeObject(data); - return item; + var stringContent = await _httpClient.GetStringAsync(_urls.Catalog + UrlsConfig.CatalogOperations.GetItemById(id)); + var catalogItem = JsonConvert.DeserializeObject(stringContent); + + return catalogItem; } public async Task> GetCatalogItems(IEnumerable ids) { - var data = await _apiClient.GetStringAsync(_urls.Catalog + UrlsConfig.CatalogOperations.GetItemsById(ids)); - var item = JsonConvert.DeserializeObject(data); - return item; + var stringContent = await _httpClient.GetStringAsync(_urls.Catalog + UrlsConfig.CatalogOperations.GetItemsById(ids)); + var catalogItems = JsonConvert.DeserializeObject(stringContent); + return catalogItems; } } } diff --git a/src/ApiGateways/Web.Bff.Shopping/aggregator/Services/OrderApiClient.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Services/OrderApiClient.cs index 220e9afa9..d43e392d3 100644 --- a/src/ApiGateways/Web.Bff.Shopping/aggregator/Services/OrderApiClient.cs +++ b/src/ApiGateways/Web.Bff.Shopping/aggregator/Services/OrderApiClient.cs @@ -1,24 +1,21 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; +using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Config; +using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Models; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Newtonsoft.Json; -using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Config; -using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Models; +using System.Net.Http; +using System.Threading.Tasks; namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Services { public class OrderApiClient : IOrderApiClient { - private readonly IHttpClient _apiClient; + private readonly HttpClient _apiClient; private readonly ILogger _logger; private readonly UrlsConfig _urls; - public OrderApiClient(IHttpClient httpClient, ILogger logger, IOptionsSnapshot config) + public OrderApiClient(HttpClient httpClient, ILogger logger, IOptions config) { _apiClient = httpClient; _logger = logger; @@ -28,10 +25,14 @@ namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Services public async Task GetOrderDraftFromBasket(BasketData basket) { var url = _urls.Orders + UrlsConfig.OrdersOperations.GetOrderDraft(); - var response = await _apiClient.PostAsync(url, basket); + var content = new StringContent(JsonConvert.SerializeObject(basket), System.Text.Encoding.UTF8, "application/json"); + var response = await _apiClient.PostAsync(url, content); + response.EnsureSuccessStatusCode(); - var jsonResponse = await response.Content.ReadAsStringAsync(); - return JsonConvert.DeserializeObject(jsonResponse); + + var ordersDraftResponse = await response.Content.ReadAsStringAsync(); + + return JsonConvert.DeserializeObject(ordersDraftResponse); } } } diff --git a/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs index f303d843d..f53142d66 100644 --- a/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs +++ b/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs @@ -1,21 +1,20 @@ -using System; -using System.Collections.Generic; -using System.IdentityModel.Tokens.Jwt; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; -using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Config; using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Filters.Basket.API.Infrastructure.Filters; +using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Infrastructure; using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Services; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Polly; +using Polly.Extensions.Http; using Swashbuckle.AspNetCore.Swagger; +using System; +using System.Collections.Generic; +using System.IdentityModel.Tokens.Jwt; namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator { @@ -31,14 +30,77 @@ namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { - services.AddSingleton(); - services.AddSingleton(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + services.AddCustomMvc(Configuration) + .AddCustomAuthentication(Configuration) + .AddApplicationServices(); + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) + { + var pathBase = Configuration["PATH_BASE"]; + if (!string.IsNullOrEmpty(pathBase)) + { + loggerFactory.CreateLogger("init").LogDebug($"Using PATH BASE '{pathBase}'"); + app.UsePathBase(pathBase); + } + + app.UseCors("CorsPolicy"); + + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + app.UseAuthentication(); + + app.UseMvc(); + + app.UseSwagger().UseSwaggerUI(c => + { + c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Purchase BFF V1"); + //c.ConfigureOAuth2("Microsoft.eShopOnContainers.Web.Shopping.HttpAggregatorwaggerui", "", "", "Purchase BFF Swagger UI"); + }); + + + } + } + + public static class ServiceCollectionExtensions + { + public static IServiceCollection AddCustomAuthentication(this IServiceCollection services, IConfiguration configuration) + { + JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); + var identityUrl = configuration.GetValue("urls:identity"); + services.AddAuthentication(options => + { + options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; + options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; + + }).AddJwtBearer(options => + { + options.Authority = identityUrl; + options.RequireHttpsMetadata = false; + options.Audience = "webshoppingagg"; + options.Events = new JwtBearerEvents() + { + OnAuthenticationFailed = async ctx => + { + int i = 0; + }, + OnTokenValidated = async ctx => + { + int i = 0; + } + }; + }); + return services; + } + public static IServiceCollection AddCustomMvc(this IServiceCollection services, IConfiguration configuration) + { services.AddOptions(); - services.Configure(Configuration.GetSection("urls")); + services.Configure(configuration.GetSection("urls")); services.AddMvc(); @@ -57,8 +119,8 @@ namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator { Type = "oauth2", Flow = "implicit", - AuthorizationUrl = $"{Configuration.GetValue("IdentityUrlExternal")}/connect/authorize", - TokenUrl = $"{Configuration.GetValue("IdentityUrlExternal")}/connect/token", + AuthorizationUrl = $"{configuration.GetValue("IdentityUrlExternal")}/connect/authorize", + TokenUrl = $"{configuration.GetValue("IdentityUrlExternal")}/connect/token", Scopes = new Dictionary() { { "webshoppingagg", "Shopping Aggregator for Web Clients" } @@ -77,62 +139,39 @@ namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator .AllowCredentials()); }); - - JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); - var identityUrl = Configuration.GetValue("urls:identity"); - services.AddAuthentication(options => - { - options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; - options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; - - }).AddJwtBearer(options => - { - options.Authority = identityUrl; - options.RequireHttpsMetadata = false; - options.Audience = "webshoppingagg"; - options.Events = new JwtBearerEvents() - { - OnAuthenticationFailed = async ctx => - { - int i = 0; - }, - OnTokenValidated = async ctx => - { - int i = 0; - } - }; - }); + return services; } - - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) + public static IServiceCollection AddApplicationServices(this IServiceCollection services) { + //register delegating handlers + services.AddTransient(); + services.AddSingleton(); - var pathBase = Configuration["PATH_BASE"]; - if (!string.IsNullOrEmpty(pathBase)) - { - loggerFactory.CreateLogger("init").LogDebug($"Using PATH BASE '{pathBase}'"); - app.UsePathBase(pathBase); - } - - app.UseCors("CorsPolicy"); + //register http services + var retriesWithExponentialBackoff = HttpPolicyExtensions + .HandleTransientHttpError() + .WaitAndRetryAsync(7, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } + var circuitBreaker = HttpPolicyExtensions + .HandleTransientHttpError() + .CircuitBreakerAsync(6, TimeSpan.FromSeconds(30)); - app.UseAuthentication(); + services.AddHttpClient() + .AddHttpMessageHandler() + .AddPolicyHandler(retriesWithExponentialBackoff) + .AddPolicyHandler(circuitBreaker); - app.UseMvc(); + services.AddHttpClient() + .AddPolicyHandler(retriesWithExponentialBackoff) + .AddPolicyHandler(circuitBreaker); - app.UseSwagger().UseSwaggerUI(c => - { - c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Purchase BFF V1"); - //c.ConfigureOAuth2("Microsoft.eShopOnContainers.Web.Shopping.HttpAggregatorwaggerui", "", "", "Purchase BFF Swagger UI"); - }); + services.AddHttpClient() + .AddHttpMessageHandler() + .AddPolicyHandler(retriesWithExponentialBackoff) + .AddPolicyHandler(circuitBreaker); + return services; } } } diff --git a/src/ApiGateways/Web.Bff.Shopping/aggregator/Web.Shopping.HttpAggregator.csproj b/src/ApiGateways/Web.Bff.Shopping/aggregator/Web.Shopping.HttpAggregator.csproj index 1e7a1f38c..7b6a56038 100644 --- a/src/ApiGateways/Web.Bff.Shopping/aggregator/Web.Shopping.HttpAggregator.csproj +++ b/src/ApiGateways/Web.Bff.Shopping/aggregator/Web.Shopping.HttpAggregator.csproj @@ -15,6 +15,7 @@ + From 094ba7c3c6676635297625c53d7e38f50bba9dfa Mon Sep 17 00:00:00 2001 From: Unai Zorrilla Castro Date: Mon, 21 May 2018 11:38:09 +0200 Subject: [PATCH 10/33] Review HTTP Aggregators. Remove IHTTPClient Resiliency building block. Fix TestController code ( ask about on this controller ). Tested with VS and docker-compose up directly --- eShopOnContainers-ServicesAndWebApps.sln | 56 +---- eShopOnContainers.sln | 54 ----- .../Mobile.Shopping.HttpAggregator.csproj | 4 - .../Mobile.Bff.Shopping/aggregator/Startup.cs | 24 +-- .../Web.Shopping.HttpAggregator.csproj | 4 - .../Resilience/Resilience.Http/IHttpClient.cs | 16 -- .../Resilience.Http/Resilience.Http.csproj | 15 -- .../Resilience.Http/ResilientHttpClient.cs | 191 ------------------ .../Resilience.Http/StandardHttpClient.cs | 125 ------------ src/Web/WebMVC/Controllers/TestController.cs | 27 ++- src/Web/WebMVC/WebMVC.csproj | 1 - 11 files changed, 27 insertions(+), 490 deletions(-) delete mode 100644 src/BuildingBlocks/Resilience/Resilience.Http/IHttpClient.cs delete mode 100644 src/BuildingBlocks/Resilience/Resilience.Http/Resilience.Http.csproj delete mode 100644 src/BuildingBlocks/Resilience/Resilience.Http/ResilientHttpClient.cs delete mode 100644 src/BuildingBlocks/Resilience/Resilience.Http/StandardHttpClient.cs diff --git a/eShopOnContainers-ServicesAndWebApps.sln b/eShopOnContainers-ServicesAndWebApps.sln index f127af6d9..f9e3e654e 100644 --- a/eShopOnContainers-ServicesAndWebApps.sln +++ b/eShopOnContainers-ServicesAndWebApps.sln @@ -68,10 +68,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Health EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebStatus", "src\Web\WebStatus\WebStatus.csproj", "{C0A7918D-B4F2-4E7F-8DE2-1E5279EF079F}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Resilience", "Resilience", "{FBF43D93-F2E7-4FF8-B4AB-186895949B88}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Resilience.Http", "src\BuildingBlocks\Resilience\Resilience.Http\Resilience.Http.csproj", "{D1C47FF1-91F1-4CAF-9ABB-AD642B821502}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Payment", "Payment", "{022E145D-1593-47EE-9608-8E323D3C63F5}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Payment.API", "src\Services\Payment\Payment.API\Payment.API.csproj", "{1A01AF82-6FCB-464C-B39C-F127AEBD315D}" @@ -130,7 +126,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Web.Shopping.HttpAggregator EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ordering.BackgroundTasks", "src\Services\Ordering\Ordering.BackgroundTasks\Ordering.BackgroundTasks.csproj", "{7D63ED4A-3EDA-4BBA-8BBA-F46BD6430931}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ordering.SignalrHub", "src\Services\Ordering\Ordering.SignalrHub\Ordering.SignalrHub.csproj", "{E1D2B260-4E7F-4A88-BC13-9910F7C44623}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ordering.SignalrHub", "src\Services\Ordering\Ordering.SignalrHub\Ordering.SignalrHub.csproj", "{E1D2B260-4E7F-4A88-BC13-9910F7C44623}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -866,54 +862,6 @@ Global {C0A7918D-B4F2-4E7F-8DE2-1E5279EF079F}.Release|x64.Build.0 = Release|Any CPU {C0A7918D-B4F2-4E7F-8DE2-1E5279EF079F}.Release|x86.ActiveCfg = Release|Any CPU {C0A7918D-B4F2-4E7F-8DE2-1E5279EF079F}.Release|x86.Build.0 = Release|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Ad-Hoc|x64.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Ad-Hoc|x86.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.AppStore|Any CPU.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.AppStore|ARM.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.AppStore|ARM.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.AppStore|iPhone.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.AppStore|iPhone.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.AppStore|x64.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.AppStore|x64.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.AppStore|x86.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.AppStore|x86.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Debug|ARM.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Debug|ARM.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Debug|iPhone.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Debug|x64.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Debug|x64.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Debug|x86.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Debug|x86.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Release|Any CPU.Build.0 = Release|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Release|ARM.ActiveCfg = Release|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Release|ARM.Build.0 = Release|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Release|iPhone.ActiveCfg = Release|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Release|iPhone.Build.0 = Release|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Release|x64.ActiveCfg = Release|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Release|x64.Build.0 = Release|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Release|x86.ActiveCfg = Release|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Release|x86.Build.0 = Release|Any CPU {1A01AF82-6FCB-464C-B39C-F127AEBD315D}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU {1A01AF82-6FCB-464C-B39C-F127AEBD315D}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU {1A01AF82-6FCB-464C-B39C-F127AEBD315D}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU @@ -1617,8 +1565,6 @@ Global {A81ECBC2-6B00-4DCD-8388-469174033379} = {DB0EFB20-B024-4E5E-A75C-52143C131D25} {942ED6E8-0050-495F-A0EA-01E97F63760C} = {A81ECBC2-6B00-4DCD-8388-469174033379} {C0A7918D-B4F2-4E7F-8DE2-1E5279EF079F} = {E279BF0F-7F66-4F3A-A3AB-2CDA66C1CD04} - {FBF43D93-F2E7-4FF8-B4AB-186895949B88} = {DB0EFB20-B024-4E5E-A75C-52143C131D25} - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502} = {FBF43D93-F2E7-4FF8-B4AB-186895949B88} {022E145D-1593-47EE-9608-8E323D3C63F5} = {91CF7717-08AB-4E65-B10E-0B426F01E2E8} {1A01AF82-6FCB-464C-B39C-F127AEBD315D} = {022E145D-1593-47EE-9608-8E323D3C63F5} {22A0F9C1-2D4A-4107-95B7-8459E6688BC5} = {A81ECBC2-6B00-4DCD-8388-469174033379} diff --git a/eShopOnContainers.sln b/eShopOnContainers.sln index ebee1f162..83125a051 100644 --- a/eShopOnContainers.sln +++ b/eShopOnContainers.sln @@ -67,10 +67,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Health EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebStatus", "src\Web\WebStatus\WebStatus.csproj", "{C0A7918D-B4F2-4E7F-8DE2-1E5279EF079F}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Resilience", "Resilience", "{FBF43D93-F2E7-4FF8-B4AB-186895949B88}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Resilience.Http", "src\BuildingBlocks\Resilience\Resilience.Http\Resilience.Http.csproj", "{D1C47FF1-91F1-4CAF-9ABB-AD642B821502}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Payment", "Payment", "{022E145D-1593-47EE-9608-8E323D3C63F5}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Payment.API", "src\Services\Payment\Payment.API\Payment.API.csproj", "{1A01AF82-6FCB-464C-B39C-F127AEBD315D}" @@ -857,54 +853,6 @@ Global {C0A7918D-B4F2-4E7F-8DE2-1E5279EF079F}.Release|x64.Build.0 = Release|Any CPU {C0A7918D-B4F2-4E7F-8DE2-1E5279EF079F}.Release|x86.ActiveCfg = Release|Any CPU {C0A7918D-B4F2-4E7F-8DE2-1E5279EF079F}.Release|x86.Build.0 = Release|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Ad-Hoc|x64.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Ad-Hoc|x86.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.AppStore|Any CPU.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.AppStore|ARM.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.AppStore|ARM.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.AppStore|iPhone.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.AppStore|iPhone.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.AppStore|x64.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.AppStore|x64.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.AppStore|x86.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.AppStore|x86.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Debug|ARM.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Debug|ARM.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Debug|iPhone.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Debug|x64.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Debug|x64.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Debug|x86.ActiveCfg = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Debug|x86.Build.0 = Debug|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Release|Any CPU.Build.0 = Release|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Release|ARM.ActiveCfg = Release|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Release|ARM.Build.0 = Release|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Release|iPhone.ActiveCfg = Release|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Release|iPhone.Build.0 = Release|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Release|x64.ActiveCfg = Release|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Release|x64.Build.0 = Release|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Release|x86.ActiveCfg = Release|Any CPU - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502}.Release|x86.Build.0 = Release|Any CPU {1A01AF82-6FCB-464C-B39C-F127AEBD315D}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU {1A01AF82-6FCB-464C-B39C-F127AEBD315D}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU {1A01AF82-6FCB-464C-B39C-F127AEBD315D}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU @@ -1840,8 +1788,6 @@ Global {A81ECBC2-6B00-4DCD-8388-469174033379} = {DB0EFB20-B024-4E5E-A75C-52143C131D25} {942ED6E8-0050-495F-A0EA-01E97F63760C} = {A81ECBC2-6B00-4DCD-8388-469174033379} {C0A7918D-B4F2-4E7F-8DE2-1E5279EF079F} = {E279BF0F-7F66-4F3A-A3AB-2CDA66C1CD04} - {FBF43D93-F2E7-4FF8-B4AB-186895949B88} = {DB0EFB20-B024-4E5E-A75C-52143C131D25} - {D1C47FF1-91F1-4CAF-9ABB-AD642B821502} = {FBF43D93-F2E7-4FF8-B4AB-186895949B88} {022E145D-1593-47EE-9608-8E323D3C63F5} = {91CF7717-08AB-4E65-B10E-0B426F01E2E8} {1A01AF82-6FCB-464C-B39C-F127AEBD315D} = {022E145D-1593-47EE-9608-8E323D3C63F5} {22A0F9C1-2D4A-4107-95B7-8459E6688BC5} = {A81ECBC2-6B00-4DCD-8388-469174033379} diff --git a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj index 439da6f4c..a8e222e0f 100644 --- a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj +++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj @@ -17,8 +17,4 @@ - - - - diff --git a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Startup.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Startup.cs index 7c95205a7..e02bffcbd 100644 --- a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Startup.cs +++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Startup.cs @@ -1,24 +1,20 @@ -using System; -using System.Collections.Generic; -using System.IdentityModel.Tokens.Jwt; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; -using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Config; using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Filters.Basket.API.Infrastructure.Filters; -using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Services; -using Swashbuckle.AspNetCore.Swagger; using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Infrastructure; -using Polly.Extensions.Http; +using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Services; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using Polly; +using Polly.Extensions.Http; +using Swashbuckle.AspNetCore.Swagger; +using System; +using System.Collections.Generic; +using System.IdentityModel.Tokens.Jwt; namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator { diff --git a/src/ApiGateways/Web.Bff.Shopping/aggregator/Web.Shopping.HttpAggregator.csproj b/src/ApiGateways/Web.Bff.Shopping/aggregator/Web.Shopping.HttpAggregator.csproj index 7b6a56038..88f058a97 100644 --- a/src/ApiGateways/Web.Bff.Shopping/aggregator/Web.Shopping.HttpAggregator.csproj +++ b/src/ApiGateways/Web.Bff.Shopping/aggregator/Web.Shopping.HttpAggregator.csproj @@ -18,8 +18,4 @@ - - - - diff --git a/src/BuildingBlocks/Resilience/Resilience.Http/IHttpClient.cs b/src/BuildingBlocks/Resilience/Resilience.Http/IHttpClient.cs deleted file mode 100644 index 5ea3003ed..000000000 --- a/src/BuildingBlocks/Resilience/Resilience.Http/IHttpClient.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.Net.Http; -using System.Threading.Tasks; - -namespace Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http -{ - public interface IHttpClient - { - Task GetStringAsync(string uri, string authorizationToken = null, string authorizationMethod = "Bearer"); - - Task PostAsync(string uri, T item, string authorizationToken = null, string requestId = null, string authorizationMethod = "Bearer"); - - Task DeleteAsync(string uri, string authorizationToken = null, string requestId = null, string authorizationMethod = "Bearer"); - - Task PutAsync(string uri, T item, string authorizationToken = null, string requestId = null, string authorizationMethod = "Bearer"); - } -} diff --git a/src/BuildingBlocks/Resilience/Resilience.Http/Resilience.Http.csproj b/src/BuildingBlocks/Resilience/Resilience.Http/Resilience.Http.csproj deleted file mode 100644 index 4f22ad943..000000000 --- a/src/BuildingBlocks/Resilience/Resilience.Http/Resilience.Http.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - netstandard2.0 - Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http - - - - - - - - - - \ No newline at end of file diff --git a/src/BuildingBlocks/Resilience/Resilience.Http/ResilientHttpClient.cs b/src/BuildingBlocks/Resilience/Resilience.Http/ResilientHttpClient.cs deleted file mode 100644 index aaa709e79..000000000 --- a/src/BuildingBlocks/Resilience/Resilience.Http/ResilientHttpClient.cs +++ /dev/null @@ -1,191 +0,0 @@ -using Microsoft.Extensions.Logging; -using Newtonsoft.Json; -using Polly; -using Polly.Wrap; -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Net; -using System.Net.Http; -using System.Net.Http.Headers; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Http; - -namespace Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http -{ - /// - /// HttpClient wrapper that integrates Retry and Circuit - /// breaker policies when invoking HTTP services. - /// Based on Polly library: https://github.com/App-vNext/Polly - /// - public class ResilientHttpClient : IHttpClient - { - private readonly HttpClient _client; - private readonly ILogger _logger; - private readonly Func> _policyCreator; - private ConcurrentDictionary _policyWrappers; - private readonly IHttpContextAccessor _httpContextAccessor; - - public ResilientHttpClient(Func> policyCreator, ILogger logger, IHttpContextAccessor httpContextAccessor) - { - _client = new HttpClient(); - _logger = logger; - _policyCreator = policyCreator; - _policyWrappers = new ConcurrentDictionary(); - _httpContextAccessor = httpContextAccessor; - } - - - public Task PostAsync(string uri, T item, string authorizationToken = null, string requestId = null, string authorizationMethod = "Bearer") - { - return DoPostPutAsync(HttpMethod.Post, uri, item, authorizationToken, requestId, authorizationMethod); - } - - public Task PutAsync(string uri, T item, string authorizationToken = null, string requestId = null, string authorizationMethod = "Bearer") - { - return DoPostPutAsync(HttpMethod.Put, uri, item, authorizationToken, requestId, authorizationMethod); - } - - public Task DeleteAsync(string uri, string authorizationToken = null, string requestId = null, string authorizationMethod = "Bearer") - { - var origin = GetOriginFromUri(uri); - - return HttpInvoker(origin, async (_) => - { - var requestMessage = new HttpRequestMessage(HttpMethod.Delete, uri); - - SetAuthorizationHeader(requestMessage); - - if (authorizationToken != null) - { - requestMessage.Headers.Authorization = new AuthenticationHeaderValue(authorizationMethod, authorizationToken); - } - - if (requestId != null) - { - requestMessage.Headers.Add("x-requestid", requestId); - } - - return await _client.SendAsync(requestMessage); - }); - } - - - public Task GetStringAsync(string uri, string authorizationToken = null, string authorizationMethod = "Bearer") - { - var origin = GetOriginFromUri(uri); - - return HttpInvoker(origin, async (_) => - { - var requestMessage = new HttpRequestMessage(HttpMethod.Get, uri); - - SetAuthorizationHeader(requestMessage); - - if (authorizationToken != null) - { - requestMessage.Headers.Authorization = new AuthenticationHeaderValue(authorizationMethod, authorizationToken); - } - - var response = await _client.SendAsync(requestMessage); - - // raise exception if HttpResponseCode 500 - // needed for circuit breaker to track fails - - if (response.StatusCode == HttpStatusCode.InternalServerError) - { - throw new HttpRequestException(); - } - - if (!response.IsSuccessStatusCode) - { - return null; - } - - return await response.Content.ReadAsStringAsync(); - }); - } - - private Task DoPostPutAsync(HttpMethod method, string uri, T item, string authorizationToken = null, string requestId = null, string authorizationMethod = "Bearer") - { - if (method != HttpMethod.Post && method != HttpMethod.Put) - { - throw new ArgumentException("Value must be either post or put.", nameof(method)); - } - - // a new StringContent must be created for each retry - // as it is disposed after each call - var origin = GetOriginFromUri(uri); - - return HttpInvoker(origin, async (_) => - { - var requestMessage = new HttpRequestMessage(method, uri); - - SetAuthorizationHeader(requestMessage); - - requestMessage.Content = new StringContent(JsonConvert.SerializeObject(item), System.Text.Encoding.UTF8, "application/json"); - - if (authorizationToken != null) - { - requestMessage.Headers.Authorization = new AuthenticationHeaderValue(authorizationMethod, authorizationToken); - } - - if (requestId != null) - { - requestMessage.Headers.Add("x-requestid", requestId); - } - - var response = await _client.SendAsync(requestMessage); - - // raise exception if HttpResponseCode 500 - // needed for circuit breaker to track fails - - if (response.StatusCode == HttpStatusCode.InternalServerError) - { - throw new HttpRequestException(); - } - - return response; - }); - } - - private async Task HttpInvoker(string origin, Func> action) - { - var normalizedOrigin = NormalizeOrigin(origin); - - if (!_policyWrappers.TryGetValue(normalizedOrigin, out PolicyWrap policyWrap)) - { - policyWrap = Policy.WrapAsync(_policyCreator(normalizedOrigin).ToArray()); - _policyWrappers.TryAdd(normalizedOrigin, policyWrap); - } - - // Executes the action applying all - // the policies defined in the wrapper - return await policyWrap.ExecuteAsync(action, new Context(normalizedOrigin)); - } - - - private static string NormalizeOrigin(string origin) - { - return origin?.Trim()?.ToLower(); - } - - private static string GetOriginFromUri(string uri) - { - var url = new Uri(uri); - - var origin = $"{url.Scheme}://{url.DnsSafeHost}:{url.Port}"; - - return origin; - } - - private void SetAuthorizationHeader(HttpRequestMessage requestMessage) - { - var authorizationHeader = _httpContextAccessor.HttpContext.Request.Headers["Authorization"]; - if (!string.IsNullOrEmpty(authorizationHeader)) - { - requestMessage.Headers.Add("Authorization", new List() { authorizationHeader }); - } - } - } -} diff --git a/src/BuildingBlocks/Resilience/Resilience.Http/StandardHttpClient.cs b/src/BuildingBlocks/Resilience/Resilience.Http/StandardHttpClient.cs deleted file mode 100644 index 578168bff..000000000 --- a/src/BuildingBlocks/Resilience/Resilience.Http/StandardHttpClient.cs +++ /dev/null @@ -1,125 +0,0 @@ -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.Logging; -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Net; -using System.Net.Http; -using System.Net.Http.Headers; -using System.Threading.Tasks; - -namespace Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http -{ - public class StandardHttpClient : IHttpClient - { - private HttpClient _client; - private ILogger _logger; - private readonly IHttpContextAccessor _httpContextAccessor; - - public StandardHttpClient(ILogger logger, IHttpContextAccessor httpContextAccessor) - { - _client = new HttpClient(); - _logger = logger; - _httpContextAccessor = httpContextAccessor; - } - - public async Task GetStringAsync(string uri, string authorizationToken = null, string authorizationMethod = "Bearer") - { - var requestMessage = new HttpRequestMessage(HttpMethod.Get, uri); - - SetAuthorizationHeader(requestMessage); - - if (authorizationToken != null) - { - requestMessage.Headers.Authorization = new AuthenticationHeaderValue(authorizationMethod, authorizationToken); - } - - var response = await _client.SendAsync(requestMessage); - - if (!response.IsSuccessStatusCode) - { - return null; - } - - return await response.Content.ReadAsStringAsync(); - } - - private async Task DoPostPutAsync(HttpMethod method, string uri, T item, string authorizationToken = null, string requestId = null, string authorizationMethod = "Bearer") - { - if (method != HttpMethod.Post && method != HttpMethod.Put) - { - throw new ArgumentException("Value must be either post or put.", nameof(method)); - } - - // a new StringContent must be created for each retry - // as it is disposed after each call - - var requestMessage = new HttpRequestMessage(method, uri); - - SetAuthorizationHeader(requestMessage); - - requestMessage.Content = new StringContent(JsonConvert.SerializeObject(item), System.Text.Encoding.UTF8, "application/json"); - - if (authorizationToken != null) - { - requestMessage.Headers.Authorization = new AuthenticationHeaderValue(authorizationMethod, authorizationToken); - } - - if (requestId != null) - { - requestMessage.Headers.Add("x-requestid", requestId); - } - - var response = await _client.SendAsync(requestMessage); - - // raise exception if HttpResponseCode 500 - // needed for circuit breaker to track fails - - if (response.StatusCode == HttpStatusCode.InternalServerError) - { - throw new HttpRequestException(); - } - - return response; - } - - - public async Task PostAsync(string uri, T item, string authorizationToken = null, string requestId = null, string authorizationMethod = "Bearer") - { - return await DoPostPutAsync(HttpMethod.Post, uri, item, authorizationToken, requestId, authorizationMethod); - } - - public async Task PutAsync(string uri, T item, string authorizationToken = null, string requestId = null, string authorizationMethod = "Bearer") - { - return await DoPostPutAsync(HttpMethod.Put, uri, item, authorizationToken, requestId, authorizationMethod); - } - public async Task DeleteAsync(string uri, string authorizationToken = null, string requestId = null, string authorizationMethod = "Bearer") - { - var requestMessage = new HttpRequestMessage(HttpMethod.Delete, uri); - - SetAuthorizationHeader(requestMessage); - - if (authorizationToken != null) - { - requestMessage.Headers.Authorization = new AuthenticationHeaderValue(authorizationMethod, authorizationToken); - } - - if (requestId != null) - { - requestMessage.Headers.Add("x-requestid", requestId); - } - - return await _client.SendAsync(requestMessage); - } - - private void SetAuthorizationHeader(HttpRequestMessage requestMessage) - { - var authorizationHeader = _httpContextAccessor.HttpContext.Request.Headers["Authorization"]; - if (!string.IsNullOrEmpty(authorizationHeader)) - { - requestMessage.Headers.Add("Authorization", new List() { authorizationHeader }); - } - } - } -} - diff --git a/src/Web/WebMVC/Controllers/TestController.cs b/src/Web/WebMVC/Controllers/TestController.cs index 1b35d5d2b..2cf053126 100644 --- a/src/Web/WebMVC/Controllers/TestController.cs +++ b/src/Web/WebMVC/Controllers/TestController.cs @@ -1,12 +1,9 @@ -using Microsoft.AspNetCore.Authentication; -using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; using Microsoft.eShopOnContainers.WebMVC.Services; using Microsoft.eShopOnContainers.WebMVC.ViewModels; -using System; -using System.Collections.Generic; -using System.Linq; +using Newtonsoft.Json; +using System.Net.Http; using System.Threading.Tasks; namespace WebMVC.Controllers @@ -14,6 +11,7 @@ namespace WebMVC.Controllers class TestPayload { public int CatalogItemId { get; set; } + public string BasketId { get; set; } public int Quantity { get; set; } @@ -22,9 +20,10 @@ namespace WebMVC.Controllers [Authorize] public class TestController : Controller { - private readonly IHttpClient _client; + private readonly IHttpClientFactory _client; private readonly IIdentityParser _appUserParser; - public TestController(IHttpClient client, IIdentityParser identityParser) + + public TestController(IHttpClientFactory client, IIdentityParser identityParser) { _client = client; _appUserParser = identityParser; @@ -33,18 +32,24 @@ namespace WebMVC.Controllers public async Task Ocelot() { var url = "http://apigw/shopping/api/v1/basket/items"; + var payload = new TestPayload() { CatalogItemId = 1, Quantity = 1, BasketId = _appUserParser.Parse(User).Id }; - var token = await HttpContext.GetTokenAsync("access_token"); - var response = await _client.PostAsync(url, payload, token); - + + var content = new StringContent(JsonConvert.SerializeObject(payload), System.Text.Encoding.UTF8, "application/json"); + + + var response = await _client.CreateClient(nameof(IBasketService)) + .PostAsync(url, content); + if (response.IsSuccessStatusCode) { var str = await response.Content.ReadAsStringAsync(); + return Ok(str); } else diff --git a/src/Web/WebMVC/WebMVC.csproj b/src/Web/WebMVC/WebMVC.csproj index a80ef22d4..db6dd3494 100644 --- a/src/Web/WebMVC/WebMVC.csproj +++ b/src/Web/WebMVC/WebMVC.csproj @@ -43,7 +43,6 @@ - From 460fc997af5bba130608bfe2a9d39811313a8f05 Mon Sep 17 00:00:00 2001 From: Unai Zorrilla Castro Date: Mon, 21 May 2018 15:01:29 +0200 Subject: [PATCH 11/33] Create Generic Host prototype for background task in order to be reviewed --- eShopOnContainers-ServicesAndWebApps.sln | 51 +++++ .../Ordering.BackgroundTasks.csproj | 5 +- .../Configuration/BackgroundTaskSettings.cs | 17 ++ .../GracePeriodConfirmedIntegrationEvent.cs | 12 ++ .../Ordering.BackgroundTasksHost.csproj | 32 ++++ .../Ordering.BackgroundTasksHost/Program.cs | 177 ++++++++++++++++++ .../Tasks/Base/BackgroundTask.cs | 81 ++++++++ .../Tasks/GracePeriodManagerTask.cs | 92 +++++++++ .../appsettings.json | 27 +++ 9 files changed, 493 insertions(+), 1 deletion(-) create mode 100644 src/Services/Ordering/Ordering.BackgroundTasksHost/Configuration/BackgroundTaskSettings.cs create mode 100644 src/Services/Ordering/Ordering.BackgroundTasksHost/IntegrationEvents/GracePeriodConfirmedIntegrationEvent.cs create mode 100644 src/Services/Ordering/Ordering.BackgroundTasksHost/Ordering.BackgroundTasksHost.csproj create mode 100644 src/Services/Ordering/Ordering.BackgroundTasksHost/Program.cs create mode 100644 src/Services/Ordering/Ordering.BackgroundTasksHost/Tasks/Base/BackgroundTask.cs create mode 100644 src/Services/Ordering/Ordering.BackgroundTasksHost/Tasks/GracePeriodManagerTask.cs create mode 100644 src/Services/Ordering/Ordering.BackgroundTasksHost/appsettings.json diff --git a/eShopOnContainers-ServicesAndWebApps.sln b/eShopOnContainers-ServicesAndWebApps.sln index f9e3e654e..d759749e8 100644 --- a/eShopOnContainers-ServicesAndWebApps.sln +++ b/eShopOnContainers-ServicesAndWebApps.sln @@ -128,6 +128,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ordering.BackgroundTasks", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ordering.SignalrHub", "src\Services\Ordering\Ordering.SignalrHub\Ordering.SignalrHub.csproj", "{E1D2B260-4E7F-4A88-BC13-9910F7C44623}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ordering.BackgroundTasksHost", "src\Services\Ordering\Ordering.BackgroundTasksHost\Ordering.BackgroundTasksHost.csproj", "{CA566CD5-A49A-47F7-BDC9-592E36DAF74E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Ad-Hoc|Any CPU = Ad-Hoc|Any CPU @@ -1534,6 +1536,54 @@ Global {E1D2B260-4E7F-4A88-BC13-9910F7C44623}.Release|x64.Build.0 = Release|Any CPU {E1D2B260-4E7F-4A88-BC13-9910F7C44623}.Release|x86.ActiveCfg = Release|Any CPU {E1D2B260-4E7F-4A88-BC13-9910F7C44623}.Release|x86.Build.0 = Release|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|x64.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|x86.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|ARM.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|ARM.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|iPhone.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|iPhone.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|x64.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|x64.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|x86.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|x86.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|ARM.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|ARM.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|iPhone.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|x64.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|x64.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|x86.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|x86.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|Any CPU.Build.0 = Release|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|ARM.ActiveCfg = Release|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|ARM.Build.0 = Release|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|iPhone.ActiveCfg = Release|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|iPhone.Build.0 = Release|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|x64.ActiveCfg = Release|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|x64.Build.0 = Release|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|x86.ActiveCfg = Release|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1589,6 +1639,7 @@ Global {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1} = {28C0F5C8-4849-4035-80AB-45639424E73F} {7D63ED4A-3EDA-4BBA-8BBA-F46BD6430931} = {0BD0DB92-2D98-44D9-9AC0-C59186D59B0B} {E1D2B260-4E7F-4A88-BC13-9910F7C44623} = {0BD0DB92-2D98-44D9-9AC0-C59186D59B0B} + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E} = {0BD0DB92-2D98-44D9-9AC0-C59186D59B0B} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {25728519-5F0F-4973-8A64-0A81EB4EA8D9} diff --git a/src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj b/src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj index 9f832bdfd..e61a12068 100644 --- a/src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj +++ b/src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj @@ -7,7 +7,10 @@ - + + + + diff --git a/src/Services/Ordering/Ordering.BackgroundTasksHost/Configuration/BackgroundTaskSettings.cs b/src/Services/Ordering/Ordering.BackgroundTasksHost/Configuration/BackgroundTaskSettings.cs new file mode 100644 index 000000000..3c0165e7b --- /dev/null +++ b/src/Services/Ordering/Ordering.BackgroundTasksHost/Configuration/BackgroundTaskSettings.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Ordering.BackgroundTasksHost.Configuration +{ + public class BackgroundTaskSettings + { + public string ConnectionString { get; set; } + + public string EventBusConnection { get; set; } + + public int GracePeriodTime { get; set; } + + public int CheckUpdateTime { get; set; } + } +} diff --git a/src/Services/Ordering/Ordering.BackgroundTasksHost/IntegrationEvents/GracePeriodConfirmedIntegrationEvent.cs b/src/Services/Ordering/Ordering.BackgroundTasksHost/IntegrationEvents/GracePeriodConfirmedIntegrationEvent.cs new file mode 100644 index 000000000..28a4b3492 --- /dev/null +++ b/src/Services/Ordering/Ordering.BackgroundTasksHost/IntegrationEvents/GracePeriodConfirmedIntegrationEvent.cs @@ -0,0 +1,12 @@ +using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Events; + +namespace Ordering.BackgroundTasksHost.IntegrationEvents +{ + public class GracePeriodConfirmedIntegrationEvent : IntegrationEvent + { + public int OrderId { get; } + + public GracePeriodConfirmedIntegrationEvent(int orderId) => + OrderId = orderId; + } +} diff --git a/src/Services/Ordering/Ordering.BackgroundTasksHost/Ordering.BackgroundTasksHost.csproj b/src/Services/Ordering/Ordering.BackgroundTasksHost/Ordering.BackgroundTasksHost.csproj new file mode 100644 index 000000000..6a5bedc9d --- /dev/null +++ b/src/Services/Ordering/Ordering.BackgroundTasksHost/Ordering.BackgroundTasksHost.csproj @@ -0,0 +1,32 @@ + + + + Exe + netcoreapp2.1 + + + + + + + + + PreserveNewest + + + + + + + + + + + + + + + + + + diff --git a/src/Services/Ordering/Ordering.BackgroundTasksHost/Program.cs b/src/Services/Ordering/Ordering.BackgroundTasksHost/Program.cs new file mode 100644 index 000000000..52668152a --- /dev/null +++ b/src/Services/Ordering/Ordering.BackgroundTasksHost/Program.cs @@ -0,0 +1,177 @@ +using Autofac.Extensions.DependencyInjection; +using Autofac; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using System; +using Ordering.BackgroundTasksHost.Configuration; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using Microsoft.eShopOnContainers.BuildingBlocks.EventBusServiceBus; +using Microsoft.Azure.ServiceBus; +using Microsoft.eShopOnContainers.BuildingBlocks.EventBusRabbitMQ; +using RabbitMQ.Client; +using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions; +using Microsoft.eShopOnContainers.BuildingBlocks.EventBus; +using Ordering.BackgroundTasksHost.Tasks; + +namespace Ordering.BackgroundTasksHost +{ + class Program + { + static void Main(string[] args) + { + using (var host = CreateHost(args)) + { + host.Start(); + + host.WaitForShutdown(); + } + } + + static IHost CreateHost(string[] args) + { + var host = new HostBuilder() + .ConfigureAppConfiguration((hostContext, configApp) => + { + configApp.AddEnvironmentVariables(); + configApp.AddJsonFile("appsettings.json", optional: true); + configApp.AddJsonFile( + $"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", + optional: true); + configApp.AddCommandLine(args); + + }) + .ConfigureServices(services => + { + var configuration = services.BuildServiceProvider() + .GetRequiredService(); + + services.AddOptions() + .Configure(configuration) + .RegisterBus(configuration) + .RegisterHostedServices(); + + }) + .UseServiceProviderFactory(new AutofacServiceProviderFactory()) + .Build(); + + return host; + } + + + } + + class AutofacServiceProviderFactory + : IServiceProviderFactory + { + public ContainerBuilder CreateBuilder(IServiceCollection services) + { + var containerBuilder = new ContainerBuilder(); + containerBuilder.Populate(services); + + return containerBuilder; + } + + public IServiceProvider CreateServiceProvider(ContainerBuilder containerBuilder) + { + return new AutofacServiceProvider(containerBuilder.Build()); + } + } + + static class ServiceCollectionExtensions + { + public static IServiceCollection RegisterBus(this IServiceCollection services, IConfiguration configuration) + { + if (configuration.GetValue("AzureServiceBusEnabled")) + { + services.AddSingleton(sp => + { + var logger = sp.GetRequiredService>(); + + var serviceBusConnectionString = configuration["EventBusConnection"]; + var serviceBusConnection = new ServiceBusConnectionStringBuilder(serviceBusConnectionString); + + return new DefaultServiceBusPersisterConnection(serviceBusConnection, logger); + }); + } + else + { + services.AddSingleton(sp => + { + var logger = sp.GetRequiredService>(); + + + var factory = new ConnectionFactory() + { + HostName = configuration["EventBusConnection"] + }; + + if (!string.IsNullOrEmpty(configuration["EventBusUserName"])) + { + factory.UserName = configuration["EventBusUserName"]; + } + + if (!string.IsNullOrEmpty(configuration["EventBusPassword"])) + { + factory.Password = configuration["EventBusPassword"]; + } + + var retryCount = 5; + if (!string.IsNullOrEmpty(configuration["EventBusRetryCount"])) + { + retryCount = int.Parse(configuration["EventBusRetryCount"]); + } + + return new DefaultRabbitMQPersistentConnection(factory, logger, retryCount); + }); + } + + + var subscriptionClientName = configuration["SubscriptionClientName"]; + + if (configuration.GetValue("AzureServiceBusEnabled")) + { + services.AddSingleton(sp => + { + var serviceBusPersisterConnection = sp.GetRequiredService(); + var iLifetimeScope = sp.GetRequiredService(); + var logger = sp.GetRequiredService>(); + var eventBusSubcriptionsManager = sp.GetRequiredService(); + + return new EventBusServiceBus(serviceBusPersisterConnection, logger, + eventBusSubcriptionsManager, subscriptionClientName, iLifetimeScope); + }); + } + else + { + services.AddSingleton(sp => + { + var rabbitMQPersistentConnection = sp.GetRequiredService(); + var iLifetimeScope = sp.GetRequiredService(); + var logger = sp.GetRequiredService>(); + var eventBusSubcriptionsManager = sp.GetRequiredService(); + + var retryCount = 5; + if (!string.IsNullOrEmpty(configuration["EventBusRetryCount"])) + { + retryCount = int.Parse(configuration["EventBusRetryCount"]); + } + + return new EventBusRabbitMQ(rabbitMQPersistentConnection, logger, iLifetimeScope, eventBusSubcriptionsManager, subscriptionClientName, retryCount); + }); + } + + services.AddSingleton(); + + return services; + } + + public static IServiceCollection RegisterHostedServices(this IServiceCollection services) + { + services.AddSingleton(); + + return services; + } + } + +} diff --git a/src/Services/Ordering/Ordering.BackgroundTasksHost/Tasks/Base/BackgroundTask.cs b/src/Services/Ordering/Ordering.BackgroundTasksHost/Tasks/Base/BackgroundTask.cs new file mode 100644 index 000000000..e9b56aece --- /dev/null +++ b/src/Services/Ordering/Ordering.BackgroundTasksHost/Tasks/Base/BackgroundTask.cs @@ -0,0 +1,81 @@ +using Microsoft.Extensions.Hosting; +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace Ordering.BackgroundTasksHost.Tasks.Base +{ + // Copyright(c) .NET Foundation.All rights reserved. + // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + + /// + /// Base class for implementing a long running . + /// IMPORTANT: This base class is implemented in .NET Core 2.1 - Since this microservice is still in .NET Core 2.0, we're using the class within the project + /// When .NET Core 2.1 is released, this class should be removed and you should use the use implemented by the framework + /// https://github.com/aspnet/Hosting/blob/712c992ca827576c05923e6a134ca0bec87af4df/src/Microsoft.Extensions.Hosting.Abstractions/BackgroundService.cs + /// + /// + public abstract class BackgroundService : IHostedService, IDisposable + { + private Task _executingTask; + + private readonly CancellationTokenSource _stoppingCts = new CancellationTokenSource(); + + /// + /// This method is called when the starts. The implementation should return a task that represents + /// the lifetime of the long running operation(s) being performed. + /// + /// Triggered when is called. + /// A that represents the long running operations. + protected abstract Task ExecuteAsync(CancellationToken stoppingToken); + + /// + /// Triggered when the application host is ready to start the service. + /// + /// Indicates that the start process has been aborted. + public virtual Task StartAsync(CancellationToken cancellationToken) + { + // Store the task we're executing + _executingTask = ExecuteAsync(_stoppingCts.Token); + + // If the task is completed then return it, this will bubble cancellation and failure to the caller + if (_executingTask.IsCompleted) + { + return _executingTask; + } + + // Otherwise it's running + return Task.CompletedTask; + } + + /// + /// Triggered when the application host is performing a graceful shutdown. + /// + /// Indicates that the shutdown process should no longer be graceful. + public virtual async Task StopAsync(CancellationToken cancellationToken) + { + // Stop called without start + if (_executingTask == null) + { + return; + } + + try + { + // Signal cancellation to the executing method + _stoppingCts.Cancel(); + } + finally + { + // Wait until the task completes or the stop token triggers + await Task.WhenAny(_executingTask, Task.Delay(Timeout.Infinite, cancellationToken)); + } + + } + + public virtual void Dispose() + { + _stoppingCts.Cancel(); + } + } +} diff --git a/src/Services/Ordering/Ordering.BackgroundTasksHost/Tasks/GracePeriodManagerTask.cs b/src/Services/Ordering/Ordering.BackgroundTasksHost/Tasks/GracePeriodManagerTask.cs new file mode 100644 index 000000000..d25e58b32 --- /dev/null +++ b/src/Services/Ordering/Ordering.BackgroundTasksHost/Tasks/GracePeriodManagerTask.cs @@ -0,0 +1,92 @@ +using Dapper; +using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Ordering.BackgroundTasksHost.Configuration; +using Ordering.BackgroundTasksHost.IntegrationEvents; +using System; +using System.Collections.Generic; +using System.Data.SqlClient; +using System.Threading; +using System.Threading.Tasks; + +namespace Ordering.BackgroundTasksHost.Tasks +{ + public class GracePeriodManagerService + : BackgroundService + { + private readonly ILogger _logger; + private readonly BackgroundTaskSettings _settings; + private readonly IEventBus _eventBus; + + public GracePeriodManagerService(IOptions settings, + IEventBus eventBus, + ILogger logger) + { + _settings = settings?.Value ?? throw new ArgumentNullException(nameof(settings)); + _eventBus = eventBus ?? throw new ArgumentNullException(nameof(eventBus)); + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + } + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + _logger.LogDebug($"GracePeriodManagerService is starting."); + + //stoppingToken.Register(() => _logger.LogDebug($"#1 GracePeriodManagerService background task is stopping.")); + + //while (!stoppingToken.IsCancellationRequested) + //{ + // _logger.LogDebug($"GracePeriodManagerService background task is doing background work."); + + // CheckConfirmedGracePeriodOrders(); + + // await Task.Delay(_settings.CheckUpdateTime, stoppingToken); + //} + + _logger.LogDebug($"GracePeriodManagerService background task is stopping."); + + await Task.CompletedTask; + } + + private void CheckConfirmedGracePeriodOrders() + { + _logger.LogDebug($"Checking confirmed grace period orders"); + + var orderIds = GetConfirmedGracePeriodOrders(); + + foreach (var orderId in orderIds) + { + var confirmGracePeriodEvent = new GracePeriodConfirmedIntegrationEvent(orderId); + + _eventBus.Publish(confirmGracePeriodEvent); + } + } + + private IEnumerable GetConfirmedGracePeriodOrders() + { + IEnumerable orderIds = new List(); + + using (var conn = new SqlConnection(_settings.ConnectionString)) + { + try + { + conn.Open(); + orderIds = conn.Query( + @"SELECT Id FROM [ordering].[orders] + WHERE DATEDIFF(minute, [OrderDate], GETDATE()) >= @GracePeriodTime + AND [OrderStatusId] = 1", + new { GracePeriodTime = _settings.GracePeriodTime }); + } + catch (SqlException exception) + { + _logger.LogCritical($"FATAL ERROR: Database connections could not be opened: {exception.Message}"); + } + + } + + return orderIds; + } + } +} diff --git a/src/Services/Ordering/Ordering.BackgroundTasksHost/appsettings.json b/src/Services/Ordering/Ordering.BackgroundTasksHost/appsettings.json new file mode 100644 index 000000000..fd26645ab --- /dev/null +++ b/src/Services/Ordering/Ordering.BackgroundTasksHost/appsettings.json @@ -0,0 +1,27 @@ +{ + "ConnectionString": "Server=tcp:127.0.0.1,5433;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word;", + "Logging": { + "IncludeScopes": false, + "Debug": { + "LogLevel": { + "Default": "Debug" + } + }, + "Console": { + "LogLevel": { + "Default": "Debug" + } + } + }, + "SubscriptionClientName": "BackgroundTasks", + "GracePeriodTime": "1", + "CheckUpdateTime": "1000", + "ApplicationInsights": { + "InstrumentationKey": "" + }, + "AzureServiceBusEnabled": false, + "EventBusRetryCount": 5, + "EventBusConnection": "", + "EventBusUserName": "", + "EventBusPassword": "" +} \ No newline at end of file From 8844aaba75e2717fdd38788e572c987370cd768c Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Llorente Date: Mon, 21 May 2018 17:04:18 -0700 Subject: [PATCH 12/33] Adding an example of a HttpMessageHandler's Lifetime to 5 minutes in the pool. The default lifetime of HttpMessageHandler instances in the pool is 2 minutes. --- src/Web/WebMVC/Startup.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Web/WebMVC/Startup.cs b/src/Web/WebMVC/Startup.cs index 9cc5921a2..655ab1e68 100644 --- a/src/Web/WebMVC/Startup.cs +++ b/src/Web/WebMVC/Startup.cs @@ -182,9 +182,12 @@ namespace Microsoft.eShopOnContainers.WebMVC services.AddTransient(); services.AddTransient(); - //add http client servicse + services.AddHttpClient("extendedhandlerlifetime").SetHandlerLifetime(TimeSpan.FromMinutes(5)); + + //add http client services services.AddHttpClient() .AddHttpMessageHandler() + .SetHandlerLifetime(TimeSpan.FromMinutes(5)) //Sample. Default lifetime is 2 minutes .AddPolicyHandler(retriesWithExponentialBackoff) .AddPolicyHandler(circuitBreaker); From 1fa6242c1c1a2ad46b100a587fef6108ae468182 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Llorente Date: Mon, 21 May 2018 18:11:27 -0700 Subject: [PATCH 13/33] Added opt-in HttpClientLogging config --- src/Web/WebMVC/Startup.cs | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/Web/WebMVC/Startup.cs b/src/Web/WebMVC/Startup.cs index 655ab1e68..3df96da2c 100644 --- a/src/Web/WebMVC/Startup.cs +++ b/src/Web/WebMVC/Startup.cs @@ -36,10 +36,11 @@ namespace Microsoft.eShopOnContainers.WebMVC public void ConfigureServices(IServiceCollection services) { services.AddAppInsight(Configuration) - .AddHealthChecks(Configuration) - .AddCustomMvc(Configuration) - .AddHttpClientServices(Configuration) - .AddCustomAuthentication(Configuration); + .AddHealthChecks(Configuration) + .AddCustomMvc(Configuration) + .AddHttpClientServices(Configuration) + //.AddHttpClientLogging(Configuration) //Opt-in HttpClientLogging config + .AddCustomAuthentication(Configuration); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. @@ -216,6 +217,23 @@ namespace Microsoft.eShopOnContainers.WebMVC return services; } + + public static IServiceCollection AddHttpClientLogging(this IServiceCollection services, IConfiguration configuration) + { + services.AddLogging(b => + { + b.AddFilter((category, level) => true); // Spam the world with logs. + + // Add console logger so we can see all the logging produced by the client by default. + b.AddConsole(c => c.IncludeScopes = true); + + // Add console logger + b.AddDebug(); + }); + + return services; + } + public static IServiceCollection AddCustomAuthentication(this IServiceCollection services, IConfiguration configuration) { var useLoadTest = configuration.GetValue("UseLoadTest"); From 6127457e8e92f2a579bd1e4a9acda228fc006909 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Llorente Date: Mon, 21 May 2018 20:06:39 -0700 Subject: [PATCH 14/33] Changed order in pipeline so SetHandlerLifetime() is first, right on the on the IHttpClientBuilder that is returned when creating the Typed Client. --- src/Web/WebMVC/Startup.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Web/WebMVC/Startup.cs b/src/Web/WebMVC/Startup.cs index 3df96da2c..34c79d010 100644 --- a/src/Web/WebMVC/Startup.cs +++ b/src/Web/WebMVC/Startup.cs @@ -187,8 +187,8 @@ namespace Microsoft.eShopOnContainers.WebMVC //add http client services services.AddHttpClient() - .AddHttpMessageHandler() .SetHandlerLifetime(TimeSpan.FromMinutes(5)) //Sample. Default lifetime is 2 minutes + .AddHttpMessageHandler() .AddPolicyHandler(retriesWithExponentialBackoff) .AddPolicyHandler(circuitBreaker); From 70a26828066dd443ebc9cca04442f2afc77011fa Mon Sep 17 00:00:00 2001 From: Unai Zorrilla Castro Date: Tue, 22 May 2018 15:33:21 +0200 Subject: [PATCH 15/33] Working on compose dependencies and check new httpclient handlers retries --- docker-compose.yml | 159 +++++++++++----- eShopOnContainers-ServicesAndWebApps.sln | 51 ----- .../Web.Bff.Shopping/aggregator/Startup.cs | 9 +- .../WebHostExtensions.cs | 4 +- .../Configuration/BackgroundTaskSettings.cs | 17 -- .../GracePeriodConfirmedIntegrationEvent.cs | 12 -- .../Ordering.BackgroundTasksHost.csproj | 32 ---- .../Ordering.BackgroundTasksHost/Program.cs | 177 ------------------ .../Tasks/Base/BackgroundTask.cs | 81 -------- .../Tasks/GracePeriodManagerTask.cs | 92 --------- .../appsettings.json | 27 --- src/Web/WebMVC/Controllers/OrderController.cs | 5 +- src/Web/WebMVC/Startup.cs | 3 +- 13 files changed, 124 insertions(+), 545 deletions(-) delete mode 100644 src/Services/Ordering/Ordering.BackgroundTasksHost/Configuration/BackgroundTaskSettings.cs delete mode 100644 src/Services/Ordering/Ordering.BackgroundTasksHost/IntegrationEvents/GracePeriodConfirmedIntegrationEvent.cs delete mode 100644 src/Services/Ordering/Ordering.BackgroundTasksHost/Ordering.BackgroundTasksHost.csproj delete mode 100644 src/Services/Ordering/Ordering.BackgroundTasksHost/Program.cs delete mode 100644 src/Services/Ordering/Ordering.BackgroundTasksHost/Tasks/Base/BackgroundTask.cs delete mode 100644 src/Services/Ordering/Ordering.BackgroundTasksHost/Tasks/GracePeriodManagerTask.cs delete mode 100644 src/Services/Ordering/Ordering.BackgroundTasksHost/appsettings.json diff --git a/docker-compose.yml b/docker-compose.yml index 414d9a1ef..67879bcd7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,25 @@ version: '3.4' services: + sql.data: + image: microsoft/mssql-server-linux:2017-latest + + nosql.data: + image: mongo + + basket.data: + image: redis:alpine + + rabbitmq: + image: rabbitmq:3-management-alpine + + identity.api: + image: eshop/identity.api:${TAG:-latest} + build: + context: . + dockerfile: src/Services/Identity/Identity.API/Dockerfile + depends_on: + - sql.data basket.api: image: eshop/basket.api:${TAG:-latest} @@ -21,14 +40,6 @@ services: - sql.data - rabbitmq - identity.api: - image: eshop/identity.api:${TAG:-latest} - build: - context: . - dockerfile: src/Services/Identity/Identity.API/Dockerfile - depends_on: - - sql.data - ordering.api: image: eshop/ordering.api:${TAG:-latest} build: @@ -58,36 +69,6 @@ services: - identity.api - rabbitmq - webspa: - image: eshop/webspa:${TAG:-latest} - build: - context: . - dockerfile: src/Web/WebSPA/Dockerfile - depends_on: - - catalog.api - - ordering.api - - identity.api - - basket.api - - marketing.api - - webmvc: - image: eshop/webmvc:${TAG:-latest} - build: - context: . - dockerfile: src/Web/WebMVC/Dockerfile - depends_on: - - catalog.api - - ordering.api - - identity.api - - basket.api - - marketing.api - - webstatus: - image: eshop/webstatus:${TAG:-latest} - build: - context: . - dockerfile: src/Web/WebStatus/Dockerfile - payment.api: image: eshop/payment.api:${TAG:-latest} build: @@ -105,57 +86,135 @@ services: - nosql.data - rabbitmq - sql.data: - image: microsoft/mssql-server-linux:2017-latest - - nosql.data: - image: mongo - - basket.data: - image: redis:alpine - - rabbitmq: - image: rabbitmq:3-management-alpine - mobileshoppingapigw: image: eshop/ocelotapigw:${TAG:-latest} build: context: . dockerfile: src/ApiGateways/ApiGw-Base/Dockerfile + depends_on: + - nosql.data + - sql.data + - identity.api + - rabbitmq + - ordering.api + - marketing.api + - catalog.api + - basket.api mobilemarketingapigw: image: eshop/ocelotapigw:${TAG:-latest} build: context: . dockerfile: src/ApiGateways/ApiGw-Base/Dockerfile + depends_on: + - nosql.data + - sql.data + - identity.api + - rabbitmq + - ordering.api + - marketing.api + - catalog.api + - basket.api webshoppingapigw: image: eshop/ocelotapigw:${TAG:-latest} build: context: . dockerfile: src/ApiGateways/ApiGw-Base/Dockerfile + depends_on: + - nosql.data + - sql.data + - identity.api + - rabbitmq + - ordering.api + - marketing.api + - catalog.api + - basket.api webmarketingapigw: image: eshop/ocelotapigw:${TAG:-latest} build: context: . dockerfile: src/ApiGateways/ApiGw-Base/Dockerfile + depends_on: + - nosql.data + - sql.data + - identity.api + - rabbitmq + - ordering.api + - marketing.api + - catalog.api + - basket.api mobileshoppingagg: image: eshop/mobileshoppingagg:${TAG:-latest} build: context: . dockerfile: src/ApiGateways/Mobile.Bff.Shopping/aggregator/Dockerfile + depends_on: + - nosql.data + - sql.data + - identity.api + - rabbitmq + - ordering.api + - marketing.api + - catalog.api + - basket.api webshoppingagg: image: eshop/webshoppingagg:${TAG:-latest} build: context: . dockerfile: src/ApiGateways/Web.Bff.Shopping/aggregator/Dockerfile + depends_on: + - nosql.data + - sql.data + - identity.api + - rabbitmq + - ordering.api + - marketing.api + - catalog.api + - basket.api ordering.signalrhub: image: eshop/ordering.signalrhub:${TAG:-latest} build: context: . dockerfile: src/Services/Ordering/Ordering.SignalrHub/Dockerfile + depends_on: + - nosql.data + - sql.data + - identity.api + - rabbitmq + - ordering.api + - marketing.api + - catalog.api + - basket.api + + webstatus: + image: eshop/webstatus:${TAG:-latest} + build: + context: . + dockerfile: src/Web/WebStatus/Dockerfile + + webspa: + image: eshop/webspa:${TAG:-latest} + build: + context: . + dockerfile: src/Web/WebSPA/Dockerfile + depends_on: + - webshoppingagg + - webshoppingapigw + - webmarketingapigw + + + webmvc: + image: eshop/webmvc:${TAG:-latest} + build: + context: . + dockerfile: src/Web/WebMVC/Dockerfile + depends_on: + - webshoppingagg + - webshoppingapigw + - webmarketingapigw diff --git a/eShopOnContainers-ServicesAndWebApps.sln b/eShopOnContainers-ServicesAndWebApps.sln index d759749e8..f9e3e654e 100644 --- a/eShopOnContainers-ServicesAndWebApps.sln +++ b/eShopOnContainers-ServicesAndWebApps.sln @@ -128,8 +128,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ordering.BackgroundTasks", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ordering.SignalrHub", "src\Services\Ordering\Ordering.SignalrHub\Ordering.SignalrHub.csproj", "{E1D2B260-4E7F-4A88-BC13-9910F7C44623}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ordering.BackgroundTasksHost", "src\Services\Ordering\Ordering.BackgroundTasksHost\Ordering.BackgroundTasksHost.csproj", "{CA566CD5-A49A-47F7-BDC9-592E36DAF74E}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Ad-Hoc|Any CPU = Ad-Hoc|Any CPU @@ -1536,54 +1534,6 @@ Global {E1D2B260-4E7F-4A88-BC13-9910F7C44623}.Release|x64.Build.0 = Release|Any CPU {E1D2B260-4E7F-4A88-BC13-9910F7C44623}.Release|x86.ActiveCfg = Release|Any CPU {E1D2B260-4E7F-4A88-BC13-9910F7C44623}.Release|x86.Build.0 = Release|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|x64.Build.0 = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|x86.Build.0 = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|Any CPU.Build.0 = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|ARM.ActiveCfg = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|ARM.Build.0 = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|iPhone.ActiveCfg = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|iPhone.Build.0 = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|x64.ActiveCfg = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|x64.Build.0 = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|x86.ActiveCfg = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|x86.Build.0 = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|ARM.ActiveCfg = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|ARM.Build.0 = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|iPhone.Build.0 = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|x64.ActiveCfg = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|x64.Build.0 = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|x86.ActiveCfg = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|x86.Build.0 = Debug|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|Any CPU.Build.0 = Release|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|ARM.ActiveCfg = Release|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|ARM.Build.0 = Release|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|iPhone.ActiveCfg = Release|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|iPhone.Build.0 = Release|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|x64.ActiveCfg = Release|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|x64.Build.0 = Release|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|x86.ActiveCfg = Release|Any CPU - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1639,7 +1589,6 @@ Global {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1} = {28C0F5C8-4849-4035-80AB-45639424E73F} {7D63ED4A-3EDA-4BBA-8BBA-F46BD6430931} = {0BD0DB92-2D98-44D9-9AC0-C59186D59B0B} {E1D2B260-4E7F-4A88-BC13-9910F7C44623} = {0BD0DB92-2D98-44D9-9AC0-C59186D59B0B} - {CA566CD5-A49A-47F7-BDC9-592E36DAF74E} = {0BD0DB92-2D98-44D9-9AC0-C59186D59B0B} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {25728519-5F0F-4973-8A64-0A81EB4EA8D9} diff --git a/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs index f53142d66..0ecf0ecf7 100644 --- a/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs +++ b/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs @@ -11,10 +11,12 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Polly; using Polly.Extensions.Http; +using Polly.Timeout; using Swashbuckle.AspNetCore.Swagger; using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; +using System.Net.Http; namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator { @@ -148,9 +150,12 @@ namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator services.AddSingleton(); //register http services + var retriesWithExponentialBackoff = HttpPolicyExtensions - .HandleTransientHttpError() - .WaitAndRetryAsync(7, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); + .HandleTransientHttpError() + .Or() + .OrResult(message => message.StatusCode == System.Net.HttpStatusCode.NotFound) + .WaitAndRetryAsync(7, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); var circuitBreaker = HttpPolicyExtensions .HandleTransientHttpError() diff --git a/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHostExtensions.cs b/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHostExtensions.cs index 858506e46..ef80f77cf 100644 --- a/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHostExtensions.cs +++ b/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHostExtensions.cs @@ -27,9 +27,9 @@ namespace Microsoft.AspNetCore.Hosting var retry = Policy.Handle() .WaitAndRetry(new TimeSpan[] { + TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(5), - TimeSpan.FromSeconds(10), - TimeSpan.FromSeconds(15), + TimeSpan.FromSeconds(8), }); retry.Execute(() => diff --git a/src/Services/Ordering/Ordering.BackgroundTasksHost/Configuration/BackgroundTaskSettings.cs b/src/Services/Ordering/Ordering.BackgroundTasksHost/Configuration/BackgroundTaskSettings.cs deleted file mode 100644 index 3c0165e7b..000000000 --- a/src/Services/Ordering/Ordering.BackgroundTasksHost/Configuration/BackgroundTaskSettings.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Ordering.BackgroundTasksHost.Configuration -{ - public class BackgroundTaskSettings - { - public string ConnectionString { get; set; } - - public string EventBusConnection { get; set; } - - public int GracePeriodTime { get; set; } - - public int CheckUpdateTime { get; set; } - } -} diff --git a/src/Services/Ordering/Ordering.BackgroundTasksHost/IntegrationEvents/GracePeriodConfirmedIntegrationEvent.cs b/src/Services/Ordering/Ordering.BackgroundTasksHost/IntegrationEvents/GracePeriodConfirmedIntegrationEvent.cs deleted file mode 100644 index 28a4b3492..000000000 --- a/src/Services/Ordering/Ordering.BackgroundTasksHost/IntegrationEvents/GracePeriodConfirmedIntegrationEvent.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Events; - -namespace Ordering.BackgroundTasksHost.IntegrationEvents -{ - public class GracePeriodConfirmedIntegrationEvent : IntegrationEvent - { - public int OrderId { get; } - - public GracePeriodConfirmedIntegrationEvent(int orderId) => - OrderId = orderId; - } -} diff --git a/src/Services/Ordering/Ordering.BackgroundTasksHost/Ordering.BackgroundTasksHost.csproj b/src/Services/Ordering/Ordering.BackgroundTasksHost/Ordering.BackgroundTasksHost.csproj deleted file mode 100644 index 6a5bedc9d..000000000 --- a/src/Services/Ordering/Ordering.BackgroundTasksHost/Ordering.BackgroundTasksHost.csproj +++ /dev/null @@ -1,32 +0,0 @@ - - - - Exe - netcoreapp2.1 - - - - - - - - - PreserveNewest - - - - - - - - - - - - - - - - - - diff --git a/src/Services/Ordering/Ordering.BackgroundTasksHost/Program.cs b/src/Services/Ordering/Ordering.BackgroundTasksHost/Program.cs deleted file mode 100644 index 52668152a..000000000 --- a/src/Services/Ordering/Ordering.BackgroundTasksHost/Program.cs +++ /dev/null @@ -1,177 +0,0 @@ -using Autofac.Extensions.DependencyInjection; -using Autofac; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using System; -using Ordering.BackgroundTasksHost.Configuration; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging; -using Microsoft.eShopOnContainers.BuildingBlocks.EventBusServiceBus; -using Microsoft.Azure.ServiceBus; -using Microsoft.eShopOnContainers.BuildingBlocks.EventBusRabbitMQ; -using RabbitMQ.Client; -using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions; -using Microsoft.eShopOnContainers.BuildingBlocks.EventBus; -using Ordering.BackgroundTasksHost.Tasks; - -namespace Ordering.BackgroundTasksHost -{ - class Program - { - static void Main(string[] args) - { - using (var host = CreateHost(args)) - { - host.Start(); - - host.WaitForShutdown(); - } - } - - static IHost CreateHost(string[] args) - { - var host = new HostBuilder() - .ConfigureAppConfiguration((hostContext, configApp) => - { - configApp.AddEnvironmentVariables(); - configApp.AddJsonFile("appsettings.json", optional: true); - configApp.AddJsonFile( - $"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", - optional: true); - configApp.AddCommandLine(args); - - }) - .ConfigureServices(services => - { - var configuration = services.BuildServiceProvider() - .GetRequiredService(); - - services.AddOptions() - .Configure(configuration) - .RegisterBus(configuration) - .RegisterHostedServices(); - - }) - .UseServiceProviderFactory(new AutofacServiceProviderFactory()) - .Build(); - - return host; - } - - - } - - class AutofacServiceProviderFactory - : IServiceProviderFactory - { - public ContainerBuilder CreateBuilder(IServiceCollection services) - { - var containerBuilder = new ContainerBuilder(); - containerBuilder.Populate(services); - - return containerBuilder; - } - - public IServiceProvider CreateServiceProvider(ContainerBuilder containerBuilder) - { - return new AutofacServiceProvider(containerBuilder.Build()); - } - } - - static class ServiceCollectionExtensions - { - public static IServiceCollection RegisterBus(this IServiceCollection services, IConfiguration configuration) - { - if (configuration.GetValue("AzureServiceBusEnabled")) - { - services.AddSingleton(sp => - { - var logger = sp.GetRequiredService>(); - - var serviceBusConnectionString = configuration["EventBusConnection"]; - var serviceBusConnection = new ServiceBusConnectionStringBuilder(serviceBusConnectionString); - - return new DefaultServiceBusPersisterConnection(serviceBusConnection, logger); - }); - } - else - { - services.AddSingleton(sp => - { - var logger = sp.GetRequiredService>(); - - - var factory = new ConnectionFactory() - { - HostName = configuration["EventBusConnection"] - }; - - if (!string.IsNullOrEmpty(configuration["EventBusUserName"])) - { - factory.UserName = configuration["EventBusUserName"]; - } - - if (!string.IsNullOrEmpty(configuration["EventBusPassword"])) - { - factory.Password = configuration["EventBusPassword"]; - } - - var retryCount = 5; - if (!string.IsNullOrEmpty(configuration["EventBusRetryCount"])) - { - retryCount = int.Parse(configuration["EventBusRetryCount"]); - } - - return new DefaultRabbitMQPersistentConnection(factory, logger, retryCount); - }); - } - - - var subscriptionClientName = configuration["SubscriptionClientName"]; - - if (configuration.GetValue("AzureServiceBusEnabled")) - { - services.AddSingleton(sp => - { - var serviceBusPersisterConnection = sp.GetRequiredService(); - var iLifetimeScope = sp.GetRequiredService(); - var logger = sp.GetRequiredService>(); - var eventBusSubcriptionsManager = sp.GetRequiredService(); - - return new EventBusServiceBus(serviceBusPersisterConnection, logger, - eventBusSubcriptionsManager, subscriptionClientName, iLifetimeScope); - }); - } - else - { - services.AddSingleton(sp => - { - var rabbitMQPersistentConnection = sp.GetRequiredService(); - var iLifetimeScope = sp.GetRequiredService(); - var logger = sp.GetRequiredService>(); - var eventBusSubcriptionsManager = sp.GetRequiredService(); - - var retryCount = 5; - if (!string.IsNullOrEmpty(configuration["EventBusRetryCount"])) - { - retryCount = int.Parse(configuration["EventBusRetryCount"]); - } - - return new EventBusRabbitMQ(rabbitMQPersistentConnection, logger, iLifetimeScope, eventBusSubcriptionsManager, subscriptionClientName, retryCount); - }); - } - - services.AddSingleton(); - - return services; - } - - public static IServiceCollection RegisterHostedServices(this IServiceCollection services) - { - services.AddSingleton(); - - return services; - } - } - -} diff --git a/src/Services/Ordering/Ordering.BackgroundTasksHost/Tasks/Base/BackgroundTask.cs b/src/Services/Ordering/Ordering.BackgroundTasksHost/Tasks/Base/BackgroundTask.cs deleted file mode 100644 index e9b56aece..000000000 --- a/src/Services/Ordering/Ordering.BackgroundTasksHost/Tasks/Base/BackgroundTask.cs +++ /dev/null @@ -1,81 +0,0 @@ -using Microsoft.Extensions.Hosting; -using System; -using System.Threading; -using System.Threading.Tasks; - -namespace Ordering.BackgroundTasksHost.Tasks.Base -{ - // Copyright(c) .NET Foundation.All rights reserved. - // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - - /// - /// Base class for implementing a long running . - /// IMPORTANT: This base class is implemented in .NET Core 2.1 - Since this microservice is still in .NET Core 2.0, we're using the class within the project - /// When .NET Core 2.1 is released, this class should be removed and you should use the use implemented by the framework - /// https://github.com/aspnet/Hosting/blob/712c992ca827576c05923e6a134ca0bec87af4df/src/Microsoft.Extensions.Hosting.Abstractions/BackgroundService.cs - /// - /// - public abstract class BackgroundService : IHostedService, IDisposable - { - private Task _executingTask; - - private readonly CancellationTokenSource _stoppingCts = new CancellationTokenSource(); - - /// - /// This method is called when the starts. The implementation should return a task that represents - /// the lifetime of the long running operation(s) being performed. - /// - /// Triggered when is called. - /// A that represents the long running operations. - protected abstract Task ExecuteAsync(CancellationToken stoppingToken); - - /// - /// Triggered when the application host is ready to start the service. - /// - /// Indicates that the start process has been aborted. - public virtual Task StartAsync(CancellationToken cancellationToken) - { - // Store the task we're executing - _executingTask = ExecuteAsync(_stoppingCts.Token); - - // If the task is completed then return it, this will bubble cancellation and failure to the caller - if (_executingTask.IsCompleted) - { - return _executingTask; - } - - // Otherwise it's running - return Task.CompletedTask; - } - - /// - /// Triggered when the application host is performing a graceful shutdown. - /// - /// Indicates that the shutdown process should no longer be graceful. - public virtual async Task StopAsync(CancellationToken cancellationToken) - { - // Stop called without start - if (_executingTask == null) - { - return; - } - - try - { - // Signal cancellation to the executing method - _stoppingCts.Cancel(); - } - finally - { - // Wait until the task completes or the stop token triggers - await Task.WhenAny(_executingTask, Task.Delay(Timeout.Infinite, cancellationToken)); - } - - } - - public virtual void Dispose() - { - _stoppingCts.Cancel(); - } - } -} diff --git a/src/Services/Ordering/Ordering.BackgroundTasksHost/Tasks/GracePeriodManagerTask.cs b/src/Services/Ordering/Ordering.BackgroundTasksHost/Tasks/GracePeriodManagerTask.cs deleted file mode 100644 index d25e58b32..000000000 --- a/src/Services/Ordering/Ordering.BackgroundTasksHost/Tasks/GracePeriodManagerTask.cs +++ /dev/null @@ -1,92 +0,0 @@ -using Dapper; -using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; -using Ordering.BackgroundTasksHost.Configuration; -using Ordering.BackgroundTasksHost.IntegrationEvents; -using System; -using System.Collections.Generic; -using System.Data.SqlClient; -using System.Threading; -using System.Threading.Tasks; - -namespace Ordering.BackgroundTasksHost.Tasks -{ - public class GracePeriodManagerService - : BackgroundService - { - private readonly ILogger _logger; - private readonly BackgroundTaskSettings _settings; - private readonly IEventBus _eventBus; - - public GracePeriodManagerService(IOptions settings, - IEventBus eventBus, - ILogger logger) - { - _settings = settings?.Value ?? throw new ArgumentNullException(nameof(settings)); - _eventBus = eventBus ?? throw new ArgumentNullException(nameof(eventBus)); - _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - - } - - protected override async Task ExecuteAsync(CancellationToken stoppingToken) - { - _logger.LogDebug($"GracePeriodManagerService is starting."); - - //stoppingToken.Register(() => _logger.LogDebug($"#1 GracePeriodManagerService background task is stopping.")); - - //while (!stoppingToken.IsCancellationRequested) - //{ - // _logger.LogDebug($"GracePeriodManagerService background task is doing background work."); - - // CheckConfirmedGracePeriodOrders(); - - // await Task.Delay(_settings.CheckUpdateTime, stoppingToken); - //} - - _logger.LogDebug($"GracePeriodManagerService background task is stopping."); - - await Task.CompletedTask; - } - - private void CheckConfirmedGracePeriodOrders() - { - _logger.LogDebug($"Checking confirmed grace period orders"); - - var orderIds = GetConfirmedGracePeriodOrders(); - - foreach (var orderId in orderIds) - { - var confirmGracePeriodEvent = new GracePeriodConfirmedIntegrationEvent(orderId); - - _eventBus.Publish(confirmGracePeriodEvent); - } - } - - private IEnumerable GetConfirmedGracePeriodOrders() - { - IEnumerable orderIds = new List(); - - using (var conn = new SqlConnection(_settings.ConnectionString)) - { - try - { - conn.Open(); - orderIds = conn.Query( - @"SELECT Id FROM [ordering].[orders] - WHERE DATEDIFF(minute, [OrderDate], GETDATE()) >= @GracePeriodTime - AND [OrderStatusId] = 1", - new { GracePeriodTime = _settings.GracePeriodTime }); - } - catch (SqlException exception) - { - _logger.LogCritical($"FATAL ERROR: Database connections could not be opened: {exception.Message}"); - } - - } - - return orderIds; - } - } -} diff --git a/src/Services/Ordering/Ordering.BackgroundTasksHost/appsettings.json b/src/Services/Ordering/Ordering.BackgroundTasksHost/appsettings.json deleted file mode 100644 index fd26645ab..000000000 --- a/src/Services/Ordering/Ordering.BackgroundTasksHost/appsettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "ConnectionString": "Server=tcp:127.0.0.1,5433;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word;", - "Logging": { - "IncludeScopes": false, - "Debug": { - "LogLevel": { - "Default": "Debug" - } - }, - "Console": { - "LogLevel": { - "Default": "Debug" - } - } - }, - "SubscriptionClientName": "BackgroundTasks", - "GracePeriodTime": "1", - "CheckUpdateTime": "1000", - "ApplicationInsights": { - "InstrumentationKey": "" - }, - "AzureServiceBusEnabled": false, - "EventBusRetryCount": 5, - "EventBusConnection": "", - "EventBusUserName": "", - "EventBusPassword": "" -} \ No newline at end of file diff --git a/src/Web/WebMVC/Controllers/OrderController.cs b/src/Web/WebMVC/Controllers/OrderController.cs index a5bf4785e..c63642239 100644 --- a/src/Web/WebMVC/Controllers/OrderController.cs +++ b/src/Web/WebMVC/Controllers/OrderController.cs @@ -52,10 +52,13 @@ namespace Microsoft.eShopOnContainers.WebMVC.Controllers return RedirectToAction("Index"); } } - catch(BrokenCircuitException) + catch (BrokenCircuitException) { ModelState.AddModelError("Error", "It was not possible to create a new order, please try later on. (Business Msg Due to Circuit-Breaker)"); } + catch (Exception ex) + { + } return View("Create", model); } diff --git a/src/Web/WebMVC/Startup.cs b/src/Web/WebMVC/Startup.cs index 9cc5921a2..344f7c22c 100644 --- a/src/Web/WebMVC/Startup.cs +++ b/src/Web/WebMVC/Startup.cs @@ -172,7 +172,8 @@ namespace Microsoft.eShopOnContainers.WebMVC var retriesWithExponentialBackoff = HttpPolicyExtensions .HandleTransientHttpError() - .WaitAndRetryAsync(7,retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); + .OrResult(msg=>msg.StatusCode == System.Net.HttpStatusCode.NotFound) + .WaitAndRetryAsync(5,retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); var circuitBreaker = HttpPolicyExtensions .HandleTransientHttpError() From 88fa0a63092b54e34a4f102166238c54ae4fc15d Mon Sep 17 00:00:00 2001 From: Unai Zorrilla Castro Date: Tue, 22 May 2018 15:34:24 +0200 Subject: [PATCH 16/33] Remove unnecesary catch --- src/Web/WebMVC/Controllers/OrderController.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Web/WebMVC/Controllers/OrderController.cs b/src/Web/WebMVC/Controllers/OrderController.cs index c63642239..38827462e 100644 --- a/src/Web/WebMVC/Controllers/OrderController.cs +++ b/src/Web/WebMVC/Controllers/OrderController.cs @@ -56,10 +56,8 @@ namespace Microsoft.eShopOnContainers.WebMVC.Controllers { ModelState.AddModelError("Error", "It was not possible to create a new order, please try later on. (Business Msg Due to Circuit-Breaker)"); } - catch (Exception ex) - { - } - return View("Create", model); + + return View("Create", model); } public async Task Cancel(string orderId) From 654555387cf81ac5bfd5b0f0d5d1e6420ef17b03 Mon Sep 17 00:00:00 2001 From: Unai Zorrilla Castro Date: Tue, 22 May 2018 16:20:28 +0200 Subject: [PATCH 17/33] Minor refactoring --- src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs | 1 - src/Web/WebMVC/Controllers/OrderController.cs | 9 ++------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs index 0ecf0ecf7..8233f8fae 100644 --- a/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs +++ b/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs @@ -16,7 +16,6 @@ using Swashbuckle.AspNetCore.Swagger; using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; -using System.Net.Http; namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator { diff --git a/src/Web/WebMVC/Controllers/OrderController.cs b/src/Web/WebMVC/Controllers/OrderController.cs index 38827462e..cb5234e3c 100644 --- a/src/Web/WebMVC/Controllers/OrderController.cs +++ b/src/Web/WebMVC/Controllers/OrderController.cs @@ -1,14 +1,9 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.eShopOnContainers.WebMVC.Services; using Microsoft.eShopOnContainers.WebMVC.ViewModels; -using Microsoft.AspNetCore.Authorization; -using System.Net.Http; using Polly.CircuitBreaker; -using WebMVC.Models; +using System.Threading.Tasks; namespace Microsoft.eShopOnContainers.WebMVC.Controllers { From 89fb5d6fc392837a6de8e43b734892736cef810f Mon Sep 17 00:00:00 2001 From: eiximenis Date: Tue, 22 May 2018 16:20:52 +0200 Subject: [PATCH 18/33] Solves issue #611 --- .../Ordering.API/Application/Queries/IOrderQueries.cs | 3 ++- .../Ordering.API/Application/Queries/OrderQueries.cs | 10 ++++++---- .../Ordering.API/Controllers/OrdersController.cs | 4 ++-- .../UnitTest/Ordering/Application/OrdersWebApiTest.cs | 2 +- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/Services/Ordering/Ordering.API/Application/Queries/IOrderQueries.cs b/src/Services/Ordering/Ordering.API/Application/Queries/IOrderQueries.cs index 10aaf3415..89cf496e3 100644 --- a/src/Services/Ordering/Ordering.API/Application/Queries/IOrderQueries.cs +++ b/src/Services/Ordering/Ordering.API/Application/Queries/IOrderQueries.cs @@ -1,5 +1,6 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Queries { + using System; using System.Collections.Generic; using System.Threading.Tasks; @@ -7,7 +8,7 @@ { Task GetOrderAsync(int id); - Task> GetOrdersAsync(); + Task> GetOrdersFromUserAsync(Guid userId); Task> GetCardTypesAsync(); } diff --git a/src/Services/Ordering/Ordering.API/Application/Queries/OrderQueries.cs b/src/Services/Ordering/Ordering.API/Application/Queries/OrderQueries.cs index 59cc8a823..8509e10d3 100644 --- a/src/Services/Ordering/Ordering.API/Application/Queries/OrderQueries.cs +++ b/src/Services/Ordering/Ordering.API/Application/Queries/OrderQueries.cs @@ -7,7 +7,7 @@ using System.Collections.Generic; public class OrderQueries - :IOrderQueries + : IOrderQueries { private string _connectionString = string.Empty; @@ -42,18 +42,20 @@ } } - public async Task> GetOrdersAsync() + public async Task> GetOrdersFromUserAsync(Guid userId) { using (var connection = new SqlConnection(_connectionString)) { connection.Open(); - return await connection.QueryAsync(@"SELECT o.[Id] as ordernumber,o.[OrderDate] as [date],os.[Name] as [status],SUM(oi.units*oi.unitprice) as total + return await connection.QueryAsync(@"SELECT o.[Id] as ordernumber,o.[OrderDate] as [date],os.[Name] as [status], SUM(oi.units*oi.unitprice) as total FROM [ordering].[Orders] o LEFT JOIN[ordering].[orderitems] oi ON o.Id = oi.orderid LEFT JOIN[ordering].[orderstatus] os on o.OrderStatusId = os.Id + LEFT JOIN[ordering].[buyers] ob on o.BuyerId = ob.Id + WHERE ob.IdentityGuid = @userId GROUP BY o.[Id], o.[OrderDate], os.[Name] - ORDER BY o.[Id]"); + ORDER BY o.[Id]", new { userId }); } } diff --git a/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs b/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs index c93e18400..5542caf11 100644 --- a/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs +++ b/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs @@ -87,8 +87,8 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API.Controllers [ProducesResponseType(typeof(IEnumerable), (int)HttpStatusCode.OK)] public async Task GetOrders() { - var orders = await _orderQueries.GetOrdersAsync(); - + var userid = _identityService.GetUserIdentity(); + var orders = await _orderQueries.GetOrdersFromUserAsync(Guid.Parse(userid)); return Ok(orders); } diff --git a/test/Services/UnitTest/Ordering/Application/OrdersWebApiTest.cs b/test/Services/UnitTest/Ordering/Application/OrdersWebApiTest.cs index b6f047960..516f9ba54 100644 --- a/test/Services/UnitTest/Ordering/Application/OrdersWebApiTest.cs +++ b/test/Services/UnitTest/Ordering/Application/OrdersWebApiTest.cs @@ -94,7 +94,7 @@ namespace UnitTest.Ordering.Application { //Arrange var fakeDynamicResult = Enumerable.Empty(); - _orderQueriesMock.Setup(x => x.GetOrdersAsync()) + _orderQueriesMock.Setup(x => x.GetOrdersFromUserAsync(Guid.NewGuid())) .Returns(Task.FromResult(fakeDynamicResult)); //Act From fb15ed1e114258986ac7b5bd9799cd400b81fe02 Mon Sep 17 00:00:00 2001 From: Unai Zorrilla Castro Date: Tue, 22 May 2018 18:19:13 +0200 Subject: [PATCH 19/33] Removed unused file --- .../Mobile.Bff.Shopping/aggregator/Startup.cs | 4 +- .../Web.Bff.Shopping/aggregator/Startup.cs | 4 +- .../HttpClientDefaultPolicies.cs | 74 ------------------- src/Web/WebMVC/Startup.cs | 4 +- 4 files changed, 6 insertions(+), 80 deletions(-) delete mode 100644 src/Web/WebMVC/Infrastructure/HttpClientDefaultPolicies.cs diff --git a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Startup.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Startup.cs index e02bffcbd..a18ec2dc1 100644 --- a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Startup.cs +++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Startup.cs @@ -149,11 +149,11 @@ namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator //register http services var retriesWithExponentialBackoff = HttpPolicyExtensions .HandleTransientHttpError() - .WaitAndRetryAsync(7, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); + .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); var circuitBreaker = HttpPolicyExtensions .HandleTransientHttpError() - .CircuitBreakerAsync(6, TimeSpan.FromSeconds(30)); + .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)); services.AddHttpClient() .AddHttpMessageHandler() diff --git a/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs index 8233f8fae..6eba724f2 100644 --- a/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs +++ b/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs @@ -154,11 +154,11 @@ namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator .HandleTransientHttpError() .Or() .OrResult(message => message.StatusCode == System.Net.HttpStatusCode.NotFound) - .WaitAndRetryAsync(7, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); + .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); var circuitBreaker = HttpPolicyExtensions .HandleTransientHttpError() - .CircuitBreakerAsync(6, TimeSpan.FromSeconds(30)); + .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)); services.AddHttpClient() .AddHttpMessageHandler() diff --git a/src/Web/WebMVC/Infrastructure/HttpClientDefaultPolicies.cs b/src/Web/WebMVC/Infrastructure/HttpClientDefaultPolicies.cs deleted file mode 100644 index 0cacb8a65..000000000 --- a/src/Web/WebMVC/Infrastructure/HttpClientDefaultPolicies.cs +++ /dev/null @@ -1,74 +0,0 @@ -using Microsoft.Extensions.Logging; -using Polly; -using Polly.CircuitBreaker; -using Polly.Retry; -using System; -using System.Net.Http; - -namespace WebMVC.Infrastructure -{ - public class HttpClientDefaultPolicies - { - //Config for Retries with exponential backoff policy - const int MAX_RETRIES = 6; - const int SECONDS_BASE_FOR_EXPONENTIAL_BACKOFF = 2; - - //Config for Circuit Breaker policy - const int EXCEPTIONS_ALLOWED_BEFORE_CIRCUIT_BREAKES = 5; - const int DURATION_OF_BREAK_IN_MINUTES = 1; - - private readonly ILogger _logger; - - public HttpClientDefaultPolicies(ILogger logger) - { - _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - } - - public IAsyncPolicy GetWaitAndRetryPolicy() - { - RetryPolicy retryPolicy = - Policy.Handle() - .WaitAndRetryAsync( - // Maximum number of retries - MAX_RETRIES, - // exponential backofff (2sg, 4sg, 8sg, 16sg, 32sg. etc.) - retryAttempt => TimeSpan.FromSeconds(Math.Pow(SECONDS_BASE_FOR_EXPONENTIAL_BACKOFF, retryAttempt)), - // on retry - (exception, timeSpan, retryCount, context) => - { - var msg = $"Retry {retryCount} implemented with Polly's RetryPolicy " + - $"of {context.PolicyKey} " + - $"at {context.OperationKey}, " + - $"due to: {exception}."; - _logger.LogWarning(msg); - _logger.LogDebug(msg); - }); - - return retryPolicy.AsAsyncPolicy(); - } - - public IAsyncPolicy GetCircuitBreakerPolicy() - { - CircuitBreakerPolicy circuitBreakerPolicy = - Policy.Handle() - .CircuitBreakerAsync( - // Number of exceptions before breaking the circuit - EXCEPTIONS_ALLOWED_BEFORE_CIRCUIT_BREAKES, - // Duration of break - TimeSpan.FromMinutes(DURATION_OF_BREAK_IN_MINUTES), - (exception, duration) => - { - // On circuit opened (Circuit is broken) - _logger.LogTrace("Circuit has been broken"); - }, - () => - { - // on circuit closed - _logger.LogTrace("Circuit has been reset"); - }); - - - return circuitBreakerPolicy.AsAsyncPolicy(); - } - } -} diff --git a/src/Web/WebMVC/Startup.cs b/src/Web/WebMVC/Startup.cs index a0e1e90ba..735e8df6c 100644 --- a/src/Web/WebMVC/Startup.cs +++ b/src/Web/WebMVC/Startup.cs @@ -174,11 +174,11 @@ namespace Microsoft.eShopOnContainers.WebMVC var retriesWithExponentialBackoff = HttpPolicyExtensions .HandleTransientHttpError() .OrResult(msg=>msg.StatusCode == System.Net.HttpStatusCode.NotFound) - .WaitAndRetryAsync(5,retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); + .WaitAndRetryAsync(6,retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); var circuitBreaker = HttpPolicyExtensions .HandleTransientHttpError() - .CircuitBreakerAsync(6, TimeSpan.FromSeconds(30)); + .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)); //register delegating handlers services.AddTransient(); From 1e2e7a343751db22fb75f6ac3a362e5da26b89cb Mon Sep 17 00:00:00 2001 From: Miguel Veloso Date: Tue, 22 May 2018 19:40:42 +0100 Subject: [PATCH 20/33] Initial Simplified CQRS and DDD KB post --- docs-kb/README.md | 6 ++ .../devenv_2018-05-22_18-00-24.png | Bin 0 -> 26956 bytes .../devenv_2018-05-22_18-13-35.png | Bin 0 -> 38016 bytes .../devenv_2018-05-22_18-22-23.png | Bin 0 -> 65239 bytes .../devenv_2018-05-22_18-40-25.png | Bin 0 -> 12338 bytes .../devenv_2018-05-22_18-48-36.png | Bin 0 -> 19945 bytes .../devenv_2018-05-22_18-52-58.png | Bin 0 -> 28743 bytes .../devenv_2018-05-22_19-11-30.png | Bin 0 -> 13372 bytes docs-kb/simplified-cqrs-ddd/post.md | 84 ++++++++++++++++++ 9 files changed, 90 insertions(+) create mode 100644 docs-kb/README.md create mode 100644 docs-kb/simplified-cqrs-ddd/devenv_2018-05-22_18-00-24.png create mode 100644 docs-kb/simplified-cqrs-ddd/devenv_2018-05-22_18-13-35.png create mode 100644 docs-kb/simplified-cqrs-ddd/devenv_2018-05-22_18-22-23.png create mode 100644 docs-kb/simplified-cqrs-ddd/devenv_2018-05-22_18-40-25.png create mode 100644 docs-kb/simplified-cqrs-ddd/devenv_2018-05-22_18-48-36.png create mode 100644 docs-kb/simplified-cqrs-ddd/devenv_2018-05-22_18-52-58.png create mode 100644 docs-kb/simplified-cqrs-ddd/devenv_2018-05-22_19-11-30.png create mode 100644 docs-kb/simplified-cqrs-ddd/post.md diff --git a/docs-kb/README.md b/docs-kb/README.md new file mode 100644 index 000000000..70ef23af6 --- /dev/null +++ b/docs-kb/README.md @@ -0,0 +1,6 @@ +eShopOnContainers Knowledge Base +================================ + +This folder contains a set of posts created mostly from [issues on the repo](https://github.com/dotnet-architecture/eShopOnContainers/issues), in order to offer a brief introduction as well as and links to deepen the knowledge on a given subject related to the application. + +[Simplified CQRS and DDD](simplified-cqrs-ddd\post.md) diff --git a/docs-kb/simplified-cqrs-ddd/devenv_2018-05-22_18-00-24.png b/docs-kb/simplified-cqrs-ddd/devenv_2018-05-22_18-00-24.png new file mode 100644 index 0000000000000000000000000000000000000000..e1b0730196d92aba3fc028a88a59a82f12cc12f2 GIT binary patch literal 26956 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

~@S>(NGubw?_ zOoPA2cJVpZuirC{Zf26v^fv0@p5GE5Kg-`*7%u~pmWKmO`Q6p^cDhuBp1s%%>$SR* zH#BGOc2v5}V#jaepETgPg)XTl6m0NQ8!7&sJG!!Cy;EpWYgOwXlTH0+e$Sbo>;D!o zKkHwD``;b=wRl^N8FPsT+zBw)y5Ygs%dbsdZ8Fo4ongTbwvg~+d`67uXZ^CXcGMB8 z7HWw-lP{mYMY;84k39_;WQDBtzV%~9beK?wrXCBNs%C}G@%hobL}P~pM4wI753kI# zA~hpyL=n3>h;|hicul1@|FFk8eR~cl%?T;fFqfHiec>O{>HdlB@d~=iX&>TZKMt_v z4&(T5G0XM+$95LG1@*1EzNuZy1Y3a-dEpluAP(~Ntl12alQlzmDw-(^Co_g7r}+&B zKF=--DMcK}8ON;6)}u$;WruxK5R#(q{_YPQR9ORy|&@vjx z?FYcmya}`C6&@KLN;}oA#TBS7o|999HFI%^b)G`o4trjs#P&k#0sk1$#Cb(KubRh< zJe$hM6+CSF)26_05|wEnlNXhe{cb$N(6$kFHaR|La@r-Er$eLYkG4EP+(R)ARCqi> z@*3E^UJ;Gi(Gp#=>=C;d6PfNE>C31UgLtvOMYgXb1Kz`>JWj_ptznx*ZHkLbX&*(= z$TL#qR=$@P47%|l%{@%q$}eDa!q1eHZ{ES~#i1i8me?+~Dz$Ey?NGYXD%6oV`GiUM zMs}`+lwxT*EnC+ZCU@>n24q<^+9nVyHxkzIyWYSZxL;ci3}9bJKS&VA zUX_XESiv&w7L)z#;2c@Z9|oJVvg&>f!I88h^qA_rP}{v%I}c zS|>v{aC4=2u00*Ew+GyneOcBc_5ws!H@%g4?ut7@Np;ij=*mI2f zBWpz-!)GF2S?zJbA5N1xunpzuv=Bu?Wbzt0C>f`@+eRx#Y~aR8lTgPsZ_dMPdx$5F z5S?wq#PVgxt-l<4D|_%!_GDIwD0Sgrg0X2#z%lbnquNaCd9C$3w3gbm4N1;9F8gy| zDPe9=BHM^>ky8%x=H7~pduF%H;vdFggOFUq-E#Q{mDed)w97z- z1SFd`bLejl3-bem#g90nm()NC3a2dP&<#23?hZU;0!*E180fG=1vwiV4}Uv9ox0k- zz)APaiWg`Ilc<;@?OlpCiDaNx)*ur+=s*6|z*|+YNeHPe# z)qLH)8)olievP>t*0PRXpQ%(Q>*lk0$akS;a%hwsQ*x({waVCZvKL^fNncVh4{mlB z7GyXZVeV4e8WuTqTIl~OW)!4}f*a&y^(e;g?p5huX( zh`DA*KDWInrrf_Q8@GOa^4D_qtWk2(I;zh8_IbnL641<5A(s(8^tUaRT92{w6;4jbw}f zpI(P13@tp~4L*Ts%f7s-A%+h8+JzomSil~v{gtUf;@&6%N+_A#393 zddn#}Dt%?R*CcT@2iq^dKH^-Po_s&blZzviETZdD`3ddemM8Pqt-EI_HQ_oMNF%?b>4TAPGLPBp)Sge~O^b+Fm93|4SH!-}`o zV|%f=qN5b%eWn+)cVT7b7*xRPV;50gkwYpx)F_y2_+D?&LY%?1*!{JJTDqrwio`5H zA5+v#Z=b>14VGHP(k-Lm8hiLcFDf@i&m%B-%P}(H^dRve7h6OJzT+AFisnbsKAs9a zcjfdg$@?dM>iDJg1juuibfW1No%{<4Jzx|M?J0S+-{kPR@^33C)JUr&yG)cQU5h!-yVw*(JRJSHDXVd^@NjhSaCXZVUk1Fez*P~Z3bDR zj~sHfA}ry!L%^FXA3@gt-AgY#oLX&WpARW}u_C1Y39a;MPGo{&`_fd$P_nKb)OD3d zOlw(yOL_ZkvYC*5R?^O^$+Qj3tx1-g?tXJ43Qdhmc?0+}(RbZ_f&P^GveQNL=x;*j zdc;9{_IMO9>Q)4SS!E?PwaZ9L+yc@7`=CXnD6A}U{<3B}1>?*BzmVOK#&t6z?AZq0 zpmwX7c%xT7bY!Lj7{t&+TPaCYk=fOpc7GoKPuT~a1IH^M3%-M`FDfWOG)gbBK3c3Z zm)-w4aw5kEkUmJv6X7$sbx_%tIPxsl%gT;n(O9#k+Vb>=7}F z7X))@-h5Rk)uOb()3{zO(sj>T6t6v(Z@*7zBj4*)x|%k;D?*k{_j4G=e@o!@2dq_Og`$My$u4BG^R zmjvF@bO|JVq#EK40dREr$sXr(*{4vW#T}SkC0@1+AqS*fE_d-0C*hWmt)e4D@d$6xzLi2^f z_6rdU=x!UCc`UnE=w1l$7fS{H61hzUwhxT4BV_bO@G%|P26l{e329jKtNx~u{IQYJ z#ZTwBp7VCLj7feb;4V02w}L?SJnLlFtJam~MuM1Cdo&GHizQm9yHOj+a+S}ou*zO_ zK7S=_QMf{kU2(5tG(&h=VBB}Lui zPIuMsCtSy#7JEOUzmApI8ZjS=3W$g_DuiTv90rGe2}ERr@yh}uZE967-@O})2+c}v8TT|Y>rH4co6q&=A zSU+dn{%2pn`>X~j=0_&rv%&HXBa+|;2Z>iA;U7+J7iRYXzZtCr9-LBQJ3UoQTjXbW zsVF>nAD$ZAvjW67&sw{(+~)qGbm~o+=p<#0q`s}rd!@}pL4oWY5bfUqDrPr{Y#>sd zAKEv2d{#ZXX$5!(h5c6J2hEG#DGblpNVQoX^dpnhh&8E6 zJ_;d4SI?_A68ogNB)ngA3a34Ak>7J`F0p%2Zu0d4JDhFq3NjcbB>E)hvYR-cr{(KD za6%kJ#GcfVHM3(@XZ=$;)#1RK7aq<8{je=WY?FGgW}5P;n`xwcXWBZQcJDbRc2Rt= z5e~YqAg{Jn+bXXINn1A7V?rX2EN}Zet3ggdb)tXDfk4vEB>zLYtCSb+zBC+BmZqA7 zK*)x29_!3!xacQut0WP4A`>WG3f7vkPKrD8WKL}oeR$S!12^;bcZL&mG(U+N4k>T& zfklA72fN1@Zxl9BL#bY#pm8c>7c=RsIEVg0Blkn0U}d4UN zf_>Ri@nqsbM1RYr(FbD~Zs&sV=?7i95BW3qu&PWbA0gtrVAcpKj;5?7`l^W376{Hl zsmo78AV`gZABJ99bG7GGrzPh4S>s$J+Um-qYlgov5*AB=N z4>NKNZsJpAS@tLMP#LKygdsaeY=D2;g1xx~ber&AfIf}-Rg;tRKfd69Xz9PjI{)wm zKQvORrv|+KWS;Cp&Qi9PvJNtrkMlOPH!?cD_zojH;q5S}z5q+7%ES0cOF8MsLm%s; z5E*Zgjcsz)kI~e&{poI^oK98;PzciK;NB(Iq61-DABzsx=0GzGDOG)Zmu6xrY1Fym zhgYE28;pJZEog(XlP`XAY{oFWXvNopK|*%X_nR+y>Ep z6L&1e&7n{Bg8H%p6RG_9I6dV{A$#{eG8o{wuSmQ{YaEb}(;~YHfABMqF7I4qd9O8R zk2IE})w2qI_s|Va0AmA6&&FV>G&b=T|f~_wgm7o8d?OYH> z)|_7o#Ldbp>%%B&h>q6l&^LkK=(g;`J$mk-`iK``aQqiMf{hG^Zv03$45idr#6g$2 z4+5JuR||GOmXN-gZR0l6kzAsstcv{|HA*M0uan+5vt8r}rFsp4y)JBXW%C`R@`PYd zK0x>?PK5vtfS%?S;#KBhSZy+R~ zjVFhHaj^!*sk2*(9azEP)7{n1Rt(w!e-p(-UBUV354;buC)psnIjKv#(s_TJowx4p z3sV}{bs%x(aBgKl*>ny?0cT-@7k}ogzq4Q0YZcX(C96 zXh0CDf(nQfK`=;@7J8yIK?D?#5=x99(tD920cj#FNbk~>5Rejj$m}5Ba?bkQnKO6Y zS!?`9l<@Mlz4!Bc+J56mN8QF~GDd`izo^{3G%>rC-l6tUn2L(yyb!=Mi$VtwYF#5E ziFKkrYJczrzI(S;qu{(ww2?;&ur$$w7sE6JWqNf8E3bX5hE6e;=uOBxsXDc56d)tt z^kF37`J03MarhmNZ^WqS2laASfzjx9p4@JT3^l%v3*U=Wa7^iaak)AlVeg$X+sV(R zw)`nPLy(o$KEcCAeB#HZtTmy2Y3_BC*)s43iw^e5Xs0d0?WSFNa=6zV3C`r+nKDQk z!tcw@RNq~zomP%HK{{t!MoJHKil)uuSl8HiV*5UBJ0GSLn|`+HkrofAG1gh^Lzy0% zL`LETL$qHztKa;xu#v>VtWFLn*jUPX<@oXzxdKrY(8hBvmN&jXe(8u5L7%X5w^yv) z%-Q$tg;&@qGq)X<-GsHI{#DmWvAh#vr6P3-eK~nkJF6!r%!)tun$4T}v`-C&&x&!4 zQIDlm2VNOniX>m1r2F0L%pomdP>xsj5cROlK2yiP`9Rz$YNood8mz)oy=L}1cI9>t zsHlFJ8;0SkHVsY4t03W`OEzX;lcNquM~jT(J)`WJlh0RoYJ@<=J9P#pRlY@QowtB` z`fI`Tlmw#EV^T+!($~aJm3<<|J$NtLUues_no^2re-UJd zmc2D8wqbCFJhgQxgrOFD8*k}KdWsNMCwtSbM8OOcaxLc?1iDHYA>^I!(LU@mqNfs8 z_lAsEO$l9J#BJh{De<%!!Sh(e!OWSabE_$$h|)F*eJP~KA*yG}<~QU~YgX4f!)HdZ z$8Y|t4q)(35j&sxAwYHyl2DEdeo#4m9ugApwRo{i;vGv{WZcbuH$8nuW-vxNlF+1$ z?9al7vmjNqKG^wl}5fnUWho5dI?+hQScAJfr?kL|9ArX}?#j+!t$&sW( zZUXg#CHRic&F>L;cOdULA4|sg$q>|g7PrFM^LXH2cDf%xitu&Bkz%trTQK{2@4*v< zb+Ka{wKnjpETw1cN^n){_Yh@;k2)+IR~;WWss{5cp*r~Ff<}N5m!O7#acn9YP3paeEyNANC5FH&8OmA-~46Z zor$|BNm#UcDYivpcC@(05%%Os!?g9N935qer=ltfNZV{?UJ5I`_lyDJXn|aqnzJu! zmHcb{9%_4p@dSY|+m&(O7h$N8*4eplT9_(hhlBfBJkJQ$yY7-@cm6h;fT5;{#nQIM;wNqD@u&o9)#i?}cY3l7V@luHE{ zLwZc%Pl~)HOD!1_t&epTi11#y`p*xu&^M}i{2KH%F#KbOQCU$PiKjmHPn~LSu ziz`zIb95t^6=UaiRPsNs7=GS92D!8DWtwihNIiW^K|z1L8h|^uO3%9b_C?6rtG5yz zMN3F%)BQT>UcCy&)69ezV7Vg8n4lU=VHwT=Q;j|5S8&Tck7^R`qJA9*?_-rTv8Q=T zb~BA45^R4ipr*E{Kcz_3aBZTCwk4~~Odm*57s;Ffv#zDv@+kfQ>$;u@Q;+vQ6VS5q zVdD;##r#h^*Hf-nJ;r0@PLuJ#Hv@S>>{UnxHV2pl2{=6&Z z+wsDZ8eck*i7{pEs!)A8KF1fL{RI-!?3hz8&tHFSbZIU@=}-Z_%B^%p9(4l~zp4|( zggUjGu|mco0QYf?HY_h{RKQjtcO0o`%zsf3I*kzc!<`$JX8@=ff4oT#Kz zsC<*Z-mjxjm)pfSpAV+Q2kH6+9CiUwF2wIi-23m)t$yRbZ0-pM{`x8u$i)AQyc=L# zB}JdzKsvdwg>GPsh_SuY%Km0n$%QFcS@>VCdBQ1eHZ)Q@CD z(K*llqKi_&dhmuM$Ar6cSe}(*}nv9zZJAyLJ*QovQgQd55%l{mRPTUh#=9^TDo7 z!z0pa&pfQ24AFioZ(|T2ti-$s~606oI7sy8UESDW&4bnx(m6_CLz_rFL7e%jhh~&iXDV5lL!>q;zv{TT+FtAjwORT*RUd z*@n2JLw2pSwyeTmQ=8+6YF8`Mbk(MwPIA!;Z85FaRzOl-lbITKNw)LD&zIpW_p1); z2>ONJyb=P_Mf4M4Ej`g^Zs%$!DUTJ|OO_(+9!?Cuw_jRP6)yEn*zz?=x?D+;Q7eC_(X_=l zZ|I5{`H0(h5~(CF%S^_p#oc}mUQr>ag)MFELykX!&h+WQPXMTdHMpu5bLvJB_8X4-G#y+2_0I@|LRu_fbiy8z0U-wi?G` z%PTvpy?I%6eRm#xmrO!$-N%mZc36Lozk1(^Gq}BAYBNq&@a6Qe0(s&NB~dW$&{$`{ zTTGPUuZ_%&GRP7OxUz88V`k(ELx)LfGH?Dp)}LdiHph`%(T3|4hDW>r`Sq6k&dd>& z-&zqbAqWmZrQweY_*|>CRd(-@)P|oqNq9N^QN9bCVxcG1jv98$%+pr;QqjFQieRXp zj}etGZFl$kiDL(BDeLmJphei1(QDsN;DfGGL=ZfbV?9sh?xp|p?W36Ts~lM=I*8Qp z#amKgC0KGfC6rF%QcA%zP~`~s-&4;)X8ETgISe3Pm<3s&NomfpBY#XZnvdU8kl3Fz{P?=RckA(6ZOAHy30XQb-gum73!yNu>L zjrcEdE>TLfz0AJvgd!uTzT9Ym3AE_c%ZT=F@0q2}Af5K^65IlHvu#AR-Xe12xuZKC zxf@u~*|+$Wy1de?nD{-S9i_Cr)&#LI&PA^+Hoj0+^k?G^%f-jg3^fm}s3XHJSLTiG z`hz0Doh!?I+oXKP#qk9EF!s zkh(nCQf9_7_RhD=k-x^Qm{6_ji0s`+BQN+|7+^14a@wC?(#0ELa{{ zhFjpFh3c(B82yqAUAKfH#QG4j)rjrq5bXy+&J}I&)^n9MT}=^4L1+ChpE$Tfc2E>S zn#==MN?xM=qA6{uG7BoXMne8o(&a1`)UPd0{Xpwsvdk0wOC%@%79u*HKEr(ilgl1@?dJX3j}2x3 z9qzL~&8@d|BGAg{tM`)nYm>cK^H{4LW&pw`)PEdc4&3C8CZ=2y3w>x8i-oFT*#0@B z<{<D~v%ArN4$!9U~ zAv%74-Alj)=$$f)*525$ zOw=Nl1MTA@vD?9lvX8G`yu4ewSd8nAo@CK0nW4-`46kpP9xcAKmmbh%*WfPsFz5AZ zUB$yT%98sPw8@Ewpew(5e!Xz3+j~i056EKThZ% z=#(9YY#tnHL9R(ay7J19+bj^?7|N;1+yM``MQ3O1Yt?QIS+OS4_Y!qm&(bcWS{J*m zrbM1vL<|i^Ky=9h`J@HNu4#AU`OR(QOvh>nq~_8llKtT?#4b0v8_nD&0FG9JxpI3i zAz%aIis)g9I=Af#>NYjHc2jfsY0Tz{o;)u1rs|JM15yQ>MUbrB2*_@e;sL7sC#w!K zSaKIcBu^b2<=G*t0=36&3~7R*O#`;z!p>>;G-Mgf^|ZLS@eQ_g)3o(49E~CyC2Nv z@tbJ-O+XpwTFu&0L}5_VcUc8>E=R^MypOn|Z% zLW8KL!^UC0$H6mnuS`zTVveT4cslPE z@(c%*wU5f_FSf+emnUsb$LtR+-^!;(d`K606sl%0E`WN?cC2kCT zPG2D`8QV4u7$>eFGd8{R&jrk!uJ!U7pFa)9y2#F78{Np?+!;US>q&MI*3^Kndu(_o z!JCL5S*Oq6!G*B00x|in(%70PKb5LvbpWg48Nsk-@XU40K!`$~g9^kuzppDp%n|r2g z1vJt-^~lZ+;xV;w5-{z~48?jKBIN!B!YEtq6*XRtuS*=`i4AEHOldEcdj}SiGyjfV z%ip_Bs(JBHMY#mFNCLy`b?UaobncxNWD0^@gw4>_u1={YR@^zdcXsATqnoh%yk{0* zz++P7>$*lkZABnS1U8i5+>X^cKY8zCR4wZdL~&^hfgFB*AJt(<7y#e7 z-&^%_c5Q%9?C_u$W;1C_7i7d?^LA@ZYXAJ6r&M4$>*3Q+37i4Bu!WD!V|sKo2b&|h`};)C<1se7KWB8T zMg=oK+w|J>Chgi0m9(JP1C-$o9OWRdc{=SNjj{ZCK+j~V;-K8!~7U&63mZrIIqj_A8B&As*N zalvReIB$P_Q$d_Q(KB@7+z^y9(Kz^+C1$H- zt2g6`R%e_(9mV`|_S%1cZeIQ~U4uXu!TLSbJn?Y{6Ur7NAj#=8K--PMQfEnx4yprtM8|*5UWp(|NwBKNA z-FyVyH5sCo8Cuby-W;#YZ#YK!S-_OwFH>xBJJa!q1OJ^cLZH{SM5VG^v`wIO*UXRE z_$_OLv5Wkrj<|`kjLER8b}9Rbf3F`=>dpuv(1I5LsIzTmk)FD(?olF6azf->>e*r$ z*TB?=_2Fs8pfK9bsZn^MlCjpX@B|L+qP}a=m@$TgZ*hM6wKWna$0Yko&`xZq8Z%<$ z*0kRKM&aI{E4vnXV=sh6KDJ$)^wkbq7lM1hA`zHYZ2OC*pj7)7%zEy``&=d$5`S?x zE_z3z=|1@&#^y*iYiu=cHK0JgT5tQP!6(-Jp(+qBA{qAXxJsJmqux_7$1X^g?aHIh z>cHgQ=an?cBk0vJ@p+58iqs9du%moEm$hLPByVV8clAErlYbcCzZb4tRW)RAOyz`e zf1q!PcoutLI&O(m%OJWWAOdw(4_c&ab~5J;ZWZr+hqeviRB674_5m>(u(GFqjh3m2 zJz)PCC&|}3a^N^zKxt`W@fp_Wp|{WBM?Rl(RG z+XV&-j*rO=IX#2ANJIyuv08BYy?fH|n0(Xbg0}H1bK8~%`Ct&fgvoFkl5%ys6qvT& zJD@92=GL%AzdwDQGn}%zh7SN|{gqnFkahnqGY8C=VghG`h?%p{q?gm?%oI$Q-R#eI zpHV|yZg9+`R8qzOK-YyOPpnv7+xwa-;TWbIG@5(=c$)qXqYV`BhyOH_d#z&)h%?XY z-sVQ|3^rO$?(WW_^13@kGFs*GAuN+5yS8vXaw@|-o#3okPgbaYCuPD(c)T~0lIh#< zCwA&3i?K_;03e<=)_9T;CExzXxsqWUY2RdcZ?C~L5Rhzh49>mpA&YgtG+1Q#Mu^<_ z%Oi#r)#;corQ+w)yCHEBam-*j$MUz+z=i|rL*UG>z!lYBF|o6P2w6lg$c=i33V{NP z!&beP9;)Mce>YU(Bw8b12pXm4&I0NVj$GU-DFItlk;$n=c>F!@Ev=T?gVHZ6gcsWJ zG0{kkCikxFCu;h1?KjQgdv_v}(r^~}{|fHVqHC-3KJ(glb$O#R-m60aF~CS8Ct?Az z;T>eHR%hFDZ4c)9lWCl;RVYUg?B;L~3+FtN5sl>MXWO`DVezn8`pQk% zQG(j!#S%xRKbAW9H^|IH*#&Ez%B0re+qo} zdtLa&fHBfxdr?v;4toeIKR&y`z6Ip>GlSf(10QHu?+olFc`3^hbl9UZHw;zCPv&gJ zyI&?wg^wO@ty=$rdwB(mz6UFxz)z);h{y0+t@D-huyJCYmLni^8 zD$ekLdI3{rtxj<@kMe0rzt_u+LNp>S*@eExZhv(HBDA@&4C&&$+4nj8J+T(OJX;2* z#t!g%wfZ#3Bf5Uyc+1Od4~=IiLii*IwjQojWL*e8Kj@AlgtMYP>>k3{4E0TTrt1?g zV+ORcnR*QU*RrGo;v)(z(uh8>4r`anfy>+a% z8M*?k(~uuWZw1T*Zv~m+TqC49RG2O9`}ELWHz+Rg_|m%6_p#9T#V@Et7cvmneR^rQ z=j|3awSHbeQHW1;MiT*JL?2*Hd!6T{#nT|19j?-2u$MG6ba4#}Vxz4rdWEg13VBePqnC10~P!>zSpTT+fyjmeC66|-1T z@w=ef1H)kei`qz=v8FlvhApHt5_eK1UQm*S9MW0z1QY)Ys|RDa8Nmw5xOvv7KbDs-+`Ref|jT9uoO%Pjv&;jw-8N^Ng`pq zW7Q|IsqZxUqeuocT4fHSI>b9yyk)#^aB_w4l7~xtzu|xO46FeE1bh)3s*pT6f92E!c{dX~3EMTOEQ=9PPEM%_SY2QY9BT#=94=jx~cbqtEFKr3vD4MJ^2)1=y0Nrci5v|5W`VXBlR%P0KRmk_LDa3^o1 z)mC%-d>wc`Vqwqb2H*oDSlW%Wb3S+ABN6S(S9tbL@>v@wQwKRU)}^n|C%-Nhqn@)r zwswW*PqjeBacQr5pMSYejmg{r_PM>oQPqHO#r>~9_M*Yzzkdzzvl<-!s~b5LF!OT% zb2S)0+_2CewBc??pxmhz0>9c^Z!F}FBP806&dE8~v|`EEGgmv+dGE}QwF3fvGh~H5 zp1zNpgMJNcPvh3qTLioU%U9lU0MG!eK7NFxrnwQw2BxBK1v=uTcEMm`JicO`0!J5G zecI}z>sqYjrpHeu04YZd(+gWhl;}sc{p#s3OCUu%-Rw(t;TKRW_~is}?v?>OknCTe z*((NIiZ3Ss`7B)AViKk>mtLnpYzO%E!e zk7RTUi^Fqc+yc_3(6YT-;64hOmwZ|cOcQ)Hvh;RP`qP&Zsz1-2r`e98omiRIK-^j@ z0B;Y4l1}5_y6;^z+4uS+YIAF0%wP9-pf!&k{bWGe5LQq?gTTIjl^T~dU@FiMJWsPlPb^Ylap*`3Mw+UX~c3 zkmiwedBuoQ4Jem?RvVsraSXHpcg`O%u14I3Nuh5%9P(8w)Pq&XM?dr)_@|tX1C!&r zXv$dgs_BNMyF{!Pjc!veHHD%6KU$r?>`(lMnbw?`dhpqGGW5>?WBh0G`Cp`7p_&UVe{?=70MGyZO5+Os%d<-r`JzG&g`PUd(AVmtJROA3NQ9nr_C%<)>}q zW}Wnnp}9{f$<-d23o1yk64oezsgn&gwQUo7dDJu0R8y1?xJ)0bm@8_^F~WEGyoWEJZV#pT)db{PS==Y52U~ zgoEZ?D*Y_`aq*Fu1RTC&yj^R`pXstzc`n4AW2E5sCmE%_ z*`Rx{Y&RcSH0K-mYzCn#EYL>q6rKL#3qp-wID{fJTz;=~bA@ho9V{UY<>>p423Sg2 z7D3CzhQ62RCmO7KOz(XAS&@X}*j?y-f6;P_vypp~!tWUaY3qqjnv{g$vzp8c^L#QP ziD^2^t4rF!Q+s?eMy}bO43GSoe1~0Y;IcUQD9l6n<@J8;Z^xR=%3jHihAT=`=ZYl> zutRzkl_F{$Ux#^FRXAsqugsMp;+C~ZFP&__NY^99V-qS)aC%>2)$^5@d8l+0^5D%Z zN1wgm>{af{rLWK~PIMoVPYIk+{s@?4>(jVK+}t4wu3u&ZBF|^w;WYQR>T`t*^sQCO zMb%IGYL;~NZ*hiQZg%J_{cR}5k=WsYet&`nY41nanxQ^jP^F#hUuerU=7HvX7;`c9 zm8EWV(RAa7i(&jbcKshczpXyrS-4@!$NF}5RM&tN^>BzZ`)JRn?yLGe73`NmeqSH`00mbsQAJBIa3Zqwj}H@5{WLwgE~?yrrs zr#Ir&QY67i*z@%oOJOO`*9f%PHQx_cwv2>#VkYS-MaGPpvIao=S z4tqz09~lzO2a$mhQ7f@?Jq;PK7U#WP<9dGUC84R;{DX*PR}9_3fo=D&&nXRJkd+lqqQuvn>re_aVM0}^{o#U(pe}X86jZx8zT*5qDN5gs>3ofxI0CHWRnA$H zt5CslC9pqTeId#Qx}uVVZ7r+RgTsA=>q{e$^t=;P;uIWC^t9=cA+_ds|TQ z5qpDMsx>z})AhBVt3*c;(aF#*Kq#$GF1OQMLhT zqLT|UK@n8ZemZ`ULS-m@|-N_xIX~%NRxNbYsjysKJ$(K6jA1@P1DeKy`=afbj9Pizz7^GB zu;>#BKVlpBz<%e-qYkhGMufjo-uayCloz4S4s#L0Y&wDHZ|i4d1wGykDvF12pBgKsHl#@Vq4n^#;WS6K1`%)y%ROt>h(df7Yn zZ-Jm(lLIAlAB{Qgd!*vA~d z@&`Iq%s~;5jcSHUke$)LMT&nl**1M?d8XH2->zj>r_x2XV_DaQ&CFF!JNw4NWr zrR5=q_KYy*ihygbb$kT>6w!z>(dtt|N&`|!vy&DxVJv2B9M#I{3C&1DXvEe(sSoI1 zY|=WL(?4(Lr`u}IeD|Znr8Dj=n}oh|TZLqMpDQ50h8>lLzU`RQQ>^Z)woqUc_F8zh zWh&76PFXEmVlHwB^s^OLBTc#KN&Igu-A!yeuo-xqh;i;5}i+kXdrEUqUJWR%|8kzW%L|Ag?OzjwR>(4x%_WWj<RILfJqMq0~q}18*$3ip78(72EE4Fxr=!NxL~?xC@%x-8njMstW2I92fdLh zb=y&)-J_lTgv)E6{H_c#mE4q%R@CU$i)F5bU|qwaNwc-hs@@G#^UM$Z{PAELf% z>5UoPZC!ZHUe(i_PlGr2no>h!zD+y?!iVKkIdZWzf~dz zHz;C3six0e(I)K{buH>@_boPdhkSjgu-ADJM6=|p-NUB}`2M{2k;26(XB5tc;)a3d zo;Bcqml`sfmj}@`@Q6mBh6WVLfk@o)|GfRo&&JIMPR(FbLU6|!!L=ciV6HceG&a&R zc+W}F5pQ&!rP0Dxt9`(=f;6f@>HQHKW4^})djKx@OJrHQ1BwaS6@1zK*ya8=l0YVX z`sKG&^Oim_+P0aZ3wD)@H}BDExxctVp~?Oxq@n`Tm|{db7axHrAjuO^k+^PXwld?L zoQ-+zi}VdPp-gu6%GLgWTOE~Se>qi}+yBo|S`_6f&x7~&3X~=0 zFKQ218~LQxIok~8{)~lM0qyo44e9FrA@v3fs27`m144WA)E}pU%$>jHll%){N`xn~ ziJ1mBjpsi!v172H5bA(T_v}S?SN~^KbpHTHJs0>Cr8Z}YSQz!(`Xb;VX4=Yh{l3Zo zJbCoZ{LqWU?$O&iTEh2}N1489PPOa1?f%vpU}f5P7$>H;sF2hj#F`#1RwonWxgMcm z_Z*jdEkao?SA6!{rGTxMyNAr9vBtmAj2ZouPS(saG&zdyo#g|hsaRmOlEPj0_gFBU z!nr9$a_=ZI>VXm=GF6pYOZ&b1(~p|kPZCmdxWN`=DI%JDVLywN&K$rA?tbtf6yl2g zwtm%p=q-2Xi0^CYK-26xWZ_nGH3*-iw$MgHPqq0#Gi#0n(^GKRS{_T=)3O>4??Hj9 zb=uIX%6C!8YehoWs;-pSADJGWq_11Rzqb2U$(gHD_zARSaT&AcO6*Pk5=|>dQ72%N zQb&lD)`^D@P@}%^AIjgzFJ*50EFFZq&5w+55X>$dJc>>z{Ew<>Cx3~xpB_Lp4cDz6 zx(z2?UXqwbZ3Gatk}%nQ4o^ixQg`g14qX-3*?bq_-t=X1V(YD?82Y0UP;Pe-hp(Q> zEnhI~E@e$8j5#F1hBLOtH(F(~afFsqSHj8JZ;DFO!}w0OO8l4KW$X2RzuZqFr$FOT z69bSuW!K25^R7pu9?6ki76imlN(G%wl>t%)X{9+zOV0JlQ8H_(gXtcccLhzBmQYhV z+uh-H>`^(kmZvueA@qU;v5f;UMKUy2rAdA#>^Vaxkv9_Mf&?n?8k3DJ6FIz&?XClb z5R*-WPmj{K$?xj$zVOr7HJ2A$${yKjO@lVdjZ6F&Ak+swY8r@^%!Ilm^G@fn%qB;l zaEO0uM}to3#}|J097HUZ<1LD$U4pca!&iG7LKHYTibF?snN-=c`t#(RgP5&Zax;VL4>8 zoy!GwouwNdQN<;H6x=)&B$?(?gGQ}uR@m*15GVMwurhPJ{l_25-^rz%F2YP7PZOdN zvx6*u`@$pVQz0WBNmJ$aYHQ+s;Yi^#l#9z{;lk7OJ=OUVF~xyjuG`R?j#LsPQQwSa zX-X!#wf0Z+&$jEc`6?)+`MR~JR?iOhD#_X2<#3;NgQes1+O%XGXAQ&Yc+80f3&8|CV>rY>hlanw&0 zUKe~YE*_Om^u-_c{^<>?W1<1tR-~Ci>dqScY^qZ!TIBkdxF;XK9P32BxRYp+_~}zq z336cv-sCm5YWQsz23d_d^1Vt`>HMI$eL!>ZY$yw)Ow+$g^!}Ht!*9+;7>tG)GuCzA zzqy&X%r7wMcyjF3iRl9RXeuOEwWHAeyj8- zdU)BS@L~yurEI+abwD}H*rQdzUVBXWV0u(JCc;H}U?ECIkjC-m=7^wgyc0vcdTPIR z=dl5#tTqB2WS-=qZg*#_f!4o$xA;dyMoLpxPT-6SLR6pdsp%N9VdDtQ*k_pY#redn zRgWMg;u6NxeR$(u`OI_)f2%>K8Fr+K=hmy7Odq~AKgd~ox(J)$3euoPe`Tr3(#$Sr znEdUrT;{?TXaNV>+)-=OrE4at}nQ*Q*tmx!^6jR!-$h7mTSqD6^x$ZBhpS+YgK@T^rDc zq)(MPQ8aM#O3shIkHF^�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 CS#^E@ literal 0 HcmV?d00001 diff --git a/docs-kb/simplified-cqrs-ddd/devenv_2018-05-22_18-48-36.png b/docs-kb/simplified-cqrs-ddd/devenv_2018-05-22_18-48-36.png new file mode 100644 index 0000000000000000000000000000000000000000..db42f1e81625ec796364f6e9f22b1fd7684098bc GIT binary patch literal 19945 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 DP5$B* literal 0 HcmV?d00001 diff --git a/docs-kb/simplified-cqrs-ddd/devenv_2018-05-22_18-52-58.png b/docs-kb/simplified-cqrs-ddd/devenv_2018-05-22_18-52-58.png new file mode 100644 index 0000000000000000000000000000000000000000..5047148d527e74eef8bf83f6af3338de59753360 GIT binary patch literal 28743 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 literal 0 HcmV?d00001 diff --git a/docs-kb/simplified-cqrs-ddd/devenv_2018-05-22_19-11-30.png b/docs-kb/simplified-cqrs-ddd/devenv_2018-05-22_19-11-30.png new file mode 100644 index 0000000000000000000000000000000000000000..ab42b4278da37d8cff11be5a1dd4e9b672413d64 GIT binary patch literal 13372 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 https://github.com/dotnet-architecture/eShopOnContainers/issues/592 + +* **Applying simplified CQRS and DDD patterns in a microservice**
+https://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/microservice-ddd-cqrs-patterns/apply-simplified-microservice-cqrs-ddd-patterns + From acde548e38749aeee3393e89edd6b3d1f229ef4d Mon Sep 17 00:00:00 2001 From: Miguel Veloso Date: Tue, 22 May 2018 19:42:26 +0100 Subject: [PATCH 21/33] fix link --- docs-kb/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-kb/README.md b/docs-kb/README.md index 70ef23af6..518ff98e5 100644 --- a/docs-kb/README.md +++ b/docs-kb/README.md @@ -3,4 +3,4 @@ eShopOnContainers Knowledge Base This folder contains a set of posts created mostly from [issues on the repo](https://github.com/dotnet-architecture/eShopOnContainers/issues), in order to offer a brief introduction as well as and links to deepen the knowledge on a given subject related to the application. -[Simplified CQRS and DDD](simplified-cqrs-ddd\post.md) +[Simplified CQRS and DDD](simplified-cqrs-ddd/post.md) From dc8d8a6be7a883b192cb9ca52abce3210433f3e9 Mon Sep 17 00:00:00 2001 From: Miguel Veloso Date: Tue, 22 May 2018 19:59:47 +0100 Subject: [PATCH 22/33] Add additional explanations --- docs-kb/simplified-cqrs-ddd/post.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs-kb/simplified-cqrs-ddd/post.md b/docs-kb/simplified-cqrs-ddd/post.md index 7931201a7..be7f9e176 100644 --- a/docs-kb/simplified-cqrs-ddd/post.md +++ b/docs-kb/simplified-cqrs-ddd/post.md @@ -21,6 +21,15 @@ Why the separation? because the rules for **changing** the model can impose unne In this simplified CQRS approach both the DDD model and the query model use the same database. +**Commands** and **Queries** are located in the Application layer, because: + +1. It's where the composition of domain root aggregates occur (commands) and +2. It's close to the UI requirements and has access to the whole database of the microservice (queries). + +Ideally, root aggregates are ignorant of each other and it's the Application layer's responsibility to compose coordinated actions by means of domain events, because it knows about all root aggregates. + +Regarding **queries**, in a similar analysis, the Application layer knows about all entities and relationships in the database, beyond the restrictions of the root aggregates. + Code ---- From 754da499e35a36395b3895bb83a37e459b9e5432 Mon Sep 17 00:00:00 2001 From: Miguel Veloso Date: Tue, 22 May 2018 20:09:45 +0100 Subject: [PATCH 23/33] fix: typo --- docs-kb/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-kb/README.md b/docs-kb/README.md index 518ff98e5..ad5fbd79f 100644 --- a/docs-kb/README.md +++ b/docs-kb/README.md @@ -1,6 +1,6 @@ eShopOnContainers Knowledge Base ================================ -This folder contains a set of posts created mostly from [issues on the repo](https://github.com/dotnet-architecture/eShopOnContainers/issues), in order to offer a brief introduction as well as and links to deepen the knowledge on a given subject related to the application. +This folder contains a set of posts created mostly from [issues on the repo](https://github.com/dotnet-architecture/eShopOnContainers/issues), in order to offer a brief introduction as well as links to deepen the knowledge on a given subject related to the application. [Simplified CQRS and DDD](simplified-cqrs-ddd/post.md) From cd1f11b4800ebc6eeb112f9986756f624395a744 Mon Sep 17 00:00:00 2001 From: Unai Zorrilla Castro Date: Fri, 25 May 2018 11:52:35 +0200 Subject: [PATCH 24/33] Create new polly policies for each service instead of use the same, in order to resolve problems with the execution context name --- .../Mobile.Bff.Shopping/aggregator/Startup.cs | 36 +++++++------ .../Web.Bff.Shopping/aggregator/Startup.cs | 38 ++++++++------ src/Web/WebMVC/Startup.cs | 50 ++++++++++--------- 3 files changed, 70 insertions(+), 54 deletions(-) diff --git a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Startup.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Startup.cs index a18ec2dc1..1d24e8312 100644 --- a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Startup.cs +++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Startup.cs @@ -15,6 +15,7 @@ using Swashbuckle.AspNetCore.Swagger; using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; +using System.Net.Http; namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator { @@ -147,30 +148,37 @@ namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator services.AddSingleton(); //register http services - var retriesWithExponentialBackoff = HttpPolicyExtensions - .HandleTransientHttpError() - .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); - - var circuitBreaker = HttpPolicyExtensions - .HandleTransientHttpError() - .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)); - services.AddHttpClient() .AddHttpMessageHandler() - .AddPolicyHandler(retriesWithExponentialBackoff) - .AddPolicyHandler(circuitBreaker); + .AddPolicyHandler(GetRetryPolicy()) + .AddPolicyHandler(GetCircuitBreakerPolicy()); services.AddHttpClient() - .AddPolicyHandler(retriesWithExponentialBackoff) - .AddPolicyHandler(circuitBreaker); + .AddPolicyHandler(GetRetryPolicy()) + .AddPolicyHandler(GetCircuitBreakerPolicy()); services.AddHttpClient() - .AddPolicyHandler(retriesWithExponentialBackoff) - .AddPolicyHandler(circuitBreaker); + .AddPolicyHandler(GetRetryPolicy()) + .AddPolicyHandler(GetCircuitBreakerPolicy()); return services; } + + static IAsyncPolicy GetRetryPolicy() + { + return HttpPolicyExtensions + .HandleTransientHttpError() + .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound) + .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); + + } + static IAsyncPolicy GetCircuitBreakerPolicy() + { + return HttpPolicyExtensions + .HandleTransientHttpError() + .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)); + } } } diff --git a/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs index 6eba724f2..e4a080289 100644 --- a/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs +++ b/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs @@ -16,6 +16,7 @@ using Swashbuckle.AspNetCore.Swagger; using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; +using System.Net.Http; namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator { @@ -150,32 +151,37 @@ namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator //register http services - var retriesWithExponentialBackoff = HttpPolicyExtensions - .HandleTransientHttpError() - .Or() - .OrResult(message => message.StatusCode == System.Net.HttpStatusCode.NotFound) - .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); - - var circuitBreaker = HttpPolicyExtensions - .HandleTransientHttpError() - .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)); - services.AddHttpClient() .AddHttpMessageHandler() - .AddPolicyHandler(retriesWithExponentialBackoff) - .AddPolicyHandler(circuitBreaker); + .AddPolicyHandler(GetRetryPolicy()) + .AddPolicyHandler(GetCircuitBreakerPolicy()); services.AddHttpClient() - .AddPolicyHandler(retriesWithExponentialBackoff) - .AddPolicyHandler(circuitBreaker); + .AddPolicyHandler(GetRetryPolicy()) + .AddPolicyHandler(GetCircuitBreakerPolicy()); services.AddHttpClient() .AddHttpMessageHandler() - .AddPolicyHandler(retriesWithExponentialBackoff) - .AddPolicyHandler(circuitBreaker); + .AddPolicyHandler(GetRetryPolicy()) + .AddPolicyHandler(GetCircuitBreakerPolicy()); return services; } + + static IAsyncPolicy GetRetryPolicy() + { + return HttpPolicyExtensions + .HandleTransientHttpError() + .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound) + .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); + + } + static IAsyncPolicy GetCircuitBreakerPolicy() + { + return HttpPolicyExtensions + .HandleTransientHttpError() + .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)); + } } } diff --git a/src/Web/WebMVC/Startup.cs b/src/Web/WebMVC/Startup.cs index 735e8df6c..24d2096ee 100644 --- a/src/Web/WebMVC/Startup.cs +++ b/src/Web/WebMVC/Startup.cs @@ -17,6 +17,7 @@ using Polly.Extensions.Http; using StackExchange.Redis; using System; using System.IdentityModel.Tokens.Jwt; +using System.Net.Http; using WebMVC.Infrastructure; using WebMVC.Infrastructure.Middlewares; using WebMVC.Services; @@ -168,18 +169,6 @@ namespace Microsoft.eShopOnContainers.WebMVC { services.AddSingleton(); - //Using fluent client configuration of Polly policies - //(CDLTLL) Instead of hardcoded values, use: configuration["HttpClientMaxNumberRetries"], configuration["SecondsBaseForExponentialBackoff"] - - var retriesWithExponentialBackoff = HttpPolicyExtensions - .HandleTransientHttpError() - .OrResult(msg=>msg.StatusCode == System.Net.HttpStatusCode.NotFound) - .WaitAndRetryAsync(6,retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); - - var circuitBreaker = HttpPolicyExtensions - .HandleTransientHttpError() - .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)); - //register delegating handlers services.AddTransient(); services.AddTransient(); @@ -190,32 +179,32 @@ namespace Microsoft.eShopOnContainers.WebMVC services.AddHttpClient() .SetHandlerLifetime(TimeSpan.FromMinutes(5)) //Sample. Default lifetime is 2 minutes .AddHttpMessageHandler() - .AddPolicyHandler(retriesWithExponentialBackoff) - .AddPolicyHandler(circuitBreaker); + .AddPolicyHandler(GetRetryPolicy()) + .AddPolicyHandler(GetCircuitBreakerPolicy()); services.AddHttpClient() - .AddPolicyHandler(retriesWithExponentialBackoff) - .AddPolicyHandler(circuitBreaker); + .AddPolicyHandler(GetRetryPolicy()) + .AddPolicyHandler(GetCircuitBreakerPolicy()); services.AddHttpClient() .AddHttpMessageHandler() .AddHttpMessageHandler() - .AddPolicyHandler(retriesWithExponentialBackoff) - .AddPolicyHandler(circuitBreaker); + .AddPolicyHandler(GetRetryPolicy()) + .AddPolicyHandler(GetCircuitBreakerPolicy()); services.AddHttpClient() .AddHttpMessageHandler() - .AddPolicyHandler(retriesWithExponentialBackoff) - .AddPolicyHandler(circuitBreaker); + .AddPolicyHandler(GetRetryPolicy()) + .AddPolicyHandler(GetCircuitBreakerPolicy()); services.AddHttpClient() .AddHttpMessageHandler() - .AddPolicyHandler(retriesWithExponentialBackoff) - .AddPolicyHandler(circuitBreaker); + .AddPolicyHandler(GetRetryPolicy()) + .AddPolicyHandler(GetCircuitBreakerPolicy()); //add custom application services services.AddTransient, IdentityParser>(); - + return services; } @@ -273,6 +262,19 @@ namespace Microsoft.eShopOnContainers.WebMVC return services; } - } + static IAsyncPolicy GetRetryPolicy() + { + return HttpPolicyExtensions + .HandleTransientHttpError() + .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound) + .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); + } + static IAsyncPolicy GetCircuitBreakerPolicy() + { + return HttpPolicyExtensions + .HandleTransientHttpError() + .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)); + } + } } From 104661d39d8075333390575d18eeb521b493bf11 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Llorente Date: Sat, 26 May 2018 20:43:54 +0200 Subject: [PATCH 25/33] Fixed bug, no need of GracePeriodTime setting for the Order microservice. Only for the Ordering.BackgroundTasks --- docker-compose.override.yml | 1 - docker-compose.prod.yml | 1 - src/Services/Ordering/Ordering.API/OrderingSettings.cs | 2 -- src/Services/Ordering/Ordering.API/settings.json | 1 - 4 files changed, 5 deletions(-) diff --git a/docker-compose.override.yml b/docker-compose.override.yml index d523b328a..98ad11c62 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -80,7 +80,6 @@ services: - UseCustomizationData=True - AzureServiceBusEnabled=False - CheckUpdateTime=30000 - - GracePeriodTime=1 - ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY} - OrchestratorType=${ORCHESTRATOR_TYPE} - UseLoadTest=${USE_LOADTEST:-False} diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 06dcbde6f..4bf465565 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -85,7 +85,6 @@ services: - UseCustomizationData=True - AzureServiceBusEnabled=False - CheckUpdateTime=30000 - - GracePeriodTime=1 - ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY} - OrchestratorType=${ORCHESTRATOR_TYPE} - UseLoadTest=${USE_LOADTEST:-False} diff --git a/src/Services/Ordering/Ordering.API/OrderingSettings.cs b/src/Services/Ordering/Ordering.API/OrderingSettings.cs index bfe4d0793..af38823ae 100644 --- a/src/Services/Ordering/Ordering.API/OrderingSettings.cs +++ b/src/Services/Ordering/Ordering.API/OrderingSettings.cs @@ -7,8 +7,6 @@ public string EventBusConnection { get; set; } - public int GracePeriodTime { get; set; } - public int CheckUpdateTime { get; set; } } } diff --git a/src/Services/Ordering/Ordering.API/settings.json b/src/Services/Ordering/Ordering.API/settings.json index 679cd23f4..ef9b9e03c 100644 --- a/src/Services/Ordering/Ordering.API/settings.json +++ b/src/Services/Ordering/Ordering.API/settings.json @@ -12,7 +12,6 @@ }, "AzureServiceBusEnabled": false, "SubscriptionClientName": "Ordering", - "GracePeriodTime": "1", "CheckUpdateTime": "30000", "ApplicationInsights": { "InstrumentationKey": "" From 01a1d653086bb92962ec4dfda14478bb392c04a2 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Llorente Date: Sat, 26 May 2018 23:45:37 +0200 Subject: [PATCH 26/33] set 10 min as the lifetime for each HttpMessageHandler int the pool --- src/Web/WebMVC/Startup.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Web/WebMVC/Startup.cs b/src/Web/WebMVC/Startup.cs index 24d2096ee..9c1c0a3b8 100644 --- a/src/Web/WebMVC/Startup.cs +++ b/src/Web/WebMVC/Startup.cs @@ -173,6 +173,7 @@ namespace Microsoft.eShopOnContainers.WebMVC services.AddTransient(); services.AddTransient(); + //set 5 min as the lifetime for each HttpMessageHandler int the pool services.AddHttpClient("extendedhandlerlifetime").SetHandlerLifetime(TimeSpan.FromMinutes(5)); //add http client services From 51236fd5af26741ff31fcfe50077ede8422a03ad Mon Sep 17 00:00:00 2001 From: eiximenis Date: Fri, 1 Jun 2018 18:59:14 +0200 Subject: [PATCH 27/33] Update to netcore2.1 RTM Updates to web Dockerfiles to support microsoft/dotnet:2.1-sdk --- .../Mobile.Shopping.HttpAggregator.csproj | 2 +- .../aggregator/Web.Shopping.HttpAggregator.csproj | 4 ++-- .../EventBusRabbitMQ/EventBusRabbitMQ.csproj | 6 +++--- .../EventBusServiceBus/EventBusServiceBus.csproj | 4 ++-- .../IntegrationEventLogEF.csproj | 8 ++++---- .../Microsoft.AspNetCore.HealthChecks.csproj | 2 +- ...ft.Extensions.HealthChecks.AzureStorage.csproj | 4 ++-- ...osoft.Extensions.HealthChecks.SqlServer.csproj | 2 +- .../Microsoft.Extensions.HealthChecks.csproj | 4 ++-- .../WebHost.Customization.csproj | 2 +- src/Services/Basket/Basket.API/Basket.API.csproj | 4 ++-- .../Catalog/Catalog.API/Catalog.API.csproj | 4 ++-- src/Services/Identity/Identity.API/Dockerfile | 15 ++++++++++++++- .../Identity/Identity.API/Identity.API.csproj | 4 ++-- .../Location/Locations.API/Locations.API.csproj | 4 ++-- .../Marketing/Marketing.API/Marketing.API.csproj | 4 ++-- .../Ordering/Ordering.API/Ordering.API.csproj | 6 +++--- .../Ordering.BackgroundTasks.csproj | 2 +- .../Ordering.Infrastructure.csproj | 6 +++--- .../Ordering.SignalrHub.csproj | 10 +++++----- .../Payment/Payment.API/Payment.API.csproj | 4 ++-- src/Web/WebMVC/Dockerfile | 14 +++++++++++++- src/Web/WebMVC/WebMVC.csproj | 6 +++--- src/Web/WebSPA/Dockerfile | 13 ++++++++++++- src/Web/WebSPA/WebSPA.csproj | 4 ++-- src/Web/WebStatus/WebStatus.csproj | 4 ++-- .../FunctionalTests/FunctionalTests.csproj | 2 +- .../IntegrationTests/IntegrationTests.csproj | 2 +- test/Services/UnitTest/UnitTest.csproj | 2 +- 29 files changed, 92 insertions(+), 56 deletions(-) diff --git a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj index a8e222e0f..d49c6a18f 100644 --- a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj +++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj @@ -14,7 +14,7 @@ - + diff --git a/src/ApiGateways/Web.Bff.Shopping/aggregator/Web.Shopping.HttpAggregator.csproj b/src/ApiGateways/Web.Bff.Shopping/aggregator/Web.Shopping.HttpAggregator.csproj index 88f058a97..7a0f6cc01 100644 --- a/src/ApiGateways/Web.Bff.Shopping/aggregator/Web.Shopping.HttpAggregator.csproj +++ b/src/ApiGateways/Web.Bff.Shopping/aggregator/Web.Shopping.HttpAggregator.csproj @@ -12,10 +12,10 @@ - + - + diff --git a/src/BuildingBlocks/EventBus/EventBusRabbitMQ/EventBusRabbitMQ.csproj b/src/BuildingBlocks/EventBus/EventBusRabbitMQ/EventBusRabbitMQ.csproj index ab5285c89..06514ba41 100644 --- a/src/BuildingBlocks/EventBus/EventBusRabbitMQ/EventBusRabbitMQ.csproj +++ b/src/BuildingBlocks/EventBus/EventBusRabbitMQ/EventBusRabbitMQ.csproj @@ -7,12 +7,12 @@ - - + + - + diff --git a/src/BuildingBlocks/EventBus/EventBusServiceBus/EventBusServiceBus.csproj b/src/BuildingBlocks/EventBus/EventBusServiceBus/EventBusServiceBus.csproj index facceac2a..9eb4bd19a 100644 --- a/src/BuildingBlocks/EventBus/EventBusServiceBus/EventBusServiceBus.csproj +++ b/src/BuildingBlocks/EventBus/EventBusServiceBus/EventBusServiceBus.csproj @@ -8,8 +8,8 @@ - - + + diff --git a/src/BuildingBlocks/EventBus/IntegrationEventLogEF/IntegrationEventLogEF.csproj b/src/BuildingBlocks/EventBus/IntegrationEventLogEF/IntegrationEventLogEF.csproj index 685cd2735..5ffc3c9eb 100644 --- a/src/BuildingBlocks/EventBus/IntegrationEventLogEF/IntegrationEventLogEF.csproj +++ b/src/BuildingBlocks/EventBus/IntegrationEventLogEF/IntegrationEventLogEF.csproj @@ -6,10 +6,10 @@ - - - - + + + + diff --git a/src/BuildingBlocks/HealthChecks/src/Microsoft.AspNetCore.HealthChecks/Microsoft.AspNetCore.HealthChecks.csproj b/src/BuildingBlocks/HealthChecks/src/Microsoft.AspNetCore.HealthChecks/Microsoft.AspNetCore.HealthChecks.csproj index 1abd12278..ce659345f 100644 --- a/src/BuildingBlocks/HealthChecks/src/Microsoft.AspNetCore.HealthChecks/Microsoft.AspNetCore.HealthChecks.csproj +++ b/src/BuildingBlocks/HealthChecks/src/Microsoft.AspNetCore.HealthChecks/Microsoft.AspNetCore.HealthChecks.csproj @@ -13,7 +13,7 @@ - + \ No newline at end of file diff --git a/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.AzureStorage/Microsoft.Extensions.HealthChecks.AzureStorage.csproj b/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.AzureStorage/Microsoft.Extensions.HealthChecks.AzureStorage.csproj index dc498e8c1..844098052 100644 --- a/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.AzureStorage/Microsoft.Extensions.HealthChecks.AzureStorage.csproj +++ b/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.AzureStorage/Microsoft.Extensions.HealthChecks.AzureStorage.csproj @@ -16,10 +16,10 @@ - + - + diff --git a/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.SqlServer/Microsoft.Extensions.HealthChecks.SqlServer.csproj b/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.SqlServer/Microsoft.Extensions.HealthChecks.SqlServer.csproj index 17fb3f68d..6217f6069 100644 --- a/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.SqlServer/Microsoft.Extensions.HealthChecks.SqlServer.csproj +++ b/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.SqlServer/Microsoft.Extensions.HealthChecks.SqlServer.csproj @@ -9,7 +9,7 @@ - + diff --git a/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/Microsoft.Extensions.HealthChecks.csproj b/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/Microsoft.Extensions.HealthChecks.csproj index 2de3689ba..5e63cac75 100644 --- a/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/Microsoft.Extensions.HealthChecks.csproj +++ b/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/Microsoft.Extensions.HealthChecks.csproj @@ -9,12 +9,12 @@ - + - + diff --git a/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Customization.csproj b/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Customization.csproj index 487fd7dc4..ad891e6bd 100644 --- a/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Customization.csproj +++ b/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Customization.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/Services/Basket/Basket.API/Basket.API.csproj b/src/Services/Basket/Basket.API/Basket.API.csproj index 4efca69c1..cea7bbedb 100644 --- a/src/Services/Basket/Basket.API/Basket.API.csproj +++ b/src/Services/Basket/Basket.API/Basket.API.csproj @@ -17,9 +17,9 @@ - + - + diff --git a/src/Services/Catalog/Catalog.API/Catalog.API.csproj b/src/Services/Catalog/Catalog.API/Catalog.API.csproj index c50c32ad0..c654c510e 100644 --- a/src/Services/Catalog/Catalog.API/Catalog.API.csproj +++ b/src/Services/Catalog/Catalog.API/Catalog.API.csproj @@ -39,8 +39,8 @@ - - + + diff --git a/src/Services/Identity/Identity.API/Dockerfile b/src/Services/Identity/Identity.API/Dockerfile index cdb915d3a..167b2bb25 100644 --- a/src/Services/Identity/Identity.API/Dockerfile +++ b/src/Services/Identity/Identity.API/Dockerfile @@ -2,7 +2,20 @@ FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 -FROM microsoft/aspnetcore-build:2.1.300-preview1 as build +FROM microsoft/dotnet:2.1-sdk AS sdk-with-node +ENV NODE_VERSION 8.11.1 +ENV NODE_DOWNLOAD_SHA 0e20787e2eda4cc31336d8327556ebc7417e8ee0a6ba0de96a09b0ec2b841f60 +RUN curl -SL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.gz" --output nodejs.tar.gz \ + && echo "$NODE_DOWNLOAD_SHA nodejs.tar.gz" | sha256sum -c - \ + && tar -xzf "nodejs.tar.gz" -C /usr/local --strip-components=1 \ + && rm nodejs.tar.gz \ + && ln -s /usr/local/bin/node /usr/local/bin/nodejs + +FROM sdk-with-node AS updated-npm +RUN npm i -g npm + + +FROM updated-npm as build RUN npm install -g bower@1.8.4 WORKDIR /src COPY . . diff --git a/src/Services/Identity/Identity.API/Identity.API.csproj b/src/Services/Identity/Identity.API/Identity.API.csproj index 1eea44cee..ca31685ab 100644 --- a/src/Services/Identity/Identity.API/Identity.API.csproj +++ b/src/Services/Identity/Identity.API/Identity.API.csproj @@ -18,8 +18,8 @@ - - + + diff --git a/src/Services/Location/Locations.API/Locations.API.csproj b/src/Services/Location/Locations.API/Locations.API.csproj index 5ec30d526..20dfbda7e 100644 --- a/src/Services/Location/Locations.API/Locations.API.csproj +++ b/src/Services/Location/Locations.API/Locations.API.csproj @@ -11,8 +11,8 @@ - - + + diff --git a/src/Services/Marketing/Marketing.API/Marketing.API.csproj b/src/Services/Marketing/Marketing.API/Marketing.API.csproj index 5573370f2..7db4320c5 100644 --- a/src/Services/Marketing/Marketing.API/Marketing.API.csproj +++ b/src/Services/Marketing/Marketing.API/Marketing.API.csproj @@ -25,8 +25,8 @@ - - + + diff --git a/src/Services/Ordering/Ordering.API/Ordering.API.csproj b/src/Services/Ordering/Ordering.API/Ordering.API.csproj index f48b34a92..8576e3cc8 100644 --- a/src/Services/Ordering/Ordering.API/Ordering.API.csproj +++ b/src/Services/Ordering/Ordering.API/Ordering.API.csproj @@ -37,13 +37,13 @@ - - + + - + diff --git a/src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj b/src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj index e61a12068..5ca8b4b3b 100644 --- a/src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj +++ b/src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj @@ -16,7 +16,7 @@ - + diff --git a/src/Services/Ordering/Ordering.Infrastructure/Ordering.Infrastructure.csproj b/src/Services/Ordering/Ordering.Infrastructure/Ordering.Infrastructure.csproj index af536efbf..72cd00442 100644 --- a/src/Services/Ordering/Ordering.Infrastructure/Ordering.Infrastructure.csproj +++ b/src/Services/Ordering/Ordering.Infrastructure/Ordering.Infrastructure.csproj @@ -9,9 +9,9 @@ - - - + + + diff --git a/src/Services/Ordering/Ordering.SignalrHub/Ordering.SignalrHub.csproj b/src/Services/Ordering/Ordering.SignalrHub/Ordering.SignalrHub.csproj index fa27ad55a..fad53bbcf 100644 --- a/src/Services/Ordering/Ordering.SignalrHub/Ordering.SignalrHub.csproj +++ b/src/Services/Ordering/Ordering.SignalrHub/Ordering.SignalrHub.csproj @@ -11,15 +11,15 @@ - - - - + + + + - + diff --git a/src/Services/Payment/Payment.API/Payment.API.csproj b/src/Services/Payment/Payment.API/Payment.API.csproj index 7c4868139..061e5f237 100644 --- a/src/Services/Payment/Payment.API/Payment.API.csproj +++ b/src/Services/Payment/Payment.API/Payment.API.csproj @@ -12,8 +12,8 @@ - - + + diff --git a/src/Web/WebMVC/Dockerfile b/src/Web/WebMVC/Dockerfile index f7d3dbcc0..bf104e83b 100644 --- a/src/Web/WebMVC/Dockerfile +++ b/src/Web/WebMVC/Dockerfile @@ -2,7 +2,19 @@ FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 -FROM microsoft/aspnetcore-build:2.1.300-preview1 AS build +FROM microsoft/dotnet:2.1-sdk AS sdk-with-node +ENV NODE_VERSION 8.11.1 +ENV NODE_DOWNLOAD_SHA 0e20787e2eda4cc31336d8327556ebc7417e8ee0a6ba0de96a09b0ec2b841f60 +RUN curl -SL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.gz" --output nodejs.tar.gz \ + && echo "$NODE_DOWNLOAD_SHA nodejs.tar.gz" | sha256sum -c - \ + && tar -xzf "nodejs.tar.gz" -C /usr/local --strip-components=1 \ + && rm nodejs.tar.gz \ + && ln -s /usr/local/bin/node /usr/local/bin/nodejs + +FROM sdk-with-node AS updated-npm +RUN npm i -g npm + +FROM updated-npm as build RUN npm install -g bower@1.8.4 WORKDIR /src COPY . . diff --git a/src/Web/WebMVC/WebMVC.csproj b/src/Web/WebMVC/WebMVC.csproj index db6dd3494..cc5b975b3 100644 --- a/src/Web/WebMVC/WebMVC.csproj +++ b/src/Web/WebMVC/WebMVC.csproj @@ -23,9 +23,9 @@ - - - + + + diff --git a/src/Web/WebSPA/Dockerfile b/src/Web/WebSPA/Dockerfile index 7399a5b87..68cf0988b 100644 --- a/src/Web/WebSPA/Dockerfile +++ b/src/Web/WebSPA/Dockerfile @@ -2,8 +2,19 @@ FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 -FROM microsoft/aspnetcore-build:2.1.300-preview1 AS build +FROM microsoft/dotnet:2.1-sdk AS sdk-with-node +ENV NODE_VERSION 8.11.1 +ENV NODE_DOWNLOAD_SHA 0e20787e2eda4cc31336d8327556ebc7417e8ee0a6ba0de96a09b0ec2b841f60 +RUN curl -SL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.gz" --output nodejs.tar.gz \ + && echo "$NODE_DOWNLOAD_SHA nodejs.tar.gz" | sha256sum -c - \ + && tar -xzf "nodejs.tar.gz" -C /usr/local --strip-components=1 \ + && rm nodejs.tar.gz \ + && ln -s /usr/local/bin/node /usr/local/bin/nodejs + +FROM sdk-with-node AS updated-npm RUN npm i -g npm + +FROM updated-npm as build WORKDIR /src COPY . . WORKDIR /src/src/Web/WebSPA diff --git a/src/Web/WebSPA/WebSPA.csproj b/src/Web/WebSPA/WebSPA.csproj index 99f228ec4..8d390cfc4 100644 --- a/src/Web/WebSPA/WebSPA.csproj +++ b/src/Web/WebSPA/WebSPA.csproj @@ -88,8 +88,8 @@ - - + + diff --git a/src/Web/WebStatus/WebStatus.csproj b/src/Web/WebStatus/WebStatus.csproj index d95a60a9b..39e945291 100644 --- a/src/Web/WebStatus/WebStatus.csproj +++ b/src/Web/WebStatus/WebStatus.csproj @@ -9,8 +9,8 @@ - - + + diff --git a/test/Services/FunctionalTests/FunctionalTests.csproj b/test/Services/FunctionalTests/FunctionalTests.csproj index afc1bf422..f5bc0ff62 100644 --- a/test/Services/FunctionalTests/FunctionalTests.csproj +++ b/test/Services/FunctionalTests/FunctionalTests.csproj @@ -44,7 +44,7 @@ - + diff --git a/test/Services/IntegrationTests/IntegrationTests.csproj b/test/Services/IntegrationTests/IntegrationTests.csproj index 6bc8221b6..9172f4254 100644 --- a/test/Services/IntegrationTests/IntegrationTests.csproj +++ b/test/Services/IntegrationTests/IntegrationTests.csproj @@ -47,7 +47,7 @@ - + diff --git a/test/Services/UnitTest/UnitTest.csproj b/test/Services/UnitTest/UnitTest.csproj index b8688052c..21a68b750 100644 --- a/test/Services/UnitTest/UnitTest.csproj +++ b/test/Services/UnitTest/UnitTest.csproj @@ -26,7 +26,7 @@ - + From 9f61e3b02929ff44d3092691e75768b4c21187e4 Mon Sep 17 00:00:00 2001 From: eiximenis Date: Mon, 4 Jun 2018 11:56:13 +0200 Subject: [PATCH 28/33] Fixes the error (400 Bad Response) when cancelling an order --- .../OrderCancelled/OrderCancelledDomainEventHandler.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderCancelled/OrderCancelledDomainEventHandler.cs b/src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderCancelled/OrderCancelledDomainEventHandler.cs index 24a8245d6..f8a7b06e5 100644 --- a/src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderCancelled/OrderCancelledDomainEventHandler.cs +++ b/src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderCancelled/OrderCancelledDomainEventHandler.cs @@ -28,6 +28,7 @@ namespace Ordering.API.Application.DomainEventHandlers.OrderCancelled _orderRepository = orderRepository ?? throw new ArgumentNullException(nameof(orderRepository)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _buyerRepository = buyerRepository ?? throw new ArgumentNullException(nameof(buyerRepository)); + _orderingIntegrationEventService = orderingIntegrationEventService; } public async Task Handle(OrderCancelledDomainEvent orderCancelledDomainEvent, CancellationToken cancellationToken) From b4daa33ae1ee0a97e2693686f3ffcbd7ee264860 Mon Sep 17 00:00:00 2001 From: David Britch Date: Mon, 4 Jun 2018 12:10:31 +0100 Subject: [PATCH 29/33] Bumped to Forms 3.0. --- .../eShopOnContainers.Core.csproj | 2 +- .../eShopOnContainers.Droid.csproj | 46 +- .../eShopOnContainers.Droid/packages.config | 6 +- .../eShopOnContainers.TestRunner.Droid.csproj | 48 +- .../packages.config | 6 +- ...ShopOnContainers.TestRunner.Windows.csproj | 2 +- .../eShopOnContainers.TestRunner.iOS.csproj | 454 +++++----- .../packages.config | 4 +- .../eShopOnContainers.UnitTests.csproj | 2 +- .../eShopOnContainers.Windows.csproj | 2 +- .../eShopOnContainers.iOS.csproj | 846 +++++++++--------- .../eShopOnContainers.iOS/packages.config | 4 +- 12 files changed, 717 insertions(+), 705 deletions(-) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj index 26fb0d89a..99606079f 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj @@ -11,7 +11,7 @@ - + diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj index 92e2df581..85f339a43 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj @@ -1,7 +1,7 @@  - - + + Debug AnyCPU @@ -58,6 +58,9 @@ SdkOnly + + ..\..\..\..\packages\Xamarin.Forms.3.0.0.482510\lib\MonoAndroid10\FormsViewGroup.dll + @@ -181,20 +184,17 @@ ..\..\..\..\packages\PCLCrypto.2.0.147\lib\MonoAndroid23\PCLCrypto.dll - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\MonoAndroid10\FormsViewGroup.dll - - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\MonoAndroid10\Xamarin.Forms.Core.dll + + ..\..\..\..\packages\Xamarin.Forms.3.0.0.482510\lib\MonoAndroid10\Xamarin.Forms.Core.dll - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\MonoAndroid10\Xamarin.Forms.Platform.Android.dll + + ..\..\..\..\packages\Xamarin.Forms.3.0.0.482510\lib\MonoAndroid10\Xamarin.Forms.Platform.dll - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\MonoAndroid10\Xamarin.Forms.Platform.dll + + ..\..\..\..\packages\Xamarin.Forms.3.0.0.482510\lib\MonoAndroid10\Xamarin.Forms.Platform.Android.dll - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll + + ..\..\..\..\packages\Xamarin.Forms.3.0.0.482510\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll @@ -368,9 +368,7 @@ eShopOnContainers.Core - - - + @@ -387,10 +385,20 @@ - - - + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + + + + \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/packages.config b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/packages.config index 2efab0dea..239ab79f5 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/packages.config +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/packages.config @@ -10,7 +10,7 @@ - + @@ -84,8 +84,8 @@ - + - + \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/eShopOnContainers.TestRunner.Droid.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/eShopOnContainers.TestRunner.Droid.csproj index fee481b8a..328b2a203 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/eShopOnContainers.TestRunner.Droid.csproj +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/eShopOnContainers.TestRunner.Droid.csproj @@ -1,7 +1,7 @@  - - + + Debug @@ -50,6 +50,9 @@ False + + ..\..\..\..\packages\Xamarin.Forms.3.0.0.482510\lib\MonoAndroid10\FormsViewGroup.dll + @@ -109,6 +112,18 @@ ..\..\..\..\packages\Xamarin.Android.Support.v7.MediaRouter.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.MediaRouter.dll + + ..\..\..\..\packages\Xamarin.Forms.3.0.0.482510\lib\MonoAndroid10\Xamarin.Forms.Core.dll + + + ..\..\..\..\packages\Xamarin.Forms.3.0.0.482510\lib\MonoAndroid10\Xamarin.Forms.Platform.dll + + + ..\..\..\..\packages\Xamarin.Forms.3.0.0.482510\lib\MonoAndroid10\Xamarin.Forms.Platform.Android.dll + + + ..\..\..\..\packages\Xamarin.Forms.3.0.0.482510\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll + ..\..\..\..\packages\xunit.runner.devices.2.3.3\lib\monoandroid80\xunit.runner.devices.dll @@ -196,21 +211,6 @@ ..\..\..\..\packages\Xamarin.FFImageLoading.Forms.2.3.4\lib\MonoAndroid10\FFImageLoading.Forms.Droid.dll - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\MonoAndroid10\FormsViewGroup.dll - - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\MonoAndroid10\Xamarin.Forms.Core.dll - - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\MonoAndroid10\Xamarin.Forms.Platform.Android.dll - - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\MonoAndroid10\Xamarin.Forms.Platform.dll - - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll - @@ -262,15 +262,19 @@ - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - + + + + + - - - + + + + \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/packages.config b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/packages.config index c487853a8..e78a48cbf 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/packages.config +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/packages.config @@ -7,7 +7,7 @@ - + @@ -81,10 +81,10 @@ - + - + diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Windows/eShopOnContainers.TestRunner.Windows.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Windows/eShopOnContainers.TestRunner.Windows.csproj index 058fd2810..dd648b8d5 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Windows/eShopOnContainers.TestRunner.Windows.csproj +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Windows/eShopOnContainers.TestRunner.Windows.csproj @@ -128,7 +128,7 @@ - 6.0.6 + 6.1.5 2.3.3 diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/eShopOnContainers.TestRunner.iOS.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/eShopOnContainers.TestRunner.iOS.csproj index 250d836a7..5bcdeee05 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/eShopOnContainers.TestRunner.iOS.csproj +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/eShopOnContainers.TestRunner.iOS.csproj @@ -1,232 +1,232 @@  - - + + + + Debug + iPhoneSimulator + {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3} + {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Exe + eShopOnContainers.TestRunner.iOS + Resources + eShopOnContainersTestRunneriOS + + + true + + + true + full + false + bin\iPhoneSimulator\Debug + DEBUG + prompt + 4 + false + x86_64 + None + True + False + False + False + False + False + True + Default + HttpClientHandler + False + + + false + none + true + bin\iPhoneSimulator\Release + prompt + 4 + None + x86_64 + false + + + true + full + false + bin\iPhone\Debug + DEBUG + prompt + 4 + false + ARMv7, ARM64 + Entitlements.plist + iPhone Developer + true + None + + + false + none + true + bin\iPhone\Release + prompt + 4 + Entitlements.plist + ARMv7, ARM64 + false + iPhone Developer + + + none + True + bin\iPhone\Ad-Hoc + prompt + 4 + False + ARMv7, ARM64 + Entitlements.plist + True + Automatic:AdHoc + iPhone Distribution + + + none + True + bin\iPhone\AppStore + prompt + 4 + False + ARMv7, ARM64 + Entitlements.plist + Automatic:AppStore + iPhone Distribution + + + + + + + + + + + + + + + + ..\..\..\..\packages\Xamarin.Forms.3.0.0.482510\lib\Xamarin.iOS10\Xamarin.Forms.Core.dll + + + ..\..\..\..\packages\Xamarin.Forms.3.0.0.482510\lib\Xamarin.iOS10\Xamarin.Forms.Platform.dll + + + ..\..\..\..\packages\Xamarin.Forms.3.0.0.482510\lib\Xamarin.iOS10\Xamarin.Forms.Platform.iOS.dll + + + ..\..\..\..\packages\Xamarin.Forms.3.0.0.482510\lib\Xamarin.iOS10\Xamarin.Forms.Xaml.dll + + + + + + ..\..\..\..\packages\xunit.runner.devices.2.3.3\lib\xamarinios10\xunit.runner.devices.dll + + + ..\..\..\..\packages\xunit.runner.devices.2.3.3\lib\xamarinios10\xunit.runner.utility.netstandard15.dll + + + ..\..\..\..\packages\xunit.abstractions.2.0.1\lib\netstandard1.0\xunit.abstractions.dll + + + ..\..\..\..\packages\xunit.assert.2.3.1\lib\netstandard1.1\xunit.assert.dll + + + ..\..\..\..\packages\xunit.extensibility.core.2.3.1\lib\netstandard1.1\xunit.core.dll + + + ..\..\..\..\packages\xunit.extensibility.execution.2.3.1\lib\netstandard1.1\xunit.execution.dotnet.dll + + + ..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\netstandard1.3\Newtonsoft.Json.dll + + + ..\..\..\..\packages\SlideOverKit.2.1.5\lib\Xamarin.iOS10\SlideOverKit.dll + + + ..\..\..\..\packages\SlideOverKit.2.1.5\lib\Xamarin.iOS10\SlideOverKit.iOS.dll + + + ..\..\..\..\packages\IdentityModel.3.0.0\lib\netstandard2.0\IdentityModel.dll + + + ..\..\..\..\packages\Acr.Support.2.1.0\lib\Xamarin.iOS10\Acr.Support.iOS.dll + + + ..\..\..\..\packages\BTProgressHUD.1.2.0.5\lib\Xamarin.iOS10\BTProgressHUD.dll + + + ..\..\..\..\packages\Splat.2.0.0\lib\Xamarin.iOS10\Splat.dll + + + ..\..\..\..\packages\Acr.UserDialogs.6.5.1\lib\Xamarin.iOS10\Acr.UserDialogs.dll + + + ..\..\..\..\packages\Acr.UserDialogs.6.5.1\lib\Xamarin.iOS10\Acr.UserDialogs.Interface.dll + + + ..\..\..\..\packages\WebP.Touch.1.0.7\lib\Xamarin.iOS10\WebP.Touch.dll + + + ..\..\..\..\packages\Xamarin.FFImageLoading.2.3.4\lib\Xamarin.iOS10\FFImageLoading.dll + + + ..\..\..\..\packages\Xamarin.FFImageLoading.2.3.4\lib\Xamarin.iOS10\FFImageLoading.Platform.dll + + + ..\..\..\..\packages\Xamarin.FFImageLoading.Forms.2.3.4\lib\Xamarin.iOS10\FFImageLoading.Forms.dll + + + ..\..\..\..\packages\Xamarin.FFImageLoading.Forms.2.3.4\lib\Xamarin.iOS10\FFImageLoading.Forms.Touch.dll + + + ..\..\..\..\packages\PInvoke.Windows.Core.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Windows.Core.dll + + + ..\..\..\..\packages\PInvoke.Kernel32.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Kernel32.dll + + + ..\..\..\..\packages\PInvoke.BCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.BCrypt.dll + + + ..\..\..\..\packages\PInvoke.NCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.NCrypt.dll + + + ..\..\..\..\packages\Validation.2.2.8\lib\dotnet\Validation.dll + + + ..\..\..\..\packages\PCLCrypto.2.0.147\lib\xamarinios10\PCLCrypto.dll + + + + + + + + {FDD910BC-DF0F-483D-B7D5-C7D831855172} + eShopOnContainers.UnitTests + + + + + + - Debug - iPhoneSimulator - {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3} - {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Exe - eShopOnContainers.TestRunner.iOS - Resources - eShopOnContainersTestRunneriOS - - - true + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - true - full - false - bin\iPhoneSimulator\Debug - DEBUG - prompt - 4 - false - x86_64 - None - True - False - False - False - False - False - True - Default - HttpClientHandler - False - - - false - none - true - bin\iPhoneSimulator\Release - prompt - 4 - None - x86_64 - false - - - true - full - false - bin\iPhone\Debug - DEBUG - prompt - 4 - false - ARMv7, ARM64 - Entitlements.plist - iPhone Developer - true - None - - - false - none - true - bin\iPhone\Release - prompt - 4 - Entitlements.plist - ARMv7, ARM64 - false - iPhone Developer - - - none - True - bin\iPhone\Ad-Hoc - prompt - 4 - False - ARMv7, ARM64 - Entitlements.plist - True - Automatic:AdHoc - iPhone Distribution - - - none - True - bin\iPhone\AppStore - prompt - 4 - False - ARMv7, ARM64 - Entitlements.plist - Automatic:AppStore - iPhone Distribution - - - - - - - - - - - - - - - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\Xamarin.iOS10\Xamarin.Forms.Core.dll - - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\Xamarin.iOS10\Xamarin.Forms.Platform.dll - - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\Xamarin.iOS10\Xamarin.Forms.Platform.iOS.dll - - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\Xamarin.iOS10\Xamarin.Forms.Xaml.dll - - - - - - ..\..\..\..\packages\xunit.runner.devices.2.3.3\lib\xamarinios10\xunit.runner.devices.dll - - - ..\..\..\..\packages\xunit.runner.devices.2.3.3\lib\xamarinios10\xunit.runner.utility.netstandard15.dll - - - ..\..\..\..\packages\xunit.abstractions.2.0.1\lib\netstandard1.0\xunit.abstractions.dll - - - ..\..\..\..\packages\xunit.assert.2.3.1\lib\netstandard1.1\xunit.assert.dll - - - ..\..\..\..\packages\xunit.extensibility.core.2.3.1\lib\netstandard1.1\xunit.core.dll - - - ..\..\..\..\packages\xunit.extensibility.execution.2.3.1\lib\netstandard1.1\xunit.execution.dotnet.dll - - - ..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\netstandard1.3\Newtonsoft.Json.dll - - - ..\..\..\..\packages\SlideOverKit.2.1.5\lib\Xamarin.iOS10\SlideOverKit.dll - - - ..\..\..\..\packages\SlideOverKit.2.1.5\lib\Xamarin.iOS10\SlideOverKit.iOS.dll - - - ..\..\..\..\packages\IdentityModel.3.0.0\lib\netstandard2.0\IdentityModel.dll - - - ..\..\..\..\packages\Acr.Support.2.1.0\lib\Xamarin.iOS10\Acr.Support.iOS.dll - - - ..\..\..\..\packages\BTProgressHUD.1.2.0.5\lib\Xamarin.iOS10\BTProgressHUD.dll - - - ..\..\..\..\packages\Splat.2.0.0\lib\Xamarin.iOS10\Splat.dll - - - ..\..\..\..\packages\Acr.UserDialogs.6.5.1\lib\Xamarin.iOS10\Acr.UserDialogs.dll - - - ..\..\..\..\packages\Acr.UserDialogs.6.5.1\lib\Xamarin.iOS10\Acr.UserDialogs.Interface.dll - - - ..\..\..\..\packages\WebP.Touch.1.0.7\lib\Xamarin.iOS10\WebP.Touch.dll - - - ..\..\..\..\packages\Xamarin.FFImageLoading.2.3.4\lib\Xamarin.iOS10\FFImageLoading.dll - - - ..\..\..\..\packages\Xamarin.FFImageLoading.2.3.4\lib\Xamarin.iOS10\FFImageLoading.Platform.dll - - - ..\..\..\..\packages\Xamarin.FFImageLoading.Forms.2.3.4\lib\Xamarin.iOS10\FFImageLoading.Forms.dll - - - ..\..\..\..\packages\Xamarin.FFImageLoading.Forms.2.3.4\lib\Xamarin.iOS10\FFImageLoading.Forms.Touch.dll - - - ..\..\..\..\packages\PInvoke.Windows.Core.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Windows.Core.dll - - - ..\..\..\..\packages\PInvoke.Kernel32.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Kernel32.dll - - - ..\..\..\..\packages\PInvoke.BCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.BCrypt.dll - - - ..\..\..\..\packages\PInvoke.NCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.NCrypt.dll - - - ..\..\..\..\packages\Validation.2.2.8\lib\dotnet\Validation.dll - - - ..\..\..\..\packages\PCLCrypto.2.0.147\lib\xamarinios10\PCLCrypto.dll - - - - - - - - {FDD910BC-DF0F-483D-B7D5-C7D831855172} - eShopOnContainers.UnitTests - - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - + + + + + + \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/packages.config b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/packages.config index 6bbbed083..4a79e3884 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/packages.config +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/packages.config @@ -7,7 +7,7 @@ - + @@ -67,7 +67,7 @@ - + diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/eShopOnContainers.UnitTests.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/eShopOnContainers.UnitTests.csproj index 74e0d0c29..d5c8bdb3b 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/eShopOnContainers.UnitTests.csproj +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/eShopOnContainers.UnitTests.csproj @@ -5,7 +5,7 @@ - + diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/eShopOnContainers.Windows.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/eShopOnContainers.Windows.csproj index 9a1a2d108..5dbe11213 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/eShopOnContainers.Windows.csproj +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/eShopOnContainers.Windows.csproj @@ -180,7 +180,7 @@ - 6.0.6 + 6.1.5 diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/eShopOnContainers.iOS.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/eShopOnContainers.iOS.csproj index 3d18f3a5c..c24b98c02 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/eShopOnContainers.iOS.csproj +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/eShopOnContainers.iOS.csproj @@ -1,428 +1,428 @@  - + + + Debug + iPhoneSimulator + 8.0.30703 + 2.0 + {6EEB23DC-7063-4444-9AF8-90DF24F549C0} + {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Exe + eShopOnContainers.iOS + Resources + eShopOnContainersiOS + + + true + true + + + true + full + false + bin\iPhoneSimulator\Debug + DEBUG + prompt + 4 + false + i386, x86_64 + None + True + False + False + False + False + False + True + Default + HttpClientHandler + False + + + none + true + bin\iPhoneSimulator\Release + prompt + 4 + None + i386, x86_64 + false + + + true + full + false + bin\iPhone\Debug + DEBUG + prompt + 4 + false + ARMv7, ARM64 + iPhone Developer + true + Entitlements.plist + None + + + none + true + bin\iPhone\Release + prompt + 4 + ARMv7, ARM64 + false + iPhone Developer + Entitlements.plist + + + none + True + bin\iPhone\Ad-Hoc + prompt + 4 + False + ARMv7, ARM64 + True + Automatic:AdHoc + iPhone Distribution + Entitlements.plist + + + none + True + bin\iPhone\AppStore + prompt + 4 + False + ARMv7, ARM64 + Automatic:AppStore + iPhone Distribution + Entitlements.plist + + + + + + + Resources\fonts\Montserrat-Bold.ttf + + + Resources\fonts\Montserrat-Regular.ttf + + + Resources\fonts\SourceSansPro-Regular.ttf + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ..\..\..\..\packages\Xamarin.Forms.3.0.0.482510\lib\Xamarin.iOS10\Xamarin.Forms.Core.dll + + + ..\..\..\..\packages\Xamarin.Forms.3.0.0.482510\lib\Xamarin.iOS10\Xamarin.Forms.Platform.dll + + + ..\..\..\..\packages\Xamarin.Forms.3.0.0.482510\lib\Xamarin.iOS10\Xamarin.Forms.Platform.iOS.dll + + + ..\..\..\..\packages\Xamarin.Forms.3.0.0.482510\lib\Xamarin.iOS10\Xamarin.Forms.Xaml.dll + + + + + + ..\..\..\..\packages\WebP.Touch.1.0.7\lib\Xamarin.iOS10\WebP.Touch.dll + + + ..\..\..\..\packages\Xamarin.FFImageLoading.2.3.4\lib\Xamarin.iOS10\FFImageLoading.dll + + + ..\..\..\..\packages\Xamarin.FFImageLoading.2.3.4\lib\Xamarin.iOS10\FFImageLoading.Platform.dll + + + ..\..\..\..\packages\Xamarin.FFImageLoading.Forms.2.3.4\lib\Xamarin.iOS10\FFImageLoading.Forms.dll + + + ..\..\..\..\packages\Xamarin.FFImageLoading.Forms.2.3.4\lib\Xamarin.iOS10\FFImageLoading.Forms.Touch.dll + + + ..\..\..\..\packages\SlideOverKit.2.1.5\lib\Xamarin.iOS10\SlideOverKit.dll + + + ..\..\..\..\packages\SlideOverKit.2.1.5\lib\Xamarin.iOS10\SlideOverKit.iOS.dll + + + ..\..\..\..\packages\Xam.Plugins.Settings.3.1.1\lib\Xamarin.iOS10\Plugin.Settings.Abstractions.dll + + + ..\..\..\..\packages\Xam.Plugins.Settings.3.1.1\lib\Xamarin.iOS10\Plugin.Settings.dll + + + ..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\netstandard1.3\Newtonsoft.Json.dll + + + ..\..\..\..\packages\Acr.Support.2.1.0\lib\Xamarin.iOS10\Acr.Support.iOS.dll + + + ..\..\..\..\packages\BTProgressHUD.1.2.0.5\lib\Xamarin.iOS10\BTProgressHUD.dll + + + ..\..\..\..\packages\Splat.2.0.0\lib\Xamarin.iOS10\Splat.dll + + + ..\..\..\..\packages\Acr.UserDialogs.6.5.1\lib\Xamarin.iOS10\Acr.UserDialogs.dll + + + ..\..\..\..\packages\Acr.UserDialogs.6.5.1\lib\Xamarin.iOS10\Acr.UserDialogs.Interface.dll + + + ..\..\..\..\packages\PInvoke.Windows.Core.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Windows.Core.dll + + + ..\..\..\..\packages\PInvoke.Kernel32.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Kernel32.dll + + + ..\..\..\..\packages\PInvoke.BCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.BCrypt.dll + + + ..\..\..\..\packages\PInvoke.NCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.NCrypt.dll + + + ..\..\..\..\packages\Validation.2.2.8\lib\dotnet\Validation.dll + + + ..\..\..\..\packages\PCLCrypto.2.0.147\lib\xamarinios10\PCLCrypto.dll + + + ..\..\..\..\packages\IdentityModel.3.0.0\lib\netstandard2.0\IdentityModel.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7} + eShopOnContainers.Core + + + + + - Debug - iPhoneSimulator - 8.0.30703 - 2.0 - {6EEB23DC-7063-4444-9AF8-90DF24F549C0} - {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Exe - eShopOnContainers.iOS - Resources - eShopOnContainersiOS - - - true - true + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - true - full - false - bin\iPhoneSimulator\Debug - DEBUG - prompt - 4 - false - i386, x86_64 - None - True - False - False - False - False - False - True - Default - HttpClientHandler - False - - - none - true - bin\iPhoneSimulator\Release - prompt - 4 - None - i386, x86_64 - false - - - true - full - false - bin\iPhone\Debug - DEBUG - prompt - 4 - false - ARMv7, ARM64 - iPhone Developer - true - Entitlements.plist - None - - - none - true - bin\iPhone\Release - prompt - 4 - ARMv7, ARM64 - false - iPhone Developer - Entitlements.plist - - - none - True - bin\iPhone\Ad-Hoc - prompt - 4 - False - ARMv7, ARM64 - True - Automatic:AdHoc - iPhone Distribution - Entitlements.plist - - - none - True - bin\iPhone\AppStore - prompt - 4 - False - ARMv7, ARM64 - Automatic:AppStore - iPhone Distribution - Entitlements.plist - - - - - - - Resources\fonts\Montserrat-Bold.ttf - - - Resources\fonts\Montserrat-Regular.ttf - - - Resources\fonts\SourceSansPro-Regular.ttf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\Xamarin.iOS10\Xamarin.Forms.Core.dll - - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\Xamarin.iOS10\Xamarin.Forms.Platform.dll - - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\Xamarin.iOS10\Xamarin.Forms.Platform.iOS.dll - - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\Xamarin.iOS10\Xamarin.Forms.Xaml.dll - - - ..\..\..\..\packages\WebP.Touch.1.0.7\lib\Xamarin.iOS10\WebP.Touch.dll - - - ..\..\..\..\packages\Xamarin.FFImageLoading.2.3.4\lib\Xamarin.iOS10\FFImageLoading.dll - - - ..\..\..\..\packages\Xamarin.FFImageLoading.2.3.4\lib\Xamarin.iOS10\FFImageLoading.Platform.dll - - - ..\..\..\..\packages\Xamarin.FFImageLoading.Forms.2.3.4\lib\Xamarin.iOS10\FFImageLoading.Forms.dll - - - ..\..\..\..\packages\Xamarin.FFImageLoading.Forms.2.3.4\lib\Xamarin.iOS10\FFImageLoading.Forms.Touch.dll - - - ..\..\..\..\packages\SlideOverKit.2.1.5\lib\Xamarin.iOS10\SlideOverKit.dll - - - ..\..\..\..\packages\SlideOverKit.2.1.5\lib\Xamarin.iOS10\SlideOverKit.iOS.dll - - - ..\..\..\..\packages\Xam.Plugins.Settings.3.1.1\lib\Xamarin.iOS10\Plugin.Settings.Abstractions.dll - - - ..\..\..\..\packages\Xam.Plugins.Settings.3.1.1\lib\Xamarin.iOS10\Plugin.Settings.dll - - - ..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\netstandard1.3\Newtonsoft.Json.dll - - - ..\..\..\..\packages\Acr.Support.2.1.0\lib\Xamarin.iOS10\Acr.Support.iOS.dll - - - ..\..\..\..\packages\BTProgressHUD.1.2.0.5\lib\Xamarin.iOS10\BTProgressHUD.dll - - - ..\..\..\..\packages\Splat.2.0.0\lib\Xamarin.iOS10\Splat.dll - - - ..\..\..\..\packages\Acr.UserDialogs.6.5.1\lib\Xamarin.iOS10\Acr.UserDialogs.dll - - - ..\..\..\..\packages\Acr.UserDialogs.6.5.1\lib\Xamarin.iOS10\Acr.UserDialogs.Interface.dll - - - ..\..\..\..\packages\PInvoke.Windows.Core.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Windows.Core.dll - - - ..\..\..\..\packages\PInvoke.Kernel32.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Kernel32.dll - - - ..\..\..\..\packages\PInvoke.BCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.BCrypt.dll - - - ..\..\..\..\packages\PInvoke.NCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.NCrypt.dll - - - ..\..\..\..\packages\Validation.2.2.8\lib\dotnet\Validation.dll - - - ..\..\..\..\packages\PCLCrypto.2.0.147\lib\xamarinios10\PCLCrypto.dll - - - ..\..\..\..\packages\IdentityModel.3.0.0\lib\netstandard2.0\IdentityModel.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - - - false - - - false - - - false - - - false - - - false - - - false - - - false - - - false - - - false - - - false - - - false - - - false - - - false - - - false - - - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7} - eShopOnContainers.Core - - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - + + + + + + \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/packages.config b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/packages.config index 86db43622..c7802a448 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/packages.config +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/packages.config @@ -7,7 +7,7 @@ - + @@ -67,5 +67,5 @@ - + \ No newline at end of file From 7efacfc519488626beef6253031f424db05cde30 Mon Sep 17 00:00:00 2001 From: David Britch Date: Mon, 4 Jun 2018 12:30:10 +0100 Subject: [PATCH 30/33] Resource files updated. --- .../Resources/Resource.Designer.cs | 18 ++++++++++++++++++ .../Resources/Resource.Designer.cs | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Resources/Resource.Designer.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Resources/Resource.Designer.cs index 074729b61..b3aa8d16c 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Resources/Resource.Designer.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Resources/Resource.Designer.cs @@ -2274,9 +2274,27 @@ namespace eShopOnContainers.Droid // aapt resource value: 0x7f020054 public const int avd_hide_password = 2130837588; + // aapt resource value: 0x7f020127 + public const int avd_hide_password_1 = 2130837799; + + // aapt resource value: 0x7f020128 + public const int avd_hide_password_2 = 2130837800; + + // aapt resource value: 0x7f020129 + public const int avd_hide_password_3 = 2130837801; + // aapt resource value: 0x7f020055 public const int avd_show_password = 2130837589; + // aapt resource value: 0x7f02012a + public const int avd_show_password_1 = 2130837802; + + // aapt resource value: 0x7f02012b + public const int avd_show_password_2 = 2130837803; + + // aapt resource value: 0x7f02012c + public const int avd_show_password_3 = 2130837804; + // aapt resource value: 0x7f020056 public const int background = 2130837590; diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/Resources/Resource.Designer.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/Resources/Resource.Designer.cs index cf88d1538..694a01864 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/Resources/Resource.Designer.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/Resources/Resource.Designer.cs @@ -2268,9 +2268,27 @@ namespace eShopOnContainers.TestRunner.Droid // aapt resource value: 0x7f020053 public const int avd_hide_password = 2130837587; + // aapt resource value: 0x7f020112 + public const int avd_hide_password_1 = 2130837778; + + // aapt resource value: 0x7f020113 + public const int avd_hide_password_2 = 2130837779; + + // aapt resource value: 0x7f020114 + public const int avd_hide_password_3 = 2130837780; + // aapt resource value: 0x7f020054 public const int avd_show_password = 2130837588; + // aapt resource value: 0x7f020115 + public const int avd_show_password_1 = 2130837781; + + // aapt resource value: 0x7f020116 + public const int avd_show_password_2 = 2130837782; + + // aapt resource value: 0x7f020117 + public const int avd_show_password_3 = 2130837783; + // aapt resource value: 0x7f020055 public const int design_bottom_navigation_item_background = 2130837589; From b68260c8944c241dff3fafd9eb3d9af39e417888 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Wed, 6 Jun 2018 16:27:01 -0700 Subject: [PATCH 31/33] Update README.md --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 4637f13ce..a181dcdb4 100644 --- a/README.md +++ b/README.md @@ -9,13 +9,11 @@ Sample .NET Core reference application, powered by Microsoft, based on a simplif **NEWS / ANNOUNCEMENTS** Do you want to be up-to-date on .NET Architecture guidance and reference apps like eShopOnContainers? --> Subscribe by "WATCHING" this new GitHub repo: https://github.com/dotnet-architecture/News -## Updated for .NET Core 2.0 "wave" of technologies -eShopOnContainers is updated to .NET Core 2.0 "wave". Not just compilation but also new recommended code in EF Core 2.0, ASP.NET Core 2.0, and other new related versions. +## Updated for .NET Core 2.0 and 2.1 "wave" of technologies +eShopOnContainers is updated to .NET Core 2.0 and 2.1 "wave". Not just compilation but also new recommended code in EF Core, ASP.NET Core, and other new related versions. The **dockerfiles** in the solution have also been updated and now support [**Docker Multi-Stage**](https://blogs.msdn.microsoft.com/stevelasker/2017/09/11/net-and-multistage-dockerfiles/) since mid-December 2017. -For a list on the new .NET Core 2.0 related implemented features, see this [blog post](https://blogs.msdn.microsoft.com/dotnet/2017/08/02/microservices-and-docker-containers-architecture-patterns-and-development-guidance/). - >**PLEASE** Read our [branch guide](./branch-guide.md) to know about our branching policy > ### DISCLAIMER From 722783a74be9960d709f046b710fce7cb098f2e4 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Llorente Date: Fri, 8 Jun 2018 19:58:04 -0700 Subject: [PATCH 32/33] Global.json updated to current .NET Core SDK targeting .NET Core 2.1 --- global.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/global.json b/global.json index 97e2836a2..2beae201a 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ -// { -// "sdk": { -// "version": "2.1.4" -// } -// } \ No newline at end of file +{ + "sdk": { + "version": "2.1.3" + } +} \ No newline at end of file From 33366ea4cac7b23cbb87f1a287a9c7a5fc08cc99 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Llorente Date: Fri, 8 Jun 2018 20:06:01 -0700 Subject: [PATCH 33/33] Setting the right SDK version: 2.1.300 --- global.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global.json b/global.json index 2beae201a..386035de8 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "2.1.3" + "version": "2.1.300" } } \ No newline at end of file