/// <summary>
        /// The entry point to the program.
        /// <param name="args">The arguments to this program.</param>
        /// </summary>
        public static void Main(string[] args)
        {
            // Check the pre-conditions:
            if(args.Length < 3)
            {
                Console.WriteLine("Please provide as argument:");
                Console.WriteLine("... (1) the ICCC password");
                Console.WriteLine("... (2) your Ocean server's IP address and port e.g. 127.0.0.1:50000");
                Console.WriteLine("... (3) the port where this instance of the program should use e.g. 51000");
                return;
            }

            // Register the own listener:
            var tmpMessage = new ICCCMyListenerCommand(); Registrar.INSTANCE.addLocalListener(tmpMessage.getChannel(), tmpMessage.getCommand(), ICCCMyListenerReceiver.myListenerReceiver);

            // Run the interactive shell:
            Task.Run(function: input);

            // Get the current version of the program:
            var versionAttribute = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyFileVersionAttribute), true).FirstOrDefault() as AssemblyFileVersionAttribute;

            // Finally, start the ICCC server. Thus, this call will block forever:
            ICCCSetup.INSTANCE.startAndBlock("Example005", versionAttribute.Version, args[0], new string[] { args[1] }, "127.0.0.1:" + args[2]);
        }
        static Task<bool> input()
        {
            printHelp();
            while(true)
            {
                Console.WriteLine("Type help to see all commands!");
                var line = Console.ReadLine(); Console.WriteLine();

                if(line.StartsWith("log="))
                {
                    var messageText = line.Replace("log=", string.Empty);
                    ICCCLog.INSTANCE.logShort("Interactive Ocean Console", LogCategory.APP, LogLevel.INFO, LogMessageName.USER, messageText);
                    Console.WriteLine("Was send to the logging system");
                }

                if(line == "help")
                {
                    printHelp();
                }

                if(line == "send")
                {
                    // Build the message:
                    var message = new ICCCMyListenerCommand();

                    // Bring in some payload i.e. data:
                    message.Factor2Use = 0.48645;
                    message.MyInput2Process = new string[] { "Hello", "World!" };

                    // Send the message:
                    var answer = ICCCConnection.INSTANCE.send2Any(message, ICCCKind.KindALL) as ICCCMyListenerCommandAnswer;

                    // Print the result:
                    if(answer == null)
                    {
                        Console.WriteLine("No answer was present!");
                    }
                    else
                    {
                        Console.WriteLine("The answer is: successful={0}; clusterName={1}", answer.ProcessSuccessful, answer.DestinationClusterName);
                    }
                }

                if(line == "exit")
                {
                    ICCCSetup.INSTANCE.shutdown();
                }

                if(line == "cls")
                {
                    Console.Clear();
                }

                if(line == "ping")
                {
                    var answers = ICCCConnection.INSTANCE.send2All(new ICCCPing(), ICCCKind.KindALL);
                    foreach(var a in answers)
                    {
                        var obj = a as ICCCDefaultAnswer;
                        if(obj != null)
                            Console.WriteLine("ping!");
                    }
                }

                if(line == "version")
                {
                    var answers = ICCCConnection.INSTANCE.send2All(new ICCCGetVersion(), ICCCKind.KindALL);
                    foreach(var a in answers)
                    {
                        var obj = a as ICCCGetVersionAnswer;
                        if(obj != null)
                        {
                            Console.WriteLine("Version: name='{0}', kind={1}, version='{2}'", obj.Name, obj.Kind, obj.Version);
                        }
                    }
                }

                if(line == "NumGen")
                {
                    var answer = ICCCConnection.INSTANCE.send2Any(new ICCCNumGenNext(), ICCCKind.KindOcean);
                    var obj = answer as ICCCNumGenNextAnswer;
                    if(obj != null)
                    {
                        Console.WriteLine("Your next unique number={0}", obj.Number);
                    }
                }
            }

            return Task.FromResult<bool>(true);
        }