Foundatio.AzureServiceBus 10.5.0

.NET Standard 2.0
NuGet\Install-Package Foundatio.AzureServiceBus -Version 10.5.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
dotnet add package Foundatio.AzureServiceBus --version 10.5.0
<PackageReference Include="Foundatio.AzureServiceBus" Version="10.5.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Foundatio.AzureServiceBus --version 10.5.0
#r "nuget: Foundatio.AzureServiceBus, 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.AzureServiceBus as a Cake Addin
#addin nuget:?package=Foundatio.AzureServiceBus&version=10.5.0

// Install Foundatio.AzureServiceBus as a Cake Tool
#tool nuget:?package=Foundatio.AzureServiceBus&version=10.5.0

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 (1)

Showing the top 1 NuGet packages that depend on Foundatio.AzureServiceBus:

Package Downloads
SoftwarePioniere.Fx.Hosting

Package Description

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
10.5.0 1,191 5/18/2022
10.4.0 913 3/8/2022
10.3.0 520 1/20/2022
10.2.2 1,065 9/23/2021
10.2.0 15,555 7/8/2021
10.1.0 471 6/16/2021
10.0.2 1,800 1/20/2021
10.0.0 1,632 9/16/2020
10.0.0-beta9 343 8/25/2020
10.0.0-beta8 310 8/3/2020
10.0.0-beta7 321 7/29/2020
10.0.0-beta6 366 7/8/2020
10.0.0-beta5 486 6/20/2020
10.0.0-beta3 416 6/14/2020
10.0.0-beta2 407 6/6/2020
10.0.0-beta10 336 9/15/2020
10.0.0-beta1 377 5/26/2020
9.0.0 38,882 1/16/2020
8.1.1518 45,118 8/30/2019
8.0.1512 6,585 5/14/2019
8.0.1510 547 4/16/2019
8.0.1507 605 2/24/2019
8.0.1505 552 2/22/2019
7.0.1490 812 5/9/2018
6.0.1467 930 11/30/2017
5.1.1454 854 5/5/2017
5.0.1336 887 3/14/2017
5.0.1334 741 3/13/2017
5.0.1331 763 3/12/2017
5.0.1329-pre 682 3/12/2017
5.0.1328-pre 701 3/12/2017
5.0.1327-pre 702 3/12/2017
5.0.1326-pre 697 3/12/2017
5.0.1324-pre 687 3/12/2017
4.3.1323-pre 701 3/11/2017
4.3.1319 771 3/1/2017
4.3.1317 737 2/23/2017
4.3.1316 782 2/22/2017
4.3.1315 780 2/22/2017
4.3.1314 768 2/20/2017
4.3.1312 768 2/20/2017
4.3.1311-pre 756 2/20/2017
4.3.1307 789 2/16/2017
4.3.1306 774 2/15/2017
4.3.1305 767 2/15/2017
4.3.1304-pre 696 2/15/2017
4.3.1303-pre 716 2/14/2017
4.3.1301 759 2/14/2017
4.3.1299 750 2/14/2017
4.3.1293 785 2/12/2017
4.3.1292 746 2/10/2017
4.3.1291 806 2/10/2017
4.3.1290 769 2/10/2017
4.3.1289 773 2/9/2017
4.3.1288 750 2/9/2017
4.3.1286 766 2/8/2017
4.3.1282 755 2/5/2017
4.3.1281 761 2/5/2017
4.3.1280 749 2/5/2017
4.3.1276-pre 673 2/5/2017
4.3.1177-pre 727 9/2/2016
4.3.1164-pre 736 8/21/2016
4.2.1205-pre 1,049 9/19/2016
4.2.1183 905 9/9/2016
4.2.1179 788 9/8/2016
4.2.1176 777 9/2/2016
4.2.1172 752 9/1/2016
4.2.1171-pre 726 9/1/2016
4.2.1169 768 8/22/2016
4.2.1167-pre 687 8/22/2016
4.2.1166-pre 696 8/22/2016
4.2.1161 773 8/10/2016
4.2.1156-pre 729 8/2/2016
4.2.1155 771 8/1/2016
4.2.1150 810 7/20/2016
4.2.1149-pre 715 7/19/2016
4.2.1148-pre 716 7/19/2016
4.2.1147-pre 736 7/19/2016
4.2.1146-pre 701 7/19/2016
4.2.1137 827 7/19/2016
4.2.1129-pre 707 7/19/2016
4.2.1128-pre 742 7/19/2016
4.2.1127-pre 692 7/19/2016
4.2.1126-pre 718 7/19/2016
4.2.1125-pre 707 7/19/2016
4.2.1123-pre 725 7/19/2016
4.2.1119-pre 724 7/18/2016
4.2.1113-pre 753 7/16/2016
4.2.1108-pre 726 7/15/2016
4.2.1107-pre 744 7/15/2016
4.2.1104-pre 883 7/13/2016
4.2.1099-pre 900 7/12/2016
4.2.1098-pre 904 7/12/2016
4.2.1093-pre 774 7/8/2016
4.2.1091-pre 758 7/8/2016
4.2.1090-pre 765 7/8/2016
4.2.1089-pre 751 7/7/2016
4.2.1087-pre 771 7/7/2016
4.2.1083-pre 768 7/6/2016
4.2.1082-pre 752 7/6/2016
4.2.1081-pre 755 7/6/2016
4.2.1079-pre 774 7/6/2016
4.2.1078-pre 770 7/6/2016
4.2.1073-pre 771 7/5/2016
4.2.1070-pre 731 7/5/2016
4.2.1069-pre 730 7/1/2016
4.2.1059-pre 737 7/1/2016
4.2.1046-pre 703 6/24/2016
4.2.1031-pre 714 6/24/2016
4.2.1028-pre 714 6/24/2016
4.2.1027-pre 731 6/24/2016
4.1.1009 1,131 6/15/2016
4.1.1002-pre 1,025 6/14/2016
4.1.995-pre 1,111 6/13/2016
4.1.989-pre 719 5/26/2016
4.1.983-pre 722 5/25/2016
4.1.982-pre 749 5/25/2016
4.1.978-pre 732 5/6/2016
4.1.977-pre 735 5/5/2016
4.1.975-pre 715 5/5/2016
4.0.958 791 5/1/2016
4.0.957 983 4/29/2016
4.0.956 969 4/29/2016
4.0.955 800 4/28/2016
4.0.941 1,055 4/27/2016
4.0.940 1,020 4/27/2016
4.0.925 943 4/27/2016
4.0.922 932 4/27/2016
4.0.909 960 4/20/2016
4.0.880 825 4/7/2016
4.0.869 784 3/30/2016
4.0.864 808 3/29/2016
4.0.861 788 3/29/2016
4.0.860 788 3/29/2016
4.0.857 787 3/29/2016
4.0.855 773 3/29/2016
4.0.846 811 3/22/2016
4.0.842 998 3/21/2016
4.0.836 794 3/18/2016
4.0.835 799 3/18/2016
4.0.834 770 3/17/2016
4.0.832 804 3/17/2016
4.0.831 778 3/16/2016
4.0.829 771 3/16/2016
4.0.828 803 3/15/2016
4.0.827 807 3/15/2016
4.0.826 786 3/15/2016
4.0.825 858 3/13/2016
4.0.821 891 3/11/2016
4.0.819 814 3/11/2016
4.0.818 836 3/11/2016
4.0.816 862 3/11/2016
4.0.815 847 3/11/2016
4.0.814 867 3/11/2016
4.0.813 792 3/10/2016
4.0.812 897 3/10/2016
4.0.811 846 3/10/2016
4.0.810 801 3/10/2016
4.0.809 811 3/10/2016
4.0.805 762 3/9/2016
4.0.797 772 3/9/2016
4.0.796 794 3/9/2016
4.0.794 811 3/9/2016
4.0.793 767 3/9/2016
4.0.792 786 3/8/2016
4.0.791 764 3/8/2016
4.0.790 761 3/8/2016
4.0.788 809 3/8/2016
4.0.774 796 3/2/2016
4.0.773 948 3/1/2016
4.0.772 983 3/1/2016
4.0.770 782 3/1/2016
4.0.769 869 3/1/2016
4.0.762 814 3/1/2016
4.0.761 814 3/1/2016
4.0.760 831 2/29/2016
4.0.759 792 2/29/2016
4.0.758 786 2/29/2016
4.0.757 1,074 2/29/2016
4.0.756 1,108 2/27/2016
4.0.755 1,147 2/27/2016
4.0.754 1,118 2/27/2016
4.0.753 1,190 2/27/2016
4.0.752 884 2/27/2016
4.0.750 1,231 2/27/2016
4.0.749 1,257 2/27/2016
4.0.747 1,179 2/26/2016
4.0.746 1,196 2/26/2016
4.0.744 1,204 2/26/2016
4.0.743 891 2/26/2016
4.0.742 1,172 2/26/2016
4.0.741 1,044 2/26/2016
4.0.739 1,188 2/25/2016
4.0.738 1,035 2/25/2016
4.0.734 1,173 2/25/2016
4.0.733-beta 1,060 2/25/2016
4.0.672 823 2/16/2016
4.0.669 873 2/11/2016
4.0.668 877 2/11/2016
3.0.654 813 2/10/2016
3.0.646 813 2/5/2016
3.0.645 808 2/5/2016
3.0.644 767 2/5/2016
3.0.639 822 2/3/2016
3.0.638 808 2/2/2016
3.0.637 818 2/1/2016
3.0.635 773 2/1/2016
3.0.633 777 1/27/2016
3.0.632 811 1/27/2016
3.0.629 878 1/18/2016
3.0.626 849 1/18/2016
3.0.625 976 1/18/2016
3.0.624 811 12/17/2015
3.0.623 936 12/9/2015
3.0.622 797 12/9/2015
3.0.621 780 12/9/2015
3.0.620 783 12/8/2015
3.0.613 1,109 12/4/2015
3.0.611 1,068 12/3/2015
3.0.610 1,115 11/30/2015
3.0.606 1,082 11/30/2015
3.0.605 954 11/25/2015
3.0.603 895 11/23/2015
3.0.601 901 11/23/2015
3.0.600 892 11/19/2015
3.0.599 863 11/19/2015
3.0.598 861 11/17/2015
3.0.592 866 11/12/2015
3.0.589 842 11/10/2015
3.0.588 821 11/10/2015
3.0.586 865 11/10/2015
3.0.584 822 11/10/2015
3.0.583 833 11/10/2015
3.0.581 809 11/6/2015
3.0.579 821 11/6/2015
3.0.576 830 11/5/2015
3.0.575 814 11/4/2015
3.0.574 845 11/4/2015
3.0.569 834 11/3/2015
3.0.568 832 11/3/2015
3.0.566 825 11/3/2015
3.0.545 818 10/28/2015
3.0.538 852 10/22/2015
3.0.537 806 10/21/2015
3.0.536 797 10/21/2015
3.0.534 781 10/21/2015
3.0.532 848 10/21/2015
3.0.531 793 10/21/2015
3.0.524 824 10/15/2015
3.0.523 906 10/10/2015
3.0.522 826 10/10/2015
3.0.520 849 10/9/2015
3.0.519 905 10/9/2015
3.0.518 877 10/9/2015
3.0.517 828 10/9/2015
3.0.516 1,177 10/7/2015
3.0.514 958 10/6/2015
3.0.513 1,164 10/6/2015
3.0.512 1,044 10/6/2015
3.0.509 910 10/1/2015
3.0.507 931 10/1/2015
3.0.505 934 9/30/2015
3.0.503 960 9/30/2015
3.0.502 938 9/30/2015
3.0.479 909 9/25/2015
3.0.476 880 9/24/2015
3.0.471 894 9/24/2015
3.0.470 890 9/24/2015
3.0.469 882 9/24/2015
3.0.468 882 9/24/2015
3.0.467 868 9/24/2015
3.0.465 894 9/24/2015
3.0.459 896 9/23/2015
3.0.456 902 9/23/2015
3.0.455 883 9/22/2015
3.0.454 919 9/19/2015
3.0.453 936 9/19/2015
3.0.452 868 9/18/2015
3.0.451 892 9/18/2015
3.0.450 898 9/18/2015
3.0.447 852 9/18/2015
2.0.378 889 9/5/2015
2.0.372 863 9/4/2015
2.0.370 904 9/4/2015
2.0.368 848 9/4/2015
2.0.365 852 9/3/2015
2.0.363 841 9/3/2015
2.0.361 842 9/3/2015
1.0.360 825 9/1/2015
1.0.359 852 9/1/2015
1.0.358 839 9/1/2015
1.0.356 834 8/31/2015
1.0.355 907 8/31/2015
1.0.354 841 8/29/2015
1.0.305 866 8/19/2015
1.0.299 1,184 8/8/2015
1.0.293 880 7/20/2015
1.0.292 891 7/20/2015
1.0.289 856 7/10/2015
1.0.288 853 7/10/2015
1.0.286 872 7/7/2015
1.0.285 877 7/7/2015
1.0.284 861 7/7/2015
1.0.282 867 7/6/2015
1.0.281 849 7/6/2015
1.0.279 850 7/6/2015
1.0.277 803 6/18/2015
1.0.276 859 6/8/2015
1.0.275 846 6/8/2015
1.0.274 787 6/8/2015
1.0.272 876 6/1/2015
1.0.269 838 5/25/2015
1.0.268 850 5/24/2015
1.0.266 826 5/24/2015
1.0.263 851 5/21/2015
1.0.258 850 5/19/2015
1.0.257 838 5/18/2015
1.0.256 1,009 5/17/2015
1.0.254 812 5/13/2015
1.0.253 828 5/13/2015
1.0.250 839 5/13/2015
1.0.249 846 5/12/2015
1.0.248 826 5/12/2015
1.0.245 828 5/12/2015
1.0.241 856 5/12/2015
1.0.240 840 5/12/2015
1.0.237 845 5/11/2015
1.0.234 837 5/9/2015
1.0.233 817 5/9/2015
1.0.231 813 5/7/2015
1.0.230 867 5/7/2015
1.0.229 842 5/7/2015
1.0.226 839 5/7/2015
1.0.217 1,087 4/28/2015
1.0.215 981 4/27/2015
1.0.213 1,030 4/23/2015
1.0.210 991 4/23/2015
1.0.209 917 4/15/2015
1.0.202 924 4/15/2015
1.0.201 902 4/15/2015
1.0.198 916 4/15/2015
1.0.197 891 4/15/2015
1.0.196 895 4/15/2015
1.0.195 901 4/15/2015
1.0.194 901 4/15/2015
1.0.193 892 4/15/2015
1.0.192 923 4/15/2015
1.0.191 927 4/14/2015
1.0.189 902 4/10/2015
1.0.187 877 4/9/2015
1.0.186 902 4/8/2015
1.0.185 899 4/6/2015
1.0.183 880 4/3/2015
1.0.181 934 4/3/2015
1.0.180 909 4/2/2015
1.0.178 887 4/1/2015
1.0.177 889 4/1/2015
1.0.175 945 4/1/2015
1.0.171 881 3/31/2015
1.0.170 857 3/31/2015
1.0.168 862 3/31/2015
1.0.164 896 3/30/2015
1.0.162 859 3/28/2015
1.0.160 877 3/27/2015
1.0.159 852 3/26/2015
1.0.157 840 3/24/2015
1.0.156 887 3/24/2015
1.0.154 846 3/24/2015
1.0.152 832 3/24/2015
1.0.151 853 3/24/2015
1.0.150 891 3/23/2015
1.0.149 856 3/23/2015
1.0.148 836 3/23/2015
1.0.147 850 3/21/2015
1.0.146 848 3/20/2015
1.0.145 840 3/19/2015
1.0.143 928 3/18/2015
1.0.142 858 3/12/2015
1.0.141 828 3/12/2015
1.0.140 1,083 3/5/2015
1.0.139 882 3/5/2015
1.0.138 970 3/4/2015
1.0.137 827 3/3/2015
1.0.134 830 3/3/2015
1.0.129 1,085 3/3/2015
1.0.128 1,225 3/3/2015
1.0.125 1,141 2/28/2015
1.0.124 875 2/28/2015
1.0.122 1,317 2/28/2015
1.0.119 1,263 2/25/2015
1.0.117 1,207 2/24/2015
1.0.115 1,064 2/24/2015
1.0.114 1,197 2/23/2015
1.0.113 1,236 2/23/2015
1.0.112 1,247 2/23/2015
1.0.111 1,257 2/23/2015
1.0.110 1,279 2/23/2015
1.0.109 1,182 2/22/2015
1.0.108 1,185 2/22/2015
1.0.103 1,256 2/22/2015