RetryingWrapper - Reintroduced Write-method to make it an almost non-breaking change (Now just replaces Target.SyncRoot with RetrySyncObject)

--- src/NLog/Targets/Wrappers/RetryingTargetWrapper.cs
+++ src/NLog/Targets/Wrappers/RetryingTargetWrapper.cs
@@ -133,54 +133,65 @@
         }

         /// <summary>
-        /// Writes the specified log event to the wrapped target, retrying and pausing in case of an error.
+        /// Writes the specified log event to the wrapped target in a thread-safe manner.
+        /// Uses <see cref="RetrySyncObject"/> instead of <see cref="Target.SyncRoot" />
+        /// to allow closing target while doing sleep and retry.
         /// </summary>
         /// <param name="logEvent">The log event.</param>
         protected override void WriteAsyncThreadSafe(AsyncLogEventInfo logEvent)
         {
             lock (this.RetrySyncObject)
             {
-                AsyncContinuation continuation = null;
-                int counter = 0;
+                Write(logEvent);
+            }
+        }

-                continuation = ex =>
+        /// <summary>
+        /// Writes the specified log event to the wrapped target, retrying and pausing in case of an error.
+        /// </summary>
+        /// <param name="logEvent">The log event.</param>
+        protected override void Write(AsyncLogEventInfo logEvent)
+        {
+            AsyncContinuation continuation = null;
+            int counter = 0;
+
+            continuation = ex =>
+            {
+                if (ex == null)
                 {
-                    if (ex == null)
+                    logEvent.Continuation(null);
+                    return;
+                }
+
+                int retryNumber = Interlocked.Increment(ref counter);
+                InternalLogger.Warn("Error while writing to '{0}': {1}. Try {2}/{3}", this.WrappedTarget, ex, retryNumber, this.RetryCount);
+
+                // exceeded retry count
+                if (retryNumber >= this.RetryCount)
+                {
+                    InternalLogger.Warn("Too many retries. Aborting.");
+                    logEvent.Continuation(ex);
+                    return;
+                }
+
+                // sleep and try again (Check every 100 ms if target have been closed)
+                for (int i = 0; i < this.RetryDelayMilliseconds;)
+                {
+                    int retryDelay = Math.Min(100, this.RetryDelayMilliseconds - i);
+                    Thread.Sleep(retryDelay);
+                    i += retryDelay;
+                    if (!IsInitialized)
                     {
-                        logEvent.Continuation(null);
-                        return;
-                    }
-
-                    int retryNumber = Interlocked.Increment(ref counter);
-                    InternalLogger.Warn("Error while writing to '{0}': {1}. Try {2}/{3}", this.WrappedTarget, ex, retryNumber, this.RetryCount);
-
-                    // exceeded retry count
-                    if (retryNumber >= this.RetryCount)
-                    {
-                        InternalLogger.Warn("Too many retries. Aborting.");
+                        InternalLogger.Warn("Target closed. Aborting.");
                         logEvent.Continuation(ex);
                         return;
                     }
-
-                    // sleep and try again (Check every 100 ms if target have been closed)
-                    for (int i = 0; i < this.RetryDelayMilliseconds;)
-                    {
-                        int retryDelay = Math.Min(100, this.RetryDelayMilliseconds - i);
-                        Thread.Sleep(retryDelay);
-                        i += retryDelay;
-                        if (!IsInitialized)
-                        {
-                            InternalLogger.Warn("Target closed. Aborting.");
-                            logEvent.Continuation(ex);
-                            return;
-                        }
-                    }
-
-                    this.WrappedTarget.WriteAsyncLogEvent(logEvent.LogEvent.WithContinuation(continuation));
-                };
+                }

                 this.WrappedTarget.WriteAsyncLogEvent(logEvent.LogEvent.WithContinuation(continuation));
-            }
+            };
+
+            this.WrappedTarget.WriteAsyncLogEvent(logEvent.LogEvent.WithContinuation(continuation));
         }
     }
 }


Workaround for issue 220.

Workaround for issue 220.

--- src/NodaTime.Test/TimeZones/BclDateTimeZoneTest.cs
+++ src/NodaTime.Test/TimeZones/BclDateTimeZoneTest.cs
@@ -99,6 +99,13 @@

         private void ValidateZoneEquality(Instant instant, DateTimeZone nodaZone, TimeZoneInfo windowsZone)
         {
+            // Skip just the first transition in Libya. It's broken in Windows.
+            // See issue 220 for the background.
+            if (windowsZone.Id == "Libya Standard Time" && instant.InUtc().Year == 2011)
+            {
+                return;
+            }
+
             var interval = nodaZone.GetZoneInterval(instant);

             // Check that the zone interval really represents a transition.


Decrement removed when max requests are reached. The finally statement will still execute and take care of decrementing.

--- src/Owin.Limits/MaxConcurrentRequestsMiddleware.cs
+++ src/Owin.Limits/MaxConcurrentRequestsMiddleware.cs
@@ -42,7 +42,6 @@
                     var conext = new OwinContext(environment);
                     conext.Response.StatusCode = 503;
                     conext.Response.ReasonPhrase = "Service Unavailable";
-                    Interlocked.Decrement(ref _concurrentRequests);
                     return;
                 }
                 await _next(environment);


Subscription; add Preview() support

Subscription; add Preview() support

--- Library/Subscription.cs
+++ Library/Subscription.cs
@@ -188,6 +188,11 @@
         /// </summary>
         public decimal? TaxRate { get; private set; }

+        /// <summary>
+        /// Determines if this object exists in the Recurly API
+        /// </summary>
+        internal bool _saved;
+
         internal Subscription()
         {
             IsPendingSubscription = false;
@@ -293,14 +298,28 @@
         }

         /// <summary>
-        /// Returns a preview for a new subscription applied to an account.
-        /// </summary>
-        public void Preview()
-        {
+        /// Transforms this object into a preview Subscription applied to the account.
+        /// </summary>
+        /// <param name="timeframe">ChangeTimeframe.Now (default) or at Renewal</param>
+        public void Preview(ChangeTimeframe timeframe)
+        {
+            if (_saved)
+            {
+                throw new Recurly.Exception("Cannot preview an existing subscription.");
+            }
+
             Client.Instance.PerformRequest(Client.HttpRequestMethod.Post,
                 UrlPrefix + "preview",
-                WriteXml,
+                WriteSubscriptionXml,
                 ReadXml);
+
+            // this method does not save the object
+            _saved = false;
+        }
+
+        public void Preview()
+        {
+            Preview(ChangeTimeframe.Now);
         }

         public void Postpone(DateTime nextRenewalDate)
@@ -332,6 +351,8 @@

         internal override void ReadXml(XmlTextReader reader)
         {
+            _saved = true;
+
             string href;

             while (reader.Read())


fixed error in assemblyinfo file

fixed error in assemblyinfo file

--- src/PropertyMapper.Core/Properties/AssemblyInfo.cs
+++ src/PropertyMapper.Core/Properties/AssemblyInfo.cs
@@ -5,10 +5,10 @@
 // General Information about an assembly is controlled through the following
 // set of attributes. Change these attribute values to modify the information
 // associated with an assembly.
-[assembly: AssemblyTitle("PropertyMapper.Tests")]
+[assembly: AssemblyTitle("PropertyMapper.Core")]
 [assembly: AssemblyDescription("")]
 [assembly: AssemblyConfiguration("")]
-[assembly: AssemblyProduct("PropertyMapper.Tests")]
+[assembly: AssemblyProduct("PropertyMapper")]
 [assembly: AssemblyCopyright("Copyright © Jens Andresen 2013")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]


Unit test fix.

Unit test fix.

--- src/Renci.SshNet/Abstractions/ThreadAbstraction.cs
+++ src/Renci.SshNet/Abstractions/ThreadAbstraction.cs
@@ -36,6 +36,8 @@
         /// <param name="action">The action to execute.</param>
         public static void ExecuteThread(Action action)
         {
+            if (action == null)
+                throw new ArgumentNullException("action");
 #if FEATURE_THREAD_THREADPOOL
             System.Threading.ThreadPool.QueueUserWorkItem(o => action());
 #elif FEATURE_THREAD_TAP


All spec

All spec

--- src/RestfulRouting.Spec/Format/MimeTypeListSpec.cs
+++ src/RestfulRouting.Spec/Format/MimeTypeListSpec.cs
@@ -139,5 +139,7 @@
                                                              ByFormat("json"),
                                                              ByFormat("pdf")
                                                          });
+
+        It parses_all = () => _mimeTypes.Parse("*/*").ShouldEqual(new List<MimeType> { ByFormat("all") });
     }
 }


259: use SubTableReader inside MySqlDataReader

--- src/SharpConnect.MySql/0_Public/MySqlDataReader.cs
+++ src/SharpConnect.MySql/0_Public/MySqlDataReader.cs
@@ -12,13 +12,14 @@
     {
         Query _query;
         Queue<MySqlTableResult> subTables = new Queue<MySqlTableResult>();
-        MySqlTableResult currentTableResult = null;
-        List<DataRowPacket> currentTableRows;
+        MySqlSubTable currentSubTable = MySqlSubTable.Empty;
+        //-------------------------
+        MySubTableDataReader subTableReader;
         int currentTableRowCount = 0;
         int currentRowIndex = 0;
+        //-------------------------
+        bool firstResultArrived;
         bool tableResultIsNotComplete;
-        DataRowPacket currentRow;
-        bool firstResultArrived;
         Action<MySqlDataReader> onFirstDataArrived;
         internal MySqlDataReader(Query query)
         {
@@ -48,7 +49,7 @@

         public MySqlSubTable CurrentSubTable
         {
-            get { return new MySqlSubTable(currentTableResult); }
+            get { return currentSubTable; }
         }

         /// <summary>
@@ -57,7 +58,7 @@
         internal void WaitUntilFirstDataArrive()
         {
             TRY_AGAIN:
-            if (currentTableResult == null)
+            if (currentSubTable.IsEmpty)
             {
                 //no current table
                 bool hasSomeSubTables = false;
@@ -65,9 +66,9 @@
                 {
                     if (subTables.Count > 0)
                     {
-                        currentTableResult = subTables.Dequeue();
+                        currentSubTable = new MySqlSubTable(subTables.Dequeue());
+                        currentTableRowCount = currentSubTable.RowCount;
                         hasSomeSubTables = true;
-                        currentTableRowCount = currentTableResult.rows.Count;
                     }
                 }
                 if (!hasSomeSubTables)
@@ -101,10 +102,7 @@
         {
             get
             {
-                //similar to Read()
-                return (currentTableResult == null) ?
-                    0 :
-                    currentTableResult.tableHeader.ColumnCount;
+                return currentSubTable.IsEmpty ? 0 : currentSubTable.FieldCount;
             }
         }
         /// <summary>
@@ -114,15 +112,15 @@
         /// <returns></returns>
         public string GetName(int colIndex)
         {
-            return currentTableResult.tableHeader.GetFields()[colIndex].name;
+            return currentSubTable.GetFieldDefinition(colIndex).Name;
+
         }
         //-------------------------
         public bool HasRows
         {
             get
             {
-                return currentTableResult != null
-                    && currentTableResult.rows.Count > 0;
+                return !currentSubTable.IsEmpty && currentSubTable.RowCount > 0;
             }
         }
         /// <summary>
@@ -132,17 +130,16 @@
         public void ReadSubTable(OnEachSubTable onEachSubTable)
         {
             TRY_AGAIN:
-            if (currentTableResult == null)
-            {
-                //no current table
-                currentRowIndex = 0;
-                currentTableRows = null;
+            if (currentSubTable.IsEmpty)
+            {
+                //no current table
+
                 bool hasSomeSubTables = false;
                 lock (subTables)
                 {
                     if (subTables.Count > 0)
                     {
-                        currentTableResult = subTables.Dequeue();
+                        currentSubTable = new MySqlSubTable(subTables.Dequeue());
                         hasSomeSubTables = true;
                     }
                 }
@@ -198,10 +195,35 @@
                     //so start clear here
                     onEachSubTable(CurrentSubTable);
                     //after invoke
-                    currentTableResult = null;
+                    currentSubTable = MySqlSubTable.Empty;
                     goto TRY_AGAIN;
                 }
             }
+        }
+
+
+        /// <summary>
+        /// async read row
+        /// </summary>
+        /// <param name="onEachRow"></param>
+        public void Read(Action onEachRow)
+        {
+            ReadSubTable(st =>
+            {
+                //on each subtable
+                var tableReader = st.CreateDataReader();
+                int j = tableReader.RowCount;
+                for (int i = 0; i < j; ++i)
+                {
+                    tableReader.SetCurrentRowIndex(i);
+                }
+                //if last one
+                if (st.IsLastTable)
+                {
+                    //async close
+                    this.Close(() => { });
+                }
+            });
         }
         /// <summary>
         /// sync read row
@@ -210,20 +232,22 @@
         public bool Read()
         {
             TRY_AGAIN:
-            if (currentTableResult == null)
-            {
-                //no current table
-                currentRowIndex = 0;
-                currentTableRows = null;
+            if (currentSubTable.IsEmpty)
+            {
+                //no current table
                 bool hasSomeSubTables = false;
                 lock (subTables)
                 {
                     if (subTables.Count > 0)
                     {
-                        currentTableResult = subTables.Dequeue();
+                        currentSubTable = new MySqlSubTable(subTables.Dequeue());
+                        //
                         hasSomeSubTables = true;
                     }
                 }
+                currentRowIndex = 0;
+                currentTableRowCount = currentSubTable.RowCount;
+
                 if (!hasSomeSubTables)
                 {
                     if (tableResultIsNotComplete)
@@ -252,25 +276,22 @@
                         return false;
                     }
                 }
-                //
-                currentTableRows = currentTableResult.rows;
-                currentTableRowCount = currentTableRows.Count;
-            }
-            //
+
+            }
+            //------------------------------------------------------------------
             if (currentRowIndex < currentTableRowCount)
             {
-                //------
-                //Console.WriteLine(currentRowIndex.ToString());
-                //------
-                currentRow = currentTableResult.rows[currentRowIndex];
+                subTableReader.SetCurrentRowIndex(currentRowIndex);
                 currentRowIndex++;
                 return true;
             }
             else
             {
-                currentTableResult = null;
+                currentSubTable = MySqlSubTable.Empty;
+                subTableReader = MySubTableDataReader.Empty;
                 goto TRY_AGAIN;
             }
+
         }
         public void Close(Action nextAction = null)
         {
@@ -284,9 +305,10 @@
                 //unblock
                 _query.Close(() =>
                 {
-                    currentTableResult = null;
                     currentRowIndex = 0;
-                    currentRow = null;
+                    currentTableRowCount = 0;
+                    currentSubTable = MySqlSubTable.Empty;
+                    subTableReader = MySubTableDataReader.Empty;
                     subTables.Clear();
                     nextAction();
                 });
@@ -295,144 +317,65 @@
         //-------------------------------------------
         public sbyte GetInt8(int colIndex)
         {
-
-            //TODO: check match type and check index here
-            return (sbyte)currentRow.Cells[colIndex].myInt32;
+            return subTableReader.GetInt8(colIndex);
+
         }
         public byte GetUInt8(int colIndex)
         {
-            //TODO: check match type and check index here
-            return (byte)currentRow.Cells[colIndex].myInt32;
+            return subTableReader.GetUInt8(colIndex);
         }
         public short GetInt16(int colIndex)
-        {   //TODO: check match type and check index here
-            return (short)currentRow.Cells[colIndex].myInt32;
+        {
+            return subTableReader.GetInt16(colIndex);
         }
         public ushort GetUInt16(int colIndex)
         {
-            //TODO: check match type and check index here
-            return (ushort)currentRow.Cells[colIndex].myInt32;
+            return subTableReader.GetUInt16(colIndex);
         }

         public int GetInt32(int colIndex)
         {
-            //TODO: check match type and check index here
-            return currentRow.Cells[colIndex].myInt32;
+            return subTableReader.GetInt32(colIndex);
         }
         public uint GetUInt32(int colIndex)
         {
-            //TODO: check match type and check index here
-            return currentRow.Cells[colIndex].myUInt32;
+            return subTableReader.GetUInt32(colIndex);
         }
         public long GetLong(int colIndex)
         {
-            //TODO: check match type and check index here
-            return currentRow.Cells[colIndex].myInt64;
+            return subTableReader.GetLong(colIndex);
+
         }
         public ulong GetULong(int colIndex)
         {
-            //TODO: check match type and check index here
-            return currentRow.Cells[colIndex].myUInt64;
+            return subTableReader.GetULong(colIndex);
+
         }
         public decimal GetDecimal(int colIndex)
         {
-            //TODO: check match type and index here
-            return currentRow.Cells[colIndex].myDecimal;
+            return subTableReader.GetDecimal(colIndex);
         }
         public string GetString(int colIndex)
         {
-            //TODO: check match type and index here
-            return currentRow.Cells[colIndex].myString;
+            return subTableReader.GetString(colIndex);
         }
         public string GetString(int colIndex, System.Text.Encoding encoding)
         {
-            //TODO: check match type and index here
-            return currentRow.Cells[colIndex].myString;
+            return subTableReader.GetString(colIndex, encoding);
         }
         public byte[] GetBuffer(int colIndex)
         {
-            //TODO: check match type and index here
-            return currentRow.Cells[colIndex].myBuffer;
+            return subTableReader.GetBuffer(colIndex);
         }

         public DateTime GetDateTime(int colIndex)
         {
-            //TODO: check match type and check index here
-            return currentRow.Cells[colIndex].myDateTime;
+            return subTableReader.GetDateTime(colIndex);
+
         }
         public object GetValue(int colIndex)
         {
-            MyStructData data = currentRow.Cells[colIndex];
-            switch (data.type)
-            {
-                case MySqlDataType.BLOB:
-                case MySqlDataType.LONG_BLOB:
-                case MySqlDataType.MEDIUM_BLOB:
-                case MySqlDataType.TINY_BLOB:
-                    return data.myBuffer;
-
-                case MySqlDataType.DATE:
-                case MySqlDataType.NEWDATE:
-                    return data.myDateTime;
-                //stbuilder.Append('\'');
-                //stbuilder.Append(data.myDateTime.ToString("yyyy-MM-dd"));
-                //stbuilder.Append('\'');
-                //break;
-                case MySqlDataType.DATETIME:
-                    //stbuilder.Append('\'');
-                    //stbuilder.Append(data.myDateTime.ToString("yyyy-MM-dd hh:mm:ss"));
-                    //stbuilder.Append('\'');
-                    //break;
-                    return data.myDateTime;
-                case MySqlDataType.TIMESTAMP:
-                case MySqlDataType.TIME:
-                    ////TODO: review here
-                    //stbuilder.Append('\'');
-                    //stbuilder.Append(data.myDateTime.ToString("hh:mm:ss"));
-                    //stbuilder.Append('\'');
-                    //break;
-                    return data.myDateTime;
-                case MySqlDataType.STRING:
-                case MySqlDataType.VARCHAR:
-                case MySqlDataType.VAR_STRING:
-
-                    //stbuilder.Append('\'');
-                    ////TODO: check /escape string here ****
-                    //stbuilder.Append(data.myString);
-                    //stbuilder.Append('\'');
-                    //break;
-                    return data.myString;
-                case MySqlDataType.BIT:
-                    throw new NotSupportedException();
-                // stbuilder.Append(Encoding.ASCII.GetString(new byte[] { (byte)data.myInt32 }));
-
-                case MySqlDataType.DOUBLE:
-                    return data.myDouble;
-                //stbuilder.Append(data.myDouble.ToString());
-                //break;
-                case MySqlDataType.FLOAT:
-                    return data.myDouble;//TODO: review here
-                //stbuilder.Append(((float)data.myDouble).ToString());
-
-                case MySqlDataType.TINY:
-                case MySqlDataType.SHORT:
-                case MySqlDataType.LONG:
-                case MySqlDataType.INT24:
-                case MySqlDataType.YEAR:
-                    return data.myInt32;
-                //stbuilder.Append(data.myInt32.ToString());
-
-                case MySqlDataType.LONGLONG:
-                    return data.myInt64;
-                //stbuilder.Append(data.myInt64.ToString());
-
-                case MySqlDataType.DECIMAL:
-                    //stbuilder.Append(data.myDecimal.ToString());
-                    return data.myDecimal;
-
-                default:
-                    throw new NotSupportedException();
-            }
+            return subTableReader.GetValue(colIndex);
         }
     }

@@ -468,6 +411,9 @@

     public struct MySubTableDataReader
     {
+
+        public static readonly MySubTableDataReader Empty = new MySubTableDataReader();
+
         //for read on each subtable
         readonly MySqlTableResult tableResult;
         int currentRowIndex;
@@ -478,6 +424,11 @@
             currentRowIndex = 0;
             currentRow = null;
             SetCurrentRowIndex(0);
+        }
+
+        public bool IsEmpty
+        {
+            get { return tableResult == null; }
         }
         public int RowIndex { get { return this.currentRowIndex; } }
         public void SetCurrentRowIndex(int index)
@@ -673,6 +624,10 @@
                 return tableResult.rows != null && tableResult.rows.Count > 0;
             }
         }
+        public bool IsEmpty
+        {
+            get { return tableResult == null; }
+        }

         public MySubTableDataReader CreateDataReader()
         {


test for ValueList

test for ValueList

--- src/Tests/Peachpie.Runtime.Tests/UtilitiesTests.cs
+++ src/Tests/Peachpie.Runtime.Tests/UtilitiesTests.cs
@@ -2,6 +2,7 @@
 using System.Text;
 using Microsoft.VisualStudio.TestTools.UnitTesting;
 using Pchp.Core;
+using Pchp.Core.Collections;
 using Pchp.Core.Text;

 namespace Peachpie.Runtime.Tests
@@ -29,5 +30,20 @@
             Assert.AreEqual("ff-ff", Pchp.Core.Utilities.StringUtils.BinToHex(new byte[] { 0xff, 0xff }, "-"));
             Assert.AreEqual("ff-ff-ff", Pchp.Core.Utilities.StringUtils.BinToHex(new byte[] { 0xff, 0xff, 0xff }, "-"));
         }
+
+        [TestMethod]
+        public void ValueListTest()
+        {
+            var list = new ValueList<int>();
+            for (int i = 0; i < 10; i++)
+            {
+                list.AddRange(new[] { 0, 1, 2, 3 });
+                list.Add(4);
+                list.Insert(list.Count, 5);
+            }
+
+            list.Insert(0, -1);
+            list.Insert(1, 1);
+        }
     }
 }


U4-9237 Validate application parameter when getting application trees (#2315)

--- src/Umbraco.Web/Trees/ApplicationTreeController.cs
+++ src/Umbraco.Web/Trees/ApplicationTreeController.cs
@@ -3,7 +3,9 @@
 using System.Linq;
 using System.Net;
 using System.Net.Http.Formatting;
+using System.Text.RegularExpressions;
 using System.Threading.Tasks;
+using System.Web;
 using System.Web.Http;
 using Umbraco.Core;
 using Umbraco.Core.Models;
@@ -32,6 +34,8 @@
         [HttpQueryStringFilter("queryStrings")]
         public async Task<SectionRootNode> GetApplicationTrees(string application, string tree, FormDataCollection queryStrings, bool onlyInitialized = true)
         {
+            application = application.CleanForXss();
+
             if (string.IsNullOrEmpty(application)) throw new HttpResponseException(HttpStatusCode.NotFound);

             var rootId = Constants.System.Root.ToString(CultureInfo.InvariantCulture);
@@ -39,7 +43,7 @@
             //find all tree definitions that have the current application alias
             var appTrees = Services.ApplicationTreeService.GetApplicationTrees(application, onlyInitialized).ToArray();

-            if (string.IsNullOrEmpty(tree) == false || appTrees.Length == 1)
+            if (string.IsNullOrEmpty(tree) == false || appTrees.Length == 1 || appTrees.Any() == false)
             {
                 var apptree = string.IsNullOrEmpty(tree) == false
                     ? appTrees.SingleOrDefault(x => x.Alias == tree)


Use BenchmarkRunner

Use BenchmarkRunner

Use BenchmarkRunner instead of having to use BenchmarkSwitcher.

--- tests/API.Benchmarks/Program.cs
+++ tests/API.Benchmarks/Program.cs
@@ -21,13 +21,7 @@
         /// </returns>
         internal static async Task Main(string[] args)
         {
-            var switcher = BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly);
-
-            if (args?.Length == 0)
-            {
-                switcher.RunAll();
-            }
-            else if (args?.Length == 1 && string.Equals(args[0], "--test", StringComparison.OrdinalIgnoreCase))
+            if (args?.Length == 1 && string.Equals(args[0], "--test", StringComparison.OrdinalIgnoreCase))
             {
                 using var benchmark = new ApiBenchmarks();
                 await benchmark.StartServer();
@@ -39,7 +33,7 @@
             }
             else
             {
-                switcher.Run(args);
+                BenchmarkRunner.Run<ApiBenchmarks>(args: args);
             }
         }
     }


Ajout commentaires registrationHelper

Ajout commentaires registrationHelper

--- src/XrmFramework.DeployUtils/RegistrationHelper.cs
+++ src/XrmFramework.DeployUtils/RegistrationHelper.cs
@@ -27,6 +27,9 @@

         public static void RegisterPluginsAndWorkflows<TPlugin>(string projectName)
         {
+            //GetProjectConfig
+            //Get configuration info for the project
+
             var xrmFrameworkConfigSection = ConfigHelper.GetSection();

             var projectConfig = xrmFrameworkConfigSection.Projects.OfType<ProjectElement>()
@@ -41,8 +44,10 @@
                 return;
             }

+            //  ------------------------------------------------------------------------
+            // Get name of the solution for which the plugins are made
             var pluginSolutionUniqueName = projectConfig.TargetSolution;
-
+            //Get the string required to connect to the CRM project
             var connectionString = ConfigurationManager.ConnectionStrings[xrmFrameworkConfigSection.SelectedConnection].ConnectionString;

             Console.WriteLine($"You are about to deploy on {connectionString} organization. If ok press any key.");
@@ -51,26 +56,34 @@

             CrmServiceClient.MaxConnectionTimeout = TimeSpan.FromMinutes(10);

+            //Create the CrmServiceClient to interact with the CrmProject
             var service = new CrmServiceClient(connectionString);

+            //Kind of deprecated, allow use of early bound classes like in DeployUtils.Model.Entities, to make a strongly typed object from a table
             service.OrganizationServiceProxy?.EnableProxyTypes();

+            //------------------------------------------------------------------------------------------------
+            // Get all users, messages, messages filters for the solution
             InitMetadata(service, pluginSolutionUniqueName);
-
+            //------------------------------------------------------------------------------------------------
+            // Get the assembly that contains the classes Plugin, CustomWorkflowActivity and CustomApi that are needed in order to understand what will be registered
             var pluginAssembly = typeof(TPlugin).Assembly;
-
+            //Get each possible type of plugin
             var pluginType = pluginAssembly.GetType("XrmFramework.Plugin");
             var customApiType = pluginAssembly.GetType("XrmFramework.CustomApi");
             var workflowType = pluginAssembly.GetType("XrmFramework.Workflow.CustomWorkflowActivity");

+            //-----------------------------------------------------------------------
             var pluginList = new List<Plugin>();
-
+            // Get all plugin types that were developped by the users
             var pluginTypes = pluginAssembly.GetTypes().Where(t => pluginType.IsAssignableFrom(t) && !customApiType.IsAssignableFrom(t) && t.IsPublic && !t.IsAbstract).ToList();

             var workflowTypes = pluginAssembly.GetTypes().Where(t => workflowType.IsAssignableFrom(t) && !t.IsAbstract && t.IsPublic).ToList();

             var customApiTypes = pluginAssembly.GetTypes().Where(t => customApiType.IsAssignableFrom(t) && t.IsPublic && !t.IsAbstract).ToList();

+            //------------------------------------------------------------------------------------
+            // Get each plugin data, the plugin class in deployUtils is not the same as in Plugin, it is metadata
             foreach (var type in pluginTypes)
             {
                 dynamic pluginTemp;
@@ -114,18 +127,18 @@
                 var customApi = CustomApi.FromXrmFrameworkCustomApi(customApiTemp, _publisher.CustomizationPrefix);

                 customApis.Add(customApi);
-            }
-
-
-            var assembly = GetAssemblyByName(service, pluginAssembly.GetName().Name);
-
-            var profilerAssembly = GetProfilerAssembly(service);
-
-            var registeredPluginTypes = new List<PluginType>();
-            var registeredCustomApis = new List<CustomApi>();
+            }
+            // ------------------------------------------------------------------------------------------
+            // Get the plugin assembly from the CRM
+            var assembly = GetAssemblyByName(service, pluginAssembly.GetName().Name);
+            //Get plugin profiler assembly from the CRM
+            var profilerAssembly = GetProfilerAssembly(service);
+            var registeredPluginTypes = new List<PluginType>();
+            var registeredCustomApis = new List<CustomApi>();
             var registeredCustomApiRequestParameters = new List<CustomApiRequestParameter>();
             var registeredCustomApiResponseProperties = new List<CustomApiResponseProperty>();
             var profiledSteps = new List<SdkMessageProcessingStep>();
+            //Collection of the steps for when a plugin will need to execute
             ICollection<SdkMessageProcessingStep> registeredSteps = Enumerable.Empty<SdkMessageProcessingStep>().ToList();

             var assemblyPath = pluginAssembly.Location;
@@ -182,9 +195,10 @@

                 service.Update(updatedAssembly);
             }
-
+            // Adding assembly to solution
             AddSolutionComponentToSolution(service, pluginSolutionUniqueName, assembly.ToEntityReference());

+            // Get preimages of assembly
             var registeredImages = GetRegisteredImages(service, assembly.Id);

             Console.WriteLine();
@@ -193,15 +207,16 @@
             foreach (var plugin in pluginList.Where(p => !p.IsWorkflow))
             {
                 Console.WriteLine($@"  - {plugin.FullName}");
-
+                // We get this plugin from the CRM
                 var registeredPluginType = registeredPluginTypes.FirstOrDefault(p => p.Name == plugin.FullName);

+                // If it is not yet registered, create it with the service
                 if (registeredPluginType == null)
                 {
                     registeredPluginType = GetPluginTypeToRegister(assembly.Id, plugin.FullName);
                     registeredPluginType.Id = service.Create(registeredPluginType);
                 }
-
+                // Get the registered steps corresponding to the plugin
                 var registeredStepsForPluginType = registeredSteps.Where(s => s.EventHandler.Id == registeredPluginType.Id).ToList();

                 var comparer = new SdkMessageStepComparer();
@@ -212,10 +227,12 @@

                     var registeredStep = registeredStepsForPluginType.FirstOrDefault(s => comparer.Equals(s, stepToRegister));

+                    //If the step is not yet registered, meaning it is a new one, create it in the CRM
                     if (registeredStep == null)
                     {
                         stepToRegister.Id = service.Create(stepToRegister);
                     }
+                    //If the step is already registered, no need to register it twice, just update it
                     else
                     {
                         registeredSteps.Remove(registeredStep);
@@ -239,7 +256,7 @@
                             service.Update(stepToRegister);
                         }
                     }
-
+                    // Add the new registered steps to the CRM
                     AddSolutionComponentToSolution(service, pluginSolutionUniqueName, stepToRegister.ToEntityReference());

                     if (convertedStep.Message != Messages.Associate.ToString() && convertedStep.Message != Messages.Lose.ToString() && convertedStep.Message != Messages.Win.ToString())
@@ -250,25 +267,26 @@
                         {
                             if (registeredPostImage == null)
                             {
-                                registeredPostImage = GetImageToRegister(service, stepToRegister.Id, convertedStep, false);
-                                registeredPostImage.Id = service.Create(registeredPostImage);
-
-                            }
-                            else if (registeredPostImage.Attributes1 != convertedStep.JoinedPostImageAttributes)
-                            {
-                                registeredPostImage.Attributes1 = convertedStep.JoinedPostImageAttributes;
-                                service.Update(registeredPostImage);
-                            }
-                        }
-                        else if (registeredPostImage != null)
-                        {
-                            service.Delete(registeredPostImage.LogicalName, registeredPostImage.Id);
-                        }
-
-                        var registeredPreImage = registeredImages.FirstOrDefault(i => i.Name == "PreImage" && i.SdkMessageProcessingStepId.Id == stepToRegister.Id);
-
-                        if (convertedStep.PreImageUsed)
-                        {
+                                registeredPostImage = GetImageToRegister(service, stepToRegister.Id, convertedStep, false);
+                                registeredPostImage.Id = service.Create(registeredPostImage);
+
+                            }
+                            else if (registeredPostImage.Attributes1 != convertedStep.JoinedPostImageAttributes)
+                            {
+                                registeredPostImage.Attributes1 = convertedStep.JoinedPostImageAttributes;
+                                service.Update(registeredPostImage);
+                            }
+                        }
+                        else if (registeredPostImage != null)
+                        {
+                            service.Delete(registeredPostImage.LogicalName, registeredPostImage.Id);
+                        }
+
+                        //Add the relevant preimages for each step
+                        var registeredPreImage = registeredImages.FirstOrDefault(i => i.Name == "PreImage" && i.SdkMessageProcessingStepId.Id == stepToRegister.Id);
+
+                        if (convertedStep.PreImageUsed)
+                        {
                             if (registeredPreImage == null)
                             {
                                 registeredPreImage = GetImageToRegister(service, stepToRegister.Id, convertedStep, true);
@@ -290,7 +308,7 @@

             Console.WriteLine();
             Console.WriteLine(@"Registering Custom Workflow activities");
-
+            // Register the customWorkflows
             foreach (var customWf in pluginList.Where(p => p.IsWorkflow))
             {
                 var registeredPluginType = registeredPluginTypes.FirstOrDefault(p => p.TypeName == customWf.FullName);
@@ -309,6 +327,7 @@
                 }
             }

+            // Add relevant custom api
             Console.WriteLine();
             Console.WriteLine(@"Registering Custom Apis");

@@ -773,6 +792,7 @@

             var sw = Stopwatch.StartNew();

+            // Get the message filters that allow custom processing steps and are visible ?
             var query = new QueryExpression(SdkMessageFilter.EntityLogicalName);
             query.ColumnSet.AddColumns("sdkmessagefilterid", "sdkmessageid", "primaryobjecttypecode");
             query.Criteria.AddCondition("iscustomprocessingstepallowed", ConditionOperator.Equal, true);
@@ -782,9 +802,11 @@

             //Console.WriteLine($"Retrieved {filters.Count} message filters in {sw.Elapsed}");

+            // Clear filters from the collection (est ce que c'est _filters qui contient tous les filtres utilisés ?, ce qui voudrait dire qu'on pourrait s'en servir pour le debugging ?)
             _filters.Clear();
             _filters.AddRange(filters.Select(f => f.ToEntity<SdkMessageFilter>()));
-
+
+            //Get all the messages in the project (update, Create, Delete etc ??)
             sw.Restart();
             query = new QueryExpression(SdkMessage.EntityLogicalName);
             query.ColumnSet.AddColumns("sdkmessageid", "name");
@@ -799,8 +821,8 @@
                 _messages.Add(e.Name, e.ToEntityReference());
             }

+            //Get the solution entity the plugins will be added to
             sw.Restart();
-
             query = new QueryExpression(Solution.EntityLogicalName);
             query.ColumnSet.AllColumns = true;
             query.Criteria.AddCondition("uniquename", ConditionOperator.Equal, solutionName);
@@ -823,6 +845,7 @@
             }
             else
             {
+                //If the solution is real and usable, get its publisher
                 _publisher = service.Retrieve(Publisher.EntityLogicalName, _solution.PublisherId.Id, new ColumnSet(true)).ToEntity<Publisher>();

@@ -835,6 +858,7 @@
                 _components.AddRange(components);
             }

+            //Get users (pourquoi lui il est pas réinitialisé ?)
             query = new QueryExpression("systemuser");
             query.ColumnSet.AddColumn("domainname");
             query.Criteria.AddCondition("accessmode", ConditionOperator.NotEqual, 3);


Fixes tank duplication.

Fixes tank duplication.

--- ModuleSwitchableTank.cs
+++ ModuleSwitchableTank.cs
@@ -216,7 +216,7 @@

 		public override void OnLoad(ConfigNode node)
 		{
-			//if the tank is managed, save its config
+			//if the config comes from TankManager, save its config
 			if(node.HasValue(SwitchableTankManager.MANAGED))
 			{
 				ModuleSave = node;
@@ -226,7 +226,10 @@
 			else if(ModuleSave != null &&
 			        ModuleSave.HasValue(SwitchableTankManager.MANAGED))
 				Load(ModuleSave);
-			//if we still don't have a saved module config, save it
+			//if it is a managed tank, but config does not come from TankManager
+			else if(managed)
+				part.Modules.Remove(this);
+			//this is a stand-alone tank; save initial MODULE configuration
 			else if(ModuleSave == null)
 				ModuleSave = node;
 		}


Reduce stack when looking for position neighbors

--- Mzinga.Core/Position.cs
+++ Mzinga.Core/Position.cs
@@ -67,10 +67,12 @@
         {
             get
             {
-                for (int i = 0; i < _neighborDeltas.Length; i++)
-                {
-                    yield return NeighborAt(i);
-                }
+                yield return new Position(X, Y + 1, Z - 1, Stack);
+                yield return new Position(X + 1, Y, Z - 1, Stack);
+                yield return new Position(X + 1, Y - 1, Z, Stack);
+                yield return new Position(X, Y - 1, Z + 1, Stack);
+                yield return new Position(X - 1, Y, Z + 1, Stack);
+                yield return new Position(X - 1, Y + 1, Z, Stack);
             }
         }

@@ -120,7 +122,7 @@
         public Position NeighborAt(Direction direction, int deltaStack = 0)
         {
             int dirIndex = (int)direction;
-            return NeighborAt(dirIndex, deltaStack);
+            return new Position(X + _neighborDeltas[dirIndex][0], Y + _neighborDeltas[dirIndex][1], Z + _neighborDeltas[dirIndex][2], deltaStack);
         }

         public Position NeighborAt(Direction[] directions, int deltaStack = 0)
@@ -138,11 +140,6 @@
             }

             return neighbor;
-        }
-
-        private Position NeighborAt(int dirIndex, int deltaStack = 0)
-        {
-            return GetShifted(_neighborDeltas[dirIndex][0], _neighborDeltas[dirIndex][1], _neighborDeltas[dirIndex][2], deltaStack);
         }

         public Position GetShifted(int deltaX, int deltaY, int deltaZ, int deltaStack = 0)


Committed Update

Committed Update

--- Framework/Node.cs
+++ Framework/Node.cs
@@ -1,193 +1,229 @@
+using UnityEngine;
+using UnityEditor;
 using System;
 using System.Collections.Generic;
-using UnityEditor;
-using UnityEngine;
-
-public abstract class Node : ScriptableObject {
-    public Rect rect;
-
-    public List<NodeInput> Inputs = new List<NodeInput>();
-    public List<NodeOutput> Outputs = new List<NodeOutput>();
-
-    /// <summary>
-    /// Init this node. Has to be called when creating a child node of this
-    /// </summary>
-    protected void Init() {
-        Calculate();
-        Node_Editor.editor.nodeCanvas.nodes.Add(this);
-        if (!String.IsNullOrEmpty(AssetDatabase.GetAssetPath(Node_Editor.editor.nodeCanvas))) {
-            AssetDatabase.AddObjectToAsset(this, Node_Editor.editor.nodeCanvas);
-            for (int inCnt = 0; inCnt < Inputs.Count; inCnt++)
-                AssetDatabase.AddObjectToAsset(Inputs[inCnt], this);
-            for (int outCnt = 0; outCnt < Outputs.Count; outCnt++)
-                AssetDatabase.AddObjectToAsset(Outputs[outCnt], this);
-
-            AssetDatabase.ImportAsset(Node_Editor.editor.openedCanvasPath);
-            AssetDatabase.Refresh();
-        }
-    }
-
-    /// <summary>
-    /// Function implemented by the children to draw the node
-    /// </summary>
-    public abstract void DrawNode();
-
-    /// <summary>
-    /// Function implemented by the children to calculate their outputs
-    /// Should return Success/Fail
-    /// </summary>
-    public abstract bool Calculate();
-
-    /// <summary>
-    /// Draws the node curves as well as the knobs
-    /// </summary>
-    public void DrawConnectors() {
-        for (int outCnt = 0; outCnt < Outputs.Count; outCnt++) {
-            NodeOutput output = Outputs[outCnt];
-            for (int conCnt = 0; conCnt < output.connections.Count; conCnt++) {
-                if (output.connections[conCnt] != null)
-                    Node_Editor.DrawNodeCurve(output.GetKnob().center,
-                                               output.connections[conCnt].GetKnob().center);
-                else
-                    output.connections.RemoveAt(conCnt);
-            }
-            GUI.DrawTexture(output.GetKnob(), Node_Editor.ConnectorKnob);
-        }
-        for (int inCnt = 0; inCnt < Inputs.Count; inCnt++) {
-            GUI.DrawTexture(Inputs[inCnt].GetKnob(), Node_Editor.ConnectorKnob);
-        }
-    }
-
-    /// <summary>
-    /// Callback when the node is deleted. Extendable by the child node, but always call base.OnDelete when overriding !!
-    /// </summary>
-    public virtual void OnDelete() {
-        for (int outCnt = 0; outCnt < Outputs.Count; outCnt++) {
-            NodeOutput output = Outputs[outCnt];
-            for (int conCnt = 0; conCnt < output.connections.Count; conCnt++)
-                output.connections[outCnt].connection = null;
-        }
-        for (int inCnt = 0; inCnt < Inputs.Count; inCnt++) {
-            if (Inputs[inCnt].connection != null)
-                Inputs[inCnt].connection.connections.Remove(Inputs[inCnt]);
-        }
-
-        DestroyImmediate(this, true);
-        if (!String.IsNullOrEmpty(Node_Editor.editor.openedCanvasPath)) {
-            AssetDatabase.ImportAsset(Node_Editor.editor.openedCanvasPath);
-            AssetDatabase.Refresh();
-        }
-    }
-
-    #region Member Functions
-
-    /// <summary>
-    /// Checks if there are no unassigned and no null-value inputs.
-    /// </summary>
-    public bool allInputsReady() {
-        for (int inCnt = 0; inCnt < Inputs.Count; inCnt++) {
-            if (Inputs[inCnt].connection == null || Inputs[inCnt].connection.value == null)
-                return false;
-        }
-        return true;
-    }
-    /// <summary>
-    /// Checks if there are any unassigned inputs.
-    /// </summary>
-    public bool hasNullInputs() {
-        for (int inCnt = 0; inCnt < Inputs.Count; inCnt++) {
-            if (Inputs[inCnt].connection == null)
-                return true;
-        }
-        return false;
-    }
-    /// <summary>
-    /// Checks if there are any null-value inputs.
-    /// </summary>
-    public bool hasNullInputValues() {
-        for (int inCnt = 0; inCnt < Inputs.Count; inCnt++) {
-            if (Inputs[inCnt].connection != null && Inputs[inCnt].connection.value == null)
-                return true;
-        }
-        return false;
-    }
-
-    /// <summary>
-    /// Returns the input knob that is at the position on this node or null
-    /// </summary>
-    public NodeInput GetInputAtPos(Vector2 pos) {
-        for (int inCnt = 0; inCnt < Inputs.Count; inCnt++) { // Search for an input at the position
-            if (Inputs[inCnt].GetKnob().Contains(new Vector3(pos.x, pos.y)))
-                return Inputs[inCnt];
-        }
-        return null;
-    }
-    /// <summary>
-    /// Returns the output knob that is at the position on this node or null
-    /// </summary>
-    public NodeOutput GetOutputAtPos(Vector2 pos) {
-        for (int outCnt = 0; outCnt < Outputs.Count; outCnt++) { // Search for an output at the position
-            if (Outputs[outCnt].GetKnob().Contains(new Vector3(pos.x, pos.y)))
-                return Outputs[outCnt];
-        }
-        return null;
-    }
-
-    /// <summary>
-    /// Recursively checks whether this node is a child of the other node
-    /// </summary>
-    public bool isChildOf(Node otherNode) {
-        if (otherNode == null)
-            return false;
-        for (int cnt = 0; cnt < Inputs.Count; cnt++) {
-            if (Inputs[cnt].connection != null) {
-                if (Inputs[cnt].connection.body == otherNode)
-                    return true;
-                else if (Inputs[cnt].connection.body.isChildOf(otherNode)) // Recursively searching
-                    return true;
-            }
-        }
-        return false;
-    }
-
-    #endregion
-
-    #region static Functions
-
-    /// <summary>
-    /// Check if an output and an input can be connected (same type, ...)
-    /// </summary>
-    public static bool CanApplyConnection(NodeOutput output, NodeInput input) {
-        if (input == null || output == null)
-            return false;
-
-        if (input.body == output.body || input.connection == output)
-            return false;
-
-        if (input.type != output.type)
-            return false;
-
-        if (output.body.isChildOf(input.body)) {
-            Node_Editor.editor.ShowNotification(new GUIContent("Recursion detected!"));
-            return false;
-        }
-        return true;
-    }
-
-    /// <summary>
-    /// Applies a connection between output and input. 'CanApplyConnection' has to be checked before
-    /// </summary>
-    public static void ApplyConnection(NodeOutput output, NodeInput input) {
-        if (input != null && output != null) {
-            if (input.connection != null) {
-                input.connection.connections.Remove(input);
-            }
-            input.connection = output;
-            output.connections.Add(input);
-
-            Node_Editor.editor.RecalculateFrom(input.body);
-        }
-    }
-
-    #endregion
+
+public abstract class Node : ScriptableObject
+{
+	public Rect rect = new Rect ();
+
+	public List<NodeInput> Inputs = new List<NodeInput> ();
+	public List<NodeOutput> Outputs = new List<NodeOutput> ();
+
+	/// <summary>
+	/// Init this node. Has to be called when creating a child node of this
+	/// </summary>
+	protected void Init ()
+	{
+		Calculate ();
+		Node_Editor.editor.nodeCanvas.nodes.Add (this);
+		if (!String.IsNullOrEmpty (AssetDatabase.GetAssetPath (Node_Editor.editor.nodeCanvas)))
+		{
+			AssetDatabase.AddObjectToAsset (this, Node_Editor.editor.nodeCanvas);
+			for (int inCnt = 0; inCnt < Inputs.Count; inCnt++)
+				AssetDatabase.AddObjectToAsset (Inputs [inCnt], this);
+			for (int outCnt = 0; outCnt < Outputs.Count; outCnt++)
+				AssetDatabase.AddObjectToAsset (Outputs [outCnt], this);
+
+			AssetDatabase.ImportAsset (Node_Editor.editor.openedCanvasPath);
+			AssetDatabase.Refresh ();
+		}
+	}
+
+	/// <summary>
+	/// Function implemented by the children to draw the node
+	/// </summary>
+	public abstract void NodeGUI ();
+
+	/// <summary>
+	/// Function implemented by the children to calculate their outputs
+	/// Should return Success/Fail
+	/// </summary>
+	public abstract bool Calculate ();
+
+	/// <summary>
+	/// Draws the node knobs; splitted from curves because of the render order
+	/// </summary>
+	public void DrawKnobs ()
+	{
+		for (int outCnt = 0; outCnt < Outputs.Count; outCnt++)
+		{
+			GUI.DrawTexture (Outputs [outCnt].GetKnob (), Node_Editor.typeData [Outputs [outCnt].type].OutputKnob);
+		}
+		for (int inCnt = 0; inCnt < Inputs.Count; inCnt++)
+		{
+			GUI.DrawTexture (Inputs [inCnt].GetKnob (), Node_Editor.typeData [Inputs [inCnt].type].InputKnob);
+		}
+	}
+	/// <summary>
+	/// Draws the node curves; splitted from knobs because of the render order
+	/// </summary>
+	public void DrawConnections ()
+	{
+		for (int outCnt = 0; outCnt < Outputs.Count; outCnt++)
+		{
+			NodeOutput output = Outputs [outCnt];
+			for (int conCnt = 0; conCnt < output.connections.Count; conCnt++)
+			{
+				Node_Editor.DrawNodeCurve (output.GetKnob ().center,
+				                           output.connections [conCnt].GetKnob ().center,
+				                           Node_Editor.typeData [output.type].col);
+			}
+		}
+	}
+
+	/// <summary>
+	/// Callback when the node is deleted. Extendable by the child node, but always call base.OnDelete when overriding !!
+	/// </summary>
+	public virtual void OnDelete ()
+	{
+		for (int outCnt = 0; outCnt < Outputs.Count; outCnt++)
+		{
+			NodeOutput output = Outputs [outCnt];
+			for (int conCnt = 0; conCnt < output.connections.Count; conCnt++)
+				output.connections [outCnt].connection = null;
+		}
+		for (int inCnt = 0; inCnt < Inputs.Count; inCnt++)
+		{
+			if (Inputs [inCnt].connection != null)
+				Inputs [inCnt].connection.connections.Remove (Inputs [inCnt]);
+		}
+
+		DestroyImmediate (this, true);
+		if (!String.IsNullOrEmpty (Node_Editor.editor.openedCanvasPath))
+		{
+			AssetDatabase.ImportAsset (Node_Editor.editor.openedCanvasPath);
+			AssetDatabase.Refresh ();
+		}
+	}
+
+	#region Member Functions
+
+	/// <summary>
+	/// Checks if there are no unassigned and no null-value inputs.
+	/// </summary>
+	public bool allInputsReady ()
+	{
+		for (int inCnt = 0; inCnt < Inputs.Count; inCnt++)
+		{
+			if (Inputs [inCnt].connection == null || Inputs [inCnt].connection.value == null)
+				return false;
+		}
+		return true;
+	}
+	/// <summary>
+	/// Checks if there are any unassigned inputs.
+	/// </summary>
+	public bool hasNullInputs ()
+	{
+		for (int inCnt = 0; inCnt < Inputs.Count; inCnt++)
+		{
+			if (Inputs [inCnt].connection == null)
+				return true;
+		}
+		return false;
+	}
+	/// <summary>
+	/// Checks if there are any null-value inputs.
+	/// </summary>
+	public bool hasNullInputValues ()
+	{
+		for (int inCnt = 0; inCnt < Inputs.Count; inCnt++)
+		{
+			if (Inputs [inCnt].connection != null && Inputs [inCnt].connection.value == null)
+				return true;
+		}
+		return false;
+	}
+
+	/// <summary>
+	/// Returns the input knob that is at the position on this node or null
+	/// </summary>
+	public NodeInput GetInputAtPos (Vector2 pos)
+	{
+		for (int inCnt = 0; inCnt < Inputs.Count; inCnt++)
+		{ // Search for an input at the position
+			if (Inputs [inCnt].GetKnob ().Contains (new Vector3 (pos.x, pos.y)))
+				return Inputs [inCnt];
+		}
+		return null;
+	}
+	/// <summary>
+	/// Returns the output knob that is at the position on this node or null
+	/// </summary>
+	public NodeOutput GetOutputAtPos (Vector2 pos)
+	{
+		for (int outCnt = 0; outCnt < Outputs.Count; outCnt++)
+		{ // Search for an output at the position
+			if (Outputs [outCnt].GetKnob ().Contains (new Vector3 (pos.x, pos.y)))
+				return Outputs [outCnt];
+		}
+		return null;
+	}
+
+	/// <summary>
+	/// Recursively checks whether this node is a child of the other node
+	/// </summary>
+	public bool isChildOf (Node otherNode)
+	{
+		if (otherNode == null)
+			return false;
+		for (int cnt = 0; cnt < Inputs.Count; cnt++)
+		{
+			if (Inputs [cnt].connection != null)
+			{
+				if (Inputs [cnt].connection.body == otherNode)
+					return true;
+				else if (Inputs [cnt].connection.body.isChildOf (otherNode)) // Recursively searching
+					return true;
+			}
+		}
+		return false;
+	}
+
+	#endregion
+
+	#region static Functions
+
+	/// <summary>
+	/// Check if an output and an input can be connected (same type, ...)
+	/// </summary>
+	public static bool CanApplyConnection (NodeOutput output, NodeInput input)
+	{
+		if (input == null || output == null)
+			return false;
+
+		if (input.body == output.body || input.connection == output)
+			return false;
+
+		if (input.type != output.type)
+			return false;
+
+		if (output.body.isChildOf (input.body))
+		{
+			Node_Editor.editor.ShowNotification (new GUIContent ("Recursion detected!"));
+			return false;
+		}
+		return true;
+	}
+
+	/// <summary>
+	/// Applies a connection between output and input. 'CanApplyConnection' has to be checked before
+	/// </summary>
+	public static void ApplyConnection (NodeOutput output, NodeInput input)
+	{
+		if (input != null && output != null)
+		{
+			if (input.connection != null)
+			{
+				input.connection.connections.Remove (input);
+			}
+			input.connection = output;
+			output.connections.Add (input);
+
+			Node_Editor.editor.RecalculateFrom (input.body);
+		}
+	}
+
+	#endregion
 }


Fixed a problem with device not disposing correctly.

--- NiWrapper.Net/Device.cs
+++ NiWrapper.Net/Device.cs
@@ -265,15 +265,17 @@

         protected virtual void Dispose(bool disposing)
         {
-            if (!this.isDisposed)
-            {
-                if (disposing && this.IsValid)
-                {
-                    this.Close();
-                }
-
-                this.Handle = IntPtr.Zero;
-                this.isDisposed = true;
+            lock (this)
+            {
+                if (!this.isDisposed)
+                {
+                    this.isDisposed = true;
+                    if (disposing && this.IsValid)
+                    {
+                        this.Close();
+                    }
+                    this.Handle = IntPtr.Zero;
+                }
             }
         }


Fixed DateTime property of Stash class.

Fixed DateTime property of Stash class.

--- GitSharp/Stash.cs
+++ GitSharp/Stash.cs
@@ -108,9 +108,14 @@
 				i2 += 2;
 				i = line.IndexOf (' ', i2);
 				int secs = int.Parse (line.Substring (i2, i - i2));
-				DateTime t = new DateTime (1970, 1, 1) + TimeSpan.FromSeconds (secs);
-				string st = t.ToString ("yyyy-MM-ddTHH:mm:ss") + line.Substring (i + 1, 3) + ":" + line.Substring (i + 4, 2);
-				s.DateTime = DateTimeOffset.Parse (st);
+
+				string stUtcOffset = line.Substring (i + 1, 3) + ":" + line.Substring (i + 4, 2);
+				if (stUtcOffset[0] == '+') stUtcOffset = stUtcOffset.Remove(0, 1);
+				TimeSpan utcOffset = TimeSpan.Parse(stUtcOffset);
+
+				DateTime t = new DateTime (1970, 1, 1) + TimeSpan.FromSeconds (secs) + utcOffset;
+				s.DateTime = new DateTimeOffset(t, utcOffset);
+
 				s.Comment = line.Substring (i + 7);
 			}
 			s.FullLine = line;


fixing test

fixing test

--- agg/Font/TypeFace.cs
+++ agg/Font/TypeFace.cs
@@ -434,7 +434,7 @@
 		{
 			// TODO: check for kerning and adjust
 			Glyph glyph = GetGlyph(character);
-			if (glyphs != null)
+			if (glyph != null)
 			{
 				return glyph.horiz_adv_x;
 			}
@@ -445,7 +445,7 @@
 		internal int GetAdvanceForCharacter(char character)
 		{
 			Glyph glyph = GetGlyph(character);
-			if (glyphs != null)
+			if (glyph != null)
 			{
 				return glyph.horiz_adv_x;
 			}


bikin objek baru udah

bikin objek baru udah

--- ShapeGame/FallingThings.cs
+++ ShapeGame/FallingThings.cs
@@ -27,7 +27,7 @@
         private const double BaseGravity = 0.017;
         private const double BaseAirFriction = 0.994;

-        private readonly List<Thing> things = new List<Thing>();
+        private readonly List<Spider> things = new List<Spider>();
         private readonly Random rnd = new Random();
         private readonly int maxThings;
         private readonly int intraFrames = 1;
@@ -118,7 +118,7 @@
         {
             for (int i = 0; i < this.things.Count; i++)
             {
-                Thing thing = this.things[i];
+                var thing = this.things[i];
                 if ((thing.State == ThingState.Bouncing) || (thing.State == ThingState.Falling))
                 {
                     thing.State = ThingState.Dissolving;
@@ -149,7 +149,7 @@
                 // Stop all movement as well!
                 for (int i = 0; i < this.things.Count; i++)
                 {
-                    Thing thing = this.things[i];
+                    var thing = this.things[i];
                     thing.XVelocity = thing.YVelocity = 0;
                     this.things[i] = thing;
                 }
@@ -177,7 +177,7 @@
                 for (int i = 0; i < this.things.Count; i++)
                 {
                     HitType hit = HitType.None;
-                    Thing thing = this.things[i];
+                    var thing = this.things[i];
                     switch (thing.State)
                     {
                         case ThingState.Bouncing:
@@ -323,7 +323,7 @@
             // Move all things by one step, accounting for gravity
             for (int thingIndex = 0; thingIndex < this.things.Count; thingIndex++)
             {
-                Thing thing = this.things[thingIndex];
+                var thing = this.things[thingIndex];
                 thing.Center.Offset(thing.XVelocity, thing.YVelocity);
                 thing.YVelocity += this.gravity * this.sceneRect.Height;
                 thing.YVelocity *= this.airFriction;
@@ -360,7 +360,7 @@
             // Then remove any that should go away now
             for (int i = 0; i < this.things.Count; i++)
             {
-                Thing thing = this.things[i];
+                var thing = this.things[i];
                 if (thing.State == ThingState.Remove)
                 {
                     this.things.Remove(thing);
@@ -411,7 +411,7 @@
             // Draw all shapes in the scene
             for (int i = 0; i < this.things.Count; i++)
             {
-                Thing thing = this.things[i];
+                var thing = this.things[i];
                 thing.Draw(children);
             }

@@ -930,9 +930,7 @@
                 {
                     this.Brush.Opacity = 1.0 - (this.Dissolve * this.Dissolve);
                 }
-
-                int numSides = Thing.polyDefs[this.Shape].Sides;
-                int skip = Thing.polyDefs[this.Shape].Skip;
+
                 double size = this.Size;
                 double spin = this.Theta;
                 System.Windows.Point center = this.Center;
@@ -956,7 +954,7 @@

                 children.Add(circle);

-
+                // create spiders head
                 Shape head = new Ellipse { Width = size, Height = size, Stroke = brushStroke };

                 if (head.Stroke != null)
@@ -967,8 +965,11 @@
                 head.StrokeThickness = strokeThickness;
                 head.Fill = brush;
                 // locate the object
-                head.SetValue(Canvas.LeftProperty, center.X - size);
-                head.SetValue(Canvas.TopProperty, center.Y - size);
+                double vx = this.XVelocity;
+                double vy = this.YVelocity;
+                double resultan = Math.Sqrt(vx * vx + vy * vy);
+                head.SetValue(Canvas.LeftProperty, center.X + size * vx / resultan - size / 2);
+                head.SetValue(Canvas.TopProperty, center.Y + size * vy / resultan - size / 2);

                 children.Add(head);
             }


Made Shutdown public

Made Shutdown public

--- Sharpex.GameLibrary/SGL.cs
+++ Sharpex.GameLibrary/SGL.cs
@@ -124,7 +124,7 @@
         /// <summary>
         /// Closes the current session.
         /// </summary>
-        internal static void Shutdown()
+        public static void Shutdown()
         {
             Components.Get<GameLoop>().Stop();
             _gameInstance.OnUnload();


Delete AssemblyInfo.cs

Delete AssemblyInfo.cs

I don`t need it

--- 02_AppendLists/Properties/AssemblyInfo.cs
+++ 02_AppendLists/Properties/AssemblyInfo.cs
@@ -1,36 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("02_AppendLists")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("02_AppendLists")]
-[assembly: AssemblyCopyright("Copyright ©  2017")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components.  If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("8f37a83e-82e7-4226-b730-35e3218d84f6")]
-
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]


Namespaces refactoring

Namespaces refactoring

--- Json/AuthToken.cs
+++ Json/AuthToken.cs
@@ -1,5 +1,4 @@
 using System;
-using System.Collections.Generic;

 namespace Azi.Amazon.CloudDrive.Json
 {


small perf improvements.

small perf improvements.

--- QuickInjectContainer.cs
+++ QuickInjectContainer.cs
@@ -30,9 +30,9 @@

         private readonly List<IBuildPlanVisitor> buildPlanVisitors = new List<IBuildPlanVisitor>();

-        private readonly ConcurrentDictionary<Type, PropertyInfo[]> propertyInfoTable = new ConcurrentDictionary<Type, PropertyInfo[]>();
-
         private readonly ExtensionImpl extensionImpl;
+
+        private ImmutableDictionary<Type, PropertyInfo[]> propertyInfoTable = ImmutableDictionary<Type, PropertyInfo[]>.Empty;

         private ImmutableDictionary<Type, Func<object>> buildPlanTable = ImmutableDictionary<Type, Func<object>>.Empty;

@@ -102,8 +102,8 @@

         public object BuildUp(Type t, object existing, string name, params ResolverOverride[] resolverOverrides)
         {
-            PropertyInfo[] propertyInfos;
-            if (this.propertyInfoTable.TryGetValue(t, out propertyInfos))
+            PropertyInfo[] propertyInfos = this.propertyInfoTable.GetValueOrDefault(t);
+            if (propertyInfos != null)
             {
                 foreach (PropertyInfo p in propertyInfos)
                 {
@@ -219,19 +219,20 @@
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public object Resolve(Type t, string name, params ResolverOverride[] resolverOverrides)
         {
+#if DEBUG
+            if (Logger.IsEnabled())
+            {
+                Logger.Resolve(t.ToString());
+            }
+#endif
+
             Func<object> plan = this.buildPlanTable.GetValueOrDefault(t);
             if (plan != null)
             {
-#if DEBUG
-                if (Logger.IsEnabled())
-                {
-                    Logger.Resolve(t.ToString());
-                }
-#endif
                 return plan();
             }

-            return this.CompilePlan(t)();
+            return this.CompileAndRunPlan(t);
         }

         public IEnumerable<object> ResolveAll(Type t, params ResolverOverride[] resolverOverrides)
@@ -266,7 +267,7 @@
         }

         [MethodImpl(MethodImplOptions.NoInlining)]
-        private Func<object> CompilePlan(Type t)
+        private object CompileAndRunPlan(Type t)
         {
             Func<object> compiledexpression;

@@ -297,7 +298,7 @@
                 this.buildPlanTable = this.buildPlanTable.AddOrUpdate(t, compiledexpression);
             }

-            return compiledexpression;
+            return compiledexpression();
         }

         [MethodImpl(MethodImplOptions.NoInlining)]
@@ -309,7 +310,7 @@
             if (policyList.PropertySelectorPolicy != null)
             {
                 var selectedProperties = policyList.PropertySelectorPolicy.SelectProperties(context, policyList).Select(x => x.Property).ToArray();
-                this.propertyInfoTable.TryAdd(t, selectedProperties);
+                this.propertyInfoTable = this.propertyInfoTable.AddOrUpdate(t, selectedProperties);

                 foreach (var selectedProperty in selectedProperties)
                 {


Bug fix.

Bug fix.

--- QuickInjectContainer.cs
+++ QuickInjectContainer.cs
@@ -129,10 +129,19 @@

         public IUnityContainer CreateChildContainer()
         {
-            var child = new QuickInjectContainer(this);
-            var childContext = new ExtensionImpl(child, new DummyPolicyList());
+            QuickInjectContainer child;
+            ExtensionImpl childContext;
+
+            lock (this.lockObj)
+            {
+                child = new QuickInjectContainer(this);
+                childContext = new ExtensionImpl(child, new DummyPolicyList());
+                this.children.Add(child);
+            }
+
+            // Must happen outside the lock to avoid deadlock between callers
             this.ChildContainerCreated(this, new ChildContainerCreatedEventArgs(childContext));
-            this.children.Add(child);
+
             return child;
         }

@@ -304,28 +313,32 @@

             lock (this.lockObj)
             {
-                var depTree = t.BuildDependencyTree(this.Dependencies);
-                var typeRegistrationTree = new TypeRegistrationTree(this);
-                depTree.PreOrderTraverse(typeRegistrationTree.BuildRegistration);
-
-                var typeRegistrations = typeRegistrationTree.Parent;
-
-                var codeGenerator = new ExpressionGenerator(this, typeRegistrations);
-                var eptree = codeGenerator.Generate();
-
-                if (this.dependencyTreeListener != null)
-                {
-                    this.dependencyTreeListener(depTree);
-                }
-
-                eptree = EmptyBlockExpressionRemovalVisitor.Visitor(eptree, t); // remove extra cruft
-                eptree = this.buildPlanVisitors.Aggregate(eptree, (current, visitor) => EmptyBlockExpressionRemovalVisitor.Visitor(visitor.Visitor(current, t), t)); // remove extra cruft after each visitor
-
-                compiledexpression = Expression.Lambda<Func<object>>(eptree, "Create_" + t, null).Compile();
-
-                this.buildPlanTable = this.buildPlanTable.AddOrUpdate(t, compiledexpression);
-            }
-
+                compiledexpression = this.buildPlanTable.GetValueOrDefault(t);
+                if (compiledexpression == null)
+                {
+                    var depTree = t.BuildDependencyTree(this.Dependencies);
+                    var typeRegistrationTree = new TypeRegistrationTree(this);
+                    depTree.PreOrderTraverse(typeRegistrationTree.BuildRegistration);
+
+                    var typeRegistrations = typeRegistrationTree.Parent;
+
+                    var codeGenerator = new ExpressionGenerator(this, typeRegistrations);
+                    var eptree = codeGenerator.Generate();
+
+                    if (this.dependencyTreeListener != null)
+                    {
+                        this.dependencyTreeListener(depTree);
+                    }
+
+                    eptree = EmptyBlockExpressionRemovalVisitor.Visitor(eptree, t); // remove extra cruft
+                    eptree = this.buildPlanVisitors.Aggregate(eptree, (current, visitor) => EmptyBlockExpressionRemovalVisitor.Visitor(visitor.Visitor(current, t), t)); // remove extra cruft after each visitor
+
+                    compiledexpression = Expression.Lambda<Func<object>>(eptree, "Create_" + t, null).Compile();
+
+                    this.buildPlanTable = this.buildPlanTable.AddOrUpdate(t, compiledexpression);
+                }
+            }
+
             return compiledexpression();
         }


Provide additional information during errors

This ought to help developers diagnose where the error occurred. The current stack trace provides no actionable information and requires going through the whole Interface searching for violations.

```
Unhandled Exception: System.ArgumentException: URL has parameter member, but no method parameter matches
   at Refit.RestMethodInfo.BuildParameterMap(String relativePath, List`1 parameterInfo) in D:\a\1\s\Refit\RestMethodInfo.cs:line 143
   at Refit.RestMethodInfo..ctor(Type targetInterface, MethodInfo methodInfo, RefitSettings refitSettings) in D:\a\1\s\Refit\RestMethodInfo.cs:line 64
   at Refit.RequestBuilderImplementation`1..ctor(RefitSettings refitSettings) in D:\a\1\s\Refit\RequestBuilderImplementation.cs:line 58
   at Refit.RequestBuilderFactory.Create[T](RefitSettings settings) in D:\a\1\s\Refit\RequestBuilderFactory.cs:line 17
   at Refit.RequestBuilder.ForType[T](RefitSettings settings) in D:\a\1\s\Refit\RequestBuilder.cs:line 24
   at Refit.RestService.For[T](HttpClient client, RefitSettings settings) in D:\a\1\s\Refit\RestService.cs:line 28
   at Refit.RestService.For[T](HttpClient client) in D:\a\1\s\Refit\RestService.cs:line 33
   at MyCode.Program.Main(String[] args) in /Users/me/Documents/MyCode/MyCode/Program.cs:line 16
```

--- Refit/RestMethodInfo.cs
+++ Refit/RestMethodInfo.cs
@@ -94,7 +94,7 @@

             var ctParams = methodInfo.GetParameters().Where(p => p.ParameterType == typeof(CancellationToken)).ToList();
             if(ctParams.Count > 1) {
-                throw new ArgumentException("Argument list can only contain a single CancellationToken");
+                throw new ArgumentException($"Argument list to method \"{methodInfo.Name}\" can only contain a single CancellationToken");
             }

             CancellationToken = ctParams.FirstOrDefault();
@@ -117,7 +117,7 @@
             return;

         bogusPath:
-            throw new ArgumentException("URL path must be of the form '/foo/bar/baz'");
+            throw new ArgumentException($"URL path {relativePath} must be of the form '/foo/bar/baz'");
         }

         Dictionary<int, string> BuildParameterMap(string relativePath, List<ParameterInfo> parameterInfo)
@@ -137,7 +137,7 @@
             foreach (var match in parameterizedParts) {
                 var name = match.Groups[1].Value.ToLowerInvariant();
                 if (!paramValidationDict.ContainsKey(name)) {
-                    throw new ArgumentException(string.Format("URL has parameter {0}, but no method parameter matches", name));
+                    throw new ArgumentException($"URL {relativePath} has parameter {name}, but no method parameter matches");
                 }

                 ret.Add(parameterInfo.IndexOf(paramValidationDict[name]), name);
@@ -290,7 +290,7 @@
             return;

         bogusMethod:
-            throw new ArgumentException("All REST Methods must return either Task<T> or IObservable<T>");
+            throw new ArgumentException($"Method \"{methodInfo.Name}\" is invalid. All REST Methods must return either Task<T> or IObservable<T>");
         }
     }
 }


Query string parameters logic.

Query string parameters logic.

--- RestSharp/RestClient.cs
+++ RestSharp/RestClient.cs
@@ -301,38 +301,9 @@

             string mergedUri = MergeBaseUrlAndResource(resource);

-
-
-            IEnumerable<Parameter> parameters;
-
-            if (request.Method != Method.POST && request.Method != Method.PUT && request.Method != Method.PATCH)
-            {
-                parameters = request.Parameters
-                                    .Where(p => p.Type == ParameterType.GetOrPost ||
-                                                p.Type == ParameterType.QueryString)
-                                    .ToList();
-            }
-            else
-            {
-                parameters = request.Parameters
-                                    .Where(p => p.Type == ParameterType.QueryString)
-                                    .ToList();
-            }
-
-            if (!parameters.Any())
-            {
-                return new Uri(mergedUri);
-            }
-
-            // build and attach querystring
-            string data = EncodeParameters(parameters);
-            string separator = mergedUri != null && mergedUri.Contains("?")
-                ? "&"
-                : "?";
-
-            mergedUri = string.Concat(mergedUri, separator, data);
-
-            return new Uri(mergedUri);
+            string finalUri = ApplyQueryStringParamsValuesToUri(mergedUri, request);
+
+            return new Uri(finalUri);
         }

         private void DoBuildUriValidations(IRestRequest request)
@@ -400,6 +371,36 @@
             return assembled;

         }
+
+        private static string ApplyQueryStringParamsValuesToUri(string mergedUri, IRestRequest request)
+        {
+            var parameters = GetQueryStringParameters(request);
+
+            if (!parameters.Any())
+            {
+                return mergedUri;
+            }
+
+            string separator = mergedUri != null && mergedUri.Contains("?") ? "&" : "?";
+
+            return string.Concat(mergedUri, separator, EncodeParameters(parameters));
+        }
+
+        private static IEnumerable<Parameter> GetQueryStringParameters(IRestRequest request)
+        {
+            if (request.Method != Method.POST && request.Method != Method.PUT && request.Method != Method.PATCH)
+            {
+                return request.Parameters
+                                    .Where(p => p.Type == ParameterType.GetOrPost ||
+                                                p.Type == ParameterType.QueryString)
+                                    .ToList();
+            }
+
+            return request.Parameters
+                                .Where(p => p.Type == ParameterType.QueryString)
+                                .ToList();
+        }
+
         private static string EncodeParameters(IEnumerable<Parameter> parameters)
         {
             return string.Join("&", parameters.Select(EncodeParameter)


Upgrade assembly metadata

Upgrade assembly metadata

--- ATL/Properties/AssemblyInfo.cs
+++ ATL/Properties/AssemblyInfo.cs
@@ -10,7 +10,7 @@
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("")]
 [assembly: AssemblyProduct("ATL")]
-[assembly: AssemblyCopyright("Copyright ©  2014")]
+[assembly: AssemblyCopyright("Copyright ©  2015")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]

@@ -32,5 +32,5 @@
 // Vous pouvez spécifier toutes les valeurs ou indiquer les numéros de build et de révision par défaut
 // en utilisant '*', comme indiqué ci-dessous :
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.1.0.0")]
-[assembly: AssemblyFileVersion("1.1.0.0")]
+[assembly: AssemblyVersion("1.2.0.0")]
+[assembly: AssemblyFileVersion("1.2.0.0")]