public override void Initialize(Response response, Table args)
		{
#if DOTNET_CORE
			SendText("Connected to MoonSharp {0} [{1}]",
					 Script.VERSION,
					 Script.GlobalOptions.Platform.GetPlatformName());
#else
			SendText("Connected to MoonSharp {0} [{1}] on process {2} (PID {3})",
					 Script.VERSION,
					 Script.GlobalOptions.Platform.GetPlatformName(),
					 System.Diagnostics.Process.GetCurrentProcess().ProcessName,
					 System.Diagnostics.Process.GetCurrentProcess().Id);
#endif

			SendText("Debugging script '{0}'; use the debug console to debug another script.", m_Debug.Name);

			SendText("Type '!help' in the Debug Console for available commands.");

			SendResponse(response, new Capabilities()
			{
				// This debug adapter does not need the configurationDoneRequest.
				supportsConfigurationDoneRequest = false,

				// This debug adapter does not support function breakpoints.
				supportsFunctionBreakpoints = false,

				// This debug adapter doesn't support conditional breakpoints.
				supportsConditionalBreakpoints = false,

				// This debug adapter does not support a side effect free evaluate request for data hovers.
				supportsEvaluateForHovers = false,

				// This debug adapter does not support exception breakpoint filters
				exceptionBreakpointFilters = new object[0]
			});

			// Debugger is ready to accept breakpoints immediately
			SendEvent(new InitializedEvent());

			m_Debug.Client = this;
		}
		public void SendErrorResponse(Response response, int id, string format, object arguments = null, bool user = true, bool telemetry = false)
		{
			var msg = new Message(id, format, arguments, user, telemetry);
			var message = Utilities.ExpandVariables(msg.format, msg.variables);
			response.SetErrorBody(message, new ErrorResponseBody(msg));
			SendMessage(response);
		}
		protected abstract void DispatchRequest(string command, Table args, Response response);
		public override void Continue(Response response, Table arguments)
		{
			SendList();
			SendResponse(response);
		}
		public override void Variables(Response response, Table arguments)
		{
			SendResponse(response);
		}
		public override void StepOut(Response response, Table arguments)
		{
			SendList();
			SendResponse(response);
		}
		public override void SetBreakpoints(Response response, Table args)
		{
			SendResponse(response);
		}
		public abstract void Evaluate(Response response, Table arguments);
		public abstract void SetBreakpoints(Response response, Table arguments);
		public virtual void SetExceptionBreakpoints(Response response, Table arguments)
		{
		}
		public abstract void Disconnect(Response response, Table arguments);
		public abstract void Attach(Response response, Table arguments);
		public abstract void Launch(Response response, Table arguments);
		public abstract void Initialize(Response response, Table args);
		protected override void DispatchRequest(string command, Table args, Response response)
		{
			if (args == null)
			{
				args = new Table(null);
			}

			try
			{
				switch (command)
				{

					case "initialize":

						if (args["linesStartAt1"] != null)
						_clientLinesStartAt1 = args.Get("linesStartAt1").ToObject<bool>();

						var pathFormat = args.Get("pathFormat").ToObject<string>();
						if (pathFormat != null)
						{
							switch (pathFormat)
							{
								case "uri":
									_clientPathsAreURI = true;
									break;
								case "path":
									_clientPathsAreURI = false;
									break;
								default:
									SendErrorResponse(response, 1015, "initialize: bad value '{_format}' for pathFormat", new { _format = pathFormat });
									return;
							}
						}
						Initialize(response, args);
						break;

					case "launch":
						Launch(response, args);
						break;

					case "attach":
						Attach(response, args);
						break;

					case "disconnect":
						Disconnect(response, args);
						break;

					case "next":
						Next(response, args);
						break;

					case "continue":
						Continue(response, args);
						break;

					case "stepIn":
						StepIn(response, args);
						break;

					case "stepOut":
						StepOut(response, args);
						break;

					case "pause":
						Pause(response, args);
						break;

					case "stackTrace":
						StackTrace(response, args);
						break;

					case "scopes":
						Scopes(response, args);
						break;

					case "variables":
						Variables(response, args);
						break;

					case "source":
						Source(response, args);
						break;

					case "threads":
						Threads(response, args);
						break;

					case "setBreakpoints":
						SetBreakpoints(response, args);
						break;

					case "setFunctionBreakpoints":
						SetFunctionBreakpoints(response, args);
						break;

					case "setExceptionBreakpoints":
						SetExceptionBreakpoints(response, args);
						break;

					case "evaluate":
						Evaluate(response, args);
						break;

					default:
						SendErrorResponse(response, 1014, "unrecognized request: {_request}", new { _request = command });
						break;
				}
			}
			catch (Exception e)
			{
				SendErrorResponse(response, 1104, "error while processing request '{_request}' (exception: {_exception})", new { _request = command, _exception = e.Message });
			}

			if (command == "disconnect")
			{
				Stop();
			}
		}
		public virtual void Source(Response response, Table arguments)
		{
			SendErrorResponse(response, 1020, "Source not supported");
		}
		public abstract void Threads(Response response, Table arguments);
		public abstract void Continue(Response response, Table arguments);
		public override void Evaluate(Response response, Table args)
		{
			var expression = getString(args, "expression");
			var context = getString(args, "context") ?? "hover";

			if (context == "repl")
				ExecuteRepl(expression);

			SendResponse(response);
		}
		public abstract void Next(Response response, Table arguments);
		public override void StackTrace(Response response, Table args)
		{
			SendResponse(response);
		}
		public abstract void StepOut(Response response, Table arguments);
		public override void Threads(Response response, Table arguments)
		{
			var threads = new List<Thread>() { new Thread(0, "Main Thread") };
			SendResponse(response, new ThreadsResponseBody(threads));
		}
		public abstract void Pause(Response response, Table arguments);
		public override void Attach(Response response, Table arguments)
		{
			SendResponse(response);
		}
		public abstract void StackTrace(Response response, Table arguments);
		public override void Disconnect(Response response, Table arguments)
		{
			SendResponse(response);
		}
		public abstract void Scopes(Response response, Table arguments);
		private void Dispatch(string req)
		{
			try
			{
				Table request = JsonTableConverter.JsonToTable(req);
				if (request != null && request["type"].ToString() == "request")
				{
					if (TRACE)
						Console.Error.WriteLine(string.Format("C {0}: {1}", request["command"], req));

					var response = new Response(request);

					DispatchRequest(request.Get("command").String, request.Get("arguments").Table, response);

					SendMessage(response);
				}
			}
			catch
			{
			}
		}
		public abstract void Variables(Response response, Table arguments);