{
	"_NOTE" : "THIS FILE MAY BE AUTOGENERATED / COPIED. ONLY MODIFY THE ORIGINAL FILE IN THE FOLDER /sharedData/ !",
	"valid_identifier_types" : [
		["program", "ProgramModel", "Program"],
		["symbol", "SymbolModel", "Symbol"],
		["rule", "RuleModel", "Rule"],
		["file", "FileObjectModel", "FileObject"],
		["tag", "TagModel", "Tag"],
		["message", "MessageModel", "Message"],
		["event", "EventModel", "Event"],
		["option", "OptionModel", "Option"]
	],
	"valid_event_types" : [
		["default"],
		["execute_rule"],
		["execute_option"],
		["present_options"],
		["mention_uncertainty"],
		["execute_program"],
		["wait_for_signal"],
		["user_command"],
		["embedded_website_command"]
	],
	"valid_user_command_event_subtypes" : [
		["initialize", "initialize"],
		["submit_data", "submit_data"],
		["change_parameters", "change_parameters"],
		["create_objects", "create_objects"],
		["import_existing_object", "import_existing_object"]
	],
	"valid_object_creation_triggers" : [
		"out_of_queued_events",
		"chosen_by_priority",
		"system_generated",
		"user_input",
		"created_by_program",
		"created_by_rule",
		"created_by_option",
		"created_by_embedded_website",
		"displaying_list_of_options",
		"mention_uncertainty",
		"error_during_iteration",
		"global_feedback_request"
	],
	"valid_runtime_error_types" : [
		["program_authorization_failure", "the program failed to meet criteria to be allowed to run."],
		["program_timeout", "the program timed out"],
		["program_interrupted_from_outside", "the program was interrupted from the outside (by the user) before it could finish"],
		["program_docker_execution_failed", "the program encountered an unknown error and did not create an error file in the process"],
		["program_failed_with_error_file", "the program encountered an error and created an error file while doing so"],
		["program_result_parsing_failed", "the output of the program could not be parsed correctly"],
		["program_result_processing_failed", "the result of the program could be parsed locally, but an error occured while processing it on the server"],
		["rule_result_processing_failed", "a Rule attempted to do something illegal on the server."],
		["option_result_processing_failed", "an Option attempted to do something illegal on the server."],
		["embedded_website_command_processing_failed", "an embedded website in a html message_component attempted to do something illegal on the server."],
		["user_input_processing_failed", "the User attempted to do something illegal on the server."],
		["file_copying_failed", "a File provided by a user was not copied correctly by a lod-executor."],
		["unexpected_error", "the server encountered an unexpected type of error. This is probably not the fault of the contributors but of the website's designers."]
	],
	"server_url" : "https://elody.com/",
	"debug_server_url" : "http://localhost:9905/",
	"docker_registry" : "elody.com:444",
	"default_local_exec_env_host" : "https://localhost",
	"default_local_exec_env_port" : 5555,
	"json_encoding" : "utf-8",
	"server_post_request_timeout" : 10,
	"lod_executor_exec_env_timeout" : 60,
	"new_program_default_max_execution_duration" : 360000.0,
	"time_limit_for_exec_env_steps_server_response" : 3.0,
	"execution_environment_keep_alive_interval" : 30,
	"persistent_model_caching_duration" : 10,
	"predefined_symbols" : [
		{
			"name" : "?scenario_start",
			"description" : "This Tag is created when a Scenario starts. Its weight is the ID of the Scenario. This Tag is always signalled with weight 1."
		},
		{
			"name" : "?scenario_plan",
			"description" : "This Tag is created when a Scenario starts, if that Scenario was based on a named/saved Scenario Plan. Its weight is the ID of the Scenario Plan and its comment is the name of the Scenario Plan."
		},
		{
			"name" : "?scenario_plan_tags",
			"description" : "This Tag is created when a Scenario starts, if that Scenario was based on a Plan.\nThis Tag is created targeting all of the tags that are created on startup as part of the Plan, as well as the [[symbol:!set_signal_weight]] tags on them, to indicate that they were created as part of the Plan. The weight of this Tag is the number of created tags, excluding [[symbol:!set_signal_weight]] tags."
		},
		{
			"name" : "?scenario_plan_user_trust",
			"description" : "These tags are created when a Scenario starts, if that Scenario was based on a Plan.\nFor each User who should be especially trusted or distrusted, one of these Tags is created. The comment is the ID of the user, the weight is 1 if the user should be trusted (all their Rules are treated as if they had a rating of 5 and moderator approval) and 0 if they should be distrusted (all their Rules are treated as having a rating of zero)."
		},
		{
			"name" : "?scenario_plan_user_trust_internet",
			"description" : "Tags of this type are created along with [[symbol:?scenario_plan_user_trust]] Tags. They target the [[symbol:?scenario_plan_user_trust]] Tags to indicate that the user should be trusted enough to be given full internet access without asking for permission."
		},
		{
			"name" : "?scenario_plan_rule_trust",
			"description" : "These tags are created when a Scenario starts, if that Scenario was based on a Plan.\nFor each Rule that should be especially trusted or distrusted, one of these Tags is created. The comment is the name of the Rule, the weight is 1 if the Rule should be trusted (it is treated as if it had a rating of 5 and moderator approval) and 0 if it should be distrusted (it is treated as having a rating of zero).\nNote about the name of the Rule: If a version is given, the trust/distrust is specific to that version. If no version is given, it applies to all versions of that Rule."
		},
		{
			"name" : "?scenario_plan_only_trust_explicitly",
			"description" : "This Tag is created when a Scenario starts, if that Scenario was based on a Plan.\nIf its weight is 1, Elody will distrust all Rules that aren't explicitly trusted using [[symbol:?scenario_plan_user_trust]] or [[symbol:?scenario_plan_rule_trust]], regardless of their rating."
		},
		{
			"name" : "!scenario_chat_text_input_status",
			"description" : "This Tag is used to enable, disable, or highlight the ability of users to enter text with the chat bar. The comment is composed of multiple parts, separated by hyphens, and defines the behavior.\n\nRequired value: 'disabled' or 'enabled'\nOptional values, if enabled, need to be in correct order: 'once', 'highlighted'\nOptional final value if enabled: 'text:<text>' where <text> is the text that will be displayed on the chatbar.\nAn example: 'enabled-once-text:Describe your problem'\nThis example will enable the chatbox once (for one usage) and ask the user to describe the problem. After the first time the user enters text, the [[symbol:!scenario_chat_text_input_status]] Tag will be ignored and the status will revert to the preceding one.\n\nYou can use [[symbol:!nullify]] to make Elody ignore a Tag of this type, so it will look at the previous one instead.\nThis Symbol is related to the Symbol [[symbol:!scenario_chat_file_input_status]] and [[symbol:!scenario_chat_object_import_input_status]]."
		},
		{
			"name" : "!scenario_chat_file_input_status",
			"description" : "This Tag is used to enable, disable, or highlight the ability of users to upload files. The comment is composed of multiple parts, separated by hyphens, and defines the behavior.\n\nRequired value: 'disabled' or 'enabled'\nOptional values, if enabled, need to be in correct order: 'once', 'highlighted', 'multi'\nAn example: 'enabled-once-multi'\nThis example will enable the file upload once (for one usage) and allow uploading any number of files at once. After the first time the user uploads a file, the [[symbol:!scenario_chat_file_input_status]] Tag will be ignored and the status will revert to the preceding one.\n\nYou can use [[symbol:!nullify]] to make Elody ignore a Tag of this type, so it will look at the previous one instead.\nThis Symbol is related to the Symbol [[symbol:!scenario_chat_text_input_status]] and [[symbol:!scenario_chat_object_import_input_status]]."
		},
		{
			"name" : "!scenario_chat_object_import_input_status",
			"description" : "This Tag is used to enable, disable, or highlight the ability of users to import objects that have previously been created with [[symbol:!export_object]]. The comment is composed of multiple parts, separated by hyphens, and defines the behavior.\n\nRequired value: 'disabled' or 'enabled'\nOptional values, if enabled, need to be in correct order: 'once', 'highlighted', an optional list of export_symbols to allow.\nAn example: 'enabled-once-highlighted-export_type_1-export_type_2'\nThis example will enable the import of objects once (for one usage) while visually highlighting the button. The user can only select objects that have been exported using either the Symbol export_type_1 or export_type_2. After the first time the user imports and object, the [[symbol:!scenario_chat_object_import_input_status]] Tag will be ignored and the status will revert to the preceding one.\n\nYou can use [[symbol:!nullify]] to make Elody ignore a Tag of this type, so it will look at the previous one instead.\nThis Symbol is related to the Symbols [[symbol:!scenario_chat_text_input_status]] and [[symbol:!scenario_chat_file_input_status]]."
		},
		{
			"name" : "!set_idle_message",
			"description" : "This Tag is used to overwrite the idle message Elody will display if there are no Rules or Options eligible to be used under the current parameter settings.\nTo do so, create a Tag with this symbol targeting a hidden Message.\nTarget this Tag with a [[symbol:!nullify]] Tag to deactivate it again. The last non-nullified !set_idle_message will be the active one.\n\nNote that this is related to [[symbol:!set_status_message]]:\n[[symbol:!set_idle_message]] is a normal Message that is generated when the user needs to do something something, and it remains visible after they do.\n[[symbol:!set_status_message]] is not a real Message object but a dummy that is displayed at the bottom of the Scenario so long as there aren't any active Options to choose from."
		},
		{
			"name" : "!set_status_message",
			"description" : "This Tag is used to overwrite the status message Elody displays.\nTo do so, create a Tag with this symbol where the comment is the text you want to display.\nIf the comment is None, a default value is used instead that describes what the lod-executor is currently doing. If the comment is the empty string, no message is displayed.\nTarget this Tag with a [[symbol:!nullify]] Tag to deactivate it again. The last non-nullified !set_status_message will be the active one.\n\nNote that this is related to [[symbol:!set_status_message]]:\n[[symbol:!set_idle_message]] is a normal Message that is generated when the user needs to do something something, and it remains visible after they do.\n[[symbol:!set_status_message]] is not a real Message object but a dummy that is displayed at the bottom of the Scenario so long as there aren't any active Options to choose from."
		},
		{
			"name" : "!nullify",
			"description" : "This Tag is used to deactivate other tags when needed.\nIt does not have a meaning on its own, but nullifies/negates/deactivates/ends other tags.\nNote that this behavior is not recursive: You can't !nullify another !nullify tag."
		},
		{
			"name" : "!offer",
			"description" : "This Tag is used to mark a 'require_' Tag with an offer that may satisfy the requirement.\nThe first argument of an !offer Tag should always be the !require tag. The remaining arguments can be whatever is appropriate and should be documented in the description of the require_ symbol.\nThis is similar to [[symbol:!provide]], but where [[symbol:!provide]] means that the requirement has been met, this symbol just means that it might be able to meet it. Several offers may be made on a require_ Tag before one of them is chosen and used with [[symbol:!provide]]."
		},
		{
			"name" : "!provide",
			"description" : "This Tag is used to mark a 'require_' Tag with something that satisfies the requirement.\nThe first argument of an !offer Tag should always be the !require tag. The remaining arguments can be whatever is appropriate and should be documented in the description of the require_ symbol.\nSee also: [[symbol:!offer]]."
		},
		{
			"name" : "!task",
			"description" : "This Tag is DEPRECATED. It used to be used for tasks, but no longer has any effect."
		},
		{
			"name" : "?user_input_command_file",
			"description" : "A Tag with this symbol targeting a file is created whenever a user enters a text command."
		},
		{
			"name" : "?user_input_uploaded_file",
			"description" : "A Tag with this symbol targeting a file is created whenever a user uploads a file."
		},
		{
			"name" : "?user_input_command_keyword",
			"description" : "Tags with this Symbol are created along with ?user_input_command_file.\nThe comment of the Tag is a word that appeared in the entered text."
		},
		{
			"name" : "?user_input_imported_object",
			"description" : "A Tag with this symbol is created whenever a user imports an object that was created via [[symbol:!export_object]]. Its comment is the description of the object, and its argument is a copy of the export_ Tag that was used to export the object. Keep in mind that the filter used to export the object may have changed since the object was created, if the export_ Symbol was changed in the meantime."
		},
		{
			"name" : "?embedded_website_command",
			"description" : "A Tag with this symbol is created when an embedded website (a message_component of type 'html') sends a command back to Elody. The first argument of the Tag is the Message or Option containing the message_component. The weight is the index of that message_component."
		},
		{
			"name" : "!set_signal_weight",
			"description" : "This Tag decides which symbols are considered active for the purpose of activating Rules.\nCreate a Tag with this symbol targeting another symbol to signal that symbol with a given weight and (optionally) comment.\nYou can also target another Tag instead of a symbol, in which case the symbol of that Tag is used instead.\nNewer instances of this Tag with the same comment overwrite older ones. Using [[symbol:!nullify]] on this Tag causes it to be ignored, but does not set the signal weight back to 0 if there are still other instances of this Tag with the same Symbol and comment as the deactivated one.\nNote about the way Rules work: Each dependency of a Rule is satisfied only if a signal exists that matches the dependency. The dependency matches if the Symbols are the same and the filter string of the dependency is either not required, or is equal to the comment of the !set_signal_weight Tag. The weight of an active dependency is the product of the !set_signal_weight Tag's weight and the dependencies weight. The weights default to 1.0 if they are not given."
		},
		{
			"name" : "!set_option_confidence",
			"description" : "Create a Tag with this symbol targeting an Option to set the confidence of that option to the weight of this Tag."
		},
		{
			"name" : "?set_priority_of_asking_for_input",
			"description" : "A Tag with this symbol targeting nothing is created to set the priority of waiting for user input in a 'default' event.\nAny Rules with a priority below this are ignored."
		},
		{
			"name" : "?set_priority_of_presenting_options",
			"description" : "A Tag with this symbol targeting nothing is created to set the priority of presenting options to the user in a 'default' event."
		},
		{
			"name" : "?set_options_display_threshold",
			"description" : "A Tag with this symbol targeting nothing is created to set the confidence an Option needs to reach in order to be presented to the user when Options are supposed to be used."
		},
		{
			"name" : "?set_options_execution_threshold",
			"description" : "A Tag with this symbol targeting nothing is created to set the confidence an Option needs to reach in order to be executed."
		},
		{
			"name" : "?set_rule_eligibility_min_ratings_count",
			"description" : "A Tag with this symbol with a specific weight targeting nothing is created to specify the minimum number of users that must have rated a Rule for that Rule to be eligible for execution."
		},
		{
			"name" : "?set_rule_eligibility_inherit_rating",
			"description" : "A Tag with this symbol targeting nothing, with comment either 'true' or 'false', is created to specify whether or not a Rule that would not have a large enough number of ratings is eligible for execution anyway if an earlier version of the same rule is eligible."
		},
		{
			"name" : "?set_rule_eligibility_requires_moderator_approval",
			"description" : "A Tag with this symbol targeting nothing, with comment either 'true' or 'false', is created to specify whether or not a Rule must have moderator approval for that Rule to be eligible for execution."
		},
		{
			"name" : "?set_rule_eligibility_always_allow_own_rules",
			"description" : "A Tag with this symbol targeting nothing, with comment either 'true' or 'false', is created to specify whether or not a Rule that was created by the owner of the current Scenario is always eligible for execution, even if it doesn't match some of the requirements."
		},
		{
			"name" : "!default_program_version",
			"description" : "This Tag can be used to specify which version of a Program should be used.\nIt's mostly intended for debugging, since you can use it to specify if the most recent release version or the most recent development version should be used.\nSet the comment of this Tag to one of the following values:\n<program_name>#<version> - use a specific version of the Program.\n<program_name>#release - use the latest release version\n<program_name>#dev - use the latest version, including development versions."
		},
		{
			"name" : "?elody_decision_process",
			"description" : "A Tag with this symbol is generated whenever Elody chooses which Rule or Option to execute next.\nIt targets the Message that is generated to describe the decision process."
		},
		{
			"name" : "?rule_candidate",
			"description" : "When Elody decides what to do next, a Tag with this symbol targeting a Rule is created for each Rule who's dependencies are fulfilled and which is a candidate for being executed in this step.\nThe weight of the Tag is the priority of the rule."
		},
		{
			"name" : "?weight_of_options",
			"description" : "A Tag with this symbol targeting nothing is created along with the ?rule_candidate Tags.\nThe weight of this Tag is the weight of the Options and can be compared to the weight of the Tags."
		},
		{
			"name" : "?named_argument_list",
			"description" : "A variant of [[symbol:?named_argument]] that is applied to named arguments that can refer to a list of objects instead of a single object. The first argument of this Tag is the item that has a named argument, the remaining arguments of this Tag are the objects used as the argument, and the comment of this Tag is the name of the argument."
		},
		{
			"name" : "?named_argument",
			"description" : "A Tag with this symbol targeting two objects and having a comment is created whenever something with named arguments is executed.\nThe first argument of this Tag is the item that has a named argument, the second argument of this Tag is the named argument, and the comment of this Tag is the name of the argument. See also: [[symbol:?named_argument_list]]."
		},
		{
			"name" : "?rule_executed",
			"description" : "A Tag with this symbol targeting a Rule and a number of ?named_argument Tags is created whenever a Rule is executed.\nThe other objects are the arguments the rule was run with."
		},
		{
			"name" : "?elody_decision_process_considers_options",
			"description" : "When Elody decides what to do next and starts looking at the Options, a Tag with this symbol targeting an Option is created for each Option that is a candidate for being executed in this step if it can find suitable arguments and no other Rule or Option takes priority.\nThe weight of the Tag is the confidence of the Option."
		},
		{
			"name" : "?option_candidate",
			"description" : "When Elody decides what to do next and starts looking at the Options, a Tag with this symbol targeting an Option is created for each candidate Option.\nThe weight of the Tag is the weight of the Option."
		},
		{
			"name" : "?option_executed",
			"description" : "A Tag with this symbol targeting an Option and a number of ?named_argument Tags is created whenever an Option is executed.\nThe ?named_argument Tags denote the arguments the Option was run with. If the weight of this Tag is null, the Option was executed automatically. If the weight is an integer, the Option was manually selected by the user and the integer denotes which of the buttons of the Option was clicked."
		},
		{
			"name" : "?presented_option",
			"description" : "A Tag with this symbol targeting an Option and a number of ?named_argument Tags is automatically created when a group of Options is presented."
		},
		{
			"name" : "?present_options",
			"description" : "A Tag with this symbol targeting a number of ?presented_option Tags is automatically created when a group of Options is presented."
		},
		{
			"name" : "?selected_option",
			"description" : "A Tag with this symbol targeting an Option and a ?present_options Tag group is automatically created when an option is selected from a group of options."
		},
		{
			"name" : "!deactivate_rule_or_option",
			"description" : "Create a Tag with this symbol targeting a Rule or an Option to deactivate it and remove it from being listed in the Decision Process. A Rule or Option with this Tag is ignored when Elody chooses what to execute next.\nThis can be reversed by using [[symbol:!nullify]] on this Tag."
		},
		{
			"name" : "?deactivated_automatically",
			"description" : "This is created along with [[symbol:!deactivate_rule_or_option]], targeting both that Tag and the Rule/Option, when a Rule/Option deactivates itself. This can happen because of a condition in its deactivate_if clause, or because it has 'repeat' == 'never'."
		},
		{
			"name" : "?deactivated_due_to_error",
			"description" : "This is created along with [[symbol:!deactivate_rule_or_option]], targeting both that Tag and the Rule/Option, when a Rule/Option is deactivated because an error occurred during its execution."
		},
		{
			"name" : "?program_executed",
			"description" : "A Tag with this symbol targeting a Program and a number of other objects is created whenever a Program is executed.\nThe other objects are the arguments the Program was run with."
		},
		{
			"name" : "?program_execution_results",
			"description" : "A Tag with this symbol targeting a ?program_executed Tag and a number of file objects is created whenever a Program is done executing."
		},
		{
			"name" : "?event_failure",
			"description" : "A Tag with this symbol is created whenever an event failed to execute correctly."
		},
		{
			"name" : "!external_domain_request",
			"description" : "Create a Tag with this symbol to indicate that you need the user to grant access to an external domain. The comment of the Tag is the domain. This Tag is also created automatically when needed, but you can create it manually so you can check in advance. Works with [[symbol:?external_domain_request_presented]] and [[symbol:?external_domain_request_accepted]]."
		},
		{
			"name" : "?external_domain_request_accepted",
			"description" : "A Tag with this symbol is attached to a [[symbol:!external_domain_request]] when the user grants access to the domain."
		},
		{
			"name" : "!export_object",
			"description" : "Create a Tag with this Symbol to export an object from this Scenario so that it can be loaded into other Scenarios. Use [[symbol:!scenario_chat_object_import_input_status]] to enable the import of objects created with [[symbol:!export_object]].\n\nExported objects can be files and/or structures of Tags that form a directed acyclic graph. Any objects referenced by exported Tags that are not themselves exported are replaced with [[symbol:?placeholder_for_missing_value]].\n\nThe comment of this Tag is the description that will be given to the exported object. This Tag must have exactly one argument, which must be a Tag with a Symbol that starts with 'export_'. That export_ Tag defines the object that will be extracted as follows:\n\nThe arguments of the export_ Tags are the starting point of the extraction process. There must be at least one, and several unrelated objects can be extracted at once.\n\nThe export process expands outwards from the starting points by looking at all Tags targeting them, and all arguments targeted by Tags that are already selected. Each encountered Tag is compared to a filter and is ignored if it doesn't match that filter.\n\nThe filter with which Tags are compared is defined in the description of the export_ Symbol. Note that this means that the filter can change over time if the export_ Symbol's description is updated. If you don't want this, you can also set the comment of the export_ Tag with an alternative filter: Doing so will overwrite the default filter.\n\nThe filter of an export_ Symbol is taken from the Symbol's description as follows: There must be 5 consecutive dashes in the description (-----), followed by a structure in the same simplified JSON format as is used to define Rules. This structure has the following values:\n\n-'name': A short and descriptive name for the datatype you are extracting. This is displayed to endusers when loading the object.\n\n-'tags': A list of symbol names to be exported. This determines the filter of the export process. Each entry in this list can be a valid symbol name, or a valid regex. If it is a regex, the filter will accept any Tag who's Symbol matches the regex. For example, the regex 'info_.*' will ensure that all Tags beginning with the prefix 'info_' match the export filter.\n\n-'nullify': Valid values are 'cleansed' (default) and 'explicit'. If the value is 'cleansed', all Tags encountered by the export process that have a [[symbol:!nullify]] Tag on them are ignored (special case: If they are referred to by another Tag that is being exported, they are kept but get explicitly marked with [[symbol:!nullify]]). If the value is 'explicit', [[symbol:!nullify]] Tags get no special treatment.\n\nNote that Files will only be exported if the export_ Tag lists them directly, as the filter will ignore any files it encounters and replace them with [[symbol:?placeholder_for_missing_value]]."
		},
		{
			"name" : "?placeholder_for_missing_value",
			"description" : "See [[symbol:!export_object]] for a description of this Symbol."
		}
	]
}
