Foundatio.Redis 10.5.0 The ID prefix of this package has been reserved for one of the owners of this package by NuGet.org. Prefix Reserved

.NET Standard 2.0
Install-Package Foundatio.Redis -Version 10.5.0
dotnet add package Foundatio.Redis --version 10.5.0
<PackageReference Include="Foundatio.Redis" Version="10.5.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Foundatio.Redis --version 10.5.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: Foundatio.Redis, 10.5.0"
#r directive can be used in F# Interactive, C# scripting and .NET Interactive. Copy this into the interactive tool or source code of the script to reference the package.
// Install Foundatio.Redis as a Cake Addin
#addin nuget:?package=Foundatio.Redis&version=10.5.0

// Install Foundatio.Redis as a Cake Tool
#tool nuget:?package=Foundatio.Redis&version=10.5.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.

FoundatioFoundatio

Build status NuGet Version feedz.io Discord

Pluggable foundation blocks for building loosely coupled distributed apps.

Includes implementations in Redis, Azure, AWS, RabbitMQ and in memory (for development).

Why Foundatio?

When building several big cloud applications we found a lack of great solutions (that's not to say there isn't solutions out there) for many key pieces to building scalable distributed applications while keeping the development experience simple. Here are a few examples of why we built and use Foundatio:

  • Wanted to build against abstract interfaces so that we could easily change implementations.
  • Wanted the blocks to be dependency injection friendly.
  • Caching: We were initially using an open source Redis cache client but then it turned into a commercial product with high licensing costs. Not only that, but there weren't any in memory implementations so every developer was required to set up and configure Redis.
  • Message Bus: We initially looked at NServiceBus (great product) but it had high licensing costs (they have to eat too) but was not OSS friendly. We also looked into MassTransit but found Azure support lacking and local set up a pain. We wanted a simple message bus that just worked locally or in the cloud.
  • Storage: We couldn't find any existing project that was decoupled and supported in memory, file storage or Azure Blob Storage.

To summarize, if you want pain free development and testing while allowing your app to scale, use Foundatio!

Implementations

Getting Started (Development)

Foundatio can be installed via the NuGet package manager. If you need help, please open an issue or join our Discord chat room. We’re always here to help if you have any questions!

This section is for development purposes only! If you are trying to use the Foundatio libraries, please get them from NuGet.

  1. You will need to have Visual Studio Code installed.
  2. Open the Foundatio.sln Visual Studio solution file.

Using Foundatio

The sections below contain a small subset of what's possible with Foundatio. We recommend taking a peek at the source code for more information. Please let us know if you have any questions or need assistance!

Caching

Caching allows you to store and access data lightning fast, saving you exspensive operations to create or get data. We provide four different cache implementations that derive from the ICacheClient interface:

  1. InMemoryCacheClient: An in memory cache client implementation. This cache implementation is only valid for the lifetime of the process. It's worth noting that the in memory cache client has the ability to cache the last X items via the MaxItems property. We use this in Exceptionless to only keep the last 250 resolved geoip results.
  2. HybridCacheClient: This cache implementation uses the InMemoryCacheClient and uses the IMessageBus to keep the cache in sync across processes.
  3. RedisCacheClient: A Redis cache client implementation.
  4. RedisHybridCacheClient: This cache implementation uses both the RedisCacheClient and InMemoryCacheClient implementations and uses the RedisMessageBus to keep the in memory cache in sync across processes. This can lead to huge wins in performance as you are saving a serialization operation and call to Redis if the item exists in the local cache.
  5. ScopedCacheClient: This cache implementation takes an instance of ICacheClient and a string scope. The scope is prefixed onto every cache key. This makes it really easy to scope all cache keys and remove them with ease.
Sample
using Foundatio.Caching;

ICacheClient cache = new InMemoryCacheClient();
await cache.SetAsync("test", 1);
var value = await cache.GetAsync<int>("test");

Queues

Queues offer First In, First Out (FIFO) message delivery. We provide four different queue implementations that derive from the IQueue interface:

  1. InMemoryQueue: An in memory queue implementation. This queue implementation is only valid for the lifetime of the process.
  2. RedisQueue: An Redis queue implementation.
  3. AzureServiceBusQueue: An Azure Service Bus Queue implementation.
  4. AzureStorageQueue: An Azure Storage Queue implementation.
  5. SQSQueue: An AWS SQS implementation.
Sample
using Foundatio.Queues;

IQueue<SimpleWorkItem> queue = new InMemoryQueue<SimpleWorkItem>();

await queue.EnqueueAsync(new SimpleWorkItem {
    Data = "Hello"
});

var workItem = await queue.DequeueAsync();

Locks

Locks ensure a resource is only accessed by one consumer at any given time. We provide two different locking implementations that derive from the ILockProvider interface:

  1. CacheLockProvider: A lock implementation that uses cache to communicate between processes.
  2. ThrottlingLockProvider: A lock implementation that only allows a certain amount of locks through. You could use this to throttle api calls to some external service and it will throttle them across all processes asking for that lock.
  3. ScopedLockProvider: This lock implementation takes an instance of ILockProvider and a string scope. The scope is prefixed onto every lock key. This makes it really easy to scope all locks and release them with ease.

It's worth noting that all lock providers take a ICacheClient. This allows you to ensure your code locks properly across machines.

Sample
using Foundatio.Lock;

ILockProvider locker = new CacheLockProvider(new InMemoryCacheClient(), new InMemoryMessageBus());
var lock = await locker.AcquireAsync("test");
// ...
await lock.ReleaseAsync();

ILockProvider throttledLocker = new ThrottlingLockProvider(new InMemoryCacheClient(), 1, TimeSpan.FromMinutes(1));
var throttledLock = await throttledLocker.AcquireAsync("test");
// ...
await throttledLock.ReleaseAsync();

Messaging

Allows you to publish and subscribe to messages flowing through your application. We provide four different message bus implementations that derive from the IMessageBus interface:

  1. InMemoryMessageBus: An in memory message bus implementation. This message bus implementation is only valid for the lifetime of the process.
  2. RedisMessageBus: A Redis message bus implementation.
  3. RabbitMQMessageBus: A RabbitMQ implementation.
  4. AzureServiceBusMessageBus: An Azure Service Bus implementation.
Sample
using Foundatio.Messaging;

IMessageBus messageBus = new InMemoryMessageBus();
await messageBus.SubscribeAsync<SimpleMessageA>(msg => {
  // Got message
});

await messageBus.PublishAsync(new SimpleMessageA { Data = "Hello" });

Jobs

Allows you to run a long running process (in process or out of process) without worrying about it being terminated prematurely. We provide three different ways of defining a job, based on your use case:

  1. Jobs: All jobs must derive from the IJob interface. We also have a JobBase base class you can derive from which provides a JobContext and logging. You can then run jobs by calling RunAsync() on the job or by creating a instance of the JobRunner class and calling one of the Run methods. The JobRunner can be used to easily run your jobs as Azure Web Jobs.
Sample
using Foundatio.Jobs;

public class HelloWorldJob : JobBase {
  public int RunCount { get; set; }

  protected override Task<JobResult> RunInternalAsync(JobContext context) {
     RunCount++;
     return Task.FromResult(JobResult.Success);
  }
}
var job = new HelloWorldJob();
await job.RunAsync(); // job.RunCount = 1;
await job.RunContinuousAsync(iterationLimit: 2); // job.RunCount = 3;
await job.RunContinuousAsync(cancellationToken: new CancellationTokenSource(10).Token); // job.RunCount > 10;
  1. Queue Processor Jobs: A queue processor job works great for working with jobs that will be driven from queued data. Queue Processor jobs must derive from QueueJobBase<T> class. You can then run jobs by calling RunAsync() on the job or passing it to the JobRunner class. The JobRunner can be used to easily run your jobs as Azure Web Jobs.
Sample
using Foundatio.Jobs;

public class HelloWorldQueueJob : QueueJobBase<HelloWorldQueueItem> {
  public int RunCount { get; set; }

  public HelloWorldQueueJob(IQueue<HelloWorldQueueItem> queue) : base(queue) {}

  protected override Task<JobResult> ProcessQueueEntryAsync(QueueEntryContext<HelloWorldQueueItem> context) {
     RunCount++;

     return Task.FromResult(JobResult.Success);
  }
}

public class HelloWorldQueueItem {
  public string Message { get; set; }
}
 // Register the queue for HelloWorldQueueItem.
container.AddSingleton<IQueue<HelloWorldQueueItem>>(s => new InMemoryQueue<HelloWorldQueueItem>());

// To trigger the job we need to queue the HelloWorldWorkItem message.
// This assumes that we injected an instance of IQueue<HelloWorldWorkItem> queue

IJob job = new HelloWorldQueueJob();
await job.RunAsync(); // job.RunCount = 0; The RunCount wasn't incremented because we didn't enqueue any data.

await queue.EnqueueAsync(new HelloWorldWorkItem { Message = "Hello World" });
await job.RunAsync(); // job.RunCount = 1;

await queue.EnqueueAsync(new HelloWorldWorkItem { Message = "Hello World" });
await queue.EnqueueAsync(new HelloWorldWorkItem { Message = "Hello World" });
await job.RunUntilEmptyAsync(); // job.RunCount = 3;
  1. Work Item Jobs: A work item job will run in a job pool among other work item jobs. This type of job works great for things that don't happen often but should be in a job (Example: Deleting an entity that has many children.). It will be triggered when you publish a message on the message bus. The job must derive from the WorkItemHandlerBase class. You can then run all shared jobs via JobRunner class. The JobRunner can be used to easily run your jobs as Azure Web Jobs.
Sample
using System.Threading.Tasks;
using Foundatio.Jobs;

public class HelloWorldWorkItemHandler : WorkItemHandlerBase {
  public override async Task HandleItemAsync(WorkItemContext ctx) {
    var workItem = ctx.GetData<HelloWorldWorkItem>();

    // We can report the progress over the message bus easily.
    // To receive these messages just inject IMessageSubscriber
    // and Subscribe to messages of type WorkItemStatus
    await ctx.ReportProgressAsync(0, "Starting Hello World Job");
    await Task.Delay(TimeSpan.FromSeconds(2.5));
    await ctx.ReportProgressAsync(50, "Reading value");
    await Task.Delay(TimeSpan.FromSeconds(.5));
    await ctx.ReportProgressAsync(70, "Reading value.");
    await Task.Delay(TimeSpan.FromSeconds(.5));
    await ctx.ReportProgressAsync(90, "Reading value..");
    await Task.Delay(TimeSpan.FromSeconds(.5));

    await ctx.ReportProgressAsync(100, workItem.Message);
  }
}

public class HelloWorldWorkItem {
  public string Message { get; set; }
}
// Register the shared job.
var handlers = new WorkItemHandlers();
handlers.Register<HelloWorldWorkItem, HelloWorldWorkItemHandler>();

// Register the handlers with dependency injection.
container.AddSingleton(handlers);

// Register the queue for WorkItemData.
container.AddSingleton<IQueue<WorkItemData>>(s => new InMemoryQueue<WorkItemData>());

// The job runner will automatically look for and run all registered WorkItemHandlers.
new JobRunner(container.GetRequiredService<WorkItemJob>(), instanceCount: 2).RunInBackground();
 // To trigger the job we need to queue the HelloWorldWorkItem message.
 // This assumes that we injected an instance of IQueue<WorkItemData> queue

 // NOTE: You may have noticed that HelloWorldWorkItem doesn't derive from WorkItemData.
 // Foundatio has an extension method that takes the model you post and serializes it to the
 // WorkItemData.Data property.
 await queue.EnqueueAsync(new HelloWorldWorkItem { Message = "Hello World" });

File Storage

We provide different file storage implementations that derive from the IFileStorage interface:

  1. InMemoryFileStorage: An in memory file implementation. This file storage implementation is only valid for the lifetime of the process.
  2. FolderFileStorage: An file storage implementation that uses the hard drive for storage.
  3. AzureFileStorage: An Azure Blob storage implementation.
  4. S3FileStorage: An AWS S3 file storage implementation.
  5. RedisFileStorage: An Redis file storage implementation.
  6. MinioFileStorage An Minio file storage implementation.
  7. AliyunFileStorage: An Aliyun file storage implementation.
  8. SshNetFileStorage: An SFTP file storage implementation.

We recommend using all of the IFileStorage implementations as singletons.

Sample
using Foundatio.Storage;

IFileStorage storage = new InMemoryFileStorage();
await storage.SaveFileAsync("test.txt", "test");
string content = await storage.GetFileContentsAsync("test.txt")

Metrics

We provide five implementations that derive from the IMetricsClient interface:

  1. InMemoryMetricsClient: An in memory metrics implementation.
  2. RedisMetricsClient: An Redis metrics implementation.
  3. StatsDMetricsClient: An statsd metrics implementation.
  4. MetricsNETClient: An Metrics.NET implementation.
  5. AppMetricsClient: An AppMetrics implementation.
  6. CloudWatchMetricsClient: An AWS CloudWatch implementation.

We recommend using all of the IMetricsClient implementations as singletons.

Sample
IMetricsClient metrics = new InMemoryMetricsClient();
metrics.Counter("c1");
metrics.Gauge("g1", 2.534);
metrics.Timer("t1", 50788);

Sample Application

We have both slides and a sample application that shows off how to use Foundatio.

Roadmap

This is a list of high level things that we are planning to do:

Product Versions
.NET net5.0 net5.0-windows net6.0 net6.0-android net6.0-ios net6.0-maccatalyst net6.0-macos net6.0-tvos net6.0-windows
.NET Core netcoreapp2.0 netcoreapp2.1 netcoreapp2.2 netcoreapp3.0 netcoreapp3.1
.NET Standard netstandard2.0 netstandard2.1
.NET Framework net461 net462 net463 net47 net471 net472 net48
MonoAndroid monoandroid
MonoMac monomac
MonoTouch monotouch
Tizen tizen40 tizen60
Xamarin.iOS xamarinios
Xamarin.Mac xamarinmac
Xamarin.TVOS xamarintvos
Xamarin.WatchOS xamarinwatchos
Compatible target framework(s)
Additional computed target framework(s)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (6)

Showing the top 5 NuGet packages that depend on Foundatio.Redis:

Package Downloads
SoftwarePioniere.Fx.Redis

Package Description

SoftwarePioniere.Foundatio.Redis

Software Pioniere Fx Foundatio Redis Extensions

HttpRequester

Multiple http clients

IFramework.FoundatioRedis

Description

Tcg.Owin.Cookies.SessionStore.Redis

Package Description

GitHub repositories (1)

Showing the top 1 popular GitHub repositories that depend on Foundatio.Redis:

Repository Stars
exceptionless/Exceptionless
Exceptionless server and jobs
Version Downloads Last updated
10.5.0 401 5/18/2022
10.4.0 7,390 3/8/2022
10.3.0 4,165 1/20/2022
10.2.3 58,620 9/24/2021
10.2.2 203 9/23/2021
10.2.0 29,317 7/8/2021
10.1.0 7,025 6/16/2021
10.0.2 35,310 1/20/2021
10.0.0 28,642 9/16/2020
10.0.0-beta9 904 8/25/2020
10.0.0-beta8 302 8/3/2020
10.0.0-beta6 765 7/8/2020
10.0.0-beta5 480 6/20/2020
10.0.0-beta3 400 6/14/2020
10.0.0-beta2 349 6/6/2020
10.0.0-beta10 298 9/16/2020
10.0.0-beta1 357 5/26/2020
9.0.0 54,866 1/16/2020
8.1.1662 69,516 8/30/2019
8.1.1651 12,115 8/1/2019
8.1.1648 1,128 7/20/2019
8.1.1642 10,327 5/14/2019
8.1.1638 2,136 4/16/2019
8.0.1631 1,116 4/3/2019
8.0.1627 8,409 2/24/2019
8.0.1621 783 2/22/2019
7.1.1608 82,384 11/9/2018
7.0.1584 3,442 10/18/2018
7.0.1570 2,086 9/7/2018
7.0.1564 17,287 5/9/2018
6.0.1496 5,600 11/30/2017
5.1.1478 8,923 8/21/2017
5.1.1468 4,907 6/23/2017
5.1.1460 1,350 5/5/2017
5.0.1336 999 3/14/2017
5.0.1334 805 3/13/2017
5.0.1331 816 3/12/2017
5.0.1329-pre 699 3/12/2017
5.0.1328-pre 698 3/12/2017
5.0.1327-pre 755 3/12/2017
5.0.1326-pre 755 3/12/2017
5.0.1324-pre 732 3/12/2017
4.3.1323-pre 725 3/11/2017
4.3.1317 2,694 2/23/2017
4.3.1316 861 2/22/2017
4.3.1315 928 2/22/2017
4.3.1314 1,082 2/20/2017
4.3.1312 842 2/20/2017
4.3.1311-pre 722 2/20/2017
4.3.1307 868 2/16/2017
4.3.1306 878 2/15/2017
4.3.1305 794 2/15/2017
4.3.1304-pre 721 2/15/2017
4.3.1303-pre 692 2/14/2017
4.3.1301 848 2/14/2017
4.3.1299 831 2/14/2017
4.3.1293 892 2/12/2017
4.3.1292 878 2/10/2017
4.3.1291 879 2/10/2017
4.3.1290 836 2/10/2017
4.3.1289 836 2/9/2017
4.3.1288 786 2/9/2017
4.3.1286 796 2/8/2017
4.3.1282 858 2/5/2017
4.3.1281 828 2/5/2017
4.3.1280 837 2/5/2017
4.3.1276-pre 713 2/5/2017
4.3.1177-pre 865 9/2/2016
4.3.1164-pre 709 8/21/2016
4.2.1205-pre 1,039 9/19/2016
4.2.1183 1,784 9/9/2016
4.2.1179 767 9/8/2016
4.2.1176 804 9/2/2016
4.2.1172 741 9/1/2016
4.2.1171-pre 730 9/1/2016
4.2.1169 811 8/22/2016
4.2.1167-pre 695 8/22/2016
4.2.1166-pre 721 8/22/2016
4.2.1161 766 8/10/2016
4.2.1156-pre 669 8/2/2016
4.2.1155 780 8/1/2016
4.2.1150 980 7/20/2016
4.2.1149-pre 728 7/19/2016
4.2.1148-pre 717 7/19/2016
4.2.1147-pre 687 7/19/2016
4.2.1146-pre 726 7/19/2016
4.2.1137 781 7/19/2016
4.2.1129-pre 699 7/19/2016
4.2.1128-pre 687 7/19/2016
4.2.1127-pre 665 7/19/2016
4.2.1126-pre 688 7/19/2016
4.2.1125-pre 691 7/19/2016
4.2.1123-pre 720 7/19/2016
4.2.1119-pre 690 7/18/2016
4.2.1113-pre 733 7/16/2016
4.2.1108-pre 769 7/15/2016
4.2.1107-pre 756 7/15/2016
4.2.1104-pre 924 7/13/2016
4.2.1099-pre 914 7/12/2016
4.2.1098-pre 899 7/12/2016
4.2.1093-pre 776 7/8/2016
4.2.1091-pre 792 7/8/2016
4.2.1090-pre 789 7/8/2016
4.2.1089-pre 785 7/7/2016
4.2.1087-pre 785 7/7/2016
4.2.1083-pre 778 7/6/2016
4.2.1082-pre 758 7/6/2016
4.2.1081-pre 763 7/6/2016
4.2.1079-pre 756 7/6/2016
4.2.1078-pre 737 7/6/2016
4.2.1073-pre 777 7/5/2016
4.2.1070-pre 792 7/5/2016
4.2.1069-pre 734 7/1/2016
4.2.1059-pre 750 7/1/2016
4.2.1046-pre 708 6/24/2016
4.2.1031-pre 683 6/24/2016
4.2.1028-pre 701 6/24/2016
4.2.1027-pre 704 6/24/2016
4.1.1009 1,024 6/15/2016
4.1.1002-pre 998 6/14/2016
4.1.995-pre 1,003 6/13/2016
4.1.989-pre 1,031 5/26/2016
4.1.983-pre 719 5/25/2016
4.1.982-pre 684 5/25/2016
4.1.978-pre 785 5/6/2016
4.1.977-pre 864 5/5/2016
4.1.975-pre 693 5/5/2016
4.0.958 2,388 5/1/2016
4.0.957 905 4/29/2016
4.0.956 924 4/29/2016
4.0.955 788 4/28/2016
4.0.941 1,085 4/27/2016
4.0.940 1,010 4/27/2016
4.0.925 940 4/27/2016
4.0.922 906 4/27/2016
4.0.909 1,009 4/20/2016
4.0.880 1,215 4/7/2016
4.0.869 841 3/30/2016
4.0.864 759 3/29/2016
4.0.861 753 3/29/2016
4.0.860 761 3/29/2016
4.0.857 753 3/29/2016
4.0.855 790 3/29/2016
4.0.846 908 3/22/2016
4.0.842 931 3/21/2016
4.0.836 836 3/18/2016
4.0.835 802 3/18/2016
4.0.834 761 3/17/2016
4.0.832 805 3/17/2016
4.0.831 755 3/16/2016
4.0.829 768 3/16/2016
4.0.828 770 3/15/2016
4.0.827 756 3/15/2016
4.0.826 771 3/15/2016
4.0.825 1,030 3/13/2016
4.0.821 830 3/11/2016
4.0.819 764 3/11/2016
4.0.818 820 3/11/2016
4.0.816 873 3/11/2016
4.0.815 763 3/11/2016
4.0.814 849 3/11/2016
4.0.813 773 3/10/2016
4.0.812 855 3/10/2016
4.0.811 817 3/10/2016
4.0.810 793 3/10/2016
4.0.809 783 3/10/2016
4.0.805 770 3/9/2016
4.0.797 749 3/9/2016
4.0.796 802 3/9/2016
4.0.794 780 3/9/2016
4.0.793 798 3/9/2016
4.0.792 763 3/8/2016
4.0.791 773 3/8/2016
4.0.790 761 3/8/2016
4.0.788 745 3/8/2016
4.0.774 918 3/2/2016
4.0.773 801 3/1/2016
4.0.772 845 3/1/2016
4.0.770 849 3/1/2016
4.0.769 768 3/1/2016
4.0.762 757 3/1/2016
4.0.761 739 3/1/2016
4.0.760 1,203 2/29/2016
4.0.759 741 2/29/2016
4.0.758 728 2/29/2016
4.0.757 769 2/29/2016
4.0.756 1,239 2/27/2016
4.0.755 1,210 2/27/2016
4.0.754 798 2/27/2016
4.0.753 1,124 2/27/2016
4.0.752 1,215 2/27/2016
4.0.750 1,249 2/27/2016
4.0.749 977 2/27/2016
4.0.747 882 2/26/2016
4.0.746 1,062 2/26/2016
4.0.744 919 2/26/2016
4.0.743 1,161 2/26/2016
4.0.742 848 2/26/2016
4.0.741 1,097 2/26/2016
4.0.739 1,018 2/25/2016
4.0.738 965 2/25/2016
4.0.734 904 2/25/2016
4.0.733-beta 1,004 2/25/2016
4.0.672 944 2/16/2016
4.0.669 939 2/11/2016
4.0.668 780 2/11/2016
3.0.654 2,172 2/10/2016
3.0.646 802 2/5/2016
3.0.645 774 2/5/2016
3.0.644 792 2/5/2016
3.0.639 794 2/3/2016
3.0.638 776 2/2/2016
3.0.637 793 2/1/2016
3.0.635 772 2/1/2016
3.0.633 892 1/27/2016
3.0.632 759 1/27/2016
3.0.629 1,139 1/18/2016
3.0.626 783 1/18/2016
3.0.625 1,018 1/18/2016
3.0.624 1,387 12/17/2015
3.0.623 866 12/9/2015
3.0.622 769 12/9/2015
3.0.621 825 12/9/2015
3.0.620 793 12/8/2015
3.0.613 810 12/4/2015
3.0.611 1,092 12/3/2015
3.0.610 1,121 11/30/2015
3.0.606 1,073 11/30/2015
3.0.605 907 11/25/2015
3.0.603 933 11/23/2015
3.0.601 865 11/23/2015
3.0.600 855 11/19/2015
3.0.599 852 11/19/2015
3.0.598 860 11/17/2015
3.0.592 830 11/12/2015
3.0.589 857 11/10/2015
3.0.588 782 11/10/2015
3.0.586 812 11/10/2015
3.0.584 815 11/10/2015
3.0.583 808 11/10/2015
3.0.581 796 11/6/2015
3.0.579 801 11/6/2015
3.0.576 843 11/5/2015
3.0.575 799 11/4/2015
3.0.574 813 11/4/2015
3.0.569 837 11/3/2015
3.0.568 850 11/3/2015
3.0.566 780 11/3/2015
3.0.545 965 10/28/2015
3.0.538 906 10/22/2015
3.0.537 790 10/21/2015
3.0.536 808 10/21/2015
3.0.534 800 10/21/2015
3.0.532 779 10/21/2015
3.0.531 862 10/21/2015
3.0.524 791 10/15/2015
3.0.523 859 10/10/2015
3.0.522 852 10/10/2015
3.0.520 944 10/9/2015
3.0.519 854 10/9/2015
3.0.518 1,067 10/9/2015
3.0.517 1,147 10/9/2015
3.0.516 886 10/7/2015
3.0.514 1,153 10/6/2015
3.0.513 1,103 10/6/2015
3.0.512 869 10/6/2015
3.0.509 977 10/1/2015
3.0.507 914 10/1/2015
3.0.505 927 9/30/2015
3.0.503 958 9/30/2015
3.0.502 910 9/30/2015
3.0.479 887 9/25/2015
3.0.476 889 9/24/2015
3.0.471 858 9/24/2015
3.0.470 862 9/24/2015
3.0.469 873 9/24/2015
3.0.468 865 9/24/2015
3.0.467 850 9/24/2015
3.0.465 859 9/24/2015
3.0.459 846 9/23/2015
3.0.456 841 9/23/2015
3.0.455 882 9/22/2015
3.0.454 897 9/19/2015
3.0.453 847 9/19/2015
3.0.452 837 9/18/2015
3.0.451 898 9/18/2015
3.0.450 833 9/18/2015
3.0.447 886 9/18/2015
2.0.378 896 9/5/2015
2.0.372 797 9/4/2015
2.0.370 848 9/4/2015
2.0.368 849 9/4/2015
2.0.365 1,692 9/3/2015
2.0.363 857 9/3/2015
2.0.361 838 9/3/2015
1.0.360 818 9/1/2015
1.0.359 798 9/1/2015
1.0.358 809 9/1/2015
1.0.356 827 8/31/2015
1.0.355 823 8/31/2015
1.0.354 822 8/29/2015
1.0.305 813 8/19/2015
1.0.299 1,172 8/8/2015
1.0.293 862 7/20/2015
1.0.292 930 7/20/2015
1.0.289 1,038 7/10/2015
1.0.288 806 7/10/2015
1.0.286 932 7/7/2015
1.0.285 833 7/7/2015
1.0.284 808 7/7/2015
1.0.282 832 7/6/2015
1.0.281 818 7/6/2015
1.0.279 799 7/6/2015
1.0.277 897 6/18/2015
1.0.276 848 6/8/2015
1.0.275 793 6/8/2015
1.0.274 808 6/8/2015
1.0.272 1,219 6/1/2015
1.0.269 850 5/25/2015
1.0.268 836 5/24/2015
1.0.266 775 5/24/2015
1.0.263 790 5/21/2015
1.0.258 812 5/19/2015
1.0.257 830 5/18/2015
1.0.256 915 5/17/2015
1.0.254 801 5/13/2015
1.0.253 777 5/13/2015
1.0.250 785 5/13/2015
1.0.249 792 5/12/2015
1.0.248 771 5/12/2015
1.0.245 773 5/12/2015
1.0.241 796 5/12/2015
1.0.240 791 5/12/2015
1.0.237 814 5/11/2015
1.0.234 791 5/9/2015
1.0.233 816 5/9/2015
1.0.231 785 5/7/2015
1.0.230 810 5/7/2015
1.0.229 803 5/7/2015
1.0.226 886 5/7/2015
1.0.217 1,043 4/28/2015
1.0.215 996 4/27/2015
1.0.213 1,039 4/23/2015
1.0.210 933 4/23/2015
1.0.209 854 4/15/2015
1.0.202 879 4/15/2015
1.0.201 849 4/15/2015
1.0.198 931 4/15/2015
1.0.197 862 4/15/2015
1.0.196 862 4/15/2015
1.0.195 860 4/15/2015
1.0.194 879 4/15/2015
1.0.193 870 4/15/2015
1.0.192 878 4/15/2015
1.0.191 910 4/14/2015
1.0.189 906 4/10/2015
1.0.187 821 4/9/2015
1.0.186 840 4/8/2015
1.0.185 941 4/6/2015
1.0.183 827 4/3/2015
1.0.181 877 4/3/2015
1.0.180 843 4/2/2015
1.0.178 872 4/1/2015
1.0.177 830 4/1/2015
1.0.175 825 4/1/2015
1.0.171 815 3/31/2015
1.0.170 845 3/31/2015
1.0.168 826 3/31/2015
1.0.164 823 3/30/2015
1.0.162 824 3/28/2015
1.0.160 863 3/27/2015
1.0.159 814 3/26/2015
1.0.157 1,066 3/24/2015
1.0.156 825 3/24/2015
1.0.154 805 3/24/2015
1.0.152 866 3/24/2015
1.0.151 813 3/24/2015
1.0.150 821 3/23/2015
1.0.149 824 3/23/2015
1.0.148 848 3/23/2015
1.0.147 826 3/21/2015
1.0.146 813 3/20/2015
1.0.145 830 3/19/2015
1.0.143 804 3/18/2015
1.0.142 960 3/12/2015
1.0.141 803 3/12/2015
1.0.140 985 3/5/2015
1.0.139 814 3/5/2015
1.0.138 856 3/4/2015
1.0.137 907 3/3/2015
1.0.134 806 3/3/2015
1.0.129 831 3/3/2015
1.0.128 1,122 3/3/2015
1.0.125 905 2/28/2015
1.0.124 936 2/28/2015
1.0.122 1,057 2/28/2015
1.0.119 1,232 2/25/2015
1.0.117 1,373 2/24/2015
1.0.115 1,172 2/24/2015
1.0.114 1,170 2/23/2015
1.0.113 1,172 2/23/2015
1.0.112 1,203 2/23/2015
1.0.111 1,140 2/23/2015
1.0.110 1,181 2/23/2015
1.0.109 1,236 2/22/2015
1.0.108 1,189 2/22/2015
1.0.103 1,073 2/22/2015
1.0.37 1,052 2/18/2015
1.0.36 1,094 2/18/2015
1.0.35 1,039 2/17/2015
1.0.34 1,045 2/17/2015
1.0.33 1,083 2/17/2015
1.0.32 819 2/15/2015
1.0.31 1,060 2/15/2015
1.0.30 1,063 2/15/2015
1.0.28 1,063 2/15/2015
1.0.27 1,082 2/15/2015
1.0.26 1,076 2/13/2015
1.0.25 1,026 2/13/2015
1.0.24 1,000 2/12/2015
1.0.23 1,053 2/12/2015
1.0.0 1,238 2/21/2015