Recent Entries

Goodbye Expensive Premium TV Service

Over the years I among everyone else has noticed the cost of cable or satellite television services has been increasing almost on an annual basis.  For me, this is becoming a burden because of the high costs I have to pay my cable provider, Comcast, each month.  Currently I am paying almost $70/month on cable TV which includes a DVR and also HD option.  I watch pretty much all my shows on networks which broadcast over the air for free, except for a few shows that come on Comedy Central or Adult Swim.

Why should I have to pay a premium for content I only watch about 10% of?  To think that in 2010 the cable and satellite providers have still not provided a la carte options is mind numbing.  Look at the music or movie model.  Apple among others have single handedly disrupted these age old models and re-invented them.  I no longer have to spend $15 on a CD just to hear two songs I want.  I can spend $2 within iTunes.  I can rent a movie digitally and completely bypass the rental companies or even having to buy a movie I will only watch once.

So why has the cable industry not changed?

Well, I think that is next.  If what this article says is true, then Apple is about to turn the cable/satellite provides on their heads.  Since most of the major networks own all of the smaller cable channels anyway, I would have no problem paying $30/mo for access to shows from specific networks that I want to watch.  Then, I could watch it when I wanted and where I wanted.  Probably even on my iPhone as well.

But before I get to that, I wanted to mention my current initiative I am taking: I am dumping cable TV completely.

That’s right, I cancelled my TV and to even do this was a very difficult thing for me to do.  Since I was probably 12 I’ve had a TV either with or without cable but mostly having cable.  Now days I don’t watch so much cable especially since the shows are just brain drain shows based on ridiculousness.  My plan is to go completely internet based for my TV options.  This will include a little jewel of a software called Boxee.

If you didn’t know, Boxee is a software that’s been around for a while in closed beta that essentially aggregates online content together into one clean interface.  It also has app support so you can get things like Pandora, Last.fm, Facebook and Twitter in there too.  Boxee is very cool as it can become a content hub for your living room.  They even have Netflix streaming support and are coming out with their own device which will be under $200 and have HDMI, 802.11n and stream 1080p.

I will be blogging my experiences here especially when I get the device to begin using instead of my netbook for now so continue reading here to discover is Boxee is worth it or not.

Favorite Places to Eat in Fresno

I try to eat at as many difference places that I can, despite my willingness to still give in to fast food (but that’s supposed to change, see my 2010 resolutions here).  But I wanted to list a few of the ones that are my favorite here in Fresno especially from the past year that I have discovered.

Don Pepe’s Taqueria

I love this place.  I get the Al Pastor burrito every time I go here.  These guys really know how to make a killer burrito.

La Boulangerie

One of my favorite places to get a sandwich.  Sometimes the crowd is a little upper-class yuppy status but the food makes up for it.

Limón

This place is very good, it is Peruvian and is based out of San Francisco.  I really loved the decor and the friendliness of the staff.

Pho #90

I recently got into Pho and this is my current favorite Pho place in Fresno.

The Million Elephant

I still like eating my Thai at Million Elephant, it’s good and the staff is always very cool.

Veni Vidi Vici

For some reason I barely discovered this place to eat at.  For all of the years we’ve been coming here for night life events I’ve never once ate a real meal here.  Now I have and now it’s going to be a monthly ritual.  The Pork Chop was out of this world.

Charlotte’s Bakery

Hands down my favorite place for a fresh and delicious sandwich in the Tower District.

Samba Churrascaria Brazilian Steakhouse

My favorite place for Brazilian, the food here is awesome and the owner is one of the most inviting people I’ve met.

Reporting Engines for Simplicity and .NET

One of the biggest challenges that faces our project is reporting.  Most of the custom requests that are made are regarding reports and currently when each report is created, it has to be done by hand by a developer.

This creates an extreme amount of strain on resources especially within a company that is not that large.  When I read The Enterprise and Scrum, one of the trending patterns the author recognized when consulting companies for Scrum was they were spending an unnecessary amount of time on support and bug fixing their product.

I wanted to find a way to avoid this and make reporting as easy as possible.  The primary requirements we wanted to have were:

  • Integration with the 3.5 framework well
  • Ability for a non-technical person to create or change reports
  • Ability to create reports 100% outside of Visual Studio environment
  • Reports can be portable
  • As cost effective as possible
  • Ability to create complex data structures and pivots

Looking at all of the reporting options and what I had worked with, the following reporting suites came to mind:

  • Crystal Reports
  • Data Dynamics Active Reports
  • Microsoft SQL Reporting Services

Crystal Reports

I have worked with Crystal Reports in the past but have had a lot of limitations with it.  Especially if you’re using the version that ships with Visual Studio, it has serious performance limitations.  Here is what an MSDN article says regarding this:

While you may allow access to the runtime software by many users, the version of the runtime software provided with Crystal Reports for Visual Studio .NET is a performance-limited edition intended for development purposes and use with Server/Web applications accessed by small groups. If a report is accessed while the server is at its performance limit, the request will be delayed until an existing request finishes. When a request is delayed, the server writes a warning message to the event log. After a finite period of time, the request will time-out. When this happens, the server writes another warning to the event log and throws an OutOfLicense exception.

This obviously would become an issue since we want to spend the least on licensing costs.  Also as far as I know Crystal Reports doesn’t have an independent report designer.

Data Dynamics Active Reports

We’ve used Active Reports on many projects and it’s actually quite a great reporting tool.  We use it to design our ticket reports which need a lot of flexibility since they’re printing out of a Boca printer and require custom ticket stock.  But the tickets themselves are pretty straight forward and don’t need complex reporting data structures.  The grouping logic in Active Reports isn’t bad but very complex groups seemed to not work the way I wanted.

Also the report designer component would need be built as well using their control which we don’t have time to do.

Microsoft SQL Reporting Services

I have been wanting to really spend some time with SQL Reporting Services for a while, I just haven’t had time to do so.  Now that I finally have I am glad I did.

SQL Reporting Services is a really great reporting component Microsoft has provided.  Since SQL Server 2005 Microsoft has shipped Reporting Services free of charge with your SQL Server license.

Sounds good to me.

What about complex reporting data?  Most definitely.  Reporting Services provides a control you use called a “Tablix” which allows you to build a very complicated grouping structure within your report tables.  It’s really, really powerful.

Also, almost every property on every control can be controlled via “Expressions”.  These are basically VB style code snippets that allow you to dynamically set groups, visibility, colors, you name it.

Microsoft also provides a report tool to design your reports 100% outside any development environment, for free.  This is called Report Builder.  It is an awesome tool and provides even more than you could find in the Visual Studio version of the report designer.

And lastly, we can embed the actual SQL query within the report file making it portable and transferable between different customers.

LocalReport vs ServerReport Snafu

After I initially did my tests, all was good.  Except one thing.  I found out that when you want to have your reports portable (saving to a local .rdl file), the report has a few problems:

  • In LocalReport mode, the report will NOT save any connection information with the report
  • But in the flip side, we don’t want to save connection info since the reports are supposed to be portable
  • There is no way to dynamically set the connection at all in LocalReport mode
  • Microsoft assumes if you’re in LocalReport mode, you would pass your data objects already constructed to the report.

But if this is the case, what is the point of designing the query within your report?  You can’t because if you need to allow the users to construct the query there is no way you can pass it from the server.

Creating a Custom RdlReport

What I ended up doing was writing up some sophisticated code to handle local reports.  This is what it does:

  • Report criteria page dynamically parses the selected report .rdl file and displays the parameters to the user
  • User selects parameters and runs the report.  When this happens, I automatically parse out all queries contained within the report, and add them to a Queries enumeration, also with each parameter within the query
  • Each query is dynamically constructed, with all parameters and ran on the server
  • The resulting data objects are then passed back to the report with the LocalReport.DataSources enumeration

In a nutshell, this is how we are dynamically running all report queries on the server and binding them back to the report.  Not including additional parameters being passed.  Then the result is being rendered to the client either in PDF or Microsoft Excel.

What About CSV?

One last requirement we had was we also need CSV option.  Crap.  But actually, after thinking about this for a second it was actually pretty easy.  All I need to do is render the Excel, then use OleDb to read the contents, and create a custom CSV by just parsing the spreadsheet.  Then stream this CSV to the response stream.  Problem solved.

This phase is wrapping up at the end of this year but I think this solution will be a very promising and flexible option.  I will try to post some code here soon to explain more in detail how I worked with the report structure dynamically.

2010

So I originally went looking for my 2009 resolutions post I wrote on this blog back when it was hosted on wordpress.com but I believe it never got imported over.  I wanted to reflect back on 2009 and see how many of my goals I accomplished.  Some of the items I can remember and have listed below.

Start learning Ruby and Ruby on Rails
Move my blog to a hosted Wordpress account
Finish my longtime in the making web application I’ve been working on
Update Microsoft certification
Pay off a lot of debt

So I think with those I didn’t do too bad.  But I need to really step it up in 2010.  I am turning 30 and I had a lot of things I really want to accomplish for myself.  So since it’s already December, I’m going to initiate my goals for 2010 already with some pretty clear projections.  These are going to get very specific but hey, if I mention it here maybe I will do it.

Continue to evolve with the Ruby language more
Pick up .NET 4.0 and start learning and using the new features
Update my Microsoft certification
Ship ShoWare 5.0
Complete development and ship 1.0 of my platform API service (details later)
Even though I have a gym membership, start going normally and get in shape and cut out junk food (this is hard)
Start utilizing DI, IoC and mock frameworks
Pay off the remaining of my debt
Pay off my wife’s car loan
Purchase furniture for the living room in our apartment
Purchase a large LCD television, preferably 52″ with 120hz refresh rate (Samsung baby)
Purchase a Wii and/or Xbox360 again
Purchase two CDJ turntables and a mixer to start mixing again
Do more volunteer work
Buy a 27″ iMac
Go to Burning Man 2010
Turn my music blog into something more than just a blog

    That is most of the items I can think of for now.  I really think I can do most of them, and having this list here will push me to cross off items as I do them.  2009 was a bad year and a lot of deaths, and I hope 2010 will be a happier place.

    Music Page

    I’ve created a page here giving an overview of all artists or DJs I’ve seen.  I just wanted to actually think about all of the people I’ve paid money to see and who influenced my life musically.

    Try Cloudberry S3 Explorer

    Recently I had the need to work with Amazon’s Simple Storage Service (S3) on large volumes and needed a way to easily work with the files.  Since their S3 service is on fact a service, I needed some sort of front-end application to manage this.  My friend referring me to a very cool application called Cloudberry S3 Explorer.

    I’m not going to go into all the details but this app is very cool.  Also free!  As in beer.  You can manage your S3 buckets, distributions which I use, since I’m using CloudFront as well.  Also it has backup-like features in it for synchronizing folders between your desktop and your S3 bucket.

    Did I mention it was free?

    They also have a bunch of other products as well but they have a fee, though it is nominal.  I recommend checking them out.

    PayPal X Innovate 2009 Was A Success

    My trip down to San Francisco for the first ever PayPal X Innovation conference has wrapped up.  I must say I left with an overall feeling of excitement this is by far one of the best conferences I’ve attended.  And for the $49 price tag we paid for the whole thing not counting hotel, I can’t complain.

    First off, one of our intentions of going was to determine if PayPal is going to integrate their new Parallel and Chained payments into PayFlow Pro.  Well they’re not, at least for now.

    The first day I went to four breakout sessions covering mobile, the new x.com developer portal and the new chained and parallel payment features.  The second day similiar with an added talk with some big venture capital people in a Q&A session.  The main features that were announced for Adaptive Payments are:

    • Currency Conversion: Allow currencies to automatically be converted across all currencies PayPal supports in the 180 countries they operate in
    • Pay Anyone: Pay anyone even if they don’t have a PayPal account (uses email).  If they don’t, they will be prompted to create a PayPal account to retrieve the funds
    • Pre-Approvals: Allow calls from the API to pre-approve specific amounts, which can automatically be deducted from later without approval.  These pre-approvals can also be configured with rules, expirations and so forth
    • Chained Payments: Allows payment from one sender to be split between multiple recipients; the sender is unaware of where each piece is going
    • Parallel Payments: Allows payment from one sender to be split between multiple recipients; the sender will know which receiver is getting each piece
    • Adaptive Accounts: API to create PayPal account on users behalf

    For me, the Chained Payments is key.  This is necessary when charging a fee for someone using your services (B-to-B-to-C) so that I don’t have to turn into a collections company billing customers each month for my fees.

    Also, everyone who was registered received a FREE Asus Netbook.  Pretty cool if you ask me.  And the dinner the first night was top class.

    See ya next year PayPal!

    Off to PayPal X Innovate 2009 Conference!

    Today I’m off to the PayPal X Innovate 2009 conference, to discover some geek goodness on their new platform and API they are releasing.  This should have some huge advantages for both my company and I in removing banks and processors as the middle man for credit card transactions.  I am particularly interested in learning about Chained and Adaptive Payments.

    I shall report here any updates on new features that are released with the new API.

    Why Working With Your Superiors Not For Them Pays Off

    I really like this article I read on TechCrunch today.  It’s talking about how Mark Zuckerberg from Facebook does videos with his employees to prove to their relatives or whoever else that they work with him.  This guy sounds like a great guy to work for and I really like this type of attitude.  One of the best atmospheres you can create within an organization to keep successful and happy employees is let them know that they work with you not for you.  Here is a quote from Justin Rosenstein from a few years back on his leaving Google and joining Facebook:

    A couple of months ago, after three years as a Google product manager, I decided to leave for Facebook. I am writing this note to spread Good News to all the friends I haven’t already overwhelmed with my enthusiasm: Facebook really is That company.

    Which company? That one. That company that shows up once in a very long while — the Google of yesterday, the Microsoft of long ago. That company where large numbers of stunningly-brilliant people congregate and feed off each other’s genius. That company that’s doing with 60 engineers what teams of 600 can’t pull off. That company that’s on the cusp of Changing The World, that’s still small enough where each employee has a huge impact on the organization, where you think about working now and again, and where you know you’ll kick yourself in three years if you don’t jump on the bandwagon now, even after someone had told you that it was rolling toward the promised land. That company where everyone seems to be having the time of their life.

    I’m serious. I have drunk from the kool-aid, and it is delicious. Facebook is hiring ambitiously across the organization. If you’re an engineer, UI designer, product manager, statistician, bizdev god, general entrepreneurial badass, whatever, and you would even consider considering Facebook as your new place for hat-hanging, please send me a Facebook message. We can have lunch, or I can give you a tour, or we can go kick it with Mark Zuckerberg — whatever it takes.

    That kool-aid probably tastes pretty damn good.  I really hope more companies take them as an example of how to run successful internet businesses.

    Setting Windows Mobile Device Backlight with .NET Compact Framework

    I recently needed to keep the back light on at all times on my Windows Mobile .NET CF application.  I discovered how to do this and thought I would share.

    First, declare your interop import:

    [DllImport("coredll")]
    private static extern int SetDevicePower(string pvDevice, int dwDeviceFlags, DevicePowerState DeviceState);
    

    Then create a DevicePowerState enumeration:

    /// <summary>
    /// Enumeration for the device power state.
    /// </sumary>
    /// <remarks>
    /// D0 = Full On
    /// D1 = Low Power On
    /// D2 = Standby
    /// D3 = Sleep
    /// D4 = Off
    /// </remarks>
    public enum DevicePowerState : int
    {
        Unspecified = -1,
        D0 = 0,
        D1,
        D2,
        D3,
        D4,
    }
    

    Create a constant representing the device flags:

    private const int POWER_NAME = 0x00000001;
    

    Now, make the call from your code.  If you use D0 it should force the backlight to never dim or go off.

    SetDevicePower("BKL1:", POWER_NAME, DevicePowerState.D0);
    

    The parameter for “BLK1:” just refers to the device and this should usually work as a default. Hope that helps!

    PHVsPjxsaT48c3Ryb25nPndvb3ByYTwvc3Ryb25nPiAtIGE6OTp7czo3OiJ2ZXJzaW9uIjtzOjc6IjEuNC4zLjEiO3M6OToiYWN0aXZhdGVkIjtzOjE6IjEiO3M6MTE6ImRhdGVfZm9ybWF0IjtzOjEwOiJ5eXl5LU1NLWRkIjtzOjc6ImFwaV9rZXkiO3M6MTA6IjFIUzFKSkhCSjciO3M6MTM6ImFuYWx5dGljc190YWIiO3M6OToiZGFzaGJvYXJkIjtzOjEwOiJydW5fc3RhdHVzIjtzOjI6Im9uIjtzOjc6InRpbWVvdXQiO3M6MzoiNjAwIjtzOjEyOiJhdXRvX3RhZ2dpbmciO3M6MToiMSI7czoxMjoid29vcHJhX2V2ZW50IjthOjI6e3M6MTI6ImNvbW1lbnRfcG9zdCI7czoxOiIxIjtzOjE2OiJ0aGVfc2VhcmNoX3F1ZXJ5IjtzOjE6IjEiO319PC9saT48bGk+PHN0cm9uZz53b29fYWRkYmxvZzwvc3Ryb25nPiAtIGZhbHNlPC9saT48bGk+PHN0cm9uZz53b29fYWRzX3JvdGF0ZTwvc3Ryb25nPiAtIHRydWU8L2xpPjxsaT48c3Ryb25nPndvb19hZF8xMjVfYWRzZW5zZV9hPC9zdHJvbmc+IC0gPC9saT48bGk+PHN0cm9uZz53b29fYWRfMTI1X2Fkc2Vuc2VfYjwvc3Ryb25nPiAtIDwvbGk+PGxpPjxzdHJvbmc+d29vX2FkXzEyNV9hZHNlbnNlX2M8L3N0cm9uZz4gLSA8L2xpPjxsaT48c3Ryb25nPndvb19hZF8xMjVfYWRzZW5zZV9kPC9zdHJvbmc+IC0gPC9saT48bGk+PHN0cm9uZz53b29fYWRfMTI1X2ltYWdlX2E8L3N0cm9uZz4gLSBodHRwOi8vd29vdGhlbWVzLmNvbS9hZHMvd29vdGhlbWVzLTEyNXgxMjUtMS5naWY8L2xpPjxsaT48c3Ryb25nPndvb19hZF8xMjVfaW1hZ2VfYjwvc3Ryb25nPiAtIGh0dHA6Ly93b290aGVtZXMuY29tL2Fkcy93b290aGVtZXMtMTI1eDEyNS0yLmdpZjwvbGk+PGxpPjxzdHJvbmc+d29vX2FkXzEyNV9pbWFnZV9jPC9zdHJvbmc+IC0gaHR0cDovL3dvb3RoZW1lcy5jb20vYWRzL3dvb3RoZW1lcy0xMjV4MTI1LTMuZ2lmPC9saT48bGk+PHN0cm9uZz53b29fYWRfMTI1X2ltYWdlX2Q8L3N0cm9uZz4gLSBodHRwOi8vd29vdGhlbWVzLmNvbS9hZHMvd29vdGhlbWVzLTEyNXgxMjUtNC5naWY8L2xpPjxsaT48c3Ryb25nPndvb19hZF8xMjVfdXJsX2E8L3N0cm9uZz4gLSBodHRwOi8vd3d3Lndvb3RoZW1lcy5jb208L2xpPjxsaT48c3Ryb25nPndvb19hZF8xMjVfdXJsX2I8L3N0cm9uZz4gLSBodHRwOi8vd3d3Lndvb3RoZW1lcy5jb208L2xpPjxsaT48c3Ryb25nPndvb19hZF8xMjVfdXJsX2M8L3N0cm9uZz4gLSBodHRwOi8vd3d3Lndvb3RoZW1lcy5jb208L2xpPjxsaT48c3Ryb25nPndvb19hZF8xMjVfdXJsX2Q8L3N0cm9uZz4gLSBodHRwOi8vd3d3Lndvb3RoZW1lcy5jb208L2xpPjxsaT48c3Ryb25nPndvb19hZF8zMDBfYWRzZW5zZTwvc3Ryb25nPiAtIDwvbGk+PGxpPjxzdHJvbmc+d29vX2FkXzMwMF9pbWFnZTwvc3Ryb25nPiAtIGh0dHA6Ly93d3cud29vdGhlbWVzLmNvbS9hZHMvd29vdGhlbWVzLTMwMHgyNTAtMi5naWY8L2xpPjxsaT48c3Ryb25nPndvb19hZF8zMDBfdXJsPC9zdHJvbmc+IC0gaHR0cDovL3d3dy53b290aGVtZXMuY29tPC9saT48bGk+PHN0cm9uZz53b29fYWRfaW1hZ2VfMTwvc3Ryb25nPiAtIGh0dHA6Ly93d3cud29vdGhlbWVzLmNvbS9hZHMvd29vdGhlbWVzLTEyNXgxMjUtMS5naWY8L2xpPjxsaT48c3Ryb25nPndvb19hZF9pbWFnZV8yPC9zdHJvbmc+IC0gaHR0cDovL3d3dy53b290aGVtZXMuY29tL2Fkcy93b290aGVtZXMtMTI1eDEyNS0yLmdpZjwvbGk+PGxpPjxzdHJvbmc+d29vX2FkX2ltYWdlXzM8L3N0cm9uZz4gLSBodHRwOi8vd3d3Lndvb3RoZW1lcy5jb20vYWRzL3dvb3RoZW1lcy0xMjV4MTI1LTMuZ2lmPC9saT48bGk+PHN0cm9uZz53b29fYWRfaW1hZ2VfNDwvc3Ryb25nPiAtIGh0dHA6Ly93d3cud29vdGhlbWVzLmNvbS9hZHMvd29vdGhlbWVzLTEyNXgxMjUtNC5naWY8L2xpPjxsaT48c3Ryb25nPndvb19hZF9pbWFnZV81PC9zdHJvbmc+IC0gaHR0cDovL3d3dy53b290aGVtZXMuY29tL2Fkcy93b290aGVtZXMtMTI1eDEyNS00LmdpZjwvbGk+PGxpPjxzdHJvbmc+d29vX2FkX2ltYWdlXzY8L3N0cm9uZz4gLSBodHRwOi8vd3d3Lndvb3RoZW1lcy5jb20vYWRzL3dvb3RoZW1lcy0xMjV4MTI1LTQuZ2lmPC9saT48bGk+PHN0cm9uZz53b29fYWRfdXJsXzE8L3N0cm9uZz4gLSBodHRwOi8vd3d3Lndvb3RoZW1lcy5jb208L2xpPjxsaT48c3Ryb25nPndvb19hZF91cmxfMjwvc3Ryb25nPiAtIGh0dHA6Ly93d3cud29vdGhlbWVzLmNvbTwvbGk+PGxpPjxzdHJvbmc+d29vX2FkX3VybF8zPC9zdHJvbmc+IC0gaHR0cDovL3d3dy53b290aGVtZXMuY29tPC9saT48bGk+PHN0cm9uZz53b29fYWRfdXJsXzQ8L3N0cm9uZz4gLSBodHRwOi8vd3d3Lndvb3RoZW1lcy5jb208L2xpPjxsaT48c3Ryb25nPndvb19hZF91cmxfNTwvc3Ryb25nPiAtIGh0dHA6Ly93d3cud29vdGhlbWVzLmNvbTwvbGk+PGxpPjxzdHJvbmc+d29vX2FkX3VybF82PC9zdHJvbmc+IC0gaHR0cDovL3d3dy53b290aGVtZXMuY29tPC9saT48bGk+PHN0cm9uZz53b29fYWx0X3N0eWxlc2hlZXQ8L3N0cm9uZz4gLSBkZWZhdWx0LmNzczwvbGk+PGxpPjxzdHJvbmc+d29vX2FyY2hpdmVfY29udGVudDwvc3Ryb25nPiAtIGZhbHNlPC9saT48bGk+PHN0cm9uZz53b29fYXV0b19pbWc8L3N0cm9uZz4gLSB0cnVlPC9saT48bGk+PHN0cm9uZz53b29fYmxvZ2NhdDwvc3Ryb25nPiAtIDwvbGk+PGxpPjxzdHJvbmc+d29vX2Jsb2dfY2F0X2lkPC9zdHJvbmc+IC0gPC9saT48bGk+PHN0cm9uZz53b29fYnJlYWRjcnVtYnM8L3N0cm9uZz4gLSB0cnVlPC9saT48bGk+PHN0cm9uZz53b29fY2F0bWVudTwvc3Ryb25nPiAtIGZhbHNlPC9saT48bGk+PHN0cm9uZz53b29fY2F0X21lbnU8L3N0cm9uZz4gLSBmYWxzZTwvbGk+PGxpPjxzdHJvbmc+d29vX2NvbnRlbnRfYXJjaGl2ZXM8L3N0cm9uZz4gLSBmYWxzZTwvbGk+PGxpPjxzdHJvbmc+d29vX2NvbnRlbnRfaG9tZTwvc3Ryb25nPiAtIGZhbHNlPC9saT48bGk+PHN0cm9uZz53b29fY3VzdG9tX2Nzczwvc3Ryb25nPiAtIDwvbGk+PGxpPjxzdHJvbmc+d29vX2N1c3RvbV9mYXZpY29uPC9zdHJvbmc+IC0gPC9saT48bGk+PHN0cm9uZz53b29fZXhfZmVhdF9wYWdlczwvc3Ryb25nPiAtIHRydWU8L2xpPjxsaT48c3Ryb25nPndvb19leF9tYWluX3BhZ2VzPC9zdHJvbmc+IC0gdHJ1ZTwvbGk+PGxpPjxzdHJvbmc+d29vX2ZlYXRfcGFnZXM8L3N0cm9uZz4gLSA4NiwgMTM8L2xpPjxsaT48c3Ryb25nPndvb19mZWVkYnVybmVyX2lkPC9zdHJvbmc+IC0gPC9saT48bGk+PHN0cm9uZz53b29fZmVlZGJ1cm5lcl91cmw8L3N0cm9uZz4gLSA8L2xpPjxsaT48c3Ryb25nPndvb19mb290ZXJfY3JlZGl0czwvc3Ryb25nPiAtIDwvbGk+PGxpPjxzdHJvbmc+d29vX2Zvb3Rlcl9sZWZ0PC9zdHJvbmc+IC0gPC9saT48bGk+PHN0cm9uZz53b29fZm9vdGVyX2xlZnRfdGl0bGU8L3N0cm9uZz4gLSA8L2xpPjxsaT48c3Ryb25nPndvb19mb290ZXJfcmlnaHQ8L3N0cm9uZz4gLSA8L2xpPjxsaT48c3Ryb25nPndvb19mb290ZXJfcmlnaHRfdGl0bGU8L3N0cm9uZz4gLSA8L2xpPjxsaT48c3Ryb25nPndvb19nZXRfaW1hZ2VfaGVpZ2h0PC9zdHJvbmc+IC0gNTAwPC9saT48bGk+PHN0cm9uZz53b29fZ2V0X2ltYWdlX3dpZHRoPC9zdHJvbmc+IC0gMjAwPC9saT48bGk+PHN0cm9uZz53b29fZ29vZ2xlX2FuYWx5dGljczwvc3Ryb25nPiAtIDwvbGk+PGxpPjxzdHJvbmc+d29vX2xvZ288L3N0cm9uZz4gLSA8L2xpPjxsaT48c3Ryb25nPndvb19tYWluX3BhZ2VzPC9zdHJvbmc+IC0gNTI8L2xpPjxsaT48c3Ryb25nPndvb19tYW51YWw8L3N0cm9uZz4gLSBodHRwOi8vd3d3Lndvb3RoZW1lcy5jb20vPC9saT48bGk+PHN0cm9uZz53b29fbWVudV9wYWdlczwvc3Ryb25nPiAtIDwvbGk+PGxpPjxzdHJvbmc+d29vX25hdl9leGNsdWRlPC9zdHJvbmc+IC0gPC9saT48bGk+PHN0cm9uZz53b29fcG9ydGZvbGlvX2NhdDwvc3Ryb25nPiAtIFNlbGVjdCBhIGNhdGVnb3J5OjwvbGk+PGxpPjxzdHJvbmc+d29vX3BvcnRfaW5fbmF2PC9zdHJvbmc+IC0gZmFsc2U8L2xpPjxsaT48c3Ryb25nPndvb19wb3J0X3ByZXZfaW5zPC9zdHJvbmc+IC0gQ2xpY2sgb24gaW1hZ2VzIGJlbG93IHRvIGxvYWQgYSBsYXJnZXIgcHJldmlldy48L2xpPjxsaT48c3Ryb25nPndvb19wb3J0X3ByZXZfdGl0bGU8L3N0cm9uZz4gLSBUaHVtYm5haWxzPC9saT48bGk+PHN0cm9uZz53b29fcmVzaXplPC9zdHJvbmc+IC0gdHJ1ZTwvbGk+PGxpPjxzdHJvbmc+d29vX3NlYXJjaF9jb250ZW50PC9zdHJvbmc+IC0gZmFsc2U8L2xpPjxsaT48c3Ryb25nPndvb19zaG9ydG5hbWU8L3N0cm9uZz4gLSB3b288L2xpPjxsaT48c3Ryb25nPndvb19zbGlkZXJfYXV0bzwvc3Ryb25nPiAtIGZhbHNlPC9saT48bGk+PHN0cm9uZz53b29fc2xpZGVyX2ludGVydmFsPC9zdHJvbmc+IC0gNDwvbGk+PGxpPjxzdHJvbmc+d29vX3NsaWRlcl9zcGVlZDwvc3Ryb25nPiAtIDAuNjwvbGk+PGxpPjxzdHJvbmc+d29vX3RoZW1lbmFtZTwvc3Ryb25nPiAtIEJpZyBFYXN5PC9saT48bGk+PHN0cm9uZz53b29fdGhlX2NvbnRlbnQ8L3N0cm9uZz4gLSB0cnVlPC9saT48bGk+PHN0cm9uZz53b29fdGh1bWJfaGVpZ2h0PC9zdHJvbmc+IC0gMTAwPC9saT48bGk+PHN0cm9uZz53b29fdGh1bWJfd2lkdGg8L3N0cm9uZz4gLSAxMDA8L2xpPjxsaT48c3Ryb25nPndvb191cGxvYWRzPC9zdHJvbmc+IC0gaHR0cDovL3d3dy5yb2JlcnRzY2h1bHR6Lm9yZy93cC1jb250ZW50L3dvb191cGxvYWRzLzMtMXgxdC5naWY8L2xpPjwvdWw+