private int processExecutables(final List<Object> executables, int count) {
		for (final Object executable : executables) {
			if (executable instanceof Call)
			{
				final Call call = (Call) executable;

				String callName = VariableHelper.substituteVariables(call.getName(), getWorkflow().getContext().getVariables());
				final CallReport callReport = new CallReport(callName);
				workflowReport.getCallReports().add(count, callReport);
				callReport.setStartTime(System.currentTimeMillis());
				try {
					processCall(call, count);
				} catch (final Exception e) {
					callReport.setStatus(CallReport.Status.ERROR);
					callReport.setType(e.getClass().getName());
					callReport.setErrorMessage(e);
				}
				callReport.setEndTime(System.currentTimeMillis());


				println("==========================================================================================");


				if (AzotConfig.GLOBAL.INTERACTIVE) {
					Scanner sc = new Scanner(System.in);
					echo("Press 'Enter' to continue... (type 'off' to turn off the interactive mode)");
					String what = sc.nextLine();
					if("off".equalsIgnoreCase(what)) {
						AzotConfig.GLOBAL.INTERACTIVE = false;
					}
				}
				count++;
			}
			else if(executable instanceof WorkflowRef)
			{
				final WorkflowRef workflowRef = (WorkflowRef) executable;
				final Launcher nestedWorkflowLauncher = new Launcher();
				nestedWorkflowLauncher.setFork(workflowRef.isFork());
				final String filename = VariableHelper.substituteVariables(workflowRef.getFilename(), getWorkflow().getContext().getVariables());

				final List<Variable> inheritedVariables = new ArrayList<Variable>();
				if (workflowRef.isFork())
				{
					// In multi-threading, we clone all variables to avoid concurrent modifications
					for (final Variable contextVariable : getWorkflow().getContext().getVariables()) {
						inheritedVariables.add(VariableHelper.clone(contextVariable));
					}
				}
				else
				{
					inheritedVariables.addAll(getWorkflow().getContext().getVariables());
				}

				final List<Variable> workflowVariables = workflowRef.getVariables();
				for (final Variable workflowVariable : workflowVariables) {
					Variable existingVariable = VariableHelper.exist(workflowVariable.getId(), inheritedVariables);
					final Variable newVariable;
					if (existingVariable == null) {
						newVariable = VariableHelper.addOrUpdateVariable(workflowVariable.getId(), workflowVariable.getValue(), workflowVariable.isOverwrite(), workflowVariable.isReport(), inheritedVariables);
					} else {
						newVariable = VariableHelper.clone(workflowVariable);
					}
					final String newValue = VariableHelper.substituteVariables(newVariable.getValue(), inheritedVariables);
					newVariable.setValue(newValue);
				}


				nestedWorkflowLauncher.launch(new File(filename), inheritedVariables);
			}
			else if(executable instanceof Loop)
			{
				final Loop loop = (Loop) executable;
				final String inValue = VariableHelper.substituteVariables(loop.getIn(), getWorkflow().getContext().getVariables());
				if(inValue != null && !inValue.isEmpty()) 
				{
					final Variable inVariable = new Variable();
					inVariable.setId(loop.getVariableId());
					getWorkflow().getContext().getVariables().add(inVariable);
					final String[] inIterationValues = inValue.split(" ");
					for (int i = 0; i < inIterationValues.length; i++) {
						inVariable.setValue(inIterationValues[i]);
						count = processExecutables(loop.getCallsAndWorkflowsAndLoops(), count);
					}
					getWorkflow().getContext().getVariables().remove(inVariable);	
				}
			}
			else if(executable instanceof Repeat)
			{
				final Repeat repeat = (Repeat) executable;
				
				
				if(repeat.getTimes() != null) {
					String srtTimes = repeat.getTimes();
					int times = 0;
					try {
						times = Integer.parseInt(srtTimes);
					} catch (NumberFormatException e1) {
						srtTimes = VariableHelper.substituteVariables(srtTimes, getWorkflow().getContext().getVariables());
						try {
							times = Integer.parseInt(srtTimes);
						} catch (NumberFormatException e2) {
							
						}
					}

					final Variable inVariable = new Variable();
					inVariable.setId(repeat.getVariableId());
					getWorkflow().getContext().getVariables().add(inVariable);
					
					for (int i=0; i<times; i++) {
						inVariable.setValue(String.valueOf(i));
						processExecutables(repeat.getCallsAndWorkflowsAndLoops(), count);
					}
				}
			}
			else if(executable instanceof PluginRef) {
				final PluginRef plugin = (PluginRef) executable;
				PluginsManager.invokePlugin(plugin.getName(), plugin, getWorkflow().getContext().getVariables());
			}
		}
		return count;
	}