Index: /branches/ProgrammableProblem/HeuristicLab.Optimization/3.3/Algorithms/BasicAlgorithm.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Optimization/3.3/Algorithms/BasicAlgorithm.cs	(revision 11891)
+++ /branches/ProgrammableProblem/HeuristicLab.Optimization/3.3/Algorithms/BasicAlgorithm.cs	(revision 11892)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -70,10 +70,8 @@
         try {
           t.Wait();
-        }
-        catch (AggregateException ex) {
+        } catch (AggregateException ex) {
           try {
             ex.Flatten().Handle(x => x is OperationCanceledException);
-          }
-          catch (AggregateException remaining) {
+          } catch (AggregateException remaining) {
             if (remaining.InnerExceptions.Count == 1) OnExceptionOccurred(remaining.InnerExceptions[0]);
             else OnExceptionOccurred(remaining);
@@ -87,9 +85,10 @@
 
     public override void Pause() {
-      throw new NotSupportedException("Pause is not supported in simple Algorithms.");
+      throw new NotSupportedException("Pause is not supported in basic algorithms.");
     }
 
     public override void Stop() {
-      //CancellationToken.ThrowIfCancellationRequested() must be called from within the Run method, otherwise stop does nothing
+      // CancellationToken.ThrowIfCancellationRequested() must be called from within the Run method, otherwise stop does nothing
+      // alternatively check the IsCancellationRequested property of the cancellation token
       base.Stop();
       CancellationTokenSource.Cancel();
@@ -107,6 +106,5 @@
       try {
         Run(cancellationToken);
-      }
-      finally {
+      } finally {
         timer.Elapsed -= new System.Timers.ElapsedEventHandler(timer_Elapsed);
         timer.Stop();
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationExpressionGrammar.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationExpressionGrammar.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationExpressionGrammar.cs	(revision 11892)
@@ -0,0 +1,105 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.GP {
+  [StorableClass]
+  [Item("ExternalEvaluationExpressionGrammar", "Represents a grammar for functional expressions using all available functions.")]
+  public class ExternalEvaluationExpressionGrammar : SymbolicExpressionGrammar, ISymbolicDataAnalysisGrammar {
+    [Storable]
+    private HeuristicLab.Problems.DataAnalysis.Symbolic.Variable variableSymbol;
+    [StorableConstructor]
+    protected ExternalEvaluationExpressionGrammar(bool deserializing) : base(deserializing) { }
+    protected ExternalEvaluationExpressionGrammar(ExternalEvaluationExpressionGrammar original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExternalEvaluationExpressionGrammar(this, cloner);
+    }
+
+    public ExternalEvaluationExpressionGrammar()
+      : base("ExternalEvaluationExpressionGrammar", "Represents a grammar for functional expressions using all available functions.") {
+      Initialize();
+    }
+
+    private void Initialize() {      
+      var add = new Addition();
+      var sub = new Subtraction();
+      var mul = new Multiplication();
+      var div = new Division();
+      var mean = new Average();
+      var sin = new Sine();
+      var cos = new Cosine();
+      var tan = new Tangent();
+      var log = new Logarithm();
+      var exp = new Exponential();
+      var @if = new IfThenElse();
+      var gt = new GreaterThan();
+      var lt = new LessThan();
+      var and = new And();
+      var or = new Or();
+      var not = new Not();
+      var constant = new Constant();
+      constant.MinValue = -20;
+      constant.MaxValue = 20;
+      variableSymbol = new HeuristicLab.Problems.DataAnalysis.Symbolic.Variable();
+
+      var allSymbols = new List<Symbol>() { add, sub, mul, div, mean, sin, cos, tan, log, exp, @if, gt, lt, and, or, not, constant, variableSymbol };
+      var unaryFunctionSymbols = new List<Symbol>() { sin, cos, tan, log, exp, not };
+      var binaryFunctionSymbols = new List<Symbol>() { gt, lt };
+      var functionSymbols = new List<Symbol>() { add, sub, mul, div, mean, and, or };
+
+      foreach (var symb in allSymbols)
+        AddSymbol(symb);
+
+      foreach (var funSymb in functionSymbols) {
+        SetSubtreeCount(funSymb, 1, 3);
+      }
+      foreach (var funSymb in unaryFunctionSymbols) {
+        SetSubtreeCount(funSymb, 1, 1);
+      }
+      foreach (var funSymb in binaryFunctionSymbols) {
+        SetSubtreeCount(funSymb, 2, 2);
+      }
+
+      SetSubtreeCount(@if, 3, 3);
+      SetSubtreeCount(constant, 0, 0);
+      SetSubtreeCount(variableSymbol, 0, 0);
+
+      // allow each symbol as child of the start symbol
+      foreach (var symb in allSymbols) {
+        AddAllowedChildSymbol(StartSymbol, symb, 0);
+      }
+
+      // allow each symbol as child of every other symbol (except for terminals that have maxSubtreeCount == 0)
+      foreach (var parent in allSymbols) {
+        for (int i = 0; i < GetMaximumSubtreeCount(parent); i++)
+          foreach (var child in allSymbols) {
+            AddAllowedChildSymbol(parent, child, i);
+          }
+      }
+    }
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationGrammar.txt
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationGrammar.txt	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationGrammar.txt	(revision 11892)
@@ -0,0 +1,17 @@
+﻿Node           = "(", Terminal | Function, ")" ;
+Function       = ArithmeticFunc | LogicalFunc, Node, { Node } ;
+ArithmeticFunc = "+" | "avg" | "cos" | "/" | "exp" | "ln" | "*" | "sin" | "-" | "tan" ;
+LogicalFunc    = "&&" | ">" | "if" | "<" | "!" | "||" ;
+Terminal       = Variable | Constant ;
+Variable       = ";", VariableName, Constant ;
+VariableName   = Alpha, { Alpha | Digit | "_" } ;
+Alpha          = "A" | "B" | "C" | "D" | "E" | "F" | "G"
+               | "H" | "I" | "J" | "K" | "L" | "M" | "N"
+               | "O" | "P" | "Q" | "R" | "S" | "T" | "U"
+               | "V" | "W" | "X" | "Y" | "Z" | "a" | "b"
+               | "c" | "d" | "e" | "f" | "g" | "h" | "i"
+               | "j" | "k" | "l" | "m" | "n" | "o" | "p"
+               | "q" | "r" | "s" | "t" | "u" | "v" | "w"
+               | "x" | "y" | "z" ;
+Digit          = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
+Constant       = ";", [ "-" ], Digit, { Digit }, [ ".", Digit, { Digit } ], "E", [ "+" | "-" ], Digit, { Digit } ;
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationSymbolicExpressionTreeBinaryConverter.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationSymbolicExpressionTreeBinaryConverter.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationSymbolicExpressionTreeBinaryConverter.cs	(revision 11892)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.IO;
+using Google.ProtocolBuffers;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.GP {
+  [Item("SymbolicExpressionTreeBinaryConverter", "Converts a symbolic expression tree into a binary representation by iterating over all nodes in a prefix way. The binary format is defined in HeuristicLab.Persistence.")]
+  [StorableClass]
+  public class SymbolicExpressionTreeBinaryConverter : SymbolicExpressionTreeConverter {
+    [StorableConstructor]
+    protected SymbolicExpressionTreeBinaryConverter(bool deserializing) : base(deserializing) { }
+    protected SymbolicExpressionTreeBinaryConverter(SymbolicExpressionTreeBinaryConverter original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicExpressionTreeBinaryConverter(this, cloner);
+    }
+    public SymbolicExpressionTreeBinaryConverter() : base() { }
+
+    protected override void ConvertSymbolicExpressionTree(SymbolicExpressionTree tree, string name, SolutionMessage.Builder builder) {
+      using (MemoryStream memoryStream = new MemoryStream()) {
+        Persistence.Default.Xml.XmlGenerator.Serialize(tree, memoryStream);
+        byte[] byteRep = memoryStream.ToArray();
+        SolutionMessage.Types.RawVariable.Builder rawVariable = SolutionMessage.Types.RawVariable.CreateBuilder();
+        rawVariable.SetName(name).SetData(ByteString.CopyFrom(byteRep));
+        builder.AddRawVars(rawVariable.Build());
+      }
+    }
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationSymbolicExpressionTreeConverter.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationSymbolicExpressionTreeConverter.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationSymbolicExpressionTreeConverter.cs	(revision 11892)
@@ -0,0 +1,58 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.GP {
+  [Item("SymbolicExpressionTreeStringConverter", "Abstract base class for symbolic expression tree converters.")]
+  [StorableClass]
+  public abstract class SymbolicExpressionTreeConverter : Item, IItemToSolutionMessageConverter {
+    private static readonly Type[] itemTypes = new Type[] { typeof(SymbolicExpressionTree) };
+
+    [StorableConstructor]
+    protected SymbolicExpressionTreeConverter(bool deserializing) : base(deserializing) { }
+    protected SymbolicExpressionTreeConverter(SymbolicExpressionTreeConverter original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public SymbolicExpressionTreeConverter() : base() { }
+
+    #region IItemToSolutionMessageConverter Members
+
+    public Type[] ItemTypes {
+      get { return itemTypes; }
+    }
+
+    public void AddItemToBuilder(IItem item, string name, SolutionMessage.Builder builder) {
+      SymbolicExpressionTree tree = (item as SymbolicExpressionTree);
+      if (tree != null) {
+        ConvertSymbolicExpressionTree(tree, name, builder);
+      }
+    }
+
+    protected abstract void ConvertSymbolicExpressionTree(SymbolicExpressionTree tree, string name, SolutionMessage.Builder builder);
+
+    #endregion
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationSymbolicExpressionTreeStringConverter.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationSymbolicExpressionTreeStringConverter.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationSymbolicExpressionTreeStringConverter.cs	(revision 11892)
@@ -0,0 +1,68 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.GP {
+  [Item("SymbolicExpressionTreeStringConverter", "Converts a symbolic expression tree into a string representation by iterating over all nodes in a prefix way. The string is added to the SolutionMessage's StringVars.")]
+  [StorableClass]
+  public class SymbolicExpressionTreeStringConverter : SymbolicExpressionTreeConverter {
+    private ExternalEvaluationSymbolicExpressionTreeStringFormatter formatter;
+
+    [StorableConstructor]
+    protected SymbolicExpressionTreeStringConverter(bool deserializing) : base(deserializing) { }
+    protected SymbolicExpressionTreeStringConverter(SymbolicExpressionTreeStringConverter original, Cloner cloner)
+      : base(original, cloner) {
+      formatter = new ExternalEvaluationSymbolicExpressionTreeStringFormatter();
+      formatter.Indent = original.formatter.Indent;
+    }
+    public SymbolicExpressionTreeStringConverter()
+      : base() {
+      Initialize();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicExpressionTreeStringConverter(this, cloner);
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      Initialize();
+    }
+
+    private void Initialize() {
+      formatter = new ExternalEvaluationSymbolicExpressionTreeStringFormatter();
+      formatter.Indent = false;
+    }
+
+    protected override void ConvertSymbolicExpressionTree(SymbolicExpressionTree tree, string name, SolutionMessage.Builder builder) {
+      string stringRep = formatter.Format(tree);
+      stringRep.Replace(Environment.NewLine, "");
+      SolutionMessage.Types.StringVariable.Builder stringVariable = SolutionMessage.Types.StringVariable.CreateBuilder();
+      stringVariable.SetName(name).SetData(stringRep);
+      builder.AddStringVars(stringVariable.Build());
+    }
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationSymbolicExpressionTreeStringFormatter.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationSymbolicExpressionTreeStringFormatter.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationSymbolicExpressionTreeStringFormatter.cs	(revision 11892)
@@ -0,0 +1,122 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Text;
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+using System;
+using System.Globalization;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.GP {
+
+  [Item("ExternalEvaluationSymbolicExpressionTreeStringFormatter", "A string formatter for symbolic expression trees for external evaluation.")]
+  [StorableClass]
+  public class ExternalEvaluationSymbolicExpressionTreeStringFormatter : NamedItem, ISymbolicExpressionTreeStringFormatter {
+
+    public bool Indent { get; set; }
+
+    [StorableConstructor]
+    protected ExternalEvaluationSymbolicExpressionTreeStringFormatter(bool deserializing) : base(deserializing) { }
+    protected ExternalEvaluationSymbolicExpressionTreeStringFormatter(ExternalEvaluationSymbolicExpressionTreeStringFormatter original, Cloner cloner)
+      : base(original, cloner) {
+      Indent = original.Indent;
+    }
+    public ExternalEvaluationSymbolicExpressionTreeStringFormatter()
+      : base() {
+      Name = "External Evaluation Symbolic Expression Tree Formatter";
+      Indent = true;
+    }
+
+    public string Format(ISymbolicExpressionTree symbolicExpressionTree) {
+      // skip root and start symbols
+      return FormatRecursively(symbolicExpressionTree.Root.GetSubtree(0).GetSubtree(0), 0);
+    }
+
+    private string FormatRecursively(ISymbolicExpressionTreeNode node, int indentLength) {
+      StringBuilder strBuilder = new StringBuilder();
+      if (Indent) strBuilder.Append(' ', indentLength);
+      if (node.Subtrees.Count() > 0) { // internal node
+        strBuilder.Append("(");
+        if (node.Symbol is Addition) {
+          strBuilder.AppendLine("+");
+        } else if (node.Symbol is And) {
+          strBuilder.AppendLine("&&");
+        } else if (node.Symbol is Average) {
+          strBuilder.AppendLine("avg");
+        } else if (node.Symbol is Cosine) {
+          strBuilder.AppendLine("cos");
+        } else if (node.Symbol is Division) {
+          strBuilder.AppendLine("/");
+        } else if (node.Symbol is Exponential) {
+          strBuilder.AppendLine("exp");
+        } else if (node.Symbol is GreaterThan) {
+          strBuilder.AppendLine(">");
+        } else if (node.Symbol is IfThenElse) {
+          strBuilder.AppendLine("if");
+        } else if (node.Symbol is LessThan) {
+          strBuilder.AppendLine("<");
+        } else if (node.Symbol is Logarithm) {
+          strBuilder.AppendLine("ln");
+        } else if (node.Symbol is Multiplication) {
+          strBuilder.AppendLine("*");
+        } else if (node.Symbol is Not) {
+          strBuilder.AppendLine("!");
+        } else if (node.Symbol is Or) {
+          strBuilder.AppendLine("||");
+        } else if (node.Symbol is Sine) {
+          strBuilder.AppendLine("sin");
+        } else if (node.Symbol is Subtraction) {
+          strBuilder.AppendLine("-");
+        } else if (node.Symbol is Tangent) {
+          strBuilder.AppendLine("tan");
+        } else {
+          throw new NotSupportedException("Formatting of symbol: " + node.Symbol + " not supported for external evaluation.");
+        }
+        // each subtree expression on a new line
+        // and closing ')' also on new line
+        foreach (var subtree in node.Subtrees) {
+          strBuilder.AppendLine(FormatRecursively(subtree, indentLength + 2));
+        }
+        if (Indent) strBuilder.Append(' ', indentLength);
+        strBuilder.Append(")");
+      } else {
+        if (node is VariableTreeNode) {
+          var varNode = node as VariableTreeNode;
+          strBuilder.AppendFormat("(* {0} {1})", varNode.VariableName, varNode.Weight.ToString("g17", CultureInfo.InvariantCulture));
+        } else if (node is ConstantTreeNode) {
+          var constNode = node as ConstantTreeNode;
+          strBuilder.Append(constNode.Value.ToString("g17", CultureInfo.InvariantCulture));
+        } else {
+          throw new NotSupportedException("Formatting of symbol: " + node.Symbol + " not supported for external evaluation.");
+        }
+      }
+      return strBuilder.ToString();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExternalEvaluationSymbolicExpressionTreeStringFormatter(this, cloner);
+    }
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/HeuristicLab.Problems.ExternalEvaluation.GP-3.5.csproj
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/HeuristicLab.Problems.ExternalEvaluation.GP-3.5.csproj	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/HeuristicLab.Problems.ExternalEvaluation.GP-3.5.csproj	(revision 11892)
@@ -0,0 +1,216 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{B7A64A60-B538-479F-9C47-A3180C458F6C}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.ExternalEvaluation.GP</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.ExternalEvaluation.GP-3.5</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <DocumentationFile>
+    </DocumentationFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Google.ProtocolBuffers-2.4.1.473, Version=2.4.1.473, Culture=neutral, PublicKeyToken=17b3b1f090c3ea48, processorArchitecture=MSIL">
+      <HintPath>..\..\bin\Google.ProtocolBuffers-2.4.1.473.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="ExternalEvaluationExpressionGrammar.cs" />
+    <Compile Include="ExternalEvaluationSymbolicExpressionTreeBinaryConverter.cs" />
+    <Compile Include="ExternalEvaluationSymbolicExpressionTreeConverter.cs" />
+    <Compile Include="ExternalEvaluationSymbolicExpressionTreeStringConverter.cs" />
+    <Compile Include="ExternalEvaluationSymbolicExpressionTreeStringFormatter.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.DataAnalysis.Symbolic-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="ExternalEvaluationGrammar.txt" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.ExternalEvaluation\3.4\HeuristicLab.Problems.ExternalEvaluation-3.4.csproj">
+      <Project>{25735db4-8e54-4a2c-83e3-a60c76565e55}</Project>
+      <Name>HeuristicLab.Problems.ExternalEvaluation-3.4</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+    <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' ">
+export ProjectDir=$(ProjectDir)
+export SolutionDir=$(SolutionDir)
+
+$SolutionDir/PreBuildEvent.sh
+</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/Plugin.cs.frame
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/Plugin.cs.frame	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/Plugin.cs.frame	(revision 11892)
@@ -0,0 +1,36 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.GP {
+  [Plugin("HeuristicLab.Problems.ExternalEvaluation.GP", "Provides a symbolic expression tree grammar and formatters for external evaluation problems.", "3.4.6.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.ExternalEvaluation.GP-3.5.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding", "3.4")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.DataAnalysis.Symbolic", "3.4")]
+  [PluginDependency("HeuristicLab.Problems.ExternalEvaluation", "3.4")]
+  [PluginDependency("HeuristicLab.ProtobufCS", "2.4.1.473")]
+  public class HeuristicLabProblemsExternalEvaluationGPPlugin : PluginBase {
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/Properties/AssemblyInfo.cs.frame	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/Properties/AssemblyInfo.cs.frame	(revision 11892)
@@ -0,0 +1,36 @@
+﻿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("HeuristicLab.Problems.ExternalEvaluation.GP")]
+[assembly: AssemblyDescription("Provides a symbolic expression tree grammar and formatters for external evaluation problems.")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("HEAL")]
+[assembly: AssemblyProduct("HeuristicLab.Problems.ExternalEvaluation.GP")]
+[assembly: AssemblyCopyright("(c) 2002-2014 HEAL")]
+[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("9DCFFA77-344D-4A3A-A444-75FF7B242583")]
+
+// 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("3.5.0.0")]
+[assembly: AssemblyFileVersion("3.5.6.$WCREV$")]
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationCacheView.Designer.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationCacheView.Designer.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationCacheView.Designer.cs	(revision 11892)
@@ -0,0 +1,145 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Views {
+  partial class EvaluationCacheView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.hits_sizeLabel = new System.Windows.Forms.Label();
+      this.hits_sizeTextBox = new System.Windows.Forms.TextBox();
+      this.clearButton = new System.Windows.Forms.Button();
+      this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
+      this.saveButton = new System.Windows.Forms.Button();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // parameterCollectionView
+      // 
+      this.parameterCollectionView.Location = new System.Drawing.Point(0, 52);
+      this.parameterCollectionView.Size = new System.Drawing.Size(490, 301);
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // hits_sizeLabel
+      // 
+      this.hits_sizeLabel.AutoSize = true;
+      this.hits_sizeLabel.Location = new System.Drawing.Point(3, 29);
+      this.hits_sizeLabel.Name = "hits_sizeLabel";
+      this.hits_sizeLabel.Size = new System.Drawing.Size(53, 13);
+      this.hits_sizeLabel.TabIndex = 4;
+      this.hits_sizeLabel.Text = "Hits/Size:";
+      // 
+      // hits_sizeTextBox
+      // 
+      this.hits_sizeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.hits_sizeTextBox.Location = new System.Drawing.Point(59, 26);
+      this.hits_sizeTextBox.Name = "hits_sizeTextBox";
+      this.hits_sizeTextBox.ReadOnly = true;
+      this.hits_sizeTextBox.Size = new System.Drawing.Size(319, 20);
+      this.hits_sizeTextBox.TabIndex = 5;
+      // 
+      // clearButton
+      // 
+      this.clearButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.clearButton.Location = new System.Drawing.Point(444, 24);
+      this.clearButton.Name = "clearButton";
+      this.clearButton.Size = new System.Drawing.Size(43, 23);
+      this.clearButton.TabIndex = 6;
+      this.clearButton.Text = "Clear";
+      this.toolTip.SetToolTip(this.clearButton, "Clear");
+      this.clearButton.UseVisualStyleBackColor = true;
+      this.clearButton.Click += new System.EventHandler(this.clearButton_Click);
+      // 
+      // saveFileDialog
+      // 
+      this.saveFileDialog.DefaultExt = "csv";
+      this.saveFileDialog.Filter = "CSV Files|*.csv|All Files|*.*";
+      this.saveFileDialog.RestoreDirectory = true;
+      this.saveFileDialog.Title = "Save Cache";
+      // 
+      // saveButton
+      // 
+      this.saveButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.saveButton.Location = new System.Drawing.Point(384, 23);
+      this.saveButton.Name = "saveButton";
+      this.saveButton.Size = new System.Drawing.Size(54, 23);
+      this.saveButton.TabIndex = 8;
+      this.saveButton.Text = "Save...";
+      this.saveButton.UseVisualStyleBackColor = true;
+      this.saveButton.Click += new System.EventHandler(this.saveButton_Click);
+      // 
+      // EvaluationCacheView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.hits_sizeTextBox);
+      this.Controls.Add(this.hits_sizeLabel);
+      this.Controls.Add(this.clearButton);
+      this.Controls.Add(this.saveButton);
+      this.Name = "EvaluationCacheView";
+      this.Controls.SetChildIndex(this.saveButton, 0);
+      this.Controls.SetChildIndex(this.clearButton, 0);
+      this.Controls.SetChildIndex(this.hits_sizeLabel, 0);
+      this.Controls.SetChildIndex(this.hits_sizeTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.parameterCollectionView, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label hits_sizeLabel;
+    private System.Windows.Forms.TextBox hits_sizeTextBox;
+    private System.Windows.Forms.Button clearButton;
+    private System.Windows.Forms.SaveFileDialog saveFileDialog;
+    private System.Windows.Forms.Button saveButton;
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationCacheView.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationCacheView.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationCacheView.cs	(revision 11892)
@@ -0,0 +1,98 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.ComponentModel;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Views {
+
+  [View("EvaluationCacheView")]
+  [Content(typeof(EvaluationCache), IsDefaultView = true)]
+  public sealed partial class EvaluationCacheView : ParameterizedNamedItemView {
+
+    public new EvaluationCache Content {
+      get { return (EvaluationCache)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public EvaluationCacheView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.Changed -= new System.EventHandler(Content_StatusChanged);
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.Changed += new System.EventHandler(Content_StatusChanged);
+    }
+
+    #region Event Handlers (Content)
+    void Content_StatusChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_StatusChanged), sender, e);
+      else
+        hits_sizeTextBox.Text = string.Format("{0}/{1} ({2} active)", Content.Hits, Content.Size, Content.ActiveEvaluations);
+    }
+
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        hits_sizeTextBox.Text = "#/#";
+      } else {
+        Content_StatusChanged(this, EventArgs.Empty);
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      clearButton.Enabled = !ReadOnly && Content != null;
+      saveButton.Enabled = !ReadOnly && Content != null;
+    }
+
+    #region Event Handlers (child controls)
+    private void clearButton_Click(object sender, EventArgs e) {
+      Content.Reset();
+    }
+    #endregion
+
+    private void saveButton_Click(object sender, EventArgs e) {
+      if (saveFileDialog.ShowDialog() == DialogResult.OK) {
+        saveButton.Enabled = false;
+        BackgroundWorker worker = new BackgroundWorker();
+        worker.DoWork += (s, a) => {
+          Content.Save((string)a.Argument);
+        };
+        worker.RunWorkerCompleted += (s, a) => {
+          SetEnabledStateOfControls();
+        };
+        worker.RunWorkerAsync(saveFileDialog.FileName);
+      }
+    }
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationProcessChannelView.Designer.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationProcessChannelView.Designer.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationProcessChannelView.Designer.cs	(revision 11892)
@@ -0,0 +1,184 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Views {
+  partial class EvaluationProcessChannelView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.executableTextBox = new System.Windows.Forms.TextBox();
+      this.browseExecutableButton = new System.Windows.Forms.Button();
+      this.argumentsTextBox = new System.Windows.Forms.TextBox();
+      this.executableLabel = new System.Windows.Forms.Label();
+      this.argumentsLabel = new System.Windows.Forms.Label();
+      this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.startButton = new System.Windows.Forms.Button();
+      this.terminateButton = new System.Windows.Forms.Button();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Location = new System.Drawing.Point(72, 0);
+      this.nameTextBox.Size = new System.Drawing.Size(287, 20);
+      // 
+      // infoLabel
+      // 
+      this.infoLabel.Location = new System.Drawing.Point(370, 3);
+      // 
+      // executableTextBox
+      // 
+      this.executableTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.executableTextBox.Location = new System.Drawing.Point(72, 26);
+      this.executableTextBox.Name = "executableTextBox";
+      this.executableTextBox.ReadOnly = true;
+      this.executableTextBox.Size = new System.Drawing.Size(287, 20);
+      this.executableTextBox.TabIndex = 4;
+      // 
+      // browseExecutableButton
+      // 
+      this.browseExecutableButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.browseExecutableButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Open;
+      this.browseExecutableButton.Location = new System.Drawing.Point(365, 24);
+      this.browseExecutableButton.Name = "browseExecutableButton";
+      this.browseExecutableButton.Size = new System.Drawing.Size(26, 23);
+      this.browseExecutableButton.TabIndex = 5;
+      this.browseExecutableButton.UseVisualStyleBackColor = true;
+      this.browseExecutableButton.Click += new System.EventHandler(this.browseExecutableButton_Click);
+      // 
+      // argumentsTextBox
+      // 
+      this.argumentsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.argumentsTextBox.Location = new System.Drawing.Point(72, 52);
+      this.argumentsTextBox.Name = "argumentsTextBox";
+      this.argumentsTextBox.Size = new System.Drawing.Size(287, 20);
+      this.argumentsTextBox.TabIndex = 6;
+      this.argumentsTextBox.Validated += new System.EventHandler(this.argumentsTextBox_Validated);
+      // 
+      // executableLabel
+      // 
+      this.executableLabel.AutoSize = true;
+      this.executableLabel.Location = new System.Drawing.Point(3, 29);
+      this.executableLabel.Name = "executableLabel";
+      this.executableLabel.Size = new System.Drawing.Size(63, 13);
+      this.executableLabel.TabIndex = 7;
+      this.executableLabel.Text = "Executable:";
+      // 
+      // argumentsLabel
+      // 
+      this.argumentsLabel.AutoSize = true;
+      this.argumentsLabel.Location = new System.Drawing.Point(3, 55);
+      this.argumentsLabel.Name = "argumentsLabel";
+      this.argumentsLabel.Size = new System.Drawing.Size(60, 13);
+      this.argumentsLabel.TabIndex = 7;
+      this.argumentsLabel.Text = "Arguments:";
+      // 
+      // openFileDialog
+      // 
+      this.openFileDialog.Filter = "Executables|*.exe|All files|*.*";
+      this.openFileDialog.Title = "Select the executable of the external process";
+      // 
+      // startButton
+      // 
+      this.startButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Play;
+      this.startButton.Location = new System.Drawing.Point(72, 78);
+      this.startButton.Name = "startButton";
+      this.startButton.Size = new System.Drawing.Size(26, 23);
+      this.startButton.TabIndex = 8;
+      this.startButton.UseVisualStyleBackColor = true;
+      this.startButton.Click += new System.EventHandler(this.startButton_Click);
+      // 
+      // terminateButton
+      // 
+      this.terminateButton.Enabled = false;
+      this.terminateButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Stop;
+      this.terminateButton.Location = new System.Drawing.Point(104, 78);
+      this.terminateButton.Name = "terminateButton";
+      this.terminateButton.Size = new System.Drawing.Size(26, 23);
+      this.terminateButton.TabIndex = 8;
+      this.terminateButton.UseVisualStyleBackColor = true;
+      this.terminateButton.Click += new System.EventHandler(this.terminateButton_Click);
+      // 
+      // EvaluationProcessChannelView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.executableTextBox);
+      this.Controls.Add(this.argumentsLabel);
+      this.Controls.Add(this.argumentsTextBox);
+      this.Controls.Add(this.startButton);
+      this.Controls.Add(this.executableLabel);
+      this.Controls.Add(this.browseExecutableButton);
+      this.Controls.Add(this.terminateButton);
+      this.Name = "EvaluationProcessChannelView";
+      this.Size = new System.Drawing.Size(391, 106);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.terminateButton, 0);
+      this.Controls.SetChildIndex(this.browseExecutableButton, 0);
+      this.Controls.SetChildIndex(this.executableLabel, 0);
+      this.Controls.SetChildIndex(this.startButton, 0);
+      this.Controls.SetChildIndex(this.argumentsTextBox, 0);
+      this.Controls.SetChildIndex(this.argumentsLabel, 0);
+      this.Controls.SetChildIndex(this.executableTextBox, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox executableTextBox;
+    private System.Windows.Forms.Button browseExecutableButton;
+    private System.Windows.Forms.TextBox argumentsTextBox;
+    private System.Windows.Forms.Label executableLabel;
+    private System.Windows.Forms.Label argumentsLabel;
+    private System.Windows.Forms.OpenFileDialog openFileDialog;
+    private System.Windows.Forms.Button startButton;
+    private System.Windows.Forms.Button terminateButton;
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationProcessChannelView.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationProcessChannelView.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationProcessChannelView.cs	(revision 11892)
@@ -0,0 +1,127 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Views {
+  [View("Process-Channel View")]
+  [Content(typeof(EvaluationProcessChannel), IsDefaultView = true)]
+  public sealed partial class EvaluationProcessChannelView : NamedItemView {
+    public new EvaluationProcessChannel Content {
+      get { return (EvaluationProcessChannel)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public EvaluationProcessChannelView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ExecutableChanged -= new EventHandler(Content_ExecutableChanged);
+      Content.ArgumentsChanged -= new EventHandler(Content_ArgumentsChanged);
+      Content.ProcessStarted -= new EventHandler(Content_ProcessStarted);
+      Content.ProcessExited -= new EventHandler(Content_ProcessExited);
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ExecutableChanged += new EventHandler(Content_ExecutableChanged);
+      Content.ArgumentsChanged += new EventHandler(Content_ArgumentsChanged);
+      Content.ProcessStarted += new EventHandler(Content_ProcessStarted);
+      Content.ProcessExited += new EventHandler(Content_ProcessExited);
+    }
+
+    #region Event Handlers (Content)
+    private void Content_ExecutableChanged(object sender, EventArgs e) {
+      executableTextBox.Text = Content.Executable;
+    }
+    private void Content_ArgumentsChanged(object sender, EventArgs e) {
+      argumentsTextBox.Text = Content.Arguments;
+    }
+    private void Content_ProcessStarted(object sender, EventArgs e) {
+      if (InvokeRequired) Invoke(new Action<object, EventArgs>(Content_ProcessStarted), sender, e);
+      else SetEnabledStateOfControls();
+    }
+    private void Content_ProcessExited(object sender, EventArgs e) {
+      if (InvokeRequired) Invoke(new Action<object, EventArgs>(Content_ProcessExited), sender, e);
+      else SetEnabledStateOfControls();
+    }
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        executableTextBox.Text = String.Empty;
+        argumentsTextBox.Text = String.Empty;
+      } else {
+        executableTextBox.Text = Content.Executable;
+        argumentsTextBox.Text = Content.Arguments;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      bool readOnlyDriverNullOrStarted = ReadOnly || Content == null || Content.IsInitialized;
+      browseExecutableButton.Enabled = !readOnlyDriverNullOrStarted;
+      startButton.Enabled = !readOnlyDriverNullOrStarted;
+      terminateButton.Enabled = !ReadOnly && Content != null && Content.IsInitialized;
+      executableTextBox.Enabled = !readOnlyDriverNullOrStarted;
+      argumentsTextBox.Enabled = !readOnlyDriverNullOrStarted;
+    }
+
+    #region Event Handlers (child controls)
+    private void browseExecutableButton_Click(object sender, EventArgs e) {
+      if (openFileDialog.ShowDialog() == DialogResult.OK) {
+        try {
+          Content.Executable = openFileDialog.FileName;
+        } catch (InvalidOperationException ex) {
+          MessageBox.Show(ex.Message);
+        }
+      }
+    }
+    private void argumentsTextBox_Validated(object sender, EventArgs e) {
+      if (Content != null) {
+        Content.Arguments = argumentsTextBox.Text;
+      }
+    }
+    #endregion
+
+    private void startButton_Click(object sender, EventArgs e) {
+      try {
+        Content.Open();
+      } catch (InvalidOperationException ex) {
+        MessageBox.Show(ex.Message);
+      }
+    }
+
+    private void terminateButton_Click(object sender, EventArgs e) {
+      try {
+        Content.Close();
+      } catch (InvalidOperationException ex) {
+        MessageBox.Show(ex.Message);
+      }
+    }
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationServiceClientView.Designer.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationServiceClientView.Designer.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationServiceClientView.Designer.cs	(revision 11892)
@@ -0,0 +1,79 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Views {
+  partial class EvaluationServiceClientView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // parameterCollectionView
+      // 
+      this.parameterCollectionView.Size = new System.Drawing.Size(528, 334);
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Location = new System.Drawing.Point(58, 0);
+      this.nameTextBox.Size = new System.Drawing.Size(445, 20);
+      // 
+      // infoLabel
+      // 
+      this.infoLabel.Location = new System.Drawing.Point(509, 3);
+      // 
+      // EvaluationServiceClientView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Name = "EvaluationServiceClientView";
+      this.Size = new System.Drawing.Size(528, 360);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationServiceClientView.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationServiceClientView.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationServiceClientView.cs	(revision 11892)
@@ -0,0 +1,71 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Views {
+  [View("Evaluation Service-Client View")]
+  [Content(typeof(EvaluationServiceClient), IsDefaultView = true)]
+  public sealed partial class EvaluationServiceClientView : ParameterizedNamedItemView {
+    public new EvaluationServiceClient Content {
+      get { return (EvaluationServiceClient)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public EvaluationServiceClientView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      // TODO: Deregister your event handlers here
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      // TODO: Register your event handlers here
+    }
+
+    #region Event Handlers (Content)
+    // TODO: Put event handlers of the content here
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        // TODO: Add code when content has been changed and is null
+      } else {
+        // TODO: Add code when content has been changed and is not null
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      // TODO: Enable or disable controls based on whether the content is null or the view is set readonly
+    }
+
+    #region Event Handlers (child controls)
+    // TODO: Put event handlers of child controls here.
+    #endregion
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationTCPChannelView.Designer.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationTCPChannelView.Designer.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationTCPChannelView.Designer.cs	(revision 11892)
@@ -0,0 +1,154 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Views {
+  partial class EvaluationTCPChannelView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.ipAddressLabel = new System.Windows.Forms.Label();
+      this.portLabel = new System.Windows.Forms.Label();
+      this.ipAddressTextBox = new System.Windows.Forms.TextBox();
+      this.portTextBox = new System.Windows.Forms.TextBox();
+      this.connectButton = new System.Windows.Forms.Button();
+      this.disconnectButton = new System.Windows.Forms.Button();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Location = new System.Drawing.Point(70, 0);
+      this.nameTextBox.Size = new System.Drawing.Size(256, 20);
+      // 
+      // ipAddressLabel
+      // 
+      this.ipAddressLabel.AutoSize = true;
+      this.ipAddressLabel.Location = new System.Drawing.Point(3, 29);
+      this.ipAddressLabel.Name = "ipAddressLabel";
+      this.ipAddressLabel.Size = new System.Drawing.Size(61, 13);
+      this.ipAddressLabel.TabIndex = 3;
+      this.ipAddressLabel.Text = "IP Address:";
+      // 
+      // portLabel
+      // 
+      this.portLabel.AutoSize = true;
+      this.portLabel.Location = new System.Drawing.Point(3, 55);
+      this.portLabel.Name = "portLabel";
+      this.portLabel.Size = new System.Drawing.Size(29, 13);
+      this.portLabel.TabIndex = 5;
+      this.portLabel.Text = "Port:";
+      // 
+      // ipAddressTextBox
+      // 
+      this.ipAddressTextBox.Location = new System.Drawing.Point(70, 26);
+      this.ipAddressTextBox.Name = "ipAddressTextBox";
+      this.ipAddressTextBox.Size = new System.Drawing.Size(281, 20);
+      this.ipAddressTextBox.TabIndex = 4;
+      this.ipAddressTextBox.Text = "127.0.0.1";
+      this.ipAddressTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.ipAddressTextBox_Validating);
+      // 
+      // portTextBox
+      // 
+      this.portTextBox.Location = new System.Drawing.Point(70, 52);
+      this.portTextBox.Name = "portTextBox";
+      this.portTextBox.Size = new System.Drawing.Size(281, 20);
+      this.portTextBox.TabIndex = 6;
+      this.portTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.portTextBox_Validating);
+      // 
+      // connectButton
+      // 
+      this.connectButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Play;
+      this.connectButton.Location = new System.Drawing.Point(70, 78);
+      this.connectButton.Name = "connectButton";
+      this.connectButton.Size = new System.Drawing.Size(26, 23);
+      this.connectButton.TabIndex = 7;
+      this.connectButton.UseVisualStyleBackColor = true;
+      this.connectButton.Click += new System.EventHandler(this.connectButton_Click);
+      // 
+      // disconnectButton
+      // 
+      this.disconnectButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Stop;
+      this.disconnectButton.Location = new System.Drawing.Point(102, 78);
+      this.disconnectButton.Name = "disconnectButton";
+      this.disconnectButton.Size = new System.Drawing.Size(26, 23);
+      this.disconnectButton.TabIndex = 8;
+      this.disconnectButton.UseVisualStyleBackColor = true;
+      this.disconnectButton.Click += new System.EventHandler(this.disconnectButton_Click);
+      // 
+      // EvaluationTCPChannelView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.ipAddressLabel);
+      this.Controls.Add(this.portTextBox);
+      this.Controls.Add(this.portLabel);
+      this.Controls.Add(this.connectButton);
+      this.Controls.Add(this.ipAddressTextBox);
+      this.Controls.Add(this.disconnectButton);
+      this.Name = "EvaluationTCPChannelView";
+      this.Size = new System.Drawing.Size(351, 105);
+      this.Controls.SetChildIndex(this.disconnectButton, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.ipAddressTextBox, 0);
+      this.Controls.SetChildIndex(this.connectButton, 0);
+      this.Controls.SetChildIndex(this.portLabel, 0);
+      this.Controls.SetChildIndex(this.portTextBox, 0);
+      this.Controls.SetChildIndex(this.ipAddressLabel, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label ipAddressLabel;
+    private System.Windows.Forms.Label portLabel;
+    private System.Windows.Forms.TextBox ipAddressTextBox;
+    private System.Windows.Forms.TextBox portTextBox;
+    private System.Windows.Forms.Button connectButton;
+    private System.Windows.Forms.Button disconnectButton;
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationTCPChannelView.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationTCPChannelView.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationTCPChannelView.cs	(revision 11892)
@@ -0,0 +1,129 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.ComponentModel;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Views {
+  [View("TCP Channel View")]
+  [Content(typeof(EvaluationTCPChannel), IsDefaultView = true)]
+  public sealed partial class EvaluationTCPChannelView : NamedItemView {
+    public new EvaluationTCPChannel Content {
+      get { return (EvaluationTCPChannel)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public EvaluationTCPChannelView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.Connected -= new EventHandler(Content_Connected);
+      Content.Disconnected -= new EventHandler(Content_Disconnected);
+      Content.IpAddressChanged -= new EventHandler(Content_IpAddressChanged);
+      Content.PortChanged -= new EventHandler(Content_PortChanged);
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.Connected += new EventHandler(Content_Connected);
+      Content.Disconnected += new EventHandler(Content_Disconnected);
+      Content.IpAddressChanged += new EventHandler(Content_IpAddressChanged);
+      Content.PortChanged += new EventHandler(Content_PortChanged);
+    }
+
+    #region Event Handlers (Content)
+    private void Content_Connected(object sender, EventArgs e) {
+      SetEnabledStateOfControls();
+    }
+    private void Content_Disconnected(object sender, EventArgs e) {
+      SetEnabledStateOfControls();
+    }
+    private void Content_IpAddressChanged(object sender, EventArgs e) {
+      ipAddressTextBox.Text = Content.IpAddress;
+    }
+    private void Content_PortChanged(object sender, EventArgs e) {
+      portTextBox.Text = Content.Port.ToString();
+    }
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        ipAddressTextBox.Text = String.Empty;
+        portTextBox.Text = String.Empty;
+      } else {
+        ipAddressTextBox.Text = Content.IpAddress;
+        portTextBox.Text = Content.Port.ToString();
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      bool readOnlyDriverNullOrStarted = ReadOnly || Content == null || Content.IsInitialized;
+      ipAddressTextBox.Enabled = !readOnlyDriverNullOrStarted;
+      portTextBox.Enabled = !readOnlyDriverNullOrStarted;
+      connectButton.Enabled = !readOnlyDriverNullOrStarted;
+      disconnectButton.Enabled = !ReadOnly && Content != null && Content.IsInitialized;
+    }
+
+    #region Event Handlers (child controls)
+    private void ipAddressTextBox_Validating(object sender, CancelEventArgs e) {
+      if (Content != null) {
+        try {
+          System.Net.IPAddress.Parse(ipAddressTextBox.Text);
+        }
+        catch (FormatException) {
+          e.Cancel = true;
+        }
+        if (!e.Cancel) Content.IpAddress = ipAddressTextBox.Text;
+      }
+    }
+    private void portTextBox_Validating(object sender, CancelEventArgs e) {
+      if (Content != null) {
+        int port;
+        e.Cancel = !int.TryParse(portTextBox.Text, out port);
+        if (!e.Cancel) Content.Port = port;
+      }
+    }
+    private void connectButton_Click(object sender, EventArgs e) {
+      try {
+        Content.Open();
+      }
+      catch (Exception ex) {
+        PluginInfrastructure.ErrorHandling.ShowErrorDialog(ex);
+      }
+    }
+    private void disconnectButton_Click(object sender, EventArgs e) {
+      try {
+        Content.Close();
+      }
+      catch (Exception ex) {
+        PluginInfrastructure.ErrorHandling.ShowErrorDialog(ex);
+      }
+    }
+    #endregion
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/HeuristicLab.Problems.ExternalEvaluation.Views-3.4.csproj
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/HeuristicLab.Problems.ExternalEvaluation.Views-3.4.csproj	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/HeuristicLab.Problems.ExternalEvaluation.Views-3.4.csproj	(revision 11892)
@@ -0,0 +1,261 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{3081630C-9521-47D7-8075-1777C12F212C}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.ExternalEvaluation.Views</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.ExternalEvaluation.Views-3.4</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <DocumentationFile>
+    </DocumentationFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="EvaluationCacheView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="EvaluationCacheView.Designer.cs">
+      <DependentUpon>EvaluationCacheView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="EvaluationServiceClientView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="EvaluationServiceClientView.Designer.cs">
+      <DependentUpon>EvaluationServiceClientView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="EvaluationProcessChannelView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="EvaluationProcessChannelView.Designer.cs">
+      <DependentUpon>EvaluationProcessChannelView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="EvaluationTCPChannelView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="EvaluationTCPChannelView.Designer.cs">
+      <DependentUpon>EvaluationTCPChannelView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <Compile Include="SolutionMessageBuilderView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="SolutionMessageBuilderView.Designer.cs">
+      <DependentUpon>SolutionMessageBuilderView.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core.Views-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Data.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Data.Views-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.MainForm-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Optimization.Views-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Optimization\3.3\HeuristicLab.Optimization-3.3.csproj">
+      <Project>{14AB8D24-25BC-400C-A846-4627AA945192}</Project>
+      <Name>HeuristicLab.Optimization-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.ExternalEvaluation\3.4\HeuristicLab.Problems.ExternalEvaluation-3.4.csproj">
+      <Project>{25735db4-8e54-4a2c-83e3-a60c76565e55}</Project>
+      <Name>HeuristicLab.Problems.ExternalEvaluation-3.4</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+    <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' ">
+export ProjectDir=$(ProjectDir)
+export SolutionDir=$(SolutionDir)
+
+$SolutionDir/PreBuildEvent.sh
+</PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/Plugin.cs.frame
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/Plugin.cs.frame	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/Plugin.cs.frame	(revision 11892)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Views {
+  [Plugin("HeuristicLab.Problems.ExternalEvaluation.Views", "3.4.10.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.ExternalEvaluation.Views-3.4.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.ExternalEvaluation", "3.4")]
+  public class HeuristicLabProblemsExternalEvaluationViewsPlugin : PluginBase {
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/Properties/AssemblyInfo.cs.frame	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/Properties/AssemblyInfo.cs.frame	(revision 11892)
@@ -0,0 +1,35 @@
+﻿using System.Reflection;
+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("HeuristicLab.Problems.ExternalEvaluation.Views")]
+[assembly: AssemblyDescription("View-Plugin for Problems that are evaluated outside of HeuristicLab.")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2014 HEAL")]
+[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("85213817-34ce-4629-8019-92b448234f8b")]
+
+// 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("3.4.0.0")]
+[assembly: AssemblyFileVersion("3.4.10.$WCREV$")]
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/SolutionMessageBuilderView.Designer.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/SolutionMessageBuilderView.Designer.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/SolutionMessageBuilderView.Designer.cs	(revision 11892)
@@ -0,0 +1,89 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Views {
+  partial class SolutionMessageBuilderView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.convertersGroupBox = new System.Windows.Forms.GroupBox();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // convertersGroupBox
+      // 
+      this.convertersGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.convertersGroupBox.Location = new System.Drawing.Point(0, 26);
+      this.convertersGroupBox.Name = "convertersGroupBox";
+      this.convertersGroupBox.Size = new System.Drawing.Size(351, 225);
+      this.convertersGroupBox.TabIndex = 3;
+      this.convertersGroupBox.TabStop = false;
+      this.convertersGroupBox.Text = "Converters";
+      // 
+      // SolutionMessageBuilderView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.convertersGroupBox);
+      this.Name = "SolutionMessageBuilderView";
+      this.Size = new System.Drawing.Size(351, 251);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.convertersGroupBox, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.GroupBox convertersGroupBox;
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/SolutionMessageBuilderView.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/SolutionMessageBuilderView.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/SolutionMessageBuilderView.cs	(revision 11892)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Views {
+  [View("Solution Message Builder View")]
+  [Content(typeof(SolutionMessageBuilder), IsDefaultView = true)]
+  public sealed partial class SolutionMessageBuilderView : NamedItemView {
+    CheckedItemListView<IItemToSolutionMessageConverter> converterView;
+
+    public new SolutionMessageBuilder Content {
+      get { return (SolutionMessageBuilder)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public SolutionMessageBuilderView() {
+      InitializeComponent();
+      converterView = new CheckedItemListView<IItemToSolutionMessageConverter>();
+      converterView.Dock = DockStyle.Fill;
+      convertersGroupBox.Controls.Add(converterView);
+    }
+
+    protected override void DeregisterContentEvents() {
+      // TODO: Deregister your event handlers here
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      // TODO: Register your event handlers here
+    }
+
+    #region Event Handlers (Content)
+    // TODO: Put event handlers of the content here
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        converterView.Content = null;
+      } else {
+        converterView.Content = Content.Converters;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+    }
+
+    #region Event Handlers (child controls)
+    // TODO: Put event handlers of child controls here.
+    #endregion
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/BoolConverter.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/BoolConverter.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/BoolConverter.cs	(revision 11892)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("BoolConverter", "Converts a ValueTypeValue<bool>, ValueTypeArray<bool>, or ValueTypeMatrix<bool> and adds it to the SolutionMessage's BoolVars or BoolArrayVars. A matrix is encoded as array by concatenating all rows and setting length as the length of a row.")]
+  [StorableClass]
+  public class BoolConverter : Item, IItemToSolutionMessageConverter {
+    private static readonly Type[] itemTypes = new Type[] { typeof(ValueTypeValue<bool>), typeof(ValueTypeArray<bool>), typeof(ValueTypeMatrix<bool>) };
+    [StorableConstructor]
+    protected BoolConverter(bool deserializing) : base(deserializing) { }
+    protected BoolConverter(BoolConverter original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BoolConverter(this, cloner);
+    }
+    public BoolConverter() : base() { }
+
+    #region IItemToSolutionMessageConverter Members
+
+    public Type[] ItemTypes {
+      get { return itemTypes; }
+    }
+
+    public void AddItemToBuilder(IItem item, string name, SolutionMessage.Builder builder) {
+      ValueTypeValue<bool> value = (item as ValueTypeValue<bool>);
+      if (value != null) {
+        SolutionMessage.Types.BoolVariable.Builder var = SolutionMessage.Types.BoolVariable.CreateBuilder();
+        var.SetName(name).SetData(value.Value);
+        builder.AddBoolVars(var.Build());
+      } else {
+        ValueTypeArray<bool> array = (item as ValueTypeArray<bool>);
+        if (array != null) {
+          SolutionMessage.Types.BoolArrayVariable.Builder var = SolutionMessage.Types.BoolArrayVariable.CreateBuilder();
+          var.SetName(name).AddRangeData(array).SetLength(array.Length);
+          builder.AddBoolArrayVars(var.Build());
+        } else {
+          ValueTypeMatrix<bool> matrix = (item as ValueTypeMatrix<bool>);
+          if (matrix != null) {
+            SolutionMessage.Types.BoolArrayVariable.Builder var = SolutionMessage.Types.BoolArrayVariable.CreateBuilder();
+            var.SetName(name).AddRangeData(matrix.AsEnumerable()).SetLength(matrix.Columns);
+            builder.AddBoolArrayVars(var.Build());
+          } else {
+            throw new ArgumentException(ItemName + ": Item is not of a supported type.", "item");
+          }
+        }
+      }
+    }
+
+    #endregion
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/DateTimeValueConverter.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/DateTimeValueConverter.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/DateTimeValueConverter.cs	(revision 11892)
@@ -0,0 +1,61 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("DateTimeValueConverter", "Converts a DateTimeValue and adds it to the SolutionMessage's StringVars. The format is yyyy-MM-dd HH:mm:sszzz, e.g. 2010-05-31 19:15:33+01:00.")]
+  [StorableClass]
+  public class DateTimeValueConverter : Item, IItemToSolutionMessageConverter {
+    private static readonly Type[] itemTypes = new Type[] { typeof(DateTimeValue) };
+    [StorableConstructor]
+    protected DateTimeValueConverter(bool deserializing) : base(deserializing) { }
+    protected DateTimeValueConverter(DateTimeValueConverter original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DateTimeValueConverter(this, cloner);
+    }
+    public DateTimeValueConverter() : base() { }
+
+    #region IItemToSolutionMessageConverter Members
+
+    public Type[] ItemTypes {
+      get { return itemTypes; }
+    }
+
+    public void AddItemToBuilder(IItem item, string name, SolutionMessage.Builder builder) {
+      DateTimeValue date = (item as DateTimeValue);
+      if (date != null) {
+        SolutionMessage.Types.StringVariable.Builder var = SolutionMessage.Types.StringVariable.CreateBuilder();
+        var.SetName(name).SetData(date.Value.ToString("yyyy-MM-dd HH:mm:sszzz"));
+        builder.AddStringVars(var.Build());
+      } else {
+        throw new ArgumentException(ItemName + ": Item is not of a supported type.", "item");
+      }
+    }
+
+    #endregion
+
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/DoubleConverter.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/DoubleConverter.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/DoubleConverter.cs	(revision 11892)
@@ -0,0 +1,76 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("DoubleConverter", "Converts a ValueTypeValue<double>, ValueTypeArray<double>, or ValueTypeMatrix<double> and adds it to the SolutionMessage's DoubleVars or DoubleArrayVars. A matrix is encoded as array by concatenating all rows and setting length as the length of a row.")]
+  [StorableClass]
+  public class DoubleConverter : Item, IItemToSolutionMessageConverter {
+    private static readonly Type[] itemTypes = new Type[] { typeof(ValueTypeValue<double>), typeof(ValueTypeArray<double>), typeof(ValueTypeMatrix<double>) };
+
+    [StorableConstructor]
+    protected DoubleConverter(bool deserializing) : base(deserializing) { }
+    protected DoubleConverter(DoubleConverter original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DoubleConverter(this, cloner);
+    }
+    public DoubleConverter() : base() { }
+
+    #region IItemToSolutionMessageConverter Members
+
+    public Type[] ItemTypes {
+      get { return itemTypes; }
+    }
+
+    public void AddItemToBuilder(IItem item, string name, SolutionMessage.Builder builder) {
+      ValueTypeValue<double> value = (item as ValueTypeValue<double>);
+      if (value != null) {
+        SolutionMessage.Types.DoubleVariable.Builder var = SolutionMessage.Types.DoubleVariable.CreateBuilder();
+        var.SetName(name).SetData(value.Value);
+        builder.AddDoubleVars(var.Build());
+      } else {
+        ValueTypeArray<double> array = (item as ValueTypeArray<double>);
+        if (array != null) {
+          SolutionMessage.Types.DoubleArrayVariable.Builder var = SolutionMessage.Types.DoubleArrayVariable.CreateBuilder();
+          var.SetName(name).AddRangeData(array).SetLength(array.Length);
+          builder.AddDoubleArrayVars(var.Build());
+        } else {
+          ValueTypeMatrix<double> matrix = (item as ValueTypeMatrix<double>);
+          if (matrix != null) {
+            SolutionMessage.Types.DoubleArrayVariable.Builder var = SolutionMessage.Types.DoubleArrayVariable.CreateBuilder();
+            var.SetName(name).AddRangeData(matrix.AsEnumerable()).SetLength(matrix.Columns);
+            builder.AddDoubleArrayVars(var.Build());
+          } else {
+            throw new ArgumentException(ItemName + ": Item is not of a supported type.", "item");
+          }
+        }
+      }
+    }
+
+    #endregion
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/IntegerConverter.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/IntegerConverter.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/IntegerConverter.cs	(revision 11892)
@@ -0,0 +1,76 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("IntegerConverter", "Converts a ValueTypeValue<int>, ValueTypeArray<int>, or ValueTypeMatrix<int> and adds it to the SolutionMessage's IntegerVars or IntegerArrayVars. A matrix is encoded as array by concatenating all rows and setting length as the length of a row.")]
+  [StorableClass]
+  public class IntegerConverter : Item, IItemToSolutionMessageConverter {
+    private static readonly Type[] itemTypes = new Type[] { typeof(ValueTypeValue<int>), typeof(ValueTypeArray<int>), typeof(ValueTypeMatrix<int>) };
+
+    [StorableConstructor]
+    protected IntegerConverter(bool deserializing) : base(deserializing) { }
+    protected IntegerConverter(IntegerConverter original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new IntegerConverter(this, cloner);
+    }
+    public IntegerConverter() : base() { }
+
+    #region IItemToSolutionMessageConverter Members
+
+    public Type[] ItemTypes {
+      get { return itemTypes; }
+    }
+
+    public void AddItemToBuilder(IItem item, string name, SolutionMessage.Builder builder) {
+      ValueTypeValue<int> value = (item as ValueTypeValue<int>);
+      if (value != null) {
+        SolutionMessage.Types.IntegerVariable.Builder var = SolutionMessage.Types.IntegerVariable.CreateBuilder();
+        var.SetName(name).SetData(value.Value);
+        builder.AddIntegerVars(var.Build());
+      } else {
+        ValueTypeArray<int> array = (item as ValueTypeArray<int>);
+        if (array != null) {
+          SolutionMessage.Types.IntegerArrayVariable.Builder var = SolutionMessage.Types.IntegerArrayVariable.CreateBuilder();
+          var.SetName(name).AddRangeData(array).SetLength(array.Length);
+          builder.AddIntegerArrayVars(var.Build());
+        } else {
+          ValueTypeMatrix<int> matrix = (item as ValueTypeMatrix<int>);
+          if (matrix != null) {
+            SolutionMessage.Types.IntegerArrayVariable.Builder var = SolutionMessage.Types.IntegerArrayVariable.CreateBuilder();
+            var.SetName(name).AddRangeData(matrix.AsEnumerable()).SetLength(matrix.Columns);
+            builder.AddIntegerArrayVars(var.Build());
+          } else {
+            throw new ArgumentException(ItemName + ": Item is not of a supported type.", "item");
+          }
+        }
+      }
+    }
+
+    #endregion
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/StringConverter.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/StringConverter.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/StringConverter.cs	(revision 11892)
@@ -0,0 +1,80 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("StringConverter", "Converts a StringValue, StringArray, StringMatrix, IStringConvertibleValue, IStringConvertibleArray, or IStringConvertibleMatrix and adds it to the SolutionMessage's StringVars or StringArrayVars. A matrix is encoded as array by concatenating all rows and setting length as the length of a row.")]
+  [StorableClass]
+  public class StringConverter : Item, IItemToSolutionMessageConverter {
+    private static readonly Type[] itemTypes = new Type[] { typeof(StringValue), typeof(StringArray), typeof(StringMatrix), typeof(IStringConvertibleValue), typeof(IStringConvertibleArray), typeof(IStringConvertibleMatrix) };
+
+    [StorableConstructor]
+    protected StringConverter(bool deserializing) : base(deserializing) { }
+    protected StringConverter(StringConverter original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StringConverter(this, cloner);
+    }
+    public StringConverter() : base() { }
+
+    #region IItemToSolutionMessageConverter Members
+
+    public Type[] ItemTypes {
+      get { return itemTypes; }
+    }
+
+    public void AddItemToBuilder(IItem item, string name, SolutionMessage.Builder builder) {
+      IStringConvertibleValue value = (item as IStringConvertibleValue);
+      if (value != null) {
+        SolutionMessage.Types.StringVariable.Builder var = SolutionMessage.Types.StringVariable.CreateBuilder();
+        var.SetName(name).SetData(value.GetValue());
+        builder.AddStringVars(var.Build());
+      } else {
+        IStringConvertibleArray array = (item as IStringConvertibleArray);
+        if (array != null) {
+          SolutionMessage.Types.StringArrayVariable.Builder var = SolutionMessage.Types.StringArrayVariable.CreateBuilder();
+          var.SetName(name).SetLength(array.Length);
+          for (int i = 0; i < array.Length; i++)
+            var.AddData(array.GetValue(i));
+          builder.AddStringArrayVars(var.Build());
+        } else {
+          IStringConvertibleMatrix matrix = (item as IStringConvertibleMatrix);
+          if (matrix != null) {
+            SolutionMessage.Types.StringArrayVariable.Builder var = SolutionMessage.Types.StringArrayVariable.CreateBuilder();
+            var.SetName(name).SetLength(matrix.Columns);
+            for (int i = 0; i < matrix.Rows; i++)
+              for (int j = 0; j < matrix.Columns; j++)
+                var.AddData(matrix.GetValue(i, j));
+            builder.AddStringArrayVars(var.Build());
+          } else {
+            throw new ArgumentException(ItemName + ": Item is not of a supported type.", "item");
+          }
+        }
+      }
+    }
+
+    #endregion
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/TimeSpanValueConverter.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/TimeSpanValueConverter.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/TimeSpanValueConverter.cs	(revision 11892)
@@ -0,0 +1,62 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("TimeSpanValueConverter", "Converts a TimeSpanValue and adds it to the SolutionMessage's StringVars. The format is d.hh:mm:ss, e.g. 1113.10:55:00 (1113 days 10 hours, 55 minutes, 0 seconds).")]
+  [StorableClass]
+  public class TimeSpanValueConverter : Item, IItemToSolutionMessageConverter {
+    private static readonly Type[] itemTypes = new Type[] { typeof(TimeSpanValue) };
+
+    [StorableConstructor]
+    protected TimeSpanValueConverter(bool deserializing) : base(deserializing) { }
+    protected TimeSpanValueConverter(TimeSpanValueConverter original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TimeSpanValueConverter(this, cloner);
+    }
+    public TimeSpanValueConverter() : base() { }
+
+    #region IItemToSolutionMessageConverter Members
+
+    public Type[] ItemTypes {
+      get { return itemTypes; }
+    }
+
+    public void AddItemToBuilder(IItem item, string name, SolutionMessage.Builder builder) {
+      DateTimeValue date = (item as DateTimeValue);
+      if (date != null) {
+        SolutionMessage.Types.StringVariable.Builder var = SolutionMessage.Types.StringVariable.CreateBuilder();
+        var.SetName(name).SetData(date.Value.ToString(@"d\.hh\:mm\:ss"));
+        builder.AddStringVars(var.Build());
+      } else {
+        throw new ArgumentException(ItemName + ": Item is not of a supported type.", "item");
+      }
+    }
+
+    #endregion
+
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationChannel.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationChannel.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationChannel.cs	(revision 11892)
@@ -0,0 +1,61 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using Google.ProtocolBuffers;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("EvaluationChannel", "Abstract base class for channels to be used in an external evaluation problem.")]
+  [StorableClass]
+  public abstract class EvaluationChannel : NamedItem, IEvaluationChannel {
+    public override bool CanChangeName { get { return false; } }
+    public override bool CanChangeDescription { get { return false; } }
+
+    [StorableConstructor]
+    protected EvaluationChannel(bool deserializing) : base(deserializing) { }
+    protected EvaluationChannel(EvaluationChannel original, Cloner cloner) : base(original, cloner) { }
+    protected EvaluationChannel()
+      : base() {
+      name = ItemName;
+      description = ItemDescription;
+    }
+
+    #region IExternalEvaluationChannel Members
+    // will not be serialized, since it will always be false after deserialization
+    public bool IsInitialized { get; protected set; }
+
+    public virtual void Open() {
+      IsInitialized = true;
+    }
+
+    public abstract void Send(IMessage message);
+
+    public abstract IMessage Receive(IBuilder builder, ExtensionRegistry extensions);
+
+    public virtual void Close() {
+      IsInitialized = false;
+    }
+
+    #endregion
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationProcessChannel.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationProcessChannel.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationProcessChannel.cs	(revision 11892)
@@ -0,0 +1,193 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Diagnostics;
+using System.IO;
+using Google.ProtocolBuffers;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("EvaluationProcessChannel", "A channel that launches an external application in a new process and communicates with that process via stdin and stdout.")]
+  [StorableClass]
+  public class EvaluationProcessChannel : EvaluationChannel {
+
+    #region Fields & Properties
+    private Process process;
+    [Storable]
+    private string executable;
+    public string Executable {
+      get { return executable; }
+      set {
+        if (IsInitialized) throw new InvalidOperationException(Name + ": Cannot change the executable path as the process has already been started.");
+        if (value == executable) return;
+        executable = value;
+        UpdateName();
+        OnExecutableChanged();
+      }
+    }
+    [Storable]
+    private string arguments;
+    public string Arguments {
+      get { return arguments; }
+      set {
+        if (IsInitialized) throw new InvalidOperationException(Name + ": Cannot change the arguments as the process has already been started.");
+        if (value == arguments) return;
+        arguments = value;
+        UpdateName();
+        OnArgumentsChanged();
+      }
+    }
+    private EvaluationStreamChannel streamingChannel;
+    #endregion
+
+    #region Construction & Cloning
+    [StorableConstructor]
+    protected EvaluationProcessChannel(bool deserializing) : base(deserializing) { }
+    protected EvaluationProcessChannel(EvaluationProcessChannel original, Cloner cloner)
+      : base(original, cloner) {
+      executable = original.executable;
+      arguments = original.arguments;
+      UpdateName();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EvaluationProcessChannel(this, cloner);
+    }
+
+    public EvaluationProcessChannel() : this(String.Empty, String.Empty) { }
+    public EvaluationProcessChannel(string executable, string arguments)
+      : base() {
+      this.executable = executable;
+      this.arguments = arguments;
+      UpdateName();
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      UpdateName();
+    }
+    #endregion
+
+    #region IExternalEvaluationChannel Members
+    public override void Open() {
+      if (!String.IsNullOrEmpty(executable.Trim())) {
+        base.Open();
+        process = new Process();
+        process.StartInfo = new ProcessStartInfo(executable, arguments);
+        process.StartInfo.UseShellExecute = false;
+        process.StartInfo.RedirectStandardInput = true;
+        process.StartInfo.RedirectStandardOutput = true;
+        process.EnableRaisingEvents = true; // required to be notified of exit
+        process.Start();
+        Stream processStdOut = process.StandardOutput.BaseStream;
+        Stream processStdIn = process.StandardInput.BaseStream;
+        OnProcessStarted();
+        process.Exited += new EventHandler(process_Exited);
+        streamingChannel = new EvaluationStreamChannel(processStdOut, processStdIn);
+        streamingChannel.Open();
+      } else throw new InvalidOperationException(Name + ": Cannot open the process channel because the executable is not defined.");
+    }
+
+    public override void Send(IMessage message) {
+      try {
+        streamingChannel.Send(message);
+      } catch {
+        Close();
+        throw;
+      }
+    }
+
+    public override IMessage Receive(IBuilder builder, ExtensionRegistry extensions) {
+      try {
+        return streamingChannel.Receive(builder, extensions);
+      } catch {
+        Close();
+        throw;
+      }
+    }
+
+    public override void Close() {
+      base.Close();
+      if (process != null) {
+        if (!process.HasExited) {
+          streamingChannel.Close();
+          if (!process.HasExited) {
+            try {
+              process.CloseMainWindow();
+              process.WaitForExit(1000);
+              process.Close();
+            } catch { }
+          }
+          // for some reasons the event process_Exited does not fire
+          OnProcessExited();
+        }
+        process = null;
+      }
+    }
+
+    #endregion
+
+    #region Event handlers (process)
+    private void process_Exited(object sender, EventArgs e) {
+      if (IsInitialized) {
+        if (streamingChannel.IsInitialized) streamingChannel.Close();
+        IsInitialized = false;
+        process = null;
+      }
+      OnProcessExited();
+    }
+    #endregion
+
+    #region Events
+    public event EventHandler ExecutableChanged;
+    protected void OnExecutableChanged() {
+      EventHandler handler = ExecutableChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler ArgumentsChanged;
+    protected void OnArgumentsChanged() {
+      EventHandler handler = ArgumentsChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler ProcessStarted;
+    private void OnProcessStarted() {
+      EventHandler handler = ProcessStarted;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler ProcessExited;
+    private void OnProcessExited() {
+      EventHandler handler = ProcessExited;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+
+    #region Auxiliary Methods
+    private void UpdateName() {
+      name = string.Format("ProcessChannel {0} {1}", Path.GetFileNameWithoutExtension(executable), arguments);
+      OnNameChanged();
+    }
+    #endregion
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationServiceClient.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationServiceClient.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationServiceClient.cs	(revision 11892)
@@ -0,0 +1,165 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.IO;
+using Google.ProtocolBuffers;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("EvaluationServiceClient", "An RPC client that evaluates a solution.")]
+  [StorableClass]
+  public class EvaluationServiceClient : ParameterizedNamedItem, IEvaluationServiceClient {
+
+    public override bool CanChangeName { get { return false; } }
+    public override bool CanChangeDescription { get { return false; } }
+
+    #region Parameters
+    public IValueParameter<IEvaluationChannel> ChannelParameter {
+      get { return (IValueParameter<IEvaluationChannel>)Parameters["Channel"]; }
+    }
+    public IValueParameter<IntValue> RetryParameter {
+      get { return (IValueParameter<IntValue>)Parameters["Retry"]; }
+    }
+
+    private IEvaluationChannel Channel {
+      get { return ChannelParameter.Value; }
+    }
+    #endregion
+
+
+    #region Construction & Cloning
+    [StorableConstructor]
+    protected EvaluationServiceClient(bool deserializing) : base(deserializing) { }
+    protected EvaluationServiceClient(EvaluationServiceClient original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterEvents();
+    }
+    public EvaluationServiceClient()
+      : base() {
+      Parameters.Add(new ValueParameter<IEvaluationChannel>("Channel", "The channel over which to call the remote function."));
+      Parameters.Add(new ValueParameter<IntValue>("Retry", "How many times the client should retry obtaining a quality in case there is an exception. Note that it immediately aborts when the channel cannot be opened.", new IntValue(10)));
+      RegisterEvents();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EvaluationServiceClient(this, cloner);
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      ChannelParameter_ValueChanged(this, EventArgs.Empty);
+      RegisterEvents();
+    }
+    #endregion
+
+    #region IEvaluationServiceClient Members
+    public QualityMessage Evaluate(SolutionMessage solution, ExtensionRegistry qualityExtensions) {
+      int tries = 0, maxTries = RetryParameter.Value.Value;
+      bool success = false;
+      QualityMessage result = null;
+      while (!success) {
+        try {
+          tries++;
+          CheckAndOpenChannel();
+          Channel.Send(solution);
+          result = (QualityMessage)Channel.Receive(QualityMessage.CreateBuilder(), qualityExtensions);
+          success = true;
+        } catch (InvalidOperationException) {
+          throw;
+        } catch {
+          if (tries >= maxTries)
+            throw;
+        }
+      }
+      if (result != null && result.SolutionId != solution.SolutionId) throw new InvalidDataException(Name + ": Received a quality for a different solution.");
+      return result;
+    }
+
+    public void EvaluateAsync(SolutionMessage solution, ExtensionRegistry qualityExtensions, Action<QualityMessage> callback) {
+      int tries = 0, maxTries = RetryParameter.Value.Value;
+      bool success = false;
+      while (!success) {
+        try {
+          tries++;
+          CheckAndOpenChannel();
+          Channel.Send(solution);
+          success = true;
+        } catch (InvalidOperationException) {
+          throw;
+        } catch {
+          if (tries >= maxTries)
+            throw;
+        }
+      }
+      System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(ReceiveAsync), new ReceiveAsyncInfo(solution, callback, qualityExtensions));
+    }
+    #endregion
+
+    #region Auxiliary Methods
+    private void CheckAndOpenChannel() {
+      if (Channel == null) throw new InvalidOperationException(Name + ": The channel is not defined.");
+      if (!Channel.IsInitialized) {
+        try {
+          Channel.Open();
+        } catch (Exception e) {
+          throw new InvalidOperationException(Name + ": The channel could not be opened.", e);
+        }
+      }
+    }
+
+    private void ReceiveAsync(object callbackInfo) {
+      var info = (ReceiveAsyncInfo)callbackInfo;
+      QualityMessage message = null;
+      try {
+        message = (QualityMessage)Channel.Receive(QualityMessage.CreateBuilder(), info.QualityExtensions);
+      } catch { }
+      if (message != null && message.SolutionId != info.SolutionMessage.SolutionId) throw new InvalidDataException(Name + ": Received a quality for a different solution.");
+      info.CallbackDelegate.Invoke(message);
+    }
+
+    private void RegisterEvents() {
+      ChannelParameter.ValueChanged += new EventHandler(ChannelParameter_ValueChanged);
+    }
+
+    void ChannelParameter_ValueChanged(object sender, EventArgs e) {
+      if (ChannelParameter.Value == null)
+        name = "Empty EvaluationServiceClient";
+      else
+        name = String.Format("{0} ServiceClient", ChannelParameter.Value.Name);
+      OnNameChanged();
+    }
+    #endregion
+
+    private class ReceiveAsyncInfo {
+      public SolutionMessage SolutionMessage { get; set; }
+      public Action<QualityMessage> CallbackDelegate { get; set; }
+      public ExtensionRegistry QualityExtensions { get; set; }
+      public ReceiveAsyncInfo(SolutionMessage solutionMessage, Action<QualityMessage> callbackDelegate, ExtensionRegistry qualityExtensions) {
+        SolutionMessage = solutionMessage;
+        CallbackDelegate = callbackDelegate;
+        QualityExtensions = qualityExtensions;
+      }
+    }
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationStreamChannel.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationStreamChannel.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationStreamChannel.cs	(revision 11892)
@@ -0,0 +1,78 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.IO;
+using Google.ProtocolBuffers;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("EvaluationStreamChannel", "A channel that communicates via an input and an output stream.")]
+  [StorableClass]
+  public class EvaluationStreamChannel : EvaluationChannel {
+
+    private Stream input;
+    private Stream output;
+
+    [StorableConstructor]
+    protected EvaluationStreamChannel(bool deserializing) : base(deserializing) { }
+    protected EvaluationStreamChannel(EvaluationStreamChannel original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EvaluationStreamChannel(this, cloner);
+    }
+
+    public EvaluationStreamChannel() : base() { }
+    public EvaluationStreamChannel(Stream input, Stream output)
+      : base() {
+      if (!input.CanRead) throw new ArgumentException("Input stream cannot be read", "input");
+      this.input = input;
+      if (!output.CanWrite) throw new ArgumentException("Output stream cannot be written", "output");
+      this.output = output;
+    }
+
+    #region IExternalEvaluationChannel Members
+
+    public override void Send(IMessage solution) {
+      lock (output) {
+        solution.WriteDelimitedTo(output);
+        output.Flush();
+      }
+    }
+
+    public override IMessage Receive(IBuilder builder, ExtensionRegistry extensions) {
+      QualityMessage message;
+      lock (input) { // only one thread can read from the stream at one time
+        message = QualityMessage.ParseDelimitedFrom(input, extensions);
+      }
+      return message;
+    }
+
+    public override void Close() {
+      base.Close();
+      input.Close();
+      output.Close();
+    }
+
+    #endregion
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationTCPChannel.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationTCPChannel.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationTCPChannel.cs	(revision 11892)
@@ -0,0 +1,224 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Net;
+using System.Net.Sockets;
+using Google.ProtocolBuffers;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("EvaluationTCPChannel", "A channel that creates a TCP connection over a network.")]
+  [StorableClass]
+  public class EvaluationTCPChannel : EvaluationChannel {
+
+    public const int MAX_VARINT32_SIZE = 5;
+
+    #region Fields & Properties
+    [Storable]
+    private string ipAddress;
+    public string IpAddress {
+      get { return ipAddress; }
+      set {
+        if (value == ipAddress) return;
+        ipAddress = value;
+        UpdateName();
+        OnIpAddressChanged();
+      }
+    }
+    [Storable]
+    private int port;
+    public int Port {
+      get { return port; }
+      set {
+        if (value == port) return;
+        port = value;
+        UpdateName();
+        OnPortChanged();
+      }
+    }
+    private Socket socket;
+    #endregion
+
+    #region Construction & Cloning
+    [StorableConstructor]
+    protected EvaluationTCPChannel(bool deserializing) : base(deserializing) { }
+    protected EvaluationTCPChannel(EvaluationTCPChannel original, Cloner cloner)
+      : base(original, cloner) {
+      ipAddress = original.ipAddress;
+      port = original.port;
+      UpdateName();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EvaluationTCPChannel(this, cloner);
+    }
+
+    public EvaluationTCPChannel() : this(String.Empty, 0) { }
+    public EvaluationTCPChannel(string ip, int port)
+      : base() {
+      this.ipAddress = ip;
+      this.port = port;
+      UpdateName();
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      UpdateName();
+    }
+    #endregion
+
+
+
+    #region IExternalEvaluationChannel Members
+
+    public override void Open() {
+      socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+      socket.Connect(IPAddress.Parse(ipAddress), port);
+      if (socket.Connected) {
+        base.Open();
+        OnConnected();
+      }
+    }
+
+    public override void Send(IMessage message) {
+      try {
+        byte[] buffer = EncodeDelimited(message);
+        socket.Send(buffer);
+      } catch (SocketException) {
+        Close();
+        throw;
+      } catch (ObjectDisposedException) {
+        socket = null;
+        Close();
+        throw;
+      }
+    }
+
+    private byte[] EncodeDelimited(IMessage message) {
+      int messageSize = message.SerializedSize;
+      int headerSize = GetVarint32EncodedSize(messageSize);
+      byte[] buffer = new byte[headerSize + messageSize];
+      CodedOutputStream tmp = CodedOutputStream.CreateInstance(buffer);
+      tmp.WriteRawVarint32((uint)messageSize);
+      message.WriteTo(tmp);
+      return buffer;
+    }
+
+    private int GetVarint32EncodedSize(int size) {
+      // Varints in Protocol Buffers are encoded using the 7 lower order bits (the MSB indicates continuation (=1) or termination (=0))
+      int sizeByteCount = 1;
+      int limit = 128;
+      while (size >= limit) {
+        sizeByteCount++;
+        limit *= 128;
+      }
+      return sizeByteCount;
+    }
+
+    public override IMessage Receive(IBuilder builder, ExtensionRegistry extensions) {
+      try {
+        byte[] buffer = GetMessageBuffer();
+        return builder.WeakMergeFrom(ByteString.CopyFrom(buffer), extensions).WeakBuild();
+      } catch (SocketException) {
+        Close();
+        throw;
+      } catch (ObjectDisposedException) {
+        socket = null;
+        Close();
+        throw;
+      }
+    }
+
+    private byte[] GetMessageBuffer() {
+      byte[] buffer;
+      int messageSize = GetReceivedMessageSize(out buffer);
+      int headerSize = GetVarint32EncodedSize(messageSize);
+      int messageBytesInHeader = Math.Min(messageSize, buffer.Length - headerSize);
+      byte[] messageBuffer = new byte[messageSize];
+      Array.Copy(buffer, headerSize, messageBuffer, 0, messageBytesInHeader);
+      ReceiveMessage(messageBuffer, messageBytesInHeader, messageSize - messageBytesInHeader);
+      return messageBuffer;
+    }
+
+    private int GetReceivedMessageSize(out byte[] buffer) {
+      buffer = new byte[MAX_VARINT32_SIZE];
+      socket.Receive(buffer);
+      CodedInputStream tmp = CodedInputStream.CreateInstance(buffer);
+      return (int)tmp.ReadRawVarint32();
+    }
+
+    private void ReceiveMessage(byte[] buffer, int offset, int size) {
+      while (size > 0) {
+        int received = socket.Receive(buffer, offset, size, SocketFlags.None);
+        offset += received;
+        size -= received;
+      }
+    }
+
+    public override void Close() {
+      if (socket != null) {
+        try {
+          if (socket.Connected)
+            socket.Disconnect(false);
+          socket.Close();
+        } catch { }
+        socket = null;
+      }
+      bool wasInitialized = IsInitialized;
+      base.Close();
+      if (wasInitialized) OnDiconnected();
+    }
+
+    #endregion
+
+    #region Auxiliary Methods
+    private void UpdateName() {
+      name = string.Format("TCPChannel {0}:{1}", ipAddress, port);
+      OnNameChanged();
+    }
+    #endregion
+
+    #region Events
+    public event EventHandler IpAddressChanged;
+    protected void OnIpAddressChanged() {
+      EventHandler handler = IpAddressChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler PortChanged;
+    protected void OnPortChanged() {
+      EventHandler handler = PortChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler Connected;
+    protected void OnConnected() {
+      EventHandler handler = Connected;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler Disconnected;
+    protected void OnDiconnected() {
+      EventHandler handler = Disconnected;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/EvaluationCache.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/EvaluationCache.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/EvaluationCache.cs	(revision 11892)
@@ -0,0 +1,284 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ * 
+ * The LRU cache is based on an idea by Robert Rossney see 
+ * <http://csharp-lru-cache.googlecode.com>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Text.RegularExpressions;
+using System.Threading;
+using HeuristicLab.Common;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+
+  [Item("EvaluationCache", "Cache for external evaluation values")]
+  [StorableClass]
+  public class EvaluationCache : ParameterizedNamedItem {
+
+    #region Types
+    private sealed class CacheEntry {
+
+      public readonly string Key;
+      public double Value;
+
+      public CacheEntry(string key, double value) {
+        Key = key;
+        Value = value;
+      }
+
+      public CacheEntry(string key) {
+        Key = key;
+      }
+
+      public override bool Equals(object obj) {
+        CacheEntry other = obj as CacheEntry;
+        if (other == null)
+          return false;
+        return Key.Equals(other.Key);
+      }
+
+      public override int GetHashCode() {
+        return Key.GetHashCode();
+      }
+
+      public override string ToString() {
+        return string.Format("{{{0} : {1}}}", Key, Value);
+      }
+    }
+
+    public delegate double Evaluator(SolutionMessage message);
+    #endregion
+
+    #region Fields
+    private LinkedList<CacheEntry> list;
+    private Dictionary<CacheEntry, LinkedListNode<CacheEntry>> index;
+
+    private HashSet<string> activeEvaluations = new HashSet<string>();
+    private object cacheLock = new object();
+    #endregion
+
+    #region Properties
+    public static new System.Drawing.Image StaticItemImage {
+      get { return VSImageLibrary.Database; }
+    }
+    public int Size { get { lock (cacheLock) return index.Count; } }
+    public int ActiveEvaluations { get { lock (cacheLock) return activeEvaluations.Count; } }
+
+    [Storable]
+    public int Hits { get; private set; }
+    #endregion
+
+    #region events
+    public event EventHandler Changed;
+
+    protected virtual void OnChanged() {
+      EventHandler handler = Changed;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
+    }
+    #endregion
+
+    #region Parameters
+    public FixedValueParameter<IntValue> CapacityParameter {
+      get { return (FixedValueParameter<IntValue>)Parameters["Capacity"]; }
+    }
+    public FixedValueParameter<BoolValue> PersistentCacheParameter {
+      get { return (FixedValueParameter<BoolValue>)Parameters["PersistentCache"]; }
+    }
+    #endregion
+
+    #region Parameter Values
+    public int Capacity {
+      get { return CapacityParameter.Value.Value; }
+      set { CapacityParameter.Value.Value = value; }
+    }
+    public bool IsPersistent {
+      get { return PersistentCacheParameter.Value.Value; }
+    }
+    #endregion
+
+    #region Persistence
+    [Storable(Name = "Cache")]
+    private IEnumerable<KeyValuePair<string, double>> Cache_Persistence {
+      get {
+        if (IsPersistent) {
+          return GetCacheValues();
+        } else {
+          return Enumerable.Empty<KeyValuePair<string, double>>();
+        }
+      }
+      set {
+        SetCacheValues(value);
+      }
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
+    #endregion
+
+    #region Construction & Cloning
+    [StorableConstructor]
+    protected EvaluationCache(bool deserializing) : base(deserializing) { }
+    protected EvaluationCache(EvaluationCache original, Cloner cloner)
+      : base(original, cloner) {
+      SetCacheValues(original.GetCacheValues());
+      Hits = original.Hits;
+      RegisterEvents();
+    }
+    public EvaluationCache() {
+      list = new LinkedList<CacheEntry>();
+      index = new Dictionary<CacheEntry, LinkedListNode<CacheEntry>>();
+      Parameters.Add(new FixedValueParameter<IntValue>("Capacity", "Maximum number of cache entries.", new IntValue(10000)));
+      Parameters.Add(new FixedValueParameter<BoolValue>("PersistentCache", "Save cache when serializing object graph?", new BoolValue(false)));
+      RegisterEvents();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EvaluationCache(this, cloner);
+    }
+    #endregion
+
+    #region Event Handling
+    private void RegisterEvents() {
+      CapacityParameter.Value.ValueChanged += new EventHandler(CapacityChanged);
+    }
+
+    void CapacityChanged(object sender, EventArgs e) {
+      if (Capacity < 0)
+        throw new ArgumentOutOfRangeException("Cache capacity cannot be less than zero");
+      lock (cacheLock)
+        Trim();
+      OnChanged();
+    }
+    #endregion
+
+    #region Methods
+    public void Reset() {
+      lock (cacheLock) {
+        list = new LinkedList<CacheEntry>();
+        index = new Dictionary<CacheEntry, LinkedListNode<CacheEntry>>();
+        Hits = 0;
+      }
+      OnChanged();
+    }
+
+    public double GetValue(SolutionMessage message, Evaluator evaluate) {
+      var entry = new CacheEntry(message.ToString());
+      bool lockTaken = false;
+      bool waited = false;
+      try {
+        Monitor.Enter(cacheLock, ref lockTaken);
+        while (true) {
+          LinkedListNode<CacheEntry> node;
+          if (index.TryGetValue(entry, out node)) {
+            list.Remove(node);
+            list.AddLast(node);
+            Hits++;
+            lockTaken = false;
+            Monitor.Exit(cacheLock);
+            OnChanged();
+            return node.Value.Value;
+          } else {
+            if (!waited && activeEvaluations.Contains(entry.Key)) {
+              while (activeEvaluations.Contains(entry.Key))
+                Monitor.Wait(cacheLock);
+              waited = true;
+            } else {
+              activeEvaluations.Add(entry.Key);
+              lockTaken = false;
+              Monitor.Exit(cacheLock);
+              OnChanged();
+              try {
+                entry.Value = evaluate(message);
+                Monitor.Enter(cacheLock, ref lockTaken);
+                index[entry] = list.AddLast(entry);
+                Trim();
+              }
+              finally {
+                if (!lockTaken)
+                  Monitor.Enter(cacheLock, ref lockTaken);
+                activeEvaluations.Remove(entry.Key);
+                Monitor.PulseAll(cacheLock);
+                lockTaken = false;
+                Monitor.Exit(cacheLock);
+              }
+              OnChanged();
+              return entry.Value;
+            }
+          }
+        }
+      }
+      finally {
+        if (lockTaken)
+          Monitor.Exit(cacheLock);
+      }
+    }
+
+    private void Trim() {
+      while (list.Count > Capacity) {
+        var item = list.First;
+        list.Remove(item);
+        index.Remove(item.Value);
+      }
+    }
+
+    private IEnumerable<KeyValuePair<string, double>> GetCacheValues() {
+      lock (cacheLock) {
+        return index.ToDictionary(kvp => kvp.Key.Key, kvp => kvp.Key.Value);
+      }
+    }
+
+    private void SetCacheValues(IEnumerable<KeyValuePair<string, double>> value) {
+      lock (cacheLock) {
+        list = new LinkedList<CacheEntry>();
+        index = new Dictionary<CacheEntry, LinkedListNode<CacheEntry>>();
+        foreach (var kvp in value) {
+          var entry = new CacheEntry(kvp.Key) { Value = kvp.Value };
+          index[entry] = list.AddLast(entry);
+        }
+      }
+    }
+
+    public void Save(string filename) {
+      using (var writer = new StreamWriter(filename)) {
+        lock (cacheLock) {
+          foreach (var entry in list) {
+            writer.WriteLine(string.Format(CultureInfo.InvariantCulture,
+              "\"{0}\", {1}",
+              Regex.Replace(entry.Key, "\\s", "").Replace("\"", "\"\""),
+              entry.Value));
+          }
+        }
+        writer.Close();
+      }
+    }
+    #endregion
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/ExternalEvaluationCD.cd
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/ExternalEvaluationCD.cd	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/ExternalEvaluationCD.cd	(revision 11892)
@@ -0,0 +1,209 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<ClassDiagram MajorVersion="1" MinorVersion="1">
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.BoolConverter" BaseTypeListCollapsed="true">
+    <Position X="0.5" Y="9.75" Width="1.5" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABACAAAAAgA=</HashCode>
+      <FileName>Converters\BoolConverter.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" Collapsed="true" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.DateTimeValueConverter" BaseTypeListCollapsed="true">
+    <Position X="2.25" Y="9.75" Width="1.5" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABACAAAAAgA=</HashCode>
+      <FileName>Converters\DateTimeValueConverter.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" Collapsed="true" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.DoubleConverter" BaseTypeListCollapsed="true">
+    <Position X="4" Y="9.75" Width="1.5" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABACAAAAAgA=</HashCode>
+      <FileName>Converters\DoubleConverter.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" Collapsed="true" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.IntegerConverter" BaseTypeListCollapsed="true">
+    <Position X="4" Y="12" Width="1.5" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABACAAAAAgA=</HashCode>
+      <FileName>Converters\IntegerConverter.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" Collapsed="true" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.StringConverter" BaseTypeListCollapsed="true">
+    <Position X="2.25" Y="12" Width="1.5" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABACAAAAAgA=</HashCode>
+      <FileName>Converters\StringConverter.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" Collapsed="true" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.TimeSpanValueConverter" BaseTypeListCollapsed="true">
+    <Position X="0.5" Y="12" Width="1.5" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABACAAAAAgA=</HashCode>
+      <FileName>Converters\TimeSpanValueConverter.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" Collapsed="true" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.EvaluationChannel" Collapsed="true">
+    <Position X="3" Y="0.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAIAAAAEAAAAAAAAAAgAAQAAAABACABAA=</HashCode>
+      <FileName>Drivers\EvaluationChannel.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.EvaluationProcessChannel">
+    <Position X="2.75" Y="3.5" Width="2" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>BAAAAAAAAAAAIAAAAEEgAgIAgAIgIgAQIAAAAACAEBg=</HashCode>
+      <FileName>Drivers\EvaluationProcessChannel.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.EvaluationServiceClient" BaseTypeListCollapsed="true">
+    <Position X="0.5" Y="14.5" Width="2" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAhAAAAAACAAAQAAgAAAAAAgAAAAhAAAAAABAA=</HashCode>
+      <FileName>Drivers\EvaluationServiceClient.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" Collapsed="true" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.EvaluationStreamChannel">
+    <Position X="5" Y="3.5" Width="2" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAEAAAAAACAAAABAQAAAAAACAAAA=</HashCode>
+      <FileName>Drivers\EvaluationStreamChannel.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.EvaluationTCPChannel">
+    <Position X="0.5" Y="3.5" Width="2" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>AAAAAAAQCAAQcIAEAGCAAAAAaCgAAAoQAQEAAgCAABA=</HashCode>
+      <FileName>Drivers\EvaluationTCPChannel.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationProblem" BaseTypeListCollapsed="true">
+    <Position X="0.5" Y="18.25" Width="2.25" />
+    <TypeIdentifier>
+      <HashCode>AAARAACGAwgABbAGCJCAQIEMAAGKAAAACIQAESAgpVA=</HashCode>
+      <FileName>ExternalEvaluationProblem.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" Collapsed="true" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluator" BaseTypeListCollapsed="true">
+    <Position X="5.75" Y="14.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAQAAAgABAAAAAAAAAAAAAAAAAAAAEAAAAAAAgAAAA=</HashCode>
+      <FileName>ExternalEvaluator.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" Collapsed="true" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.SolutionMessage">
+    <Position X="5.25" Y="18.25" Width="2.25" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+    </Compartments>
+    <NestedTypes>
+      <Class Name="HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types" Collapsed="true">
+        <TypeIdentifier>
+          <NewMemberFileName>Protos\ExternalEvaluationMessages.cs</NewMemberFileName>
+        </TypeIdentifier>
+      </Class>
+      <Class Name="HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Builder" Collapsed="true">
+        <TypeIdentifier>
+          <NewMemberFileName>Protos\ExternalEvaluationMessages.cs</NewMemberFileName>
+        </TypeIdentifier>
+      </Class>
+    </NestedTypes>
+    <TypeIdentifier>
+      <HashCode>XGEAApEgkUOSJEQREEkgQAFBQRQHASKyAQ0CDCQAoAA=</HashCode>
+      <FileName>Protos\ExternalEvaluationMessages.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.QualityMessage">
+    <Position X="3" Y="18.25" Width="2" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+    </Compartments>
+    <NestedTypes>
+      <Class Name="HeuristicLab.Problems.ExternalEvaluation.QualityMessage.Builder" Collapsed="true">
+        <TypeIdentifier>
+          <NewMemberFileName>Protos\ExternalEvaluationMessages.cs</NewMemberFileName>
+        </TypeIdentifier>
+      </Class>
+    </NestedTypes>
+    <TypeIdentifier>
+      <HashCode>VGAAgAAgAMEAIABAAAggAAEAAIABAgIwAAgADAAAgAA=</HashCode>
+      <FileName>Protos\ExternalEvaluationMessages.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.SolutionMessageBuilder">
+    <Position X="5.75" Y="9.75" Width="2" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>AASAAAACAAAAAAAAIAAAAMAkAAAAgRAAAAAAAAAAhAA=</HashCode>
+      <FileName>SolutionMessageBuilder.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Interface Name="HeuristicLab.Problems.ExternalEvaluation.IEvaluationChannel">
+    <Position X="0.5" Y="0.5" Width="1.75" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAIAAAAEAAAAAAAAAAAAAQAAAABACAAAA=</HashCode>
+      <FileName>Interfaces\IEvaluationChannel.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Problems.ExternalEvaluation.IEvaluationServiceClient">
+    <Position X="3" Y="14.5" Width="2" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAQAAgAAAAAAAAAAAAAAAAAAAAA=</HashCode>
+      <FileName>Interfaces\IEvaluationServiceClient.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Problems.ExternalEvaluation.IExternalEvaluationProblemEvaluator">
+    <Position X="2.75" Y="16.25" Width="2.75" />
+    <TypeIdentifier>
+      <HashCode>AAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
+      <FileName>Interfaces\IExternalEvaluationProblemEvaluator.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Problems.ExternalEvaluation.IItemToSolutionMessageConverter">
+    <Position X="5.25" Y="7.5" Width="2.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAgA=</HashCode>
+      <FileName>Interfaces\IItemToSolutionMessageConverter.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Font Name="Segoe UI" Size="9" />
+</ClassDiagram>
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/ExternalEvaluationProblem.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/ExternalEvaluationProblem.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/ExternalEvaluationProblem.cs	(revision 11892)
@@ -0,0 +1,131 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Threading;
+using Google.ProtocolBuffers;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.Programmable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("External Evaluation Problem", "A problem that is evaluated in a different process.")]
+  [Creatable("Problems")]
+  [StorableClass]
+  public sealed class ExternalEvaluationProblem : SingleObjectiveBasicProblem<IEncoding> {
+    private HashSet<IEvaluationServiceClient> activeClients = new HashSet<IEvaluationServiceClient>();
+    private object clientLock = new object();
+
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Type; }
+    }
+
+    public OptionalValueParameter<EvaluationCache> CacheParameter {
+      get { return (OptionalValueParameter<EvaluationCache>)Parameters["Cache"]; }
+    }
+    public IValueParameter<CheckedItemCollection<IEvaluationServiceClient>> ClientsParameter {
+      get { return (IValueParameter<CheckedItemCollection<IEvaluationServiceClient>>)Parameters["Clients"]; }
+    }
+    public IValueParameter<SolutionMessageBuilder> MessageBuilderParameter {
+      get { return (IValueParameter<SolutionMessageBuilder>)Parameters["MessageBuilder"]; }
+    }
+
+    public EvaluationCache Cache {
+      get { return CacheParameter.Value; }
+    }
+    public CheckedItemCollection<IEvaluationServiceClient> Clients {
+      get { return ClientsParameter.Value; }
+    }
+    public SolutionMessageBuilder MessageBuilder {
+      get { return MessageBuilderParameter.Value; }
+    }
+
+    [StorableConstructor]
+    private ExternalEvaluationProblem(bool deserializing) : base(deserializing) { }
+    private ExternalEvaluationProblem(ExternalEvaluationProblem original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExternalEvaluationProblem(this, cloner);
+    }
+    public ExternalEvaluationProblem()
+      : base() {
+      Parameters.Add(new OptionalValueParameter<EvaluationCache>("Cache", "Cache of previously evaluated solutions."));
+      Parameters.Add(new ValueParameter<CheckedItemCollection<IEvaluationServiceClient>>("Clients", "The clients that are used to communicate with the external application.", new CheckedItemCollection<IEvaluationServiceClient>() { new EvaluationServiceClient() }));
+      Parameters.Add(new ValueParameter<SolutionMessageBuilder>("MessageBuilder", "The message builder that converts from HeuristicLab objects to SolutionMessage representation.", new SolutionMessageBuilder()));
+    }
+
+    public override bool Maximization {
+      get { return Parameters.ContainsKey("Maximization") && ((IValueParameter<BoolValue>)Parameters["Maximization"]).Value.Value; }
+    }
+
+    public override double Evaluate(Individual individual, IRandom random) {
+      return Cache == null ? EvaluateOnNextAvailableClient(BuildSolutionMessage(individual)).Quality
+        : Cache.GetValue(BuildSolutionMessage(individual), m => EvaluateOnNextAvailableClient(m).Quality);
+    }
+
+    private QualityMessage EvaluateOnNextAvailableClient(SolutionMessage message) {
+      IEvaluationServiceClient client = null;
+      lock (clientLock) {
+        client = Clients.CheckedItems.FirstOrDefault(c => !activeClients.Contains(c));
+        while (client == null && Clients.CheckedItems.Any()) {
+          Monitor.Wait(clientLock);
+          client = Clients.CheckedItems.FirstOrDefault(c => !activeClients.Contains(c));
+        }
+        if (client != null)
+          activeClients.Add(client);
+      }
+      try {
+        return client.Evaluate(message, GetQualityMessageExtensions());
+      } finally {
+        lock (clientLock) {
+          activeClients.Remove(client);
+          Monitor.PulseAll(clientLock);
+        }
+      }
+    }
+
+    private ExtensionRegistry GetQualityMessageExtensions() {
+      return ExtensionRegistry.CreateInstance();
+    }
+
+    private SolutionMessage BuildSolutionMessage(Individual individual) {
+      lock (clientLock) {
+        SolutionMessage.Builder protobufBuilder = SolutionMessage.CreateBuilder();
+        protobufBuilder.SolutionId = 0;
+        var scope = new Scope();
+        individual.CopyToScope(scope);
+        foreach (var variable in scope.Variables) {
+          try {
+            MessageBuilder.AddToMessage(variable.Value, variable.Name, protobufBuilder);
+          } catch (ArgumentException ex) {
+            throw new InvalidOperationException(string.Format("ERROR while building solution message: Parameter {0} cannot be added to the message", name), ex);
+          }
+        }
+        return protobufBuilder.Build();
+      }
+    }
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/HeuristicLab.Problems.ExternalEvaluation-3.4.csproj
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/HeuristicLab.Problems.ExternalEvaluation-3.4.csproj	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/HeuristicLab.Problems.ExternalEvaluation-3.4.csproj	(revision 11892)
@@ -0,0 +1,260 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{25735DB4-8E54-4A2C-83E3-A60C76565E55}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.ExternalEvaluation</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.ExternalEvaluation-3.4</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <DocumentationFile>
+    </DocumentationFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Google.ProtocolBuffers-2.4.1.473, Version=2.4.1.473">
+      <HintPath>..\..\..\..\trunk\sources\bin\Google.ProtocolBuffers-2.4.1.473.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="Converters\BoolConverter.cs" />
+    <Compile Include="Converters\TimeSpanValueConverter.cs" />
+    <Compile Include="Converters\DateTimeValueConverter.cs" />
+    <Compile Include="Converters\DoubleConverter.cs" />
+    <Compile Include="Converters\IntegerConverter.cs" />
+    <Compile Include="Converters\StringConverter.cs" />
+    <Compile Include="EvaluationCache.cs" />
+    <Compile Include="Drivers\EvaluationServiceClient.cs" />
+    <Compile Include="Drivers\EvaluationChannel.cs" />
+    <Compile Include="Drivers\EvaluationProcessChannel.cs" />
+    <Compile Include="Drivers\EvaluationStreamChannel.cs" />
+    <Compile Include="Drivers\EvaluationTCPChannel.cs" />
+    <Compile Include="ExternalEvaluationProblem.cs" />
+    <Compile Include="Interfaces\IEvaluationServiceClient.cs" />
+    <Compile Include="Interfaces\IEvaluationChannel.cs" />
+    <Compile Include="Interfaces\IItemToSolutionMessageConverter.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <Compile Include="Protos\ExternalEvaluationMessages.cs" />
+    <Compile Include="SolutionMessageBuilder.cs" />
+    <None Include="Protos\ProcessProtos.cmd" />
+  </ItemGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Analysis-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Data-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Operators-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Optimization.Operators-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Optimization\3.3\HeuristicLab.Optimization-3.3.csproj">
+      <Project>{14AB8D24-25BC-400C-A846-4627AA945192}</Project>
+      <Name>HeuristicLab.Optimization-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.Programmable\3.3\HeuristicLab.Problems.Programmable-3.3.csproj">
+      <Project>{ee07bff8-b23d-41f5-8ad7-ac9598d7a2c9}</Project>
+      <Name>HeuristicLab.Problems.Programmable-3.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="ExternalEvaluationCD.cd" />
+    <None Include="HeuristicLab.snk" />
+    <None Include="Protos\ExternalEvaluationMessages.proto" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+
+call "$(ProjectDir)\Protos\ProcessProtos.cmd"
+call PreBuildEvent.cmd
+</PreBuildEvent>
+    <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' ">
+export ProjectDir=$(ProjectDir)
+export SolutionDir=$(SolutionDir)
+
+$SolutionDir/PreBuildEvent.sh
+</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Interfaces/IEvaluationChannel.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Interfaces/IEvaluationChannel.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Interfaces/IEvaluationChannel.cs	(revision 11892)
@@ -0,0 +1,56 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using Google.ProtocolBuffers;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  public interface IEvaluationChannel : INamedItem {
+    /// <summary>
+    /// A flag that describes whether the channel has been initialized or not.
+    /// </summary>
+    bool IsInitialized { get; }
+    /// <summary>
+    /// Opens the channel for communication.
+    /// </summary>
+    /// <remarks>
+    /// Must be called before calling <seealso cref="Send"/> or <seealso cref="Receive"/>.
+    /// The concrete implementation of the channel may require additional information on how to start a connection,
+    /// which should be passed into the concrete channel's constructor.
+    /// </remarks>
+    void Open();
+    /// <summary>
+    /// Sends a message over the channel.
+    /// </summary>
+    /// <param name="solution">The message to send.</param>
+    void Send(IMessage solution);
+    /// <summary>
+    /// Receives a message from the channel and merges the message with the given builder.
+    /// </summary>
+    /// <param name="builder">The builder that must match the message type that is to be received.</param>
+    /// <returns>The received message.</returns>
+    IMessage Receive(IBuilder builder, ExtensionRegistry extensions);
+    /// <summary>
+    /// Tells the channel to close down and terminate open connections.
+    /// </summary>
+    void Close();
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Interfaces/IEvaluationServiceClient.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Interfaces/IEvaluationServiceClient.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Interfaces/IEvaluationServiceClient.cs	(revision 11892)
@@ -0,0 +1,43 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using Google.ProtocolBuffers;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  public interface IEvaluationServiceClient : IItem {
+    /// <summary>
+    /// Evaluates a given solution in a blocking manner.
+    /// </summary>
+    /// <param name="solution">The solution message that should be evaluated.</param>
+    /// <param name="qualityExtensions">An extension registry for the quality message that specifies additional custom fields.</param>
+    /// <returns>The resulting quality message from the external process.</returns>
+    QualityMessage Evaluate(SolutionMessage solution, ExtensionRegistry qualityExtensions);
+    /// <summary>
+    /// Evaluates a given solution in a non-blocking manner.
+    /// </summary>
+    /// <param name="solution">The solution message that should be evaluated.</param>
+    /// <param name="qualityExtensions">An extension registry for the quality message that specifies additional custom fields.</param>
+    /// <param name="callback">The callback method that is invoked when evaluation is finished.</param>
+    void EvaluateAsync(SolutionMessage solution, ExtensionRegistry qualityExtensions, Action<QualityMessage> callback);
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Interfaces/IItemToSolutionMessageConverter.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Interfaces/IItemToSolutionMessageConverter.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Interfaces/IItemToSolutionMessageConverter.cs	(revision 11892)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  public interface IItemToSolutionMessageConverter : IItem {
+    Type[] ItemTypes { get; }
+    void AddItemToBuilder(IItem item, string name, SolutionMessage.Builder builder);
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Plugin.cs.frame
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Plugin.cs.frame	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Plugin.cs.frame	(revision 11892)
@@ -0,0 +1,41 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Plugin("HeuristicLab.Problems.ExternalEvaluation", "3.4.10.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.ExternalEvaluation-3.4.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Analysis", "3.3")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.ProtobufCS", "2.4.1.473")]
+  public class HeuristicLabProblemsExternalEvaluationPlugin : PluginBase {
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Properties/AssemblyInfo.cs.frame	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Properties/AssemblyInfo.cs.frame	(revision 11892)
@@ -0,0 +1,36 @@
+﻿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("HeuristicLab.Problems.ExternalEvaluation")]
+[assembly: AssemblyDescription("Plugin for Problems that are evaluated outside of HeuristicLab.")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2014 HEAL")]
+[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("3f1d3642-717c-4c35-93e6-fccd57030267")]
+
+// 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("3.4.0.0")]
+[assembly: AssemblyFileVersion("3.4.10.$WCREV$")]
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Protos/ExternalEvaluationMessages.proto
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Protos/ExternalEvaluationMessages.proto	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Protos/ExternalEvaluationMessages.proto	(revision 11892)
@@ -0,0 +1,75 @@
+package HeuristicLab.Problems.ExternalEvaluation;
+option java_package = "com.heuristiclab.problems.externalevaluation";
+
+message SolutionMessage {
+  required int32 solutionId = 1;
+  
+  message IntegerVariable {
+    required string name = 1;
+    optional int32 data = 2;
+  }
+  repeated IntegerVariable integerVars = 2;
+  
+  message IntegerArrayVariable {
+    required string name = 1;
+    repeated int32 data = 2;
+    optional int32 length = 3;
+  }
+  repeated IntegerArrayVariable integerArrayVars = 3;
+  
+  message DoubleVariable {
+    required string name = 1;
+    optional double data = 2;
+  }
+  repeated DoubleVariable doubleVars = 4;
+  
+  message DoubleArrayVariable {
+    required string name = 1;
+    repeated double data = 2;
+    optional int32 length = 3;
+  }
+  repeated DoubleArrayVariable doubleArrayVars = 5;
+  
+  message BoolVariable {
+    required string name = 1;
+    optional bool data = 2;
+  }
+  repeated BoolVariable boolVars = 6;
+  
+  message BoolArrayVariable {
+    required string name = 1;
+    repeated bool data = 2;
+    optional int32 length = 3;
+  }
+  repeated BoolArrayVariable boolArrayVars = 7;
+  
+  message StringVariable {
+    required string name = 1;
+    optional string data = 2;
+  }
+  repeated StringVariable stringVars = 8;
+  
+  message StringArrayVariable {
+    required string name = 1;
+    repeated string data = 2;
+    optional int32 length = 3;
+  }
+  repeated StringArrayVariable stringArrayVars = 9;
+  
+  message RawVariable {
+    required string name = 1;
+    optional bytes data = 2;
+  }
+  repeated RawVariable rawVars = 10;
+}
+
+message QualityMessage {
+  required int32 solutionId = 1;
+  required double quality = 2;
+
+  extensions 1000 to max;
+}
+  
+service EvaluationService {
+  rpc Evaluate (SolutionMessage) returns (QualityMessage);
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Protos/ProcessProtos.cmd
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Protos/ProcessProtos.cmd	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/Protos/ProcessProtos.cmd	(revision 11892)
@@ -0,0 +1,4 @@
+for %%i in ("%ProjectDir%Protos\*.proto") do (
+  echo Processing %%i
+  ProtoGen --proto_path="%ProjectDir%\Protos" "%%i" --include_imports -output_directory="%ProjectDir%Protos"
+)
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/SolutionMessageBuilder.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/SolutionMessageBuilder.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.ExternalEvaluation/3.4/SolutionMessageBuilder.cs	(revision 11892)
@@ -0,0 +1,112 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("SolutionMessageBuilder", "Holds and uses a number of converters to translate HeuristicLab objects into appropriate fields of a solution message.")]
+  [StorableClass]
+  public class SolutionMessageBuilder : NamedItem {
+    public override bool CanChangeName { get { return false; } }
+    public override bool CanChangeDescription { get { return false; } }
+    private Dictionary<Type, Action<IItem, string, SolutionMessage.Builder>> dispatcher;
+
+    [Storable]
+    private CheckedItemList<IItemToSolutionMessageConverter> convertersList;
+    public CheckedItemList<IItemToSolutionMessageConverter> Converters {
+      get { return convertersList; }
+    }
+
+    [StorableConstructor]
+    protected SolutionMessageBuilder(bool deserializing) : base(deserializing) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEventHandlers();
+    }
+
+    protected SolutionMessageBuilder(SolutionMessageBuilder original, Cloner cloner)
+      : base(original, cloner) {
+      convertersList = cloner.Clone(original.convertersList);
+      RegisterEventHandlers();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SolutionMessageBuilder(this, cloner);
+    }
+    public SolutionMessageBuilder()
+      : base() {
+      name = ItemName;
+      description = ItemDescription;
+      convertersList = new CheckedItemList<IItemToSolutionMessageConverter>();
+      convertersList.Add(new BoolConverter());
+      convertersList.Add(new DateTimeValueConverter());
+      convertersList.Add(new DoubleConverter());
+      convertersList.Add(new IntegerConverter());
+      convertersList.Add(new StringConverter());
+      convertersList.Add(new TimeSpanValueConverter());
+
+      RegisterEventHandlers();
+    }
+
+    public void AddToMessage(IItem item, string name, SolutionMessage.Builder builder) {
+      if (dispatcher == null) BuildDispatcher();
+      Type itemType = item.GetType();
+      while (!dispatcher.ContainsKey(itemType)) {
+        if (itemType.BaseType != null) itemType = itemType.BaseType;
+        else break;
+      }
+      if (itemType.BaseType == null && !dispatcher.ContainsKey(itemType)) {
+        IEnumerable<Type> interfaces = item.GetType().GetInterfaces().Where(x => dispatcher.ContainsKey(x));
+        if (interfaces.Count() != 1) throw new ArgumentException(Name + ": No converter for type " + itemType.FullName + " defined.", "item");
+        else itemType = interfaces.Single();
+      }
+      dispatcher[itemType](item, name, builder);
+    }
+
+    private void RegisterEventHandlers() {
+      convertersList.ItemsAdded += convertersList_Changed;
+      convertersList.ItemsRemoved += convertersList_Changed;
+      convertersList.CheckedItemsChanged += convertersList_Changed;
+      convertersList.ItemsMoved += convertersList_Changed;
+      convertersList.ItemsReplaced += convertersList_Changed;
+    }
+
+    private void convertersList_Changed(object sender, CollectionItemsChangedEventArgs<IndexedItem<IItemToSolutionMessageConverter>> e) {
+      BuildDispatcher();
+    }
+
+    private void BuildDispatcher() {
+      dispatcher = new Dictionary<Type, Action<IItem, string, SolutionMessage.Builder>>();
+      foreach (var c in convertersList.CheckedItems.OrderBy(x => x.Index).Select(x => x.Value)) {
+        var types = c.ItemTypes;
+        foreach (var t in types) {
+          if (!dispatcher.ContainsKey(t))
+            dispatcher.Add(t, c.AddItemToBuilder);
+        }
+      }
+    }
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable.Views/3.3/CreateNewSingleEncodingDialog.Designer.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable.Views/3.3/CreateNewSingleEncodingDialog.Designer.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable.Views/3.3/CreateNewSingleEncodingDialog.Designer.cs	(revision 11892)
@@ -0,0 +1,149 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Problems.Programmable.Views {
+  partial class CreateNewSingleEncodingDialog {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CreateNewSingleEncodingDialog));
+      this.label1 = new System.Windows.Forms.Label();
+      this.encodingTypeComboBox = new System.Windows.Forms.ComboBox();
+      this.label2 = new System.Windows.Forms.Label();
+      this.encodingNameTextBox = new System.Windows.Forms.TextBox();
+      this.okButton = new System.Windows.Forms.Button();
+      this.cancelButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(22, 20);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(34, 13);
+      this.label1.TabIndex = 0;
+      this.label1.Text = "Type:";
+      // 
+      // encodingTypeComboBox
+      // 
+      this.encodingTypeComboBox.DisplayMember = "Name";
+      this.encodingTypeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.encodingTypeComboBox.FormattingEnabled = true;
+      this.encodingTypeComboBox.Location = new System.Drawing.Point(66, 17);
+      this.encodingTypeComboBox.Name = "encodingTypeComboBox";
+      this.encodingTypeComboBox.Size = new System.Drawing.Size(232, 21);
+      this.encodingTypeComboBox.TabIndex = 1;
+      this.encodingTypeComboBox.SelectedIndexChanged += new System.EventHandler(this.encodingTypeComboBox_SelectedIndexChanged);
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(22, 47);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(38, 13);
+      this.label2.TabIndex = 2;
+      this.label2.Text = "Name:";
+      // 
+      // encodingNameTextBox
+      // 
+      this.encodingNameTextBox.Location = new System.Drawing.Point(66, 44);
+      this.encodingNameTextBox.Name = "encodingNameTextBox";
+      this.encodingNameTextBox.Size = new System.Drawing.Size(232, 20);
+      this.encodingNameTextBox.TabIndex = 3;
+      this.encodingNameTextBox.TextChanged += new System.EventHandler(this.encodingNameTextBox_TextChanged);
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.Location = new System.Drawing.Point(142, 70);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 4;
+      this.okButton.Text = "&OK";
+      this.okButton.UseVisualStyleBackColor = true;
+      this.okButton.Click += new System.EventHandler(this.okButton_Click);
+      // 
+      // cancelButton
+      // 
+      this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.cancelButton.Location = new System.Drawing.Point(223, 70);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 4;
+      this.cancelButton.Text = "&Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click);
+      // 
+      // CreateNewSingleEncodingDialog
+      // 
+      this.AcceptButton = this.okButton;
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.CancelButton = this.cancelButton;
+      this.ClientSize = new System.Drawing.Size(320, 105);
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.okButton);
+      this.Controls.Add(this.encodingNameTextBox);
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.encodingTypeComboBox);
+      this.Controls.Add(this.label1);
+      this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "CreateNewSingleEncodingDialog";
+      this.ShowInTaskbar = false;
+      this.Text = "Create new encoding";
+      this.Load += new System.EventHandler(this.CreateNewSingleEncodingDialog_Load);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.ComboBox encodingTypeComboBox;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.TextBox encodingNameTextBox;
+    private System.Windows.Forms.Button okButton;
+    private System.Windows.Forms.Button cancelButton;
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable.Views/3.3/CreateNewSingleEncodingDialog.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable.Views/3.3/CreateNewSingleEncodingDialog.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable.Views/3.3/CreateNewSingleEncodingDialog.cs	(revision 11892)
@@ -0,0 +1,83 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.Programmable.Views {
+  public partial class CreateNewSingleEncodingDialog : Form {
+    private HashSet<string> forbiddenNames;
+    public IEnumerable<string> ForbiddenNames {
+      get { return forbiddenNames; }
+      set { forbiddenNames = new HashSet<string>(value); }
+    }
+
+    public Type EncodingType { get; private set; }
+    public string EncodingName { get; private set; }
+
+    public CreateNewSingleEncodingDialog() {
+      InitializeComponent();
+      forbiddenNames = new HashSet<string>();
+    }
+
+    private void CreateNewSingleEncodingDialog_Load(object sender, EventArgs e) {
+      encodingTypeComboBox.Items.Clear();
+      var encodings = ApplicationManager.Manager.GetTypes(typeof(IEncoding));
+      foreach (var enc in encodings) {
+        if (enc != typeof(MultiEncoding))
+          encodingTypeComboBox.Items.Add(enc);
+      }
+      if (encodingTypeComboBox.Items.Count > 0)
+        encodingTypeComboBox.SelectedIndex = 0;
+      else encodingTypeComboBox.SelectedIndex = -1;
+    }
+
+    private void encodingNameTextBox_TextChanged(object sender, EventArgs e) {
+      EncodingName = encodingNameTextBox.Text;
+      SetEnabledStateOfControls();
+    }
+
+    private void encodingTypeComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      if (encodingTypeComboBox.SelectedIndex >= 0)
+        EncodingType = (Type)encodingTypeComboBox.SelectedItem;
+      else EncodingType = null;
+      SetEnabledStateOfControls();
+    }
+
+    private void SetEnabledStateOfControls() {
+      okButton.Enabled = EncodingType != null
+                         && !string.IsNullOrEmpty(EncodingName)
+                         && !forbiddenNames.Contains(EncodingName);
+    }
+
+    private void okButton_Click(object sender, EventArgs e) {
+      DialogResult = DialogResult.OK;
+      Close();
+    }
+
+    private void cancelButton_Click(object sender, EventArgs e) {
+      DialogResult = DialogResult.Cancel;
+      Close();
+    }
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable.Views/3.3/CreateNewSingleEncodingDialog.resx
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable.Views/3.3/CreateNewSingleEncodingDialog.resx	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable.Views/3.3/CreateNewSingleEncodingDialog.resx	(revision 11892)
@@ -0,0 +1,1787 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAUAEBAAAAEAIABoBAAAVgAAACAgAAABACAAqBAAAL4EAAAwMAAAAQAgAKglAABmFQAAQEAAAAEA
+        IAAoQgAADjsAAICAAAABACAAKAgBADZ9AAAoAAAAEAAAACAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAABuR/gAbk/YAAAAAABuS9gAAAAAAGpD2AAAAAAAAAAAAAAAAABuQ
+        9QAAAAAAAAAAAByS9QAAAAAAAAAAAAAAAAAakfUAAAAAABuR9QIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAHJD2QAAAAAAAAAAAGo/4CBuR9f8akPVCAAAAABuT9gAAAAAAG5H1/xuR9YEbkPYUG5H1/xqR
+        9v8bkfX/G5H1/xuS9P8bkfX/GpH1QwAAAAAbkfX/G5H1eQAAAAAAAAAAAAAAABuR9cgbkPSjAAAAABuR
+        9f8dkfWZG5H1QRyR9kAbkfWrG5L1TwAAAAAAAAAAHJH1zhuR9p4AAAAAAAAAAAAAAAAckvaHG5H15QAA
+        AAAbkfXkHJH2hgAAAAAAAAAAAAAAAAAAAAAbkvUAAAAAABuS9YwbkfXiGpHzJhuS9TQbkfQwG5H1fhuR
+        9f8AAAAAG5L1qhuR9cUAAAAAHJD2AAAAAAAbkfYAAAAAAAAAAAAbkfVqG5H1/xuR9f8akfX/G5H1/xuR
+        9f8bkfX/GpLzFhuQ9n0bkfX/AAAAABiQ9gAAAAAAAAAAAAAAAAAAAAAAG5H2KRuR9f8ckfYcI5D3Ax+U
+        /AUAAAAAG5H1/xyR9VEckvVBG5H1/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAckfX/GpH1TgAA
+        AAAAAAAAAAAAABuR9esakfWBGI7xBhyR9f8akfQwAAAAAAAAAAAAAAAAAAAAABuS9QAAAAAAG5L1+huR
+        9YAAAAAAGpH1AAAAAAAbkfalG5H0ugAAAAAbkfX/HJL1bwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByR
+        9ccbkfXIAAAAAAAAAAAAAAAAG5L17BuR9f8dkvMXG5H17BqR9Z0AAAAAAAAAAAAAAAAAAAAAAAAAABuR
+        9QEAAAAAAAAAABuR9QEbkfQAAAAAAB6P9w8akfXwAAAAAAAAAAAAAAAAG5H1AAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAByR9gAAAAAAAAAAABqR9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG5L1AAAAAAAckvQAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAP//AAD//wAA//8AALyBAAC8mwAAnJ8AAJ6fAADA3wAA3t8AAN5fAADOXwAAzk8AAP9/
+        AAD//wAA//8AAP//AAAoAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        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
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAP//////////////////////////////78fxwAPH8cABx/HAB8f5x+/H+Mf/5/jH/+f4
+        5//j+OP/4ADj/+AA4//j/GP/8/xj//H8c//x/HH/8f5x//H+cf/5/BH/+f4x///+P////3//////////
+        ////////////////////////KAAAADAAAABgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpD2AByX+AAAAAAAAAAAABuT9wAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAByS9gAAAAAAHJL2AByT9gAbkvcAHJL2AByS9wAAAAAAHJL3AAAAAAAAAAAAAAAAAAAA
+        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
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZL1AAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAByS9gAbkvYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJH2AByS9gIAAAAAHJH1TRuS
+        9v8bkfb/G5H1TgAAAAAAAAAAHJH2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByT9wAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAByS9gAAAAAAHJL2AByS9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAek/YAAAAAABuR9ocbkvXlGpL2DgAAAAAakPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAckvUAAAAAABuR9hEbkvUuAAAAAByR9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAakfgAHJL1AQAAAAAAAAAAHZH2ABuS9QAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuR9gAckvUBAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAA////////AAD///////8AAP//
+        /////wAA////////AAD///////8AAP///////wAA////////AAD//////x8AAMH/w8AADwAA4f/D4AAD
+        AADh/8HgAAMAAOH/4eAADwAA4f/h4f8fAADg/+Hh//8AAPD/4eD//wAA8P/h8P//AADw//Dw//8AAPD/
+        8PD//wAA8P/w8P//AADwAADw//8AAPgAAPD//wAA+AAAeH//AAD4AAB4f/8AAPg/+Hh//wAA+D/4eH//
+        AAD8P/h4f/8AAPw/+Hg//wAA/D/8PD//AAD8P/w8P/8AAPw//Dw//wAA/B/8PD//AAD+H/w8P/8AAP4f
+        +Awf/wAA/h/4Dh//AAD+H/weH/8AAP///h///wAA////P///AAD///8///8AAP///////wAA////////
+        AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////AAD///////8AACgA
+        AABAAAAAgAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAdk/YAAAAAAB2T9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAbkvcAAAAAAAAAAAAbk/cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqQ9gQbk/cUAAAAAEac7AAckvYAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2T9wAckvYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL3AByS
+        9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2U9wAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAHZP2AAAAAAAAAAAAAAAAAByS9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL2/xyR
+        9oEAAAAAAAAAAByS9gAfkPcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS9ikdk/crG5P3LhyS
+        9zEck/c0HJL3LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAHZb3ARyS9hQckvcSHZP3Eh2R9hIbkfcTIJX0BAAAAAAck/cAAAAAAAAAAAAAAAAAHJL2ExyQ
+        9hIckvUSHZP3EhyS9hIdkvYSHJL2Eh2T9xIdkfYSHZP3EhyU9xIck/YSHZH2EhyT9xIck/cSG5D2EhyT
+        9xIckfYSG5r9AhyS9/8ckvb/HJL2+hyS9kAAAAAAAAAAAByS9gAAAAAAAAAAAAAAAAAAAAAAHZP2AAAA
+        AAAckvbSHJL2/xyS9v8ckvb/HZP2/xyS9v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAckvb/HJL2/xyS9v8ck/f/HZL2/xuS9ooAAAAAAAAAAAAA
+        AAAAAAAAAAAAAByS9u4ck/b/HJL2/x2S9/8ck/f/HJP3/xyS9/8ckvb/HJP3/xyS9v8ckff/HJL2/xyT
+        9/8ckvb/HJL2/x2T9/8ckfb/HJL2/xyS9v8ckvb9HJL2/xyS9v0ckvb/HJL2xR+R+AcAAAAAAAAAAByS
+        9wAAAAAAAAAAAByS9gAAAAAAG5H3hh2T9v8ckvb+HJL2/hyS9v4ckvb/IZ3/AQAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByT9gAAAAAAHJL2zRyS9v8ckvb+HJL2/hyS
+        9v8ckfbAAAAAAAAAAAAAAAAAG5H1AAAAAAAckvevHJL1/xyS9v4ckvb+HJL2/hyS9v4ckvb+HJL2/hyS
+        9v4ckvb+HJL2/hyS9v4ckvf+HJL2/hyS9v4ck/b9HJL2/hyS9v4ckvb+HJL2/hyS9v4ckvb+HJL2/hyT
+        9v8ckvb/HJP1ggAAAAAAAAAAHZL2AAAAAAAAAAAAAAAAAB2S91Yckvb/HJL2/hyS9v4ckvb/HJL2/xyS
+        9ikAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdlPQAAAAAAByS
+        9pYckvb/HJL3/hyS9/4ckvf/HJL29AAAAAAAAAAAAAAAAAAAAAAAAAAAHJL2fByS9v8ckvb+HJL2/hyS
+        9v8ckvf/HJL2/hyS9/4ckvf+HJL2/xyR9v8ckvb/HJL3/hyS9v8ckvf/HJP2/hyR9/8ckvb/HJL2/hyS
+        9v4ckvb/HJL3/xyS9v4ckvf+HZL2/hyS9/8ckvb/HZH1IQAAAAAAAAAAHJL2AAAAAAAakvQYHJL2/xyS
+        9v8ckvb+HJL2/xyS9v8bkvZXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAckvZhHJL2/xyS9v4ckvb+HJL2/hyS9v8dk/cJAAAAAAAAAAAAAAAAAAAAAB2S
+        9kwckvb/HJL2/hyS9v4ckvb/HJL2/xyS9v4ckvb+HJL2/hyS9v8ckfb/HJL2/xyS9/4ckvb/HJL2/xyT
+        9/4ckvb/HJL2/xyS9v4ckvb+HJL2/xyS9v8ckvb+HJL2/hyS9v8ckvb+HJL2RgAAAAAckvUAAAAAAAAA
+        AAAAAAAAAAAAAByS9v8dkvb+HJP2/hyS9f8ckvb/HZP2kQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        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
+        9v8dk/b+HZP2/hyS9v4dk/f/HZL3KwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAHJP2SxyS9v8ckvb+HJL2/hyS9v4ckvb/AAAAAAAAAAAAAAAAAAAAAAAA
+        AAAbkvaCHZL2/x2T9v4dk/b+HJL2/hyS9v8AAAAAAAAAAByS9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAckvb/HJL2/xyS9/8ckvb/HZL3/RyS9/8ckvb/HJH2/xyS9v8ckvb/HJL2/xyS
+        9v8ckvb/HJL2/xyS9v8ckvb/HJL2/xyS9v8ckvb/HJL2/xyS9v8ckvb+HJL2/xyS9v8ckvb/HJL2/xyS
+        9j0AAAAAAAAAAAAAAAAAAAAAHZP3TB2S9v8ckvb/HJL3/xyS9v8ckvf/HJL2DwAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL26R2S9v8dkvb/HJL2/hyS9v4dkvb+HJH2/hyR
+        9v8ckfb/HZL2/hyR9v8ckfb/HJL2/hyR9v8ckfb/HJL2/h2S9v4dkvb/HZL2/xyS9v4ckvb+HZL2/hyR
+        9v8ckfb/HJH2/xyT9/8ckfVrAAAAAAAAAAAAAAAAAAAAABuR9R8ckvb/HZL2/x2S9v8ckvb+HJL2/xyS
+        9kUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAckvYAAAAAAByS9q0ckvb/HJL2/hyS
+        9v4ckvb+HJL2/hyS9v4ckvb+HJL2/hyS9/4ckvb+HJL2/hyT9v0ckvb+HJL2/hyS9v4ckvb+HJL2/hyS
+        9v4ckvb+HJL2/hyS9v4ckvb+HJL2/hyS9v4ck/f/HJL2pwAAAAAAAAAAAAAAAAAAAAAAAAAAHJL2/xyS
+        9v4ckvb+HJL2/hyS9v8ckvdwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAckvZ+HJL2/xyS9/8ckvb+HJL3/hyS9/4ckvb/HJH2/xyS9v8ckvf+HJL2/xyS9/8ck/b+HJH3/xyS
+        9v8ckvb+HJL2/hyS9v8ckvf/HJL2/hyS9/4ckvf+HJL2/xyR9v8ckvb/HJL3/xyS9tIAAAAAHJL2AAAA
+        AAAAAAAAAAAAAByS9uYckvb/HJL3/xyS9v4ck/b/HJL1qAAAAAAdkvYAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAG5L2QByS9v8ckvb/HJL2/hyS9v4dk/b+HJL2/xyR9v8ckvb/HJP2/xyS
+        9v8ckvb/HJP2/xyS9v8ckvb/HJL2/xyS9v8ck/b/HJP2/xyS9v8ckvb/HJP3/xyS9v0ckfb/HJL2/xyS
+        9/8ckvb/AAAAAAAAAAAdk/YAHJP3AAAAAAAckvesHJL2/xyS9v8ckvb+HJL2/xyS9tMAAAAAHJL2AAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2S9hUckvb/HJL1/xyS9v4dkvb+HJL2/x2S
+        9rYckvd1HZL3eB2T93gck/Z4HZL3eByS9ngdkvd4HJP2eB2T93gdkvd4HJL3eByT93gdkvd4HJP2dx2R
+        944dk/b/HJH1/xyS9v8ck/f+HJL2/x6V+A0AAAAAAAAAAAAAAAAAAAAAHJL2fxyS9v8ckvX/HJL2/h2S
+        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
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbk/YAAAAAAByS9tcckvb/G5L2/hyS
+        9v8bkfVEAAAAAByS9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAII34AAAA
+        AAAAAAAAHJL2/xyS9v8ckvbyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAdkvcAAAAAABqR+CIckvb/G5L2agAAAAAck/cAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZL2ABqS+AAAAAAAHJL2cCWU7gEAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/YAHJL2AAAA
+        AAAAAAAAHJL2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        ///////////8//////////x/4H//A+AAAB/gf/8D4AAAB/B//wPwAAAD8H//g/AAAAfwP/+D8AAAD/A/
+        /4PwP/w/8D//gfA//P/4P/+B8D/9//g//8HwP///+D//wfg////4H//B+D////gf/8D4P///+B//wPgf
+        ///8H//A+B////wf/+D4H////AAAAPwf///8AAAA/B////wAAAB8H////gAAAHwP///+AAAAfA////4H
+        /+B+D////gf/8H4P///+B//wfg////4H//A+B////wf/8D4H////B//4Pgf///8H//g/B////wP/+D8H
+        ////A//4Hwf///8D//gfA////4P/+B8D////g//8HwP///+D//AHg////4H/8AeD////gf/4B4P////B
+        //wPg////////A/////////+H/////////8f/////////7//////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        //////////////////8oAAAAgAAAAAABAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAIJX1AB2T9gIclvsAHYvvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOY9AAAAAAAAAAAAAAAAAAAAAAAHZL3AAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAABuS9xgck/d9HZT4BwAAAAAAAAAAHJH2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG5P2ExyT9v8dkvfnHJP2VQAA
+        AAAAAAAAHZP2ARqR9gAdkvgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAbkvYSHJL39R2T9v8dkvf/HZL3shyS9yQAAAAAAAAAAB2S9wAdk/YAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHI3xAB2T
+        9wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/cBAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZT2AAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuR9wAdk/YAAID/AAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAByV9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABeT9wYck/f2HZL3/x2T
+        9/8dk/b/HJL3/xyT9oEck/UKAAAAAB+R9wEbk/YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS9kQdk/d5HZP3bh2T93Ick/d0HJP3dx2T
+        93kckvd8HZP3fhyT94AckveLHZP4RQAAAAAckvgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAHZT3Cx2T90AckvZHHJP3RR2S90Udk/dFHZP3RR2S90Udk/dFHZP3RRyS
+        90cdk/Y4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByn7QAck/Y0HZL3SRyS
+        9kUdkvdFHJL2RR2T9kUdk/dFHZP3RR2T90Uck/dFHZP3RR2T90Uck/dFHZL3RR2T90Udk/dFHZL3RR2T
+        90Udk/dFHZP3RRyT90Udk/dFHJP2RR2T90UdkvdFHZP3RRyT90Udk/dFHJP3RR2T90UdkvdFHJL3RR2S
+        90Uck/dFHJL2RR2S90Udk/dCHJP3UxyT9/kdk/f/HZP2/hyS9/8dk/b/HZL3/x2S990ck/ZWAAAAAAAA
+        AAAAAAAAHJL2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAHJL2jR2T9/8dk/f/HZP2/x2T9v8dkvb/HZP3/x2T9/8dk/b/HZP3/xyS9/8dk/e0AAAAAByS
+        9wUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAck/YXHJP21h2S
+        9/8ckvb6HZP3+h2T9/ockvb6HZP3+hyT9/odk/f6HZP3/RyS9u8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2T9qsckvf/HJP2+h2T9/odk/f6HJL2+h2S9/odk/f6HZP3+hyT
+        9/odk/f6HJP3+hyS9/odk/f6HZP3+hyS9vodk/f6HJP3+h2T9/ockvb6HJL3+h2S9/ock/b6HZL3+h2T
+        9/ock/f6HJL2+h2T9/ockvb6HZP3+h2T9/odk/f6HZL2+hyS9/ockvb6HZP3+hyT9/odkvb7HZP3/hyT
+        9/8dk/f/HJL2/x2S9/4ck/b6HZL2/xyT9/8ck/ezHJL2IgAAAAAAAAAAHpL3ABuT9wAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHI3xAAAAAAAdk/dZHJP2/xyS9/8dk/b/HJP3/xyS
+        9v8dkvf/HJP2/x2T9v8dk/b/HZP3/xyS9tMAAAAAHpT3AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAckvbBHZP3/x2S9/8dk/f/HZP3/x2S9v8dk/f/HZP3/x2T
+        9/8dkvb/HJP3/xyT9yMAAAAAHJP3AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACue8QAAAAAAHJL3jh2T
+        9v8dk/f/HZP3/x2T9/8dkvb/HZL3/x2T9/8dk/f/HZP3/x2T9/8dk/f/HZL3/x2T9/8dk/f/HZL2/x2T
+        9/8dk/f/HZP3/xyS9v8dkvf/HZL3/x2T9/8dkvf/HZP3/x2T9/8ckvb/HZP3/xyS9v8dk/f/HZP3/x2T
+        9/8dkvb/HZL3/x2S9/8dk/f/HJP2/xyS9v8dkvf/HZP2/h2S9v8dkvb/HZL2/xyT9/8ck/f+HZL2/x2S
+        9v8ckvf/HZL3gBuT9ggAAAAAAAAAAAAAAAAckvYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAByS9y4ckvf8HZP2/x2T9/8dk/f+HJL2/x2T9/4ckvb/HJL2/xyS9v8dkvb/HJP34xyU
+        +BYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2S
+        95wck/b/HJL2/x2T9/4dk/f+HJL2/x2T9/4ckvb/HJL3/xyT9v8dkvf/HZL3VAAAAAAdkvcCAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/ZlHJL3/x2T9v8ckvb/HZP3/hyS9v8dk/f+HJL2/xyS
+        9v8ckvb/HJL2/xyS9v8ckvb/HZP3/h2T9/4ckvb/HZP3/hyS9v8ckvf/HJL2/xyS9v8ckvb/HJL2/xyS
+        9/8dk/f+HJL3/xyS9v8ckvb/HJL2/xyS9v8dk/f+HZP3/hyS9v8ckvb/HJL3/xyS9v8dk/f+HJL2/x2T
+        9/4ckvb/HJL2/xyS9v8ckvb/HJL2/xyS9v8dk/f/HZP3/RyT9v8dk/b/HJL32xyT9lMAAAAAAAAAAAAA
+        AAAck/cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxmNYAAH7/AByS9/Adk/b/HZP2/xyT
+        9v4dk/f/HZP3/h2T9v4dk/b+HZP3/hyS9v8dk/f2HZP3PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2S9QAAAAAAHZP3ax2T9v8dkvf/HJP3/h2T9/4dk/f/HZP3/h2T
+        9/4dk/f+HZP3/xyS9v8dk/aIAAAAAByT9gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2T
+        9zsdk/f/HJL2/xyS9v4ck/b+HZP3/x2T9/4dk/b+HZP2/h2T9/4dk/f+HZP3/h2T9v4ck/f+HZP3/h2T
+        9/8dk/f+HZP3/h2T9/4dk/b/HJP3/h2T9v4ck/b+HZL3/x2T9/4dk/f+HJP2/x2T9/4dk/f/HZP3/hyT
+        9/4ck/b+HZP3/x2T9/4dk/f/HZP2/hyT9v4dk/f/HZP3/h2T9v4dk/b+HZP3/h2T9/4dk/f+HZP2/hyT
+        9/4dk/f+HZP2/hyS9v8dkvf/HZP2/x2T9rYdkvcrAAAAAAAAAAAek/cAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAByS9gIAAAAAHZP30RyS9v8dkvf+HZP2/x2S9/8dkvf/HZP2/x2T9v8dk/f/HZP3/x2S
+        9v8ck/ZdAAAAAB2S9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAdkvZAHZL2/xyT9/8dk/f/HZP3/x2S9/8dk/f/HZP3/x2T9/8dk/f/HZP2/xyT97YAAAAAHZP2BQAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL2FRyS9vYdk/f/HZL2/x2T9v8dkvf/HZL3/x2T
+        9v8dk/b/HZP3/x2T9/8dk/f/HZL2/x2T9/8dk/f/HZL3/x2T9/8dk/f/HZP3/xyS9v8dkvf/HZL2/x2T
+        9v8dkvf/HZP3/x2T9/8ckvb/HZP3/xyS9/8dk/f/HZP3/x2T9v8dkvf/HZL3/x2S9/8dk/b/HZP2/x2S
+        9/8dkvf/HZP2/x2T9v8dk/f/HZP3/x2T9/8dkvb/HZP3/x2T9/8dkvf/HZP3/x2T9v4ckvf/HZP3/xyS
+        9vwdk/eEH5L2EAAAAAAWmP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZP3AQAAAAAdkvefHJP2/x2S
+        9/0ck/f+HJL3/x2T9/4ckvb/HJP2/xyS9/8ckvb/HJP2/x2S938AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByT9xIck/f8HZL2/xyT9/8dk/f+HJL3/x2T
+        9/4ckvf/HJL3/xyT9/4dkvb/HJP30gqT+AAgkvYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByR
+        9QEAAAAAHZP36RyS9v8ckvb+HJP3/hyS9/8dk/f+HJL2/xyT9v8ckvf/HJL3/xyT9/8ckvb/HJP3/h2T
+        9/4ckvf/HZP3/hyS9/8ckvf/HJL2/xyS9/8ckvb/HJL2/xyS9/8dk/f+HJL3/xyS9v8ckvf/HJL3/xyS
+        9/8ck/f+HJP3/hyS9/8ckvf/HJL3/xyS9v8ck/f+HJL3/x2T9/4ckvb/HJP2/xyS9/8ckvf/HJP3/xyS
+        9v8ck/f+HZP3/hyS9/8dk/f+HZL3/x2T9/8ckvf7HJP3/x2T9v8dkvaOAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAck/YAAAAAAByT9modkvf/HJP2/ByT9/8dk/f/HZL3/x2T9/8dk/f/HZP3/xyT
+        9v4dkvf/HJP2pgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAelPUBAAAAAByS9+Mdk/b/HJL3/h2T9/8dk/f/HZP3/x2T9/8dk/f/HZP3/h2S9/8ck/bpHJL2JgAA
+        AAAAqv4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJP3AgAAAAAdkva+HJP3/x2T9v0ck/f/HZP3/x2S
+        9/8dk/f/HZP3/x2T9/8dk/f/HZP3/x2S9/8ck/f/HZP3/x2T9/8dk/f/HZP3/x2T9/8dk/f/HJL3/x2S
+        9/8ck/f/HZL3/x2T9/8dk/f/HJP3/x2T9/8dk/f/HZP3/xyT9/8ck/f/HZP3/x2S9/8dk/f/HZP3/xyT
+        9/8dk/f/HZL3/x2T9/8dk/f/HZP3/x2T9/8dk/f/HZL3/xyT9/8dk/f/HZP3/x2T9v4dk/f+HZL2/xyT
+        9/8dk/fkHJL2VQAAAAAolP8AHZH2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuS9gAAAAAAHJL2Ox2T
+        9/8ckvb6HZP3/hyS9v8dk/f+HJL2/xyT9v8ckvb/HJL2/x2T9v8ckvfJHJL3CwAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS9wAAAAAAHZP2sxyS9/8dk/f9HZP3/hyS
+        9v8dk/f+HJL2/xyS9/8ckvb/HJP3/x2S9v8dk/dIAAAAAByR9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAckvYBAAAAAB2T95Mckvb/HZL3/B2T9/4ckvb/HZP3/hyS9v8ck/b/HJL2/xyS9v8ck/b/HJL2/x2T
+        9/4dk/f+HJL2/x2T9/4ckvb/HJL3/xyS9v8ckvb/HJL2/xyS9v8ckvb/HZP3/hyS9/8ckvb/HJL2/xyS
+        9v8ckvb/HZP3/h2T9/4ckvb/HJL2/xyS9v8ckvb/HZP3/hyS9v8dk/f+HJL2/xyT9v8ckvb/HJL2/xyT
+        9v8ckvb/HZP3/h2T9/8ckvb+HJL3/x2T9/8ck/f/HZL2kR2S9hIAAAAAH5L4AQBVuAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdkvcbHJL2+x2T9/4dk/f+HZL2/x2T9/4dk/b/HZP2/x2T
+        9v8dk/b/HJP3/x2T9vEdk/ccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAHZP2AAAAAAAdk/Z9HJL3/x2T9vsdk/f+HZL2/x2T9/4dk/b/HZP3/xyS9v8dk/f/HZL2/xyT
+        924AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS9wAAAAAAHJL2Yx2T9/8ckvb7HZP3/h2S
+        9v8dk/f+HZP2/x2T9v8dk/b/HZP2/x2T9/4dkvf/HZP3/R2T9/0dk/f9HZP3/R2T9/0dk/f9HZP3/R2S
+        9/0dkvf9HJP2/R2S9/0dk/f9HZP2/RyS9/0dk/b9HZL3/R2T9/0dk/f9HZP3/R2S9/0dkvf9HZP3/R2T
+        9/0dk/b9HZP2/R2S9/4dk/b/HZP2/x2T9v8dk/b/HZP2/x2S9/8ck/b/HZP3/RyS9/8dkvb/HJL2yRyS
+        9zcAAAAAAAAAAB+V9gAakfcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2U
+        9g4dk/bUHJL3/x2T9/4dk/b/HZP3/hyT9v8dkvb/HJP2/x2T9v8ckvb6HZP3/xyT9i4AAAAAGpP2AAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAck/cAAAAAAByT904dkvb/HJP3+h2T
+        9/4dk/b/HZP3/hyT9v8dk/f/HJP2/x2S9v4dk/f/HJL2lAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAHZT3AAAAAAAdk/c4HJL3/x2T9vodk/f+HZP2/x2T9/4ck/b/HZL2/xyT9v8dk/b/HZL3/x2T
+        9v0dkvf/HZL3/x2S9/8dk/f/HZP3/x2T9/8ckvb/HJL2/x2S9v8dk/b/HJL3/x2T9/8dk/f/HJP2/xyT
+        9/8ck/b/HJP2/x2T9v8dk/b/HZP2/x2S9v8ck/b/HZL2/xyT9/8dkvb/HZP3/xyT9v4dkvb/HJP2/x2T
+        9v8dk/f/HJP3/h2S9/8dkvb/HJP3+hyT928AAAAAAAAAAB+V+gAAAAAAHpH2AAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByT96kdkvb/HJP3/x2S9/8dk/f+HJL2/x2T
+        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
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6Q+QEAAAAAAAAAAAAAAAAdk/cAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAckvYDAAAAAByT9ngckvf/HJP3/h2T9/4dk/f+HZP3/h2T9/4dk/f+HZP3/hyS
+        9v8dk/f/HJL3kQAAAAAdk/YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAdkPgBAAAAAByT9tsckvf/HZL2/x2T9/4dk/f+HZP3/hyS9v8dk/f+HZL3/xyT9v8dkvf1HZH3HAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByR9g4dkvbeHZP3/x2S9v8dk/f+HZP3/h2T
+        9/4dk/f+HZP3/h2T9/4dk/b/HJL3+xyR9yYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAekPkAAAAAAByT
+        9wIdkvYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS9wEAAAAAHJL3QxyS
+        9/8ckvf+HZL3/h2T9/4dk/f+HZP3/h2T9/4dk/f+HJL3/hyT9v8dkve2AAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByT9wQAAAAAHJL2thyT9/8ckvb+HZP3/h2T
+        9/4dk/f+HJL2/x2S9/4dkvf+HJP3/xyS9v8dkvZLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAdk/cEAAAAAB2S9sgdk/f/HZL2/h2S9/4dk/f+HZP3/h2T9/4dk/f+HZP3/hyS9/8dk/b/HZP2TQAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAHZP2AAAAAAAdk/YVHZP3/x2T9/4dkvf/HZP2/x2T9v8dk/f/HZP3/x2T
+        9/8dkvb/HJL2/x2T99Adk/kOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAHZL3AgAAAAAdk/aFHZL3/x2S9v4dk/f/HZP3/x2T9/8dk/b+HZL3/x2S9v8dk/b/HJP3/x2S
+        9nQAAAAAHJT3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS9gQAAAAAHJP3pR2S9v8dk/f+HZL3/x2T
+        9v8dk/b/HZP3/x2T9/8dk/f/HZP2/xyS9v8ckvdxAAAAAB2T9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAdk/bmHZP3/x2S9/8dk/f/HZP3/x2T9/8dk/f/HZP3/x2S9/8dkvb/HJP37hyS9yoAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAck/cBAAAAAByT91Ack/f/HJP3/R2T
+        9/8dk/f/HZP3/xyT9v8ckvf/HZL3/xyT9v4ckvb/HZP3nwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAHJL2AwAAAAAckvZzHJL2/xyS9v4dkvf/HZP3/x2T9/8dk/f/HZP3/x2T9/8ckvb/HJP3/x2T
+        9poAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS97gckvb/HZL3/h2T9v8dk/b/HZP2/x2T
+        9v8dk/b/HZL2/x2T9/8ckvb/HZP3QQAAAAAZkfYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAByS9gAAAAAAHJL2IByS9v8ckvb9HZP3/h2T9v8dk/b/HZP2/x2S9v8dkvb/HZP2/h2S
+        9v8ck/e/HJb6AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/cBAAAAAB2T90cdk/f/HZP3/h2S
+        9/4dk/b/HZP2/x2T9v8dk/b/HZP2/xyS9v4ckvb/HJL3tgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAHZL2jByT9/8dk/f+HZP3/x2T9/8dk/f/HZP3/x2T9/8dk/f/HJL2/hyS9v8dk/dhAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdkvYHHZL28x2S
+        9v8dk/f/HZP3/x2T9/8dk/f/HZP3/x2T9/8dk/f/HJP3/x2S9t8ckvYaAAAAADOZ/wAAAAAAAAAAAAAA
+        AAAAAAAAAAAAABuS9gAAAAAAHJL2GRyS9v8ckvb+HZP3/x2T9/8dk/f/HZP3/x2T9/8dk/f/HZP3/xyT
+        9v8dkvfOHZP3DQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAck/dbHZL2/x2S9/8dk/b/HZP2/x2T
+        9/8dk/f/HZP3/x2S9v8ck/f+HZP2/xyS95EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdkvfCHJP2/x2T9/8dk/f/HZP3/xyS9v8ckvf/HZL2/xyT
+        9v8dkvf/HJP2/x2S9zMAAAAAGZP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL27hyS
+        9v8dkvf/HZP2/x2T9v8dk/f/HZP3/x2T9/8dkvb/HZP3/x2T9ukdkvYlAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAij/UAAAAAAByT9z0dkvb/HZP3/xyT9v8dk/b/HJP3/x2T9/8ck/f/HJL2/x2T9/4dk/f/HZP2ugAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2S
+        95gck/b/HZP3/hyT9/8dk/f/HJP2/xyS9/8dkvb/HJP2/x2T9/4ckvf/HZP2UQAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAakvYAAAAAAAAAAAAck/bDHJL3/x2T9/4ck/b/HZP2/xyT9/8dk/f/HJP3/xyS
+        9v8dk/f/HJP2/x2S9zsAAAAAHZP2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACq/gAAAAAAHZL2IByS9uQdk/f/HZP2/x2T
+        9v8dk/b/HZP2/x2T9v8dkvb/HZP3/hyS9/8ckvfqF4T/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZL3aByT9v8ck/b/HZP2/x2T9/8ckvb/HZL2/x2S
+        9v8dk/b/HJL3/h2S9/8ck/aFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2S
+        95Qck/b/HZL3/x2T9v8dk/b/HZP2/x2T9v8dk/b/HZL2/x2T9/4ck/b/HZL3WwAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAdlfkGHZP3yByS9v8dk/b+HZP2/xyT9v8dk/b/HJP2/xyS9v8ck/f+HJL3/hyS
+        9/8bkvcSAAAAABqR9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZL3AAAA
+        AAAck/ZHHZL3/x2T9/8ck/b/HZP2/xyS9v8ckvb/HZL2/xyT9v8ckvb/HZP2/xyS97QAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL3ah2T9v8dk/f+HJP2/x2T9v8ck/b/HZP2/xyT
+        9v8ckvb/HJP3/h2S9v8ck/eDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAck/asHZL3/x2S
+        9v4dk/f+HZP3/h2T9/4dk/f+HZL3/hyT9/4ck/b+HJP2/xyT9j8AAAAAHJP2AQAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2T9ysdk/btHJL3/x2T9/4dk/f+HJL2/xyS
+        9/4dkvf+HJP3/h2S9/8ck/f/HZL25QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAck/ZHHZL3/x2S9/8dk/f+HZP3/h2T9/4dk/f+HZP3/h2S9/4ck/f/HZP2/xyS96sAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAdk/gAAAAAAByS9oEdk/f/HZP2/x2T9v8dk/b/HZP2/x2T9v8dkvb/HJP2/x2T
+        9/4dk/f/HZL3cQAAAAAdk/cDHZP3AByT9wAdk/YAHJL3AB+V8wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAGpn2BxyT9s8dkvf/HZP2/x2T9/8dk/b/HJL2/x2S9v8ck/b/HZL3/xyS9v8dk/f/HpP3EgAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAakvgAAAAAAB2T9iwckvfxHZL3/x2T9v8dk/b/HZP2/x2T
+        9v8dk/b/HZL2/xyT9v8ckvf/HZL22QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL2Vh2S
+        9/8dk/f/HZP3/h2T9/4dk/f+HZP3/h2T9/4dk/f+HZP3/h2T9/8dk/ecAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfmPkEH5v5BB+a+QQfmvkEH5r5BCCd
+        +gQdkfcIHo/zCx6P8wsej/MLHo/zCx6P8woekPQLHpL4EB6Q+A84hP8AHZP3uxyS9v8dk/f+HZP3/hyS
+        9v8dk/f+HZP3/h2T9/4ckvf/HZP2/xyS9/8ckvdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAHZP2FByT9tYdkvf/HZP3/h2T9/4dk/f+HZP3/h2T9/4dk/f+HZP3/hyT9/8ck/f/GpT3BgAA
+        AAAPmvcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/YnHZP2/ByS9/8dk/f/HZP3/x2T9/8dk/f/HZP3/xyT
+        9/8dk/f/HZP3/x2T9/4dk/fxHZP3+B2T9/kckvf4HZL2+B2T9vgckvf4HJL2+R2T9vkdk/b5HZP2+R2T
+        9vkdk/b5HZP2+R2T9/odk/f6HZP3+h2T9/odk/f6HZP3+h2S9/sdkvb7HZL2+x2S9vsdkvb7HZL2+x2S
+        9vsdkvf8HZL3/B2S9/odkvf8HJP2/x2T9/8dk/f/HJL2/xyT9/8dk/f/HJP3/x2S9/8ck/f/HZL2/xyS
+        9nUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZP3uB2S9v8dk/f+HZP3/x2T
+        9/8dk/f/HZP3/x2T9/8ck/f/HJP3/hyT9/8ck/YtAAAAAByT9gEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJZHvAAAA
+        AAAck/fyHZL2/x2T9v8ckvf/HZL3/xyT9/8ckvb/HJL3/x2S9/8dkvf+HZP3/xyS9/8ckvb/HZP3/xyS
+        9/8dkvb/HJL3/x2T9v8dk/f/HJL3/xyS9/8ckvf/HJL3/xyS9/8ckvf/HJL2/xyS9v8ckvb/HJL2/xyS
+        9v8ckvb/HJP2/xyT9/8ck/f/HJP3/xyT9/8ck/f/HJP3/xyT9v8ck/b/HJP2/xyS9v8dkvf+HJL3/x2S
+        9/8ckvb/HJL3/x2S9v8ckvb/HZL3/x2S9/8ckvb/HZP3pQAAAAAbjfMAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAdk/eaHZL2/x2S9v8dk/b/HJL3/x2S9/8ck/f/HJL2/xyS9/8dkvf+HZL3/x2S
+        91kAAAAAHZL3AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/YBAAAAAByS980dk/b/HZP3/h2S9/8dkvf/HZP3/x2S
+        9/8dk/f+HZP3/hyS9v8dk/f+HZL3/h2S9/4ckvb/HZL3/x2S9/8dkvf/HJL3/x2T9/4dkvf/HJL2/x2S
+        9/8ckvb/HZL3/x2T9/4dk/f+HJL2/x2S9/8ckvf/HZL3/x2T9/4ckvb/HZP3/h2S9/8dk/f/HZL3/x2S
+        9/8dk/f/HZL3/x2T9/4dk/f+HJL2/x2T9/4dkvf/HZL3/xyS9v8dkvf/HZL3/x2S9/8ckvf/HZP3/hyT
+        9/8dkvbHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdm/8AAAAAAByS9nMdk/f/HJP2/x2T
+        9/8dkvf/HZL3/x2T9/8dkvf/HZP3/h2T9v4ck/b/HZL3gwAAAAAck/YDAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS
+        9wEAAAAAHZP2mByS9/8dk/f8HZL2/x2S9v8dkvb/HZL2/xyS9v8dkvb/HJL2/x2S9v8dkvb/HZL3/xyS
+        9v8ckvb/HZL2/xyS9v8ckvf/HZL2/x2S9/8ckvb/HZL2/xyS9v8dkvb/HJL2/xyS9v8ckvb/HZL2/xyS
+        9v8dkvb/HJL2/xyS9v8dkvb/HZL2/x2S9v8dkvb/HZL2/x2S9v8dkvb/HJL2/x2S9v8ckvb/HZL2/x2S
+        9v8dkvf/HJL2/xyS9v8dkvb/HJL2/xyS9/8dk/f+HZP3/xyS9t8ckvYYAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAHZL2Rh2S9v8ck/f/HZL2/x2S9v8dkvb/HZL2/x2S9v8ckvb/HZP3/h2S
+        9/8ck/a0AAAAAB2S9wUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL2AAAAAAAckvZpHZP3/xyS9vsckvb/HJL2/xyS
+        9v8ckvb/HZP3/h2T9/4ckvb/HZP3/hyS9v8ckvf/HJL2/xyS9v8ckvb/HJL2/xyS9/8dk/f+HJL3/xyS
+        9v8ckvb/HJL2/xyS9v8dk/f+HZP3/hyS9v8ckvb/HJL3/xyS9v8dk/f+HJL2/x2T9/4ckvb/HJL2/xyS
+        9v8ckvb/HJL2/xyS9v8dk/f+HZP3/hyS9v8dk/f+HJL2/xyS9/8ckvb/HJL2/xyS9v8ckvb/HJL3/x2T
+        9/4dk/f/HJP29B2S9zYAAAAAHJf2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAck/cdHJP3+x2S
+        9v8ck/b/HJL2/xyS9v8ckvb/HJL2/x2T9/4dk/b/HZL2/xyT99AAAAAAHZL2AgAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAaj/UAAAAAAByS9jYdk/f/HJL2+h2T9/4dk/f+HZP3/h2T9v4ck/f+HZP3/h2T9/8dk/f+HZP3/h2T
+        9/4dk/b/HJP3/h2T9v4ck/b+HZL3/x2T9/4dk/f+HJP2/x2T9/4dk/f/HZP3/hyT9/4ck/b+HZP3/x2T
+        9/4dk/f/HZP2/hyT9v4dk/f/HZP3/h2T9v4dk/b+HZP3/h2T9/4dk/f+HZP2/hyT9/4dk/f+HZP3/x2T
+        9/4dk/f+HZP3/h2T9v8ck/f+HZP2/hyT9v4dkvf/HZP3/hyT9/8ckvf/HZP2WAAAAAAbjPcAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAH5H1AQAAAAAck/fsHZL2/x2T9v4dk/f+HZP3/h2T9/4dk/b+HJP3/h2T
+        9/8ck/b/HZL35B2S9xsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZP3HhyS9vgdk/f/HZP3/x2T
+        9/8dk/f/HZL2/x2T9/8dk/f/HZL3/x2T9/8dk/f/HZP3/xyS9v8dkvf/HZL2/x2T9v8dkvf/HZP3/x2T
+        9/8ckvb/HZP3/xyS9/8dk/f/HZP3/x2T9v8dkvf/HZL3/x2S9/8dk/b/HZP2/x2S9/8dkvf/HZP2/x2T
+        9v8dk/f/HZP3/x2T9/8dkvb/HZP3/x2T9/8dkvf/HZP3/x2T9/8dk/f/HJL2/x2S9/8dkvb/HZP2/x2S
+        9/8dk/f/HJL3/h2S9/8ck/Z6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAck/cBAAAAAB2S
+        9sQck/f/HZP2/R2T9/8dk/f/HZP3/x2S9v8dk/f/HZP3/x2T9/8ck/b1HZL2OgAAAAAVlf8AAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAGo/2AAAAAAAdkvYPHZP30RyS9v8ckvf/HJL3/xyT9/8ckvb/HJP3/h2T9/4ckvf/HZP3/hyS
+        9/8ckvf/HJL2/xyS9/8ckvb/HJL2/xyS9/8dk/f+HJL3/xyS9v8ckvf/HJL3/xyS9/8ck/f+HJP3/hyS
+        9/8ckvf/HJL3/xyS9v8ck/f+HJL3/x2T9/4ckvb/HJP2/xyS9/8ckvf/HJP3/xyS9v8ck/f+HZP3/hyS
+        9/8dk/f+HJL3/xyS9/8ckvb/HJL3/xyS9v8ckvb/HJL3/x2T9/4dk/f/HZP2/xyS96IAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2S9gAAAAAAHJL3lR2T9v8ckvb8HJL3/xyS9/8ck/f/HJL2/xyT
+        9/4dk/f+HJP2/x2S9v8ck/dZAAAAAB+S9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAckveoHZP2/xyT
+        9/4dk/f/HZP3/x2S9/8ck/f/HZP3/x2T9/8dk/f/HZP3/x2T9/8dk/f/HJL3/x2S9/8ck/f/HZL3/x2T
+        9/8dk/f/HJP3/x2T9/8dk/f/HZP3/xyT9/8ck/f/HZP3/x2S9/8dk/f/HZP3/xyT9/8dk/f/HZL3/x2T
+        9/8dk/f/HZP3/x2T9/8dk/f/HZL3/xyT9/8dk/f/HZP3/x2T9/8dk/f/HZP3/x2T9/8ckvf/HZL3/xyT
+        9/8dkvf/HZP3/x2T9/8ckvf/HZP2zh2S9gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZP3AAAA
+        AAAdk/dkHJL3/x2T9/sdk/f/HZP3/x2T9/8dkvf/HJP3/x2T9/8dk/f/HJL3/x2T9n0AAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAByT9oQdkvf/HJP3/hyS9v8ck/b/HJL2/x2T9/4dk/f+HJL2/x2T
+        9/4dk/b+HZP3/xyS9v8ckvb/HZL2/xyT9v8ckvb/HZP3/xyT9v8ckvb/HJP2/xyS9v8ck/b/HZP3/x2T
+        9v8ckvb/HJL2/xyS9v8dk/b/HZP2/xyS9v8dkvf/HJP2/x2T9v8ck/b/HZP2/xyT9v8ckvb/HZP3/x2T
+        9/8ckvb/HZP3/xyT9/8dkvf+HJP2/hyS9v8ckvb/HJL2/xyS9v8dk/f+HJL3/xyS9v8dk/f2HJL2DQAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbk/cAAAAAAByT9jgdkvf/HJP2+hyS9v8ckvb/HJP2/xyS
+        9v8dk/f+HZP3/hyS9v4ck/f/HZL2nwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS9wAAAAAAHZP3XByT
+        9/8dkvb/HZP2/x2T9v8dkvb/HZP3/h2T9/4dkvb/HZP3/h2T9/8dkvb8HZL22x2T990dkvfdHZP33R2S
+        990dk/fdHZP33RyT9t0dk/fdHZP33R2T990dk/fdHZP33R2T990dkvfdHZP23R2T990dk/fdHZP33R2S
+        990dk/fdHZP33R2T990dk/fdHZP33R2S990dk/fdHZP33R2T9t0dkvfaHZL38R2T9v8dk/f+HJL2/x2S
+        9v8ck/b/HZL3/x2T9/4dk/f/HZP3+xyS9v8dk/cpAAAAAB2U9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAHJL2Hh2T9/gckvb/HZP2/x2T9v8dk/b/HZL2/x2T9/4dk/f+HZL2/x2S9v8ck/fGHJL3CQAA
+        AAAkkv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAHJf2AAAAAAAdkvY5HZL29RyT9/8dk/b/HJL2/xyS9v8dk/f+HZP3/h2T
+        9v8dk/f+HJL2/x2T9/Mck/ceHJL2FRyT9xYckvcWHJP2Fh2T9xYck/YWHZP3FhyT9hYckvYWHJL2Fh2S
+        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
+        AAAAAAAAAAAAACGT/QAAAAAAHJL2aB2T9/8dk/f/HJL2/xyT9v8ckvb/HJP2/x2T9v8ckvb/HJL2/B2S
+        9/8ck/aLAAAAAByS9gEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL3AgAAAAAdk/dwHZL3/x2T9/4ck/f/HJL2/x2T
+        9/4dk/f+HZL3/x2T9/4ck/b+HZL2/xyT96QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAHJL2BAAAAAAdk/fLHJL2/xyT9/4dkvb/HJL2/x2S9/8dk/f+HJL3/xyS
+        9v8ckvb/HZP27hyU9h8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGJHyAAAAAAAdk/dCHJL2+R2T
+        9/8dkvf/HJP3/xyS9v8dk/f+HZP3/h2S9/8dk/f+HZP2/xyS98UAAAAAHZP2AgAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAckvYBAAAAAByS9kEckvb/HJL2/hyT9v8ckvb/HZP3/h2T9/4dkvb/HZP3/h2T9/4ck/f/HZL3vx2E
+        9gEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/cDAAAAAByS
+        9qAdk/f/HJP2/h2S9v8ckvb/HZL3/x2T9/4ckvb/HJL2/x2T9/8dkvf6HJL2RgAAAAAkkv8AAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2T9iEdk/bpHJL3/x2S9/8ck/b/HJL2/x2T9/4dk/f+HZL2/x2T
+        9/4dk/b/HJL37QAAAAAhlvYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6V+gAAAAAAHZP4EB2T9/8ckvf+HZP2/x2S
+        9v8dk/f+HZP3/h2S9v8dk/f+HZP2/xyT9v8ckvfdHZL2GgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2S9wIAAAAAHZL3bhyT9v8dkvf9HZL2/x2T9v8dkvf/HZP3/h2T
+        9/8ckvb/HZP3/xyT9v8dkvdxAAAAABmV8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/YBAAAAAByS
+        99Ydk/b/HZP2/x2T9v8dkvb/HZP3/h2T9/4dkvb/HZP3/x2T9/8ckvb7HJL2KQAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAckfYBHJL25B2T9v8dk/f/HZL2/xyT9/8dk/f/HZP3/x2T9/8dk/f/HZL3/x2T
+        9vkck/cvAAAAAB2R9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJP2AQAA
+        AAAck/ZCHZL3/xyT9vwdkvb/HJP2/x2S9/8dk/f/HZP3/xyT9v8dk/f/HZL3/xyT9pUAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2T9gUAAAAAHJL3uh2T9v8ckvb+HZP3/x2S9v8ck/f/HZP3/x2T
+        9/8dk/f/HJL3/x2T9/8dk/ZWAAAAAB6U9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAglfkAAAAAAAAAAAAdk/a5HJL3/x2T
+        9/4dk/f+HZP3/h2T9/4dkvb/HZP3/h2T9/4ckvf/HJP3/x2S9kUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdlvkAAAAAAB2T9xkckvb/HZP3/B2T9/4dk/f+HZL3/x2T
+        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
+        AAAAAAAAAAAAABaO8QAAAAAAHZP3TxyS9v8dk/f/HZP3/x2T9/8dk/f/HZP3/x2T9/8dk/f/HZL2/ByT
+        9/8dkvacAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACSS/gAAAAAAAAAAAB2S96wckvf/HZP3/x2T
+        9/8dk/f/HZP3/x2T9/8dk/f/HZP3/x2T9/8ck/b/HZL3TgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAHZP2sRyS9/8dk/b+HJP3/x2T9/8dkvb/HZP3/x2T9/8dk/f/HZP3/xyS9v8ckvZDAAAAAByS
+        9gEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIpn/AAAAAAAckvYwHZP38B2S
+        9/8ck/b/HZL3/x2T9/8dk/f/HJL2/x2T9/8dkvb9HZP3/xyS9s8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAHJL2fh2T9/8dkvf+HZL2/xyT9/8dk/f/HZL2/x2T9/8dk/f/HZP3/hyT
+        9v8dkvd6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpTyAAAAAAAdkveOHJL2/xyT9/8dk/f+HZP3/h2T
+        9/8dk/f+HJP3/x2T9/8dkvf/HZP2/x2T9m0AAAAAHZP2AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAByT9hQck/baHZL3/x2T9/4dkvf/HZP3/hyT9/8ck/b/HJP3/xyT
+        9v4ckvb/HZP39wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAck/dYHZL2/x2T
+        9/8ckvb/HZP3/h2T9/4dk/f/HZP3/hyT9/8dk/f/HJP2/x2S96IAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAkkv8AAAAAAB2T918dk/f/HJL2/x2T9/4dk/f+HJL2/x2T9/4dk/b/HZP3/x2T9/8ck/f/HZL2nAAA
+        AAAck/cEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS
+        98Idk/b/HZP2/hyS9/8dk/f+HZP3/xyS9v8dk/b/HJP2/x2S9v8ck/f/HJP3JwAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAdkfYAAAAAAByT9zkdkvb+HZP2/x2S9v8dk/f+HZP3/hyS9v8dk/f+HZP2/x2T
+        9/8dkvb/HJP20AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJP3NRyT9/8dkvb/HZP3/x2T
+        9/4ckvb/HZP3/hyT9v8dk/b/HZP2/x2S9v8ck/fBAAAAAB2S9gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAABSU7gAAAAAAHZL3oxyT9v8ck/f/HJL2/x2T9/4ck/b/HJL2/xyT
+        9v8ckvb/HJP3/x2S9v8dkvZVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACq/wAAAAAAHZL2IB2S
+        9+Mck/f/HJL2/xyT9/4dk/f+HJL2/x2T9/4ck/b/HZP2/xyT9v8dkvf5IIH3AQAAAAA9APYAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAYk/YJHJP2+h2S9/8dk/f/HZP3/h2S9/8dk/f+HZP3/h2T9/4ck/b+HJP2/x2S
+        99Ygj/gHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAck/Z5HZP3/xyS9/8dkvf/HZP3/h2T9/4ckvb/HZP3/hyS9/8dk/b/HZL2/xyT94EAAAAAIJL2AAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAck/YFHJP3yh2S9v8dkvf+HJP3/h2T9/4dkvf/HZP3/h2T
+        9/4dk/f+HJP2/x2S9/8dkvYgAAAAAB2S9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL2AQAAAAAdk/fcHJL2/xyS
+        9v4dk/b/HZP2/x2T9v8dk/b/HZP3/x2T9v8ck/b/HZL36x2S9ykAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2S90odkvf/HJP2/xyS9v4dk/b/HZP3/xyT
+        9v8dk/b/HZP2/x2T9/8ck/f/HZL2rwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAck/asHZL2/x2T9v8ck/b/HZP2/x2T9v8dk/b/HZP2/x2T9/8dkvf/HJP3/xyT91AAAAAAHJP3AgAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAdkvYAAAAAAByT9q0dkvf/HZP2/R2T9/4ckvf/HZP3/h2T9/4dk/f+HJL2/xyT
+        9/8dkvb+HJL2RgAAAAAelPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAHJL3HxyS9/8dk/b/HJL3/x2T9/4dk/f+HJL2/x2T9/4ckvf/HZP3/hyT9/8dkvbKAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAalfcAAAAAAB2S94gck/f/HZP2/x2T9/4dk/f+HJL3/x2T
+        9/4dk/f+HZP3/h2S9v8dk/b/HJL3eQAAAAAdk/YDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2S9wAAAAAAHZL3exyT
+        9v8dkvf7HZP3/x2S9v8dk/f/HZP3/x2T9/8ckvb/HZP3/xyS9/8dk/ZoAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAXi/8AAAAAABuR+gAelvcAHZX4AAAAAAAAAAAAHZP38xyS9v8dk/f+HZP3/x2T
+        9/8ckvb/HZP3/xyS9v8dk/f/HZL2/xyT9+QclPcgAAAAAB6W+AAdlfcAHpb4AB+X+gAAAAAAAAAAAAAA
+        AAAAAAAAHJP2WRyT9v8dkvf/HJP3/x2T9/8dkvb/HZP3/x2T9/8dk/f/HJL2/xyS9/8dk/apAAAAAByS
+        9wUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAHJH4AAAAAAAckvdMHZP2/xyS9/kdkvf/HZL3/xyS9/8ckvf/HZL3/xyS
+        9v8dkvf+HJL2/x2T94kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/YAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAck/bEHZP3/x2T9/0ckvf/HJL3/xyS9v8ckvf/HJL3/xyS9/8dk/f/HJL3/B2S
+        9jgAAAAAAAAAAAAAAAAAAAAAAAAAAB2T9wAAAAAAAAAAAAAAAAAdkvcwHZL3/xyT9v8dkvf/HZL3/x2S
+        9/8ckvf/HJL3/x2S9/8dk/b+HJL2/x2T98kAAAAAHJH2AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS
+        9isdk/f/HJL2/B2T9/4ckvb/HZP3/h2S9/8dkvf/HJL2/xyS9v8dk/b/HJL3rRuR/wAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAGoz+AAAAAAAckvgMHZT3Kx2U9x4dlPcfHZT3Fh2T964ckvb/HZL2/B2T
+        9/4dkvf/HJL2/x2S9/8ckvb/HZL3/x2S9v8dk/b/HJL3bx2W+AsdlPcgHZT3IB2U9yIdlPgJAAAAAAAA
+        AAAAAAAAAAAAABuT9QYck/b5HZL3/x2T9/8dk/f+HJL2/x2T9/4dkvf/HZL3/xyS9v8dk/b/HJL32xyR
+        9xEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZP2GByS9+Idk/b/HZL2/xyS9v8dkvb/HZL2/x2S
+        9/8ckvb/HJL2/x2S9/8dk/bVHZP2DQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkkv8AAAAAAB2S
+        9xMckvbjHZP3/xyS9v8ckvb/HJL2/x2T9/4ckvf/HZL2/x2S9/8ckvb/HZL2/xyS9v8dkvb/HJP3/hyS
+        9/4dk/b/HJL2/xyS9v8ck/b/HJP35ByT9w4AAAAAAAAAAAAAAAAckvYBAAAAAB2T99kckvb/HZL3/h2S
+        9v8ckvb/HZL2/x2S9v8dkvf/HJL2/xyT9/8ckvbxHZL2MgAAAAAVlP4AAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAckvYHHJL3wB2T9v8dk/f+HJL2/x2T9/4ckvb/HJL3/xyS9v8ckvb/HJP3/x2T9vock/cYAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/YAAAAAAByS9yQdkvb1HZP3/x2T9/sdk/f+HJL2/xyS
+        9/4dk/f+HJL3/xyS9v8ckvb/HJL2/xyS9v8dk/f/HZP2/xyS9/0dk/f8HZP3/R2S9v8dkvd2AAAAAByR
+        9QAAAAAAAAAAAB2S9wAAAAAAHJP2qh2S9/8ck/b8HZP3/hyS9v8dk/f+HJL2/xyS9/8ckvb/HZP3/x2S
+        9v8ckvdPAAAAAB6T9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdkvaZHJP3/x2T9/4dk/f/HZP3/h2T
+        9/4dk/f+HZP2/xyT9/4dk/f7HJP2/x2T9zIAAAAAHZL4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS
+        9wAdk/cCAAAAAByS91Eck/f/HZL2/h2S9v4ck/b/HZL3/x2T9/4dk/f+HJP2/x2T9/4dk/f/HZP3/hyT
+        9/4ck/b+HZP3/xyS9v4dk/f/HZL39B2R9gcAAAAAHZT4AAAAAAAAAAAAHZL3AAAAAAAdkvd5HJP2/x2S
+        9/sdk/f+HZP3/x2T9/4dk/f+HZP3/h2T9v8ckvf/HZL2/xyT93IAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAUc/YAAAAAAB2T9ncckvf/HZL3/x2S9/8dk/f/HZP3/x2T9/8ckvb/HZL3/x2S9vwck/f/HZP2XQAA
+        AAAdk/YBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2S9pAck/f/HZL2/xyT
+        9v4dkvf/HZP3/x2T9/8ckvb/HZP3/xyS9/8dk/f/HZP3/x2T9v8dkvf/HJL3+x2S9v8dk/eOAAAAAByS
+        9wAAAAAAAAAAAAAAAAAbkfgAAAAAAByS90wdk/b/HJL3+R2T9/8dkvf/HZP3/x2T9/8dk/f/HJL2/x2S
+        9/4ckvf/HZP2lQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL3UxyS9/8dk/f/HJL3/x2T
+        9/4ckvf/HJL3/xyS9v8ckvf/HJP3/R2T9v8ck/eJAAAAAByT9wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAHpP2ABuT+AAAAAAAAAAAAByT98Ick/f/HJP3/hyS9/8dk/f+HJL3/xyS9v8ckvf/HJL3/xyS
+        9/8ck/f+HJP3/hyT9/4ck/b+HZL3/x2S9yoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL2Kx2T
+        9/8ckvb8HZP3/hyS9/8dk/f+HJL3/xyS9/8ckvb/HJL3/x2T9/8ckva5HJL2BAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAdk/YrHZP2+hyS9/8dk/f/HZP3/x2T9/8dk/f/HZP2/xyS9/8dkvb/HJP3/x2S
+        9sUAAAAAHJP3AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZH1AByT9wAAAAAAHJL2FByS
+        9+wdk/b/HJL3/R2T9/4dk/f/HJP3/x2T9/8dk/f/HZP3/xyT9/8dk/f/HZP3/h2S9/8ck/ajAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/YYHZP37ByS9v8dk/f/HZP3/x2T9/8dk/f/HZP3/x2T
+        9v8ckvf/HZL2/x2T9+8dk/cTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGW+Agdk/eUHJL2rx2T
+        96gdk/eoHZP2qB2T96gck/eoHJP2qB2S96gdkvauHJP3kgAAAAAejvYCAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS9wAAAAAAHZP2RxyS9v8dk/b/HZP3/hyT9/8ckvb/HJL2/xyS
+        9v8ckvb/HZP3/h2T9/8ckvb/HZL3/xyT9kMAAAAAHZH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuR
+        9gYckveCHZP3rhyT96gdk/eoHZP3qB2T9qgdk/eoHJP3qByT9qgckvanHJP3qR2T9hIAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAdlPYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAGpr3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL3AAAA
+        AAAAAAAAHJL3cx2S9/8ck/b/HZL3/xyS9v8dk/b/HJL2/x2T9v8dk/f+HJP3/hyS9v8dk/fCAAAAAByS
+        9wMamfIAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2T9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACua/gAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfivYAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAglfQAHJL2ABuS0QAAAAAAHJP3rB2S9v8ck/f9HJP2/hyT
+        9v8ck/b/HJP2/x2T9/4dkvb8HZP3/xyT9kwAAAAAHZP2AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS
+        9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJP3AAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAHZL4AAAAAAAgjfgEHJP32x2T9v8ckvb+HJP3/xyS9/8ckvf/HJP3/h2T9/8ckvbVAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZL1AAAAAAAdkvcvHJL2+xyT
+        9v8dk/b+HJP2/xyT9/4dkvb/HJP3/xyS9mwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAACuA/wAAAAAAHZX2AAAAAAAdkvdhHZP2/xyT9/8ckvb+HZL3/hyT9/8dkvbmHZP3GAAA
+        AAAdkfUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAckvYAAAAAAAAA
+        AAAck/eZHZL2/xyT9/4ck/b/HJP3/x2S9owAAAAAG5T6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdkvYAAAAAABWU/AIckvfMHZP2/x2S9v8ck/f/HJP2GgAA
+        AAAekPIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuU
+        +AAdkvYBAAAAAByT9xockvbuHZL3/xyS9qIAAAAAHpL3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuS9wAdk/YBAAAAAB2T904ck/f/HZP2NgAA
+        AAAZlPoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2S9kYckvYOAAAAAByS8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByT9wAAAAAAAAAAAAAA
+        AAAdk/cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2S/wAdkvYAHJL1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAP//////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        //////////////////////////////////////////////////////////P////////////////////w
+        ////////////////////8D////5///////////////Af//wAP////wAf/AAAAAAAB//+AD////8AH/wA
+        AAAAAAH//gA/////AB/+AAAAAAAA//4AP////4AP/gAAAAAAAD/+AD////+AD/4AAAAAAAAP/gA/////
+        gA/+AAAAAAAAB/8AH////4AP/gAAAAAAAB//AB////+AD/4AAAAAAAA//wAf////wA//AAAAAAAA//8A
+        H////8AH/wAAAAAAA///AB/////AB/8ACD//8Af//wAP////wAf/AB////Af//+AD////8AH/wAf///w
+        P///gA/////AB/8AD///8P///4AP////4AP/gA////P///+AD////+AD/4AP///3////gA/////gA/+A
+        D////////8AH////4AP/gA/////////AB////+AD/4AP////////wAf////gA/+AD////////8AH////
+        8AH/wAf////////AB/////AB/8AH////////wAf////wAf/AB////////+AD////8AH/wAf////////g
+        A/////AB/8AH////////4AP////4AP/AB////////+AD////+AD/4AP////////gA/////gA/+AD////
+        ////4AP////4AP/gA/////////AB////+AD/4AP////////wAAAAAAAA/+AD////////8AAAAAAAAH/g
+        A/////////AAAAAAAAB/8AH////////wAAAAAAAAf/AB////////+AAAAAAAAH/wAf////////gAAAAA
+        AAB/8AH////////4AAAAAAAAf/AB////////+AAAAAAAAD/wAf////////gAAAAAAAA/+AH////////4
+        AAAAAAAAP/gA/////////AAAAAAAAD/4AP////////wAf////gA/+AD////////8AH////8AH/gA////
+        /////AB/////AB/4AP////////wAf////wAf/AB////////+AD////8AH/wAf////////gA/////AB/8
+        AH////////4AP////4Af/AB////////+AD////+AD/wAf////////gA/////gA/8AD////////4AP///
+        /4AP/gA/////////AB////+AD/4AP////////wAf////gA/+AD////////8AH////8AP/gA/////////
+        AB/////AB/4AP////////wAf////wAf/AD////////8AH////8AH/wAf////////gA/////AB/8AH///
+        /////4AP////wAf/AB////////+AD////+AD/wAf////////gA/////gA/8AH////////4AP////4AP/
+        AB/////////AD////+AD/4AP////////wAf////gA/+AD////////8AH////4AP/gA/////////AB///
+        /gAAH4AP////////wAf///8AAD+AD////////8AH////gAA/wA/////////gB////4AAP8AH////////
+        4AP////AAH/AB////////+AD////4AB/wAf////////gA/////AA/8AH///////////////4AP//////
+        ////////////+AH///////////////////wB///////////////////+A////////////////////wP/
+        //////////////////8D////////////////////h////////////////////8f/////////////////
+        ///v////////////////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        ////////////////////////
+</value>
+  </data>
+</root>
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable.Views/3.3/HeuristicLab.Problems.Programmable.Views-3.3.csproj
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable.Views/3.3/HeuristicLab.Problems.Programmable.Views-3.3.csproj	(revision 11891)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable.Views/3.3/HeuristicLab.Problems.Programmable.Views-3.3.csproj	(revision 11892)
@@ -103,4 +103,16 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="MultiEncodingView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="MultiEncodingView.Designer.cs">
+      <DependentUpon>MultiEncodingView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="CreateNewSingleEncodingDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="CreateNewSingleEncodingDialog.Designer.cs">
+      <DependentUpon>CreateNewSingleEncodingDialog.cs</DependentUpon>
+    </Compile>
     <Compile Include="Plugin.cs" />
     <Compile Include="ProblemDefinitionScriptView.cs">
@@ -141,4 +153,9 @@
     </ProjectReference>
   </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="CreateNewSingleEncodingDialog.resx">
+      <DependentUpon>CreateNewSingleEncodingDialog.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <PropertyGroup>
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable.Views/3.3/MultiEncodingView.Designer.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable.Views/3.3/MultiEncodingView.Designer.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable.Views/3.3/MultiEncodingView.Designer.cs	(revision 11892)
@@ -0,0 +1,218 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Problems.Programmable.Views {
+  partial class MultiEncodingView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.encodingsListView = new System.Windows.Forms.ListView();
+      this.addEncodingButton = new System.Windows.Forms.Button();
+      this.removeEncodingButton = new System.Windows.Forms.Button();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.encodingsGroupBox = new System.Windows.Forms.GroupBox();
+      this.encodingDetailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.encodingDetailViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.encodingNameColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.encodingTypeColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.encodingsGroupBox.SuspendLayout();
+      this.encodingDetailsGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Size = new System.Drawing.Size(583, 20);
+      // 
+      // infoLabel
+      // 
+      this.infoLabel.Location = new System.Drawing.Point(647, 3);
+      // 
+      // encodingsListView
+      // 
+      this.encodingsListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.encodingsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.encodingNameColumnHeader,
+            this.encodingTypeColumnHeader});
+      this.encodingsListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
+      this.encodingsListView.HideSelection = false;
+      this.encodingsListView.Location = new System.Drawing.Point(3, 33);
+      this.encodingsListView.MultiSelect = false;
+      this.encodingsListView.Name = "encodingsListView";
+      this.encodingsListView.ShowGroups = false;
+      this.encodingsListView.Size = new System.Drawing.Size(214, 416);
+      this.encodingsListView.TabIndex = 3;
+      this.encodingsListView.UseCompatibleStateImageBehavior = false;
+      this.encodingsListView.View = System.Windows.Forms.View.Details;
+      this.encodingsListView.SelectedIndexChanged += new System.EventHandler(this.encodingsListView_SelectedIndexChanged);
+      // 
+      // addEncodingButton
+      // 
+      this.addEncodingButton.Location = new System.Drawing.Point(3, 3);
+      this.addEncodingButton.Name = "addEncodingButton";
+      this.addEncodingButton.Size = new System.Drawing.Size(24, 24);
+      this.addEncodingButton.TabIndex = 4;
+      this.addEncodingButton.Text = "+";
+      this.addEncodingButton.UseVisualStyleBackColor = true;
+      this.addEncodingButton.Click += new System.EventHandler(this.addEncodingButton_Click);
+      // 
+      // removeEncodingButton
+      // 
+      this.removeEncodingButton.Location = new System.Drawing.Point(33, 3);
+      this.removeEncodingButton.Name = "removeEncodingButton";
+      this.removeEncodingButton.Size = new System.Drawing.Size(24, 24);
+      this.removeEncodingButton.TabIndex = 4;
+      this.removeEncodingButton.Text = "x";
+      this.removeEncodingButton.UseVisualStyleBackColor = true;
+      this.removeEncodingButton.Click += new System.EventHandler(this.removeEncodingButton_Click);
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.Location = new System.Drawing.Point(3, 16);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.encodingsListView);
+      this.splitContainer.Panel1.Controls.Add(this.removeEncodingButton);
+      this.splitContainer.Panel1.Controls.Add(this.addEncodingButton);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.encodingDetailsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(660, 452);
+      this.splitContainer.SplitterDistance = 220;
+      this.splitContainer.TabIndex = 5;
+      // 
+      // encodingsGroupBox
+      // 
+      this.encodingsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.encodingsGroupBox.Controls.Add(this.splitContainer);
+      this.encodingsGroupBox.Location = new System.Drawing.Point(0, 26);
+      this.encodingsGroupBox.Name = "encodingsGroupBox";
+      this.encodingsGroupBox.Size = new System.Drawing.Size(666, 471);
+      this.encodingsGroupBox.TabIndex = 6;
+      this.encodingsGroupBox.TabStop = false;
+      this.encodingsGroupBox.Text = "Encodings";
+      // 
+      // encodingDetailsGroupBox
+      // 
+      this.encodingDetailsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.encodingDetailsGroupBox.Controls.Add(this.encodingDetailViewHost);
+      this.encodingDetailsGroupBox.Location = new System.Drawing.Point(3, 27);
+      this.encodingDetailsGroupBox.Name = "encodingDetailsGroupBox";
+      this.encodingDetailsGroupBox.Size = new System.Drawing.Size(430, 422);
+      this.encodingDetailsGroupBox.TabIndex = 1;
+      this.encodingDetailsGroupBox.TabStop = false;
+      this.encodingDetailsGroupBox.Text = "Details";
+      // 
+      // encodingDetailViewHost
+      // 
+      this.encodingDetailViewHost.Caption = "View";
+      this.encodingDetailViewHost.Content = null;
+      this.encodingDetailViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.encodingDetailViewHost.Enabled = false;
+      this.encodingDetailViewHost.Location = new System.Drawing.Point(3, 16);
+      this.encodingDetailViewHost.Name = "encodingDetailViewHost";
+      this.encodingDetailViewHost.ReadOnly = false;
+      this.encodingDetailViewHost.Size = new System.Drawing.Size(424, 403);
+      this.encodingDetailViewHost.TabIndex = 0;
+      this.encodingDetailViewHost.ViewsLabelVisible = true;
+      this.encodingDetailViewHost.ViewType = null;
+      // 
+      // encodingNameColumnHeader
+      // 
+      this.encodingNameColumnHeader.Text = "Name";
+      this.encodingNameColumnHeader.Width = 80;
+      // 
+      // encodingTypeColumnHeader
+      // 
+      this.encodingTypeColumnHeader.Text = "Type";
+      this.encodingTypeColumnHeader.Width = 120;
+      // 
+      // MultiEncodingView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.encodingsGroupBox);
+      this.Name = "MultiEncodingView";
+      this.Size = new System.Drawing.Size(666, 497);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.encodingsGroupBox, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+      this.splitContainer.ResumeLayout(false);
+      this.encodingsGroupBox.ResumeLayout(false);
+      this.encodingDetailsGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.ListView encodingsListView;
+    private System.Windows.Forms.Button addEncodingButton;
+    private System.Windows.Forms.Button removeEncodingButton;
+    private System.Windows.Forms.SplitContainer splitContainer;
+    private System.Windows.Forms.ColumnHeader encodingNameColumnHeader;
+    private System.Windows.Forms.ColumnHeader encodingTypeColumnHeader;
+    private System.Windows.Forms.GroupBox encodingDetailsGroupBox;
+    private MainForm.WindowsForms.ViewHost encodingDetailViewHost;
+    private System.Windows.Forms.GroupBox encodingsGroupBox;
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable.Views/3.3/MultiEncodingView.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable.Views/3.3/MultiEncodingView.cs	(revision 11892)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable.Views/3.3/MultiEncodingView.cs	(revision 11892)
@@ -0,0 +1,145 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Drawing;
+using System.Linq;
+using System.Reflection;
+using System.Windows.Forms;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Problems.Programmable.Views {
+  [View("MultiEncoding View")]
+  [Content(typeof(MultiEncoding), IsDefaultView = true)]
+  public sealed partial class MultiEncodingView : NamedItemView {
+
+    public new MultiEncoding Content {
+      get { return (MultiEncoding)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public MultiEncodingView() {
+      InitializeComponent();
+      addEncodingButton.Text = string.Empty;
+      addEncodingButton.Image = VSImageLibrary.Add;
+      removeEncodingButton.Text = string.Empty;
+      removeEncodingButton.Image = VSImageLibrary.Remove;
+    }
+
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+      Content.EncodingsChanged -= ContentOnEncodingsChanged;
+    }
+
+    protected override void RegisterContentEvents() {
+      Content.EncodingsChanged += ContentOnEncodingsChanged;
+      base.RegisterContentEvents();
+    }
+
+    private void ContentOnEncodingsChanged(object sender, EventArgs eventArgs) {
+      RecreateEncodingsList();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      encodingDetailViewHost.Content = null;
+      RecreateEncodingsList();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      addEncodingButton.Enabled = !Locked && !ReadOnly && Content != null;
+      removeEncodingButton.Enabled = !Locked && !ReadOnly && Content != null
+                                     && encodingsListView.SelectedItems.Count > 0;
+    }
+
+    private void addEncodingButton_Click(object sender, EventArgs e) {
+      using (var dialog = new CreateNewSingleEncodingDialog()) {
+        dialog.ForbiddenNames = Content.Encodings.Select(x => x.Name);
+        if (dialog.ShowDialog() == DialogResult.OK) {
+          IEncoding encoding;
+          try {
+            encoding = (IEncoding)Activator.CreateInstance(dialog.EncodingType, dialog.EncodingName);
+          } catch (MissingMethodException mmex) {
+            PluginInfrastructure.ErrorHandling.ShowErrorDialog(
+              "The encoding must have a constructor that takes the name as a single string argument", mmex);
+            return;
+          } catch (TargetInvocationException tiex) {
+            PluginInfrastructure.ErrorHandling.ShowErrorDialog("The encoding could not be created due to an error in the constructor.", tiex);
+            return;
+          } catch (MethodAccessException maex) {
+            PluginInfrastructure.ErrorHandling.ShowErrorDialog("The encoding's string constructor is not public.", maex);
+            return;
+          }
+          Content.Add(encoding);
+        }
+      }
+    }
+
+    private void removeEncodingButton_Click(object sender, EventArgs e) {
+      var encoding = GetSelectedEncoding();
+      var success = Content.Remove(encoding);
+      encodingDetailViewHost.Content = null;
+      if (!success) MessageBox.Show("Could not remove encoding.", "Error while removing encoding.", MessageBoxButtons.OK, MessageBoxIcon.Error);
+    }
+
+    private void encodingsListView_SelectedIndexChanged(object sender, EventArgs e) {
+      if (encodingsListView.SelectedItems.Count > 0) {
+        var encoding = GetSelectedEncoding();
+        encodingDetailViewHost.Content = encoding;
+      } else encodingDetailViewHost.Content = null;
+      SetEnabledStateOfControls();
+    }
+
+    private IEncoding GetSelectedEncoding() {
+      var selected = encodingsListView.SelectedItems[0];
+      var encodingName = selected.Text;
+      var encoding = Content.Encodings.Single(x => x.Name == encodingName);
+      return encoding;
+    }
+
+    private void RecreateEncodingsList() {
+      encodingsListView.SelectedIndices.Clear();
+      encodingsListView.Items.Clear();
+      if (encodingsListView.SmallImageList != null)
+        foreach (Image img in encodingsListView.SmallImageList.Images) img.Dispose();
+      encodingsListView.SmallImageList = new ImageList();
+      if (Content != null) {
+        foreach (var enc in Content.Encodings)
+          CreateListViewItem(enc);
+      }
+    }
+
+    private void CreateListViewItem(IEncoding enc) {
+      encodingsListView.SmallImageList.Images.Add(enc.ItemImage);
+      var item = new ListViewItem() {
+        ImageIndex = encodingsListView.SmallImageList.Images.Count - 1,
+        Text = enc.Name
+      };
+      item.SubItems.Add(new ListViewItem.ListViewSubItem() {
+        Text = enc.GetType().Name
+      });
+      encodingsListView.Items.Add(item);
+    }
+  }
+}
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/BinaryVectorEncoding.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/BinaryVectorEncoding.cs	(revision 11891)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/BinaryVectorEncoding.cs	(revision 11892)
@@ -73,4 +73,5 @@
 
     public BinaryVectorEncoding() : this("BinaryVector", 10) { }
+    public BinaryVectorEncoding(string name) : this(name, 10) { }
     public BinaryVectorEncoding(int length) : this("BinaryVector", length) { }
     public BinaryVectorEncoding(string name, int length)
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/IntegerVectorEncoding.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/IntegerVectorEncoding.cs	(revision 11891)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/IntegerVectorEncoding.cs	(revision 11892)
@@ -96,4 +96,5 @@
 
     public IntegerVectorEncoding() : this("IntegerVector", 10) { }
+    public IntegerVectorEncoding(string name) : this(name, 10) { }
     public IntegerVectorEncoding(int length) : this("integerVector", length) { }
     public IntegerVectorEncoding(string name, int length, int min = int.MinValue, int max = int.MaxValue, int? step = null)
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/MultiEncoding.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/MultiEncoding.cs	(revision 11891)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/MultiEncoding.cs	(revision 11892)
@@ -40,5 +40,4 @@
     }
 
-
     [StorableConstructor]
     private MultiEncoding(bool deserializing)
@@ -46,5 +45,4 @@
       encodings = new List<IEncoding>();
     }
-
     public override IDeepCloneable Clone(Cloner cloner) { return new MultiEncoding(this, cloner); }
     private MultiEncoding(MultiEncoding original, Cloner cloner)
@@ -75,4 +73,5 @@
         @operator.AddEncoding(encoding);
       }
+      OnEncodingsChanged();
       return this;
     }
@@ -84,4 +83,5 @@
         @operator.RemoveEncoding(encoding);
       }
+      OnEncodingsChanged();
       return success;
     }
@@ -89,4 +89,10 @@
     public override void ConfigureOperators(IEnumerable<IOperator> operators) {
     }
+
+    public event EventHandler EncodingsChanged;
+    private void OnEncodingsChanged() {
+      var handler = EncodingsChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
   }
 }
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/PermutationEncoding.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/PermutationEncoding.cs	(revision 11891)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/PermutationEncoding.cs	(revision 11892)
@@ -98,4 +98,5 @@
 
     public PermutationEncoding() : this("Permutation", 10, PermutationTypes.Absolute) { }
+    public PermutationEncoding(string name) : this(name, 10, PermutationTypes.Absolute) { }
     public PermutationEncoding(int length) : this("Permuration", length, PermutationTypes.Absolute) { }
     public PermutationEncoding(string name, int length, PermutationTypes type)
Index: /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/RealVectorEncoding.cs
===================================================================
--- /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/RealVectorEncoding.cs	(revision 11891)
+++ /branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/RealVectorEncoding.cs	(revision 11892)
@@ -94,4 +94,5 @@
 
     public RealVectorEncoding() : this("RealVector", 10) { }
+    public RealVectorEncoding(string name) : this(name, 10) { }
     public RealVectorEncoding(int length) : this("RealVector", length) { }
     public RealVectorEncoding(string name, int length, double min = double.MinValue, double max = double.MaxValue)
Index: /branches/ProgrammableProblem/ProgrammableProblem.sln
===================================================================
--- /branches/ProgrammableProblem/ProgrammableProblem.sln	(revision 11891)
+++ /branches/ProgrammableProblem/ProgrammableProblem.sln	(revision 11892)
@@ -5,10 +5,4 @@
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.Programmable-3.3", "HeuristicLab.Problems.Programmable\3.3\HeuristicLab.Problems.Programmable-3.3.csproj", "{EE07BFF8-B23D-41F5-8AD7-AC9598D7A2C9}"
-	ProjectSection(ProjectDependencies) = postProject
-		{BB6D334A-4BB6-4674-9883-31A6EBB32CAB} = {BB6D334A-4BB6-4674-9883-31A6EBB32CAB}
-		{DBECB8B0-B166-4133-BAF1-ED67C3FD7FCA} = {DBECB8B0-B166-4133-BAF1-ED67C3FD7FCA}
-		{66D249C3-A01D-42A8-82A2-919BC8EC3D83} = {66D249C3-A01D-42A8-82A2-919BC8EC3D83}
-		{DDFB14DD-2A85-493C-A52D-E69729BBAEB0} = {DDFB14DD-2A85-493C-A52D-E69729BBAEB0}
-	EndProjectSection
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.Programmable.Views-3.3", "HeuristicLab.Problems.Programmable.Views\3.3\HeuristicLab.Problems.Programmable.Views-3.3.csproj", "{6F023B90-2091-40A9-8AC0-B0338DFF8E5F}"
@@ -25,4 +19,10 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Encodings.RealVectorEncoding-3.3", "HeuristicLab.Encodings.RealVectorEncoding\3.3\HeuristicLab.Encodings.RealVectorEncoding-3.3.csproj", "{BB6D334A-4BB6-4674-9883-31A6EBB32CAB}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.ExternalEvaluation-3.4", "HeuristicLab.Problems.ExternalEvaluation\3.4\HeuristicLab.Problems.ExternalEvaluation-3.4.csproj", "{25735DB4-8E54-4A2C-83E3-A60C76565E55}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.ExternalEvaluation.Views-3.4", "HeuristicLab.Problems.ExternalEvaluation.Views\3.4\HeuristicLab.Problems.ExternalEvaluation.Views-3.4.csproj", "{3081630C-9521-47D7-8075-1777C12F212C}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.ExternalEvaluation.GP-3.5", "HeuristicLab.Problems.ExternalEvaluation.GP\3.5\HeuristicLab.Problems.ExternalEvaluation.GP-3.5.csproj", "{B7A64A60-B538-479F-9C47-A3180C458F6C}"
 EndProject
 Global
@@ -124,4 +124,40 @@
 		{BB6D334A-4BB6-4674-9883-31A6EBB32CAB}.Release|x86.ActiveCfg = Release|x86
 		{BB6D334A-4BB6-4674-9883-31A6EBB32CAB}.Release|x86.Build.0 = Release|x86
+		{25735DB4-8E54-4A2C-83E3-A60C76565E55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{25735DB4-8E54-4A2C-83E3-A60C76565E55}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{25735DB4-8E54-4A2C-83E3-A60C76565E55}.Debug|x64.ActiveCfg = Debug|x64
+		{25735DB4-8E54-4A2C-83E3-A60C76565E55}.Debug|x64.Build.0 = Debug|x64
+		{25735DB4-8E54-4A2C-83E3-A60C76565E55}.Debug|x86.ActiveCfg = Debug|x86
+		{25735DB4-8E54-4A2C-83E3-A60C76565E55}.Debug|x86.Build.0 = Debug|x86
+		{25735DB4-8E54-4A2C-83E3-A60C76565E55}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{25735DB4-8E54-4A2C-83E3-A60C76565E55}.Release|Any CPU.Build.0 = Release|Any CPU
+		{25735DB4-8E54-4A2C-83E3-A60C76565E55}.Release|x64.ActiveCfg = Release|x64
+		{25735DB4-8E54-4A2C-83E3-A60C76565E55}.Release|x64.Build.0 = Release|x64
+		{25735DB4-8E54-4A2C-83E3-A60C76565E55}.Release|x86.ActiveCfg = Release|x86
+		{25735DB4-8E54-4A2C-83E3-A60C76565E55}.Release|x86.Build.0 = Release|x86
+		{3081630C-9521-47D7-8075-1777C12F212C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3081630C-9521-47D7-8075-1777C12F212C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{3081630C-9521-47D7-8075-1777C12F212C}.Debug|x64.ActiveCfg = Debug|x64
+		{3081630C-9521-47D7-8075-1777C12F212C}.Debug|x64.Build.0 = Debug|x64
+		{3081630C-9521-47D7-8075-1777C12F212C}.Debug|x86.ActiveCfg = Debug|x86
+		{3081630C-9521-47D7-8075-1777C12F212C}.Debug|x86.Build.0 = Debug|x86
+		{3081630C-9521-47D7-8075-1777C12F212C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{3081630C-9521-47D7-8075-1777C12F212C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{3081630C-9521-47D7-8075-1777C12F212C}.Release|x64.ActiveCfg = Release|x64
+		{3081630C-9521-47D7-8075-1777C12F212C}.Release|x64.Build.0 = Release|x64
+		{3081630C-9521-47D7-8075-1777C12F212C}.Release|x86.ActiveCfg = Release|x86
+		{3081630C-9521-47D7-8075-1777C12F212C}.Release|x86.Build.0 = Release|x86
+		{B7A64A60-B538-479F-9C47-A3180C458F6C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B7A64A60-B538-479F-9C47-A3180C458F6C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B7A64A60-B538-479F-9C47-A3180C458F6C}.Debug|x64.ActiveCfg = Debug|x64
+		{B7A64A60-B538-479F-9C47-A3180C458F6C}.Debug|x64.Build.0 = Debug|x64
+		{B7A64A60-B538-479F-9C47-A3180C458F6C}.Debug|x86.ActiveCfg = Debug|x86
+		{B7A64A60-B538-479F-9C47-A3180C458F6C}.Debug|x86.Build.0 = Debug|x86
+		{B7A64A60-B538-479F-9C47-A3180C458F6C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B7A64A60-B538-479F-9C47-A3180C458F6C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B7A64A60-B538-479F-9C47-A3180C458F6C}.Release|x64.ActiveCfg = Release|x64
+		{B7A64A60-B538-479F-9C47-A3180C458F6C}.Release|x64.Build.0 = Release|x64
+		{B7A64A60-B538-479F-9C47-A3180C458F6C}.Release|x86.ActiveCfg = Release|x86
+		{B7A64A60-B538-479F-9C47-A3180C458F6C}.Release|x86.Build.0 = Release|x86
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
