<?xml version="1.0"?>
<rss version="2.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007" xmlns:atom="http://www.w3.org/2005/Atom">
   <channel>
      <title>Digging My Blog With CheeseSalt</title>
      <description>Pipes Output</description>
      <link>http://pipes.yahoo.com/pipes/pipe.info?_id=09ef3126039426f9027e9946876495c9</link>
      <atom:link rel="next" href="http://pipes.yahoo.com/pipes/pipe.run?_id=09ef3126039426f9027e9946876495c9&amp;_render=rss&amp;page=2"/>
      <pubDate>Thu, 01 Oct 2015 22:58:04 +0000</pubDate>
      <generator>http://pipes.yahoo.com/pipes/</generator>
      <item>
         <title>Type argument Microsoft.Runtime.CompilerServices.ConfiguredTaskAwaitable violates the constraint of type parameter TAwaiter</title>
         <link>http://danhounshell.com/blog/configuredtaskawaitable-violates-constraint-tawaiter/</link>
         <description>&lt;p&gt;You add a reference to StackExchange.Redis in your .NET 4.0 project and you get the following exception:&lt;/p&gt;
&lt;div style=&quot;overflow:auto;cursor:text;font-size:8pt;border-top:silver 1px solid;font-family:'Courier New', courier, monospace;border-right:silver 1px solid;width:97.5%;border-bottom:silver 1px solid;padding-bottom:4px;direction:ltr;text-align:left;padding-top:4px;padding-left:4px;margin:20px 0px 10px;border-left:silver 1px solid;line-height:12pt;padding-right:4px;max-height:200px;background-color:#f4f4f4;&quot; id=&quot;codeSnippetWrapper&quot;&gt;
&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot; id=&quot;codeSnippet&quot;&gt;
Method 
System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1[System.Boolean].AwaitUnsafeOnCompleted: 
type argument 
&lt;span style=&quot;color:#006080;&quot;&gt;'Microsoft.Runtime.CompilerServices.ConfiguredTaskAwaitable`1+ConfiguredTaskAwaiter[StackExchange.Redis.ServerEndPoint]'&lt;/span&gt; 
violates the constraint of type parameter &lt;span style=&quot;color:#006080;&quot;&gt;'TAwaiter'&lt;/span&gt;.&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The solution can be found here:&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.marcgravell.com/2014/03/so-i-went-and-wrote-another-redis-client.html?showComment=1405397410965#c8649668071319126908&quot; title=&quot;http://blog.marcgravell.com/2014/03/so-i-went-and-wrote-another-redis-client.html?showComment=1405397410965#c8649668071319126908&quot;&gt;http://blog.marcgravell.com/2014/03/so-i-went-and-wrote-another-redis-client.html?showComment=1405397410965#c8649668071319126908&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Try running &lt;font face=&quot;Cambria&quot;&gt;Update-Package Microsoft.Bcl&lt;/font&gt;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://danhounshell.com/blog/configuredtaskawaitable-violates-constraint-tawaiter/</guid>
         <pubDate>Thu, 19 Mar 2015 13:52:00 +0000</pubDate>
      </item>
      <item>
         <title>Reference foo.dll could not be resolved because indirect dependency on System.Runtime 1.5.11.0</title>
         <link>http://danhounshell.com/blog/reference-not-resolved-dependency-system-runtime/</link>
         <description>&lt;p&gt;After adding a reference (via Nuget or a direct reference) to another library from your .NET 4.0 project you get an exception similar to the following:&lt;/p&gt;
&lt;div style=&quot;overflow:auto;cursor:text;font-size:8pt;border-top:silver 1px solid;font-family:'Courier New', courier, monospace;border-right:silver 1px solid;width:97.5%;border-bottom:silver 1px solid;padding-bottom:4px;direction:ltr;text-align:left;padding-top:4px;padding-left:4px;margin:20px 0px 10px;border-left:silver 1px solid;line-height:12pt;padding-right:4px;max-height:200px;background-color:#f4f4f4;&quot; id=&quot;codeSnippetWrapper&quot;&gt;
&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot; id=&quot;codeSnippet&quot;&gt;
The primary reference &amp;ldquo;foo.dll&amp;rdquo; could not be resolved because it has an indirect 
dependency on the framework assembly &amp;ldquo;System.Runtime, Version=1.5.11.0, 
Culture=neutral, PublicKey Token=b03f5f7f11d50a3a&amp;rdquo; which could not be resolved 
&lt;span style=&quot;color:#0000ff;&quot;&gt;in&lt;/span&gt; the currently targeted framework. &amp;ldquo;.NETFramework, Version=v4.0&amp;rdquo;. To resolve 
&lt;span style=&quot;color:#0000ff;&quot;&gt;this&lt;/span&gt; problem, either remove the reference &amp;ldquo;XYZ.dll&amp;rdquo; or retarget your application 
to a framework version which contains &amp;ldquo;System.Runtime, Version=1.5.11.0, 
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&amp;rdquo;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The library you are referencing has a dependency on Microsoft.Bcl.Async, probably because it using Async and Await. The async functionality is baked into .NET 4.5 but is available in 4.0 if you use Microsoft.Bcl.Async.&lt;/p&gt;
&lt;p&gt;While researching the error you&amp;rsquo;ll see a lot of instructions for adding assembly binding redirects. You may also try referencing the System.Runtime.dll that came with your dependency. Those may only fix part of the problem. I did plenty of searching and finally found the full solution here:&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://stackoverflow.com/questions/15551953/how-to-use-the-microsoft-bcl-async-right&quot; title=&quot;http://stackoverflow.com/questions/15551953/how-to-use-the-microsoft-bcl-async-right&quot;&gt;http://stackoverflow.com/questions/15551953/how-to-use-the-microsoft-bcl-async-right&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There is a known issue that causes MSBuild to think that the referencing library has taken a dependency on an assembly from a newer framework version. There is a fix included in Microsoft.Bcl.Build. The solutions is to simply install the Microsoft.Bcl.Async package directly into your project, it will include Microsoft.Bcl.Build.&lt;/p&gt;
&lt;p&gt;In my case I was referencing a library that referenced a library that used Microsoft.Bcl.Async. The library that I referenced included references to the Microsoft.Bcl dlls but I had to add them to my project as well.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://danhounshell.com/blog/reference-not-resolved-dependency-system-runtime/</guid>
         <pubDate>Thu, 19 Mar 2015 13:41:00 +0000</pubDate>
      </item>
      <item>
         <title>Setting Environment Variables on Mac OS X</title>
         <link>http://danhounshell.com/blog/setting-environment-variables-on-mac-os-x/</link>
         <description>&lt;p&gt;This is the way I do it and I&amp;rsquo;m storing the info here because I&amp;rsquo;ve already looked it up on 3 different occasions.&lt;/p&gt;
&lt;p&gt;I store them in my bash profile. To edit that file simply use the following in the terminal:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;subl ~/.bash_profile&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I use Sublime text editor. You can substitute nano or vm or the command for your preferred editor of choice.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll see stuff like: &lt;strong&gt;export SOME_ENVIRONMENT_VARIABLE=&amp;rdquo;foo&amp;rdquo;&lt;/strong&gt;, add whatever you need to add.&lt;/p&gt;
&lt;p&gt;After you&amp;rsquo;ve made your changes you&amp;rsquo;ll probably want those changes to affect the terminal window you are currently working in. To do that type:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;source ~/.bash_profile&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Done.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://danhounshell.com/blog/setting-environment-variables-on-mac-os-x/</guid>
         <pubDate>Wed, 23 Jul 2014 19:47:00 +0000</pubDate>
      </item>
      <item>
         <title>Node to Microsoft SharePoint / Project Online via Edge.js</title>
         <link>http://danhounshell.com/blog/node-to-microsoft-sharepoint-project-online-via-edge-js/</link>
         <description>&lt;p&gt;At &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://leankit.com/&quot;&gt;LeanKit&lt;/a&gt; we&amp;rsquo;re always creating new integrations with other software and sites. Most of them involve reading from a 3rd party application&amp;rsquo;s web service API (Microsoft&amp;rsquo;s TFS via VisualStudio.com, JIRA, GitHub issues and more), performing some type of translation and mapping of the data, and then writing to LeanKit&amp;rsquo;s web service API to manipulate (add, update, remove) cards on a board. Some integrations also read from LeanKit and write to the target application to provide 2-way syncing of data.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://danhounshell.com/files/media/image/Windows-Live-Writer/a3c457b6af1f_92FE/CropperCapture%5B188%5D_2.jpg&quot;&gt;&lt;img width=&quot;644&quot; height=&quot;481&quot; border=&quot;0&quot; src=&quot;http://danhounshell.com/files/media/image/Windows-Live-Writer/a3c457b6af1f_92FE/CropperCapture%5B188%5D_thumb.jpg&quot; alt=&quot;Cards created on a LeanKit board that are copies of tasks from a project hosted on Microsoft Project Online&quot; style=&quot;border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;&quot; title=&quot;Cards created on a LeanKit board that are copies of tasks from a project hosted on Microsoft Project Online&quot;/&gt;&lt;/a&gt;     &lt;br /&gt;
&lt;em&gt;Cards on a LeanKit board that were imported from Microsoft&amp;rsquo;s Project Online by a node application using Edge.js&amp;nbsp; &lt;br /&gt;
to communicate with Microsoft Projects CSOM API dlls.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Recently we have been working with &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://nodejs.org/&quot;&gt;Node.js&lt;/a&gt; to offer a &amp;ldquo;run anywhere&amp;rdquo; option for our integration services. Using Node has been great when communicating with most web service APIs, especially those that are REST-based but even those that are SOAP-based are not too horrible. But in cases where I am forced to consume WCF web services I&amp;rsquo;d much rather use a client-side API if one is available. Working with Microsoft Project Server 2013 and specifically Project Online in addition to SharePoint because Project Server is built on SharePoint is one of those cases. SharePoint and Project Server have a CSOM (Client Side Object Model) API that works pretty well. However, the problem for our scenario is those APIs are a pair of .NET dlls which do not compute in our Node environment. Yes, I know there is a SharePoint/Project JSOM (Javascript Object Model) API that might work in our scenario but in my limited experience with it I found it to be&amp;hellip; well&amp;hellip; to use a technical term: &amp;ldquo;weird&amp;rdquo;&amp;hellip; and I did not care for it.&lt;/p&gt;
&lt;p&gt;We want to get tasks from a project hosted on Microsoft Project Online. We have a lot of Javascript code written for Node for handling that data once we get it. We have .NET dlls that provide an API for working with Microsoft Project Online. So how can we tie the two together? How can our Node application communicate with a .NET library?&lt;/p&gt;
&lt;p&gt;Well we could create a web service interface to act as a facade for communicating with the library and consume that in our Node application. That&amp;rsquo;s a decent option and one we considered. Instead we decided to take a look at Edge.js.&lt;/p&gt;
&lt;h2&gt;Enter Stage Left: Edge.js&lt;/h2&gt;
&lt;p&gt;What is &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://tjanczuk.github.io/edge/&quot;&gt;Edge.js&lt;/a&gt;? Pure .NET &amp;amp; Node awesomeness. According to the introduction: Edge.js connects Node.js and .NET ecosystems &amp;hellip; on Windows, MacOS, and Linux in &lt;strong&gt;one&lt;/strong&gt; process.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://danhounshell.com/files/media/image/Windows-Live-Writer/a3c457b6af1f_92FE/CropperCapture%5B189%5D_2.jpg&quot;&gt;&lt;img width=&quot;471&quot; height=&quot;484&quot; border=&quot;0&quot; src=&quot;http://danhounshell.com/files/media/image/Windows-Live-Writer/a3c457b6af1f_92FE/CropperCapture%5B189%5D_thumb.jpg&quot; alt=&quot;Edge.js connects Node.js and .NET ecosystems on Windows, MacOS, and Linux in one process&quot; style=&quot;border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;&quot; title=&quot;Edge.js connects Node.js and .NET ecosystems on Windows, MacOS, and Linux in one process&quot;/&gt;&lt;/a&gt;     &lt;br /&gt;
&lt;em&gt;I first learned about Node.js from my super smart friend and co-worker      &lt;br /&gt;
David Neal: &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.codeship.io/2014/04/22/leverage-sql-server-with-node-js-using-edge-js.html&quot;&gt;How to leverage SQL Server with Node.js using Edge.js&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;In layman&amp;rsquo;s terms: Edge.js allows you to run .NET code in the Node process. Yes, .NET code inside Node! It obviously works on Windows but will also work on MacOS and Linux using Mono as long as the underlying .NET code you are using will run on Mono. In our case the CSOM library we are using will only work on Windows.&lt;/p&gt;
&lt;p&gt;Other than my brief explanation above and the examples below I will not provide detailed information about Edge.js, both David&amp;rsquo;s article and the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/tjanczuk/edge&quot;&gt;Edge.js documentation&lt;/a&gt; offer plenty of introduction material, quick-start examples, etc. I&amp;rsquo;ll assume that since you are reading this that you either have some experience with Node or at least some interest so I will not provide details for installing Node or setting up your Node environment, NPM (Node Package Manager), etc.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Wrap that Wrapper&lt;/h2&gt;
&lt;p&gt;I don&amp;rsquo;t need to expose everything that the CSOM API can do to my Node application. I only need to perform a few operations like getting a list of projects and getting a list of tasks for a project. In real life I need to do a few other things like attempt to authenticate a user, add a task, update a task, get a list of team members and more but getting projects and tasks should work well for this demo. To simplify code navigation, readability and testing we&amp;rsquo;ll create a class, ProjectServerClient, to serve as a wrapper to the CSOM API that will only provide the functionality we need. getting projects and tasks. If you have worked with the SharePoint/Project CSOM before then the below code will look somewhat familiar. I fully admit to not being a SharePoint developer so there may be much better ways to do what I&amp;rsquo;ve done in the example code. Feel free to offer helpful insight, tips and suggestions.&lt;/p&gt;
&lt;p&gt;Some things to keep in mind:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Your .NET project&amp;rsquo;s platform version must be .NET 4.5 or higher because you need Async/Await support for working with Edge.js.&lt;/li&gt;
    &lt;li&gt;You will need to install the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.microsoft.com/en-us/download/details.aspx?id=35585&quot;&gt;Microsoft Office SharePoint Server 2013 Client Components SDK&lt;/a&gt; on your dev box as well as on any machine where this code will run.&lt;/li&gt;
    &lt;li&gt;You will also need to reference the Micorosoft.ProjectServer.Client dll which you can get from the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.microsoft.com/en-us/download/details.aspx?id=30435&quot;&gt;Project 2013 SDK&lt;/a&gt;.&lt;/li&gt;
    &lt;li&gt;You may also need to enable/install Windows Identity Foundation.&lt;/li&gt;
    &lt;li&gt;This example uses the SharePointOnlineCredentials to communicate with Project Online (Office 365). If communicating with an on-premise (or other-hosted) installation of Microsoft Project Server you can use NetworkCredentials to authenticate.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;overflow:auto;cursor:text;font-size:8pt;border-top:silver 1px solid;font-family:'Courier New', courier, monospace;border-right:silver 1px solid;width:97.5%;border-bottom:silver 1px solid;padding-bottom:4px;direction:ltr;text-align:left;padding-top:4px;padding-left:4px;margin:20px 0px 10px;border-left:silver 1px solid;line-height:12pt;padding-right:4px;max-height:600px;background-color:#f4f4f4;&quot; id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot; id=&quot;codeSnippet&quot;&gt;
&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;&lt;span style=&quot;color:#0000ff;&quot;&gt;using&lt;/span&gt; System;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;&lt;span style=&quot;color:#0000ff;&quot;&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;&lt;span style=&quot;color:#0000ff;&quot;&gt;using&lt;/span&gt; System.Linq;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;&lt;span style=&quot;color:#0000ff;&quot;&gt;using&lt;/span&gt; System.Net;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;&lt;span style=&quot;color:#0000ff;&quot;&gt;using&lt;/span&gt; Microsoft.ProjectServer.Client;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;&lt;span style=&quot;color:#0000ff;&quot;&gt;using&lt;/span&gt; Microsoft.SharePoint.Client;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
&amp;nbsp;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;&lt;span style=&quot;color:#0000ff;&quot;&gt;namespace&lt;/span&gt; leankit.integration.client.microsoft.projectserver&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
{&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
    &lt;span style=&quot;color:#0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:#0000ff;&quot;&gt;class&lt;/span&gt; ProjectServerAuth&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
    {&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
        &lt;span style=&quot;color:#0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:#0000ff;&quot;&gt;string&lt;/span&gt; Url { get; set; }&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
        &lt;span style=&quot;color:#0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:#0000ff;&quot;&gt;string&lt;/span&gt; Username { get; set; }&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
        &lt;span style=&quot;color:#0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:#0000ff;&quot;&gt;string&lt;/span&gt; Password { get; set; }&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
    }&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
&amp;nbsp;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
    &lt;span style=&quot;color:#0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:#0000ff;&quot;&gt;class&lt;/span&gt; ProjectServerClient&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
    {       &lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
        &lt;span style=&quot;color:#0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:#0000ff;&quot;&gt;static&lt;/span&gt; List&amp;lt;Project&amp;gt; GetProjects(ProjectServerAuth auth)&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
        {&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
            var projects = &lt;span style=&quot;color:#0000ff;&quot;&gt;new&lt;/span&gt; List&amp;lt;Project&amp;gt;();&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
            &lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
            &lt;span style=&quot;color:#0000ff;&quot;&gt;using&lt;/span&gt; (ProjectContext projContext = &lt;span style=&quot;color:#0000ff;&quot;&gt;new&lt;/span&gt; ProjectContext(auth.Url))&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
            {&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
                projContext.Credentials = &lt;span style=&quot;color:#0000ff;&quot;&gt;new&lt;/span&gt; SharePointOnlineCredentials(auth.Username, auth.Password.ToSecureString());&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
                &lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
                projContext.Load(projContext.Web);&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
                projContext.ExecuteQuery();&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
&amp;nbsp;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
                var publishedProjects = projContext.LoadQuery(projContext.Projects);&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
                projContext.ExecuteQuery();&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
&amp;nbsp;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
                &lt;span style=&quot;color:#0000ff;&quot;&gt;foreach&lt;/span&gt; (PublishedProject pubProj &lt;span style=&quot;color:#0000ff;&quot;&gt;in&lt;/span&gt; publishedProjects)&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
                {                   &lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
                    projects.Add(MapToProject(pubProj));                    &lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
                }&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
            }&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
            &lt;span style=&quot;color:#0000ff;&quot;&gt;return&lt;/span&gt; projects;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
        }&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
&amp;nbsp;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
        &lt;span style=&quot;color:#0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:#0000ff;&quot;&gt;static&lt;/span&gt; List&amp;lt;Item&amp;gt; GetTasks(ProjectServerAuth auth, Guid projectId)&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
        {&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
            var items = &lt;span style=&quot;color:#0000ff;&quot;&gt;new&lt;/span&gt; List&amp;lt;Item&amp;gt;();&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
&amp;nbsp;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
            &lt;span style=&quot;color:#0000ff;&quot;&gt;using&lt;/span&gt; (ProjectContext projContext = &lt;span style=&quot;color:#0000ff;&quot;&gt;new&lt;/span&gt; ProjectContext(auth.Url)) &lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
            {&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
                projContext.Credentials = &lt;span style=&quot;color:#0000ff;&quot;&gt;new&lt;/span&gt; SharePointOnlineCredentials(auth.Username, auth.Password.ToSecureString());&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
&amp;nbsp;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
                projContext.Load(projContext.Web);&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
                projContext.ExecuteQuery();&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
&amp;nbsp;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
                var projects = projContext.LoadQuery(projContext.Projects);&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
                projContext.ExecuteQuery();&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
&amp;nbsp;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
                var project = projects.FirstOrDefault(x =&amp;gt; x.Id == projectId);&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
&amp;nbsp;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
                &lt;span style=&quot;color:#0000ff;&quot;&gt;if&lt;/span&gt; (project != &lt;span style=&quot;color:#0000ff;&quot;&gt;null&lt;/span&gt;) &lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
                {&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
                    var ts = project.Tasks;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
                    projContext.Load(ts);&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
                    projContext.ExecuteQuery();&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
&amp;nbsp;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
                    var tasks =&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
                        projContext.LoadQuery(&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
                            ts.IncludeWithDefaultProperties(task =&amp;gt;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
                                task.Assignments.IncludeWithDefaultProperties(assignment =&amp;gt; assignment.Resource))&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
                            .Where(t =&amp;gt; t.IsActive)));&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
                    projContext.ExecuteQuery();&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
&amp;nbsp;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
                    &lt;span style=&quot;color:#0000ff;&quot;&gt;foreach&lt;/span&gt; (var task &lt;span style=&quot;color:#0000ff;&quot;&gt;in&lt;/span&gt; tasks)&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
                    {&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
                        items.Add(MapToItem(task));&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
                    }&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
                }&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
&amp;nbsp;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
            }&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
&amp;nbsp;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
            &lt;span style=&quot;color:#0000ff;&quot;&gt;return&lt;/span&gt; items;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
        }      &lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
    }&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now that we have a simpler .NET library to work with it needs to have an interface that Edge.js understands. We could convert all of our methods to Async/Await but I will leave them as-is for code reuse purposes and instead create a wrapper for the wrapper, EdgeProjectServerClient.&lt;/p&gt;
&lt;div style=&quot;overflow:auto;cursor:text;font-size:8pt;border-top:silver 1px solid;font-family:'Courier New', courier, monospace;border-right:silver 1px solid;width:97.5%;border-bottom:silver 1px solid;padding-bottom:4px;direction:ltr;text-align:left;padding-top:4px;padding-left:4px;margin:20px 0px 10px;border-left:silver 1px solid;line-height:12pt;padding-right:4px;max-height:600px;background-color:#f4f4f4;&quot; id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot; id=&quot;codeSnippet&quot;&gt;
&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;&lt;span style=&quot;color:#0000ff;&quot;&gt;using&lt;/span&gt; System;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;&lt;span style=&quot;color:#0000ff;&quot;&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;&lt;span style=&quot;color:#0000ff;&quot;&gt;using&lt;/span&gt; System.Dynamic;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;&lt;span style=&quot;color:#0000ff;&quot;&gt;using&lt;/span&gt; System.Threading.Tasks;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
&amp;nbsp;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;&lt;span style=&quot;color:#0000ff;&quot;&gt;namespace&lt;/span&gt; integration.client.projectserver &lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
{&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
    &lt;span style=&quot;color:#0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:#0000ff;&quot;&gt;class&lt;/span&gt; EdgeProjectServerClient     &lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
    {&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
        &lt;span style=&quot;color:#0000ff;&quot;&gt;public&lt;/span&gt; async Task&amp;lt;&lt;span style=&quot;color:#0000ff;&quot;&gt;object&lt;/span&gt;&amp;gt; GetProjects(IDictionary&amp;lt;&lt;span style=&quot;color:#0000ff;&quot;&gt;string&lt;/span&gt;, &lt;span style=&quot;color:#0000ff;&quot;&gt;object&lt;/span&gt;&amp;gt; input)&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
        {&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
            var auth = &lt;span style=&quot;color:#0000ff;&quot;&gt;new&lt;/span&gt; ProjectServerAuth();&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
            ExpandoMapper&amp;lt;ProjectServerAuth&amp;gt;.Map((ExpandoObject)input[&lt;span style=&quot;color:#006080;&quot;&gt;&amp;quot;auth&amp;quot;&lt;/span&gt;], auth);&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
            &lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
            &lt;span style=&quot;color:#0000ff;&quot;&gt;return&lt;/span&gt; await Task.Run(() =&amp;gt; ProjectServerClient.GetProjects(auth));&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
        }&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
&amp;nbsp;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
        &lt;span style=&quot;color:#0000ff;&quot;&gt;public&lt;/span&gt; async Task&amp;lt;&lt;span style=&quot;color:#0000ff;&quot;&gt;object&lt;/span&gt;&amp;gt; GetTasks(IDictionary&amp;lt;&lt;span style=&quot;color:#0000ff;&quot;&gt;string&lt;/span&gt;, &lt;span style=&quot;color:#0000ff;&quot;&gt;object&lt;/span&gt;&amp;gt; input)&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
        {&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
            var auth = &lt;span style=&quot;color:#0000ff;&quot;&gt;new&lt;/span&gt; ProjectServerAuth();&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
            ExpandoMapper&amp;lt;ProjectServerAuth&amp;gt;.Map((ExpandoObject)input[&lt;span style=&quot;color:#006080;&quot;&gt;&amp;quot;auth&amp;quot;&lt;/span&gt;], auth);&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
            var projectId = Guid.Parse(input[&lt;span style=&quot;color:#006080;&quot;&gt;&amp;quot;projectId&amp;quot;&lt;/span&gt;].ToString());&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
&amp;nbsp;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
            &lt;span style=&quot;color:#0000ff;&quot;&gt;return&lt;/span&gt; await Task.Run(() =&amp;gt; ProjectServerClient.GetTasks(auth, projectId));&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
        }&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
    }&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now we have a couple of methods with signatures that Edge.js can understand. Next we&amp;rsquo;ll add code to our Node.js app to call into this .NET library.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Node + Edge &amp;gt; Node&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s create a module that acts as a client library for talking to our .NET code via Edge.js and call it client.js. Our module will simply expose a couple of methods: getProjects and getTasks, which map to the similarly named methods in our .NET library.&lt;/p&gt;
&lt;div style=&quot;overflow:auto;cursor:text;font-size:8pt;border-top:silver 1px solid;font-family:'Courier New', courier, monospace;border-right:silver 1px solid;width:97.5%;border-bottom:silver 1px solid;padding-bottom:4px;direction:ltr;text-align:left;padding-top:4px;padding-left:4px;margin:20px 0px 10px;border-left:silver 1px solid;line-height:12pt;padding-right:4px;max-height:600px;background-color:#f4f4f4;&quot; id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot; id=&quot;codeSnippet&quot;&gt;
&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;&lt;span style=&quot;color:#0000ff;&quot;&gt;var&lt;/span&gt; edge = require(&lt;span style=&quot;color:#006080;&quot;&gt;&amp;quot;edge&amp;quot;&lt;/span&gt;),&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
    path = require(&lt;span style=&quot;color:#006080;&quot;&gt;&amp;quot;path&amp;quot;&lt;/span&gt;), &lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
    dllpath = path.join(&lt;span style=&quot;color:#006080;&quot;&gt;&amp;quot;.&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color:#006080;&quot;&gt;'dlls'&lt;/span&gt;);&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
&amp;nbsp;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;&lt;span style=&quot;color:#0000ff;&quot;&gt;var&lt;/span&gt; Client = &lt;span style=&quot;color:#0000ff;&quot;&gt;function&lt;/span&gt;(url, user, password) {&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
&amp;nbsp;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
    &lt;span style=&quot;color:#0000ff;&quot;&gt;var&lt;/span&gt; auth = { &lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
            &lt;span style=&quot;color:#006080;&quot;&gt;&amp;quot;url&amp;quot;&lt;/span&gt;: url, &lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
            &lt;span style=&quot;color:#006080;&quot;&gt;&amp;quot;username&amp;quot;&lt;/span&gt;: user, &lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
            &lt;span style=&quot;color:#006080;&quot;&gt;&amp;quot;password&amp;quot;&lt;/span&gt;: password &lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
        };&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
&amp;nbsp;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
    &lt;span style=&quot;color:#0000ff;&quot;&gt;var&lt;/span&gt; getProjectsMethod = edge.func({&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
        assemblyFile: path.join( dllpath, &lt;span style=&quot;color:#006080;&quot;&gt;'integration.client.projectserver.dll'&lt;/span&gt;),&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
        typeName: &lt;span style=&quot;color:#006080;&quot;&gt;'integration.client.projectserver.EdgeProjectServerClient'&lt;/span&gt;,&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
        methodName: &lt;span style=&quot;color:#006080;&quot;&gt;'GetProjects'&lt;/span&gt;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
    });&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
    &lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
    &lt;span style=&quot;color:#0000ff;&quot;&gt;var&lt;/span&gt; getTasksMethod = edge.func({&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
        assemblyFile: path.join( dllpath, &lt;span style=&quot;color:#006080;&quot;&gt;'integration.client.projectserver.dll'&lt;/span&gt;),&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
        typeName: &lt;span style=&quot;color:#006080;&quot;&gt;'integration.client.projectserver.EdgeProjectServerClient'&lt;/span&gt;,&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
        methodName: &lt;span style=&quot;color:#006080;&quot;&gt;'GetTasks'&lt;/span&gt;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
    });    &lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
                &lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
    &lt;span style=&quot;color:#0000ff;&quot;&gt;var&lt;/span&gt; getProjects = &lt;span style=&quot;color:#0000ff;&quot;&gt;function&lt;/span&gt;(callback) {&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
        &lt;span style=&quot;color:#0000ff;&quot;&gt;var&lt;/span&gt; data = { &lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
            auth: auth&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
        };&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
            &lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
        getProjectsMethod(data, &lt;span style=&quot;color:#0000ff;&quot;&gt;function&lt;/span&gt;(err, res) {&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
            &lt;span style=&quot;color:#0000ff;&quot;&gt;if&lt;/span&gt; (err || !res){&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
                err = err || &lt;span style=&quot;color:#006080;&quot;&gt;'unknown error'&lt;/span&gt;;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
                console.log(&lt;span style=&quot;color:#006080;&quot;&gt;&amp;quot;err=&amp;quot;&lt;/span&gt; + err + &lt;span style=&quot;color:#006080;&quot;&gt;&amp;quot;, res=&amp;quot;&lt;/span&gt; + res);&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
                callback(err, &lt;span style=&quot;color:#0000ff;&quot;&gt;null&lt;/span&gt;);&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
            }&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
            &lt;span style=&quot;color:#0000ff;&quot;&gt;else&lt;/span&gt; {&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
                callback(err, res);&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
            }&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
        });        &lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
    };&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
&amp;nbsp;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
    &lt;span style=&quot;color:#0000ff;&quot;&gt;var&lt;/span&gt; getTasks = &lt;span style=&quot;color:#0000ff;&quot;&gt;function&lt;/span&gt;(projectId, callback) {&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
        &lt;span style=&quot;color:#0000ff;&quot;&gt;var&lt;/span&gt; data = { &lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
            auth: auth, &lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
            projectId: projectId&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
        };&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
&amp;nbsp;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
        getTasksMethod(data, &lt;span style=&quot;color:#0000ff;&quot;&gt;function&lt;/span&gt;(err, res) {&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
            &lt;span style=&quot;color:#0000ff;&quot;&gt;if&lt;/span&gt; (err || !res){&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
                err = err || &lt;span style=&quot;color:#006080;&quot;&gt;'unknown error'&lt;/span&gt;;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
                console.log(&lt;span style=&quot;color:#006080;&quot;&gt;&amp;quot;err=&amp;quot;&lt;/span&gt; + err + &lt;span style=&quot;color:#006080;&quot;&gt;&amp;quot;, res=&amp;quot;&lt;/span&gt; + res);&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
                callback(err, &lt;span style=&quot;color:#0000ff;&quot;&gt;null&lt;/span&gt;);&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
            } &lt;span style=&quot;color:#0000ff;&quot;&gt;else&lt;/span&gt; {&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
                callback(err, res);&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
            }&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
        });&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
    };    &lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
    &lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
    &lt;span style=&quot;color:#0000ff;&quot;&gt;return&lt;/span&gt; {&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
        getProjects: getProjects,&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
        getTasks: getTasks,&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
    };&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
};&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
&amp;nbsp;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
module.exports = Client;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We simply require the &amp;ldquo;edge&amp;rdquo; module and then create a proxy for each .NET method we want to call using Edge&amp;rsquo;s .func() method, think of it as an anonymous function. The getProjectsMethod and getTasksMethod methods are examples of creating the Node.js proxy to a .NET method by specifying the .NET assembly, class and method name. Later we invoke the .NET methods by invoking the getProjectsMethod and getTasksMethod functions. Note: &amp;ldquo;dlls&amp;rdquo; is the name of a folder that is a sibling to the Node src folder. It is where I store the dll for the library that contains the ProjectServerClient and EdgeProjectServerClient classes described above in addition all its dependencies.&lt;/p&gt;
&lt;p&gt;Finally we just need to write some code in our index.js file that uses our client module to talk to Project Online. Let&amp;rsquo;s just get a list of our projects and write the name of each to the console. Assuming we have everything installed and setup properly we only need to start up our Node app and it will print out a list of projects hosted on Project Online.&lt;/p&gt;
&lt;div style=&quot;overflow:auto;cursor:text;font-size:8pt;border-top:silver 1px solid;font-family:'Courier New', courier, monospace;border-right:silver 1px solid;width:97.5%;border-bottom:silver 1px solid;padding-bottom:4px;direction:ltr;text-align:left;padding-top:4px;padding-left:4px;margin:20px 0px 10px;border-left:silver 1px solid;line-height:12pt;padding-right:4px;max-height:400px;background-color:#f4f4f4;&quot; id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot; id=&quot;codeSnippet&quot;&gt;
&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;&lt;span style=&quot;color:#0000ff;&quot;&gt;var&lt;/span&gt; Client = require(&lt;span style=&quot;color:#006080;&quot;&gt;&amp;quot;./client.js&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;&lt;span style=&quot;color:#0000ff;&quot;&gt;var&lt;/span&gt; client = &lt;span style=&quot;color:#0000ff;&quot;&gt;new&lt;/span&gt; Client(&lt;span style=&quot;color:#006080;&quot;&gt;&amp;quot;https://mysite.sharepoint.com/sites/pwa&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color:#006080;&quot;&gt;&amp;quot;admin&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color:#006080;&quot;&gt;&amp;quot;password&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
&amp;nbsp;&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;&lt;span style=&quot;color:#0000ff;&quot;&gt;var&lt;/span&gt; projects = client.getProjects(&lt;span style=&quot;color:#0000ff;&quot;&gt;function&lt;/span&gt;(err, projects) {&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
    &lt;span style=&quot;color:#0000ff;&quot;&gt;for&lt;/span&gt;(&lt;span style=&quot;color:#0000ff;&quot;&gt;var&lt;/span&gt; i = 0; i &amp;lt; projects.length; i++) {&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
        console.log(&lt;span style=&quot;color:#006080;&quot;&gt;&amp;quot;Project: &amp;quot;&lt;/span&gt; + projects[i].Title);&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
    }&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
});&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Running this file via the command line with the command &amp;ldquo;node [Path To File]/index.js&amp;rdquo; results in the below output which is a list of all my projects on my Project Online site!&lt;/p&gt;
&lt;div style=&quot;overflow:auto;cursor:text;font-size:8pt;border-top:silver 1px solid;font-family:'Courier New', courier, monospace;border-right:silver 1px solid;width:97.5%;border-bottom:silver 1px solid;padding-bottom:4px;direction:ltr;text-align:left;padding-top:4px;padding-left:4px;margin:20px 0px 10px;border-left:silver 1px solid;line-height:12pt;padding-right:4px;max-height:200px;background-color:#f4f4f4;&quot; id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot; id=&quot;codeSnippet&quot;&gt;
&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
Project: Demo Integration&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
Project: Test Project 1&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:white;&quot;&gt;
Project: Test Project 2&lt;/pre&gt;

&lt;pre style=&quot;border-top-style:none;overflow:visible;font-size:8pt;font-family:'Courier New', courier, monospace;width:100%;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;border-left-style:none;line-height:12pt;padding-right:0px;background-color:#f4f4f4;&quot;&gt;
Project: Hello World&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Building out additional functionality like getting tasks for each project, getting a list of team members, updating a task, etc. is just a matter of continuing down the same path that we have already started together.&lt;/p&gt;
&lt;p&gt;Hopefully you&amp;rsquo;ll find leveraging your .NET code base with Edge.js as useful and interesting as I have. If you have any questions feel free to give me a shout via the comments below or on Twitter: &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://twitter.com/danhounshell&quot;&gt;@danhounshell&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://danhounshell.com/blog/node-to-microsoft-sharepoint-project-online-via-edge-js/</guid>
         <pubDate>Tue, 22 Jul 2014 20:45:00 +0000</pubDate>
      </item>
      <item>
         <title>Kiatechinfo.com for your Kia maintenance</title>
         <link>http://danhounshell.com/blog/kiatechinfo-for-your-kia-maintenance/</link>
         <description>&lt;p&gt;When you decide that you want to do some work on your beloved Kia yourself but do not own a service manual then head on over to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://kiatechinfo.com&quot;&gt;kiatechinfo.com&lt;/a&gt;. Simply create an account and look up the procedure for whatever it is you want to do. Amazingly they have an online version of their factory service manuals that looks to me to be 100% complete.&lt;/p&gt;
&lt;p&gt;Pro Tips:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;In my experience when printing directions for a specific procedure Google Chrome does not render any images or sometimes just the first one. Firefox renders them all fine though.&lt;/li&gt;
    &lt;li&gt;Read through the full list of instructions before going off to your garage to start getting your hands dirty. It may include one or many lines like &amp;ldquo;Remove alternator (See section EE: Alternator)&amp;rdquo;. You will have to browse to the specified section and print those instructions separately.&lt;/li&gt;
    &lt;li&gt;You may find maintenance instructions for smaller things like changing a belt included in a section titled General, Troubleshooting, Repair, Installation, or something else. Some of the pages will be broken up into sections for Removal and then Installation and finally small maintenance tasks last. Or sometimes those smaller tasks are listed first. It can take a little bit of looking but you will eventually find what you need.&lt;/li&gt;
    &lt;li&gt;Follow the instructions. Do not think, like I did, &amp;ldquo;There is no reason for me to loosen those water pump pulley bolts now, I can get to them much easier after the belts are off and all this other stuff around it is removed&amp;rdquo;. Unfortunately after the belts are off and all the other stuff is removed there is nothing providing tension on the pulley to allow you to loosen the bolts. The instructions are there in a specific order for a reason.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I have used instructions from the Kiatechinfo site to change a CV axle, change the water pump and timing belt, replace the rear hatch (after a small boo-boo) and several other smaller maintenance jobs for my 2005 Kia Spectra5 with just over 100,000 miles on it. It is nice to have a manufacturer support its customers by providing documentation rather than forcing them to purchase factory service manuals or worse buy something from other publishers, like Chilton&amp;rsquo;s, etc.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://danhounshell.com/blog/kiatechinfo-for-your-kia-maintenance/</guid>
         <pubDate>Wed, 04 Jun 2014 19:55:00 +0000</pubDate>
      </item>
      <item>
         <title>Python version 3.x.x is not supported by node-gyp error</title>
         <link>http://danhounshell.com/blog/python-version-3-x-x-is-not-supported-by-node-gyp-error/</link>
         <description>&lt;p&gt;Problem: You try to npm install a node package on Windows and get an error similar to: Python version 3.x.x is not supported by node-gyp&lt;/p&gt;  &lt;p&gt;Issue: You have Python 3.x installed and node-gyp needs version 2.7. You may already have 2.7 installed but your PATH var for python is pointing to the new one. &lt;/p&gt;  &lt;p&gt;Fix: If you do not already have Python 2.7 installed then do so. Next find the path to that install and do the following: &lt;font face=&quot;Consolas&quot;&gt;npm config set python C:&amp;#92;Python27&amp;#92;python.exe&lt;/font&gt; (using whatever your path to it is). Now you can go back and npm install the original package you were trying to install before getting the error.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://danhounshell.com/blog/python-version-3-x-x-is-not-supported-by-node-gyp-error/</guid>
         <pubDate>Tue, 13 May 2014 14:00:10 +0000</pubDate>
      </item>
      <item>
         <title>Default value must be string or number error when running npm adduser</title>
         <link>http://danhounshell.com/blog/default-value-must-be-string-or-number-error-when-running-npm-adduser/</link>
         <description>&lt;p&gt;Problem: You try to run &lt;font face=&quot;Consolas&quot;&gt;npm adduser&lt;/font&gt; command and get an error message that starts with something like &amp;ldquo;Default value must be string or number&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Cause: It is attempting to access your default email address which you do not have set.&lt;/p&gt;
&lt;p&gt;Fix:&lt;font face=&quot;Consolas&quot;&gt; npm config&lt;/font&gt; set email youremail@yourdomain.com and then retry &lt;font face=&quot;Consolas&quot;&gt;npm adduser&lt;/font&gt; again&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://danhounshell.com/blog/default-value-must-be-string-or-number-error-when-running-npm-adduser/</guid>
         <pubDate>Tue, 13 May 2014 13:35:00 +0000</pubDate>
      </item>
      <item>
         <title>I can hit RabbitMQ fine from local but when I try from remote it does not work</title>
         <link>http://danhounshell.com/blog/i-can-hit-rabbitmq-fine-from-local-but-when-i-try-from-remote-it-does-not-work/</link>
         <description>&lt;p&gt;I’ve run into this now a couple of times. The cause may be from the (sometimes) default binding to 127.0.0.1 in the rabbitmq-env.conf file. Update the file, changing the value of NODE_IP_ADDRESS to 0.0.0.0 which will bind it to all IP addresses on the machine. Or you can bind it to just a specific one. &lt;/p&gt;  &lt;p&gt;&lt;a rel=&quot;nofollow&quot; title=&quot;http://superuser.com/questions/464311/open-port-5672-tcp-for-access-to-rabbitmq-on-mac&quot; target=&quot;_blank&quot; href=&quot;http://superuser.com/questions/464311/open-port-5672-tcp-for-access-to-rabbitmq-on-mac&quot;&gt;http://superuser.com/questions/464311/open-port-5672-tcp-for-access-to-rabbitmq-on-mac&lt;/a&gt;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://danhounshell.com/blog/i-can-hit-rabbitmq-fine-from-local-but-when-i-try-from-remote-it-does-not-work/</guid>
         <pubDate>Fri, 25 Apr 2014 13:30:39 +0000</pubDate>
      </item>
      <item>
         <title>Where is Dan?</title>
         <link>http://danhounshell.com/blog/where-is-dan/</link>
         <description>&lt;p&gt;I spread this news on Twitter and Facebook months ago but thought it was about time to do the same thing here. Wednesday, May 1st was my last day as an employee of &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://telligent.com&quot;&gt;Telligent&lt;/a&gt;. I worked for Telligent for over six years and I loved every minute of it. I worked with some very bright (most of them much smarter than me!), dedicated and hard-working folks. I worked on tough, challenging problems and had a lot of fun as well. With the exception of a few jobs I have spent about 5 years at each of my previous stops. After that amount of time I must start getting restless and maybe a little bored. But it was still very tough to leave Telligent. I can honestly say that at least a few tears were shed, at least by me.&lt;/p&gt;  &lt;p&gt;On May 6th I became a member of the dev team at &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://leankit.com/&quot;&gt;LeanKit&lt;/a&gt;. If you have not heard of LeanKit then you will soon. LeanKit is going places – big, big places and I’m just grateful to be along for the ride.&amp;#160; I don’t know what I did to deserve to be in the company of such a great team but I am honestly thankful. Much of the thanks goes to my friend &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://twitter.com/reverentgeek&quot;&gt;David Neal&lt;/a&gt; – I trusted that if he was asking me to join then it was something special. “Special” is really the best word to describe the company, the culture, the people, the product, the location… everything. I’m in. I’m all in. &lt;/p&gt;  &lt;p&gt;I could go on and on, but if you want to know more about LeanKit, Kanban, what I’m working on, why I love it so much, etc. then give me a shout. You know where to find me.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://danhounshell.com/blog/where-is-dan/</guid>
         <pubDate>Thu, 18 Jul 2013 03:02:35 +0000</pubDate>
      </item>
      <item>
         <title>Outsourcing your Blog engine’s functionality</title>
         <link>http://danhounshell.com/blog/outsourcing-your-blog-engine-rsquo-s-functionality/</link>
         <description>&lt;p&gt;[NOTE: I wrote this blog post over 2 years ago and recently found it in my Windows Live Writer drafts. I must have saved it to come back later and do some editing but forgot about it. It seems to be fairly up to date so I&amp;rsquo;m hitting the Publish button. Sorry it is 2 years late &lt;img src=&quot;http://danhounshell.com/files/media/image/Windows-Live-Writer/f043cfbde5bf_13B32/wlEmoticon-smile_2.png&quot; alt=&quot;Smile&quot; style=&quot;border-top-style:none;border-left-style:none;border-bottom-style:none;border-right-style:none;&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot;/&gt;]&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been working on and with &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://graffiticms.codeplex.com/&quot;&gt;Graffiti&lt;/a&gt; for quite some time. While Graffiti was a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://telligent.com&quot;&gt;Telligent&lt;/a&gt; product I built some custom widgets and themes. After it became an open source project I contributed to the project&amp;rsquo;s core. But since then my excitement for Graffiti and blog engines in general has waned. Why? Because I don&amp;rsquo;t need a full-blown blog engine and maybe you don&amp;rsquo;t either.&lt;/p&gt;
&lt;p&gt;To be fair to Graffiti and WordPress, they are great products and provide much more than just blog functionality. And I will still make use of them in many situations. Really they are both now CMS platforms and have a plethora of addons that are continuously rolling out that really extend the products. WordPress won&amp;rsquo;t die anytime soon, if ever. I&amp;rsquo;m purely talking about the functionality needed for a blog, specifically for a developer who has the ability to seek out and use other options.&lt;/p&gt;
&lt;p&gt;This no-blog option is not for the faint of heart and I&amp;rsquo;m not saying that you should take this route, but it is something I&amp;rsquo;m considering. It is definitely not for someone who just wants a simple &amp;ldquo;push a button now I have a blog&amp;rdquo; blog. But for someone who is constantly tweaking and experimenting like me it makes sense.&lt;/p&gt;
&lt;p&gt;The functionality that we&amp;rsquo;ve come to expect from a blogging engine has grown over the last 10 years. Blogs began as a Web Log &amp;ndash; a collection of simple static web pages. At at some point clever enterprising developers moved the content to data stores, thus the birth of the blog engines. Once we had the content stored in a database we needed some sort of admin control panel to provide for adding, updating and deleting. Then we added comments and pingbacks and trackbacks. Contact forms became a necessity. We added RSS so all our friends will know when we post a new article. Someone decided a good blog engine should have built-in analytics. We began using our blogs to host our kids&amp;rsquo; pictures and our recent word docs, resumes and other files so the engines began providing file management and slideshow functionality. And then came the birth of &amp;ldquo;flare&amp;rdquo;: my last 6 pics on Flickr, and the 4 videos I liked on YouTube. In the past couple of years we added &amp;ldquo;follow me on Twitter and here are my last 10 tweets&amp;rdquo;. Over that same time we also added more and more CMS-like features to our blogs.&lt;/p&gt;
&lt;p&gt;However, I&amp;rsquo;ve noticed a&amp;nbsp; trend to use less of a blogging engine&amp;rsquo;s functionality. It&amp;rsquo;s not that we no longer want all the functionality I mentioned above, it&amp;rsquo;s that we don&amp;rsquo;t want/expect it to all come from the blog engine itself. In our brave new world of &amp;ldquo;SOA&amp;rdquo;, &amp;ldquo;SAAS&amp;rdquo; and &amp;ldquo;Cloud Computing&amp;rdquo;, buzzword bingo aside, we have come to realize that it is best to focus on core functionality and leave the fringe pieces to someone else who focuses on that as their core functionality. In other words, we are choosing &amp;ldquo;the best of breed&amp;rdquo; (for those who have not gotten their fill of catchy buzzy phrases).&lt;/p&gt;
&lt;p&gt;Need some examples?&lt;/p&gt;
&lt;p&gt;1.&amp;nbsp; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.google.com/analytics/&quot;&gt;Google Analytics&lt;/a&gt; &amp;ndash; I&amp;rsquo;ve been using this for so long to track activity on my sites that I cannot even remember when I started.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://disqus.com&quot;&gt;Disqus&lt;/a&gt; &amp;ndash; I don&amp;rsquo;t need my blog engine to provide commenting functionality, I&amp;rsquo;d rather use Disqus. It also handles trackbacks and catching any &amp;ldquo;social&amp;rdquo; mentions of your post.&lt;/p&gt;
&lt;p&gt;3. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://kontactr.com/&quot;&gt;Kontactr&lt;/a&gt; &amp;ndash; I recently switched my home page (a primarily static html/JavaScript page) to use Kontactr to provide a contact form.&lt;/p&gt;
&lt;p&gt;4. Twitter, Foursquare, etc. widgets &amp;ndash; I can use JavaScript to query most social networks myself rather than depend on a widget provided by my blog platform. You can easily find a JQuery Plugin for nearly anything by doing a simple search.&lt;/p&gt;
&lt;p&gt;5. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://explore.live.com/windows-live-writer&quot;&gt;Windows Live Writer&lt;/a&gt; &amp;ndash; I don&amp;rsquo;t need my blog engine to provide create/edit post functionality for me. I can do everything I need with Windows Live Writer.&lt;/p&gt;
&lt;p&gt;6. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feedburner.google.com&quot;&gt;Feedburner&lt;/a&gt; &amp;ndash; handles distribution of my syndication feeds rather nicely.&lt;/p&gt;
&lt;p&gt;7. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.flickr.com/&quot;&gt;Flickr&lt;/a&gt;, YouTube, SlideShare and DropBox &amp;ndash; easily handle hosting all my photos, videos, presentations, files, etc.&lt;/p&gt;
&lt;p&gt;I am sure both we can think of more examples.&lt;/p&gt;
&lt;p&gt;What functionality is missing that still requires a bull-blown blog engine? Content and version management? How about using a combination of &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.wekeroad.com/danger-danger/git-and-dropbox-sitting-in-a-tree&quot;&gt;Git and DropBox&lt;/a&gt; that will handle deploying content updates for you as well as easily handling versioning. What could be better than having a real version control system?&lt;/p&gt;
&lt;p&gt;You could get rid of your database by using static files to hold each post&amp;rsquo;s content. Either use the Git/Dropbox approach or have a WindowsLiveWriter endpoint that would convert sent content to static files.&lt;/p&gt;
&lt;p&gt;If you hand off all the above then what do you have left? You really only need some type of routing engine to serve up the static content based on the requested Url and something that wires up the configuration for the 3rd party stuff mentioned above. That does not really sound like much of a blog engine to me, in fact I&amp;rsquo;d suggest that it could mostly be done with JavaScript and maybe, just maybe, a few lines of server-side code.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://danhounshell.com/blog/outsourcing-your-blog-engine-rsquo-s-functionality/</guid>
         <pubDate>Thu, 18 Jul 2013 02:38:00 +0000</pubDate>
      </item>
   </channel>
</rss>
<!-- fe3.yql.bf1.yahoo.com compressed/chunked Thu Oct  1 22:58:03 UTC 2015 -->
