public MainViewModel(ILogger <MainViewModel> logger, IAcmePdbParser acmePdbParser, Globals globals, IDispatcher dispatcher,
                      ISettingsManager settingsManager, ErrorMessagesViewModel errorMessagesViewModel, IServiceScope scope, IViceBridge viceBridge,
                      IProjectPrgFileWatcher projectPdbFileWatcher, RegistersMapping registersMapping, RegistersViewModel registers,
                      ExecutionStatusViewModel executionStatusViewModel, BreakpointsViewModel breakpointsViewModel)
 {
     this.logger                               = logger;
     this.acmePdbParser                        = acmePdbParser;
     this.Globals                              = globals;
     this.dispatcher                           = dispatcher;
     this.settingsManager                      = settingsManager;
     this.scope                                = scope;
     this.viceBridge                           = viceBridge;
     this.projectPdbFileWatcher                = projectPdbFileWatcher;
     this.executionStatusViewModel             = executionStatusViewModel;
     RegistersViewModel                        = registers;
     BreakpointsViewModel                      = breakpointsViewModel;
     executionStatusViewModel.PropertyChanged += ExecutionStatusViewModel_PropertyChanged;
     uiFactory                          = new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext());
     commandsManager                    = new CommandsManager(this, uiFactory);
     closeOverlaySubscription           = dispatcher.Subscribe <CloseOverlayMessage>(CloseOverlay);
     prgFileChangedSubscription         = dispatcher.Subscribe <PrgFileChangedMessage>(PrgFileChanged);
     prgFilePathChangedSubscription     = dispatcher.Subscribe <PrgFilePathChangedMessage>(PrgFilePathChanged);
     showModalDialogMessageSubscription = dispatcher.Subscribe <ShowModalDialogMessageCore>(OnShowModalDialog);
     ErrorMessagesViewModel             = errorMessagesViewModel;
     ShowSettingsCommand                = commandsManager.CreateRelayCommand(ShowSettings, () => !IsShowingSettings);
     ShowProjectCommand                 = commandsManager.CreateRelayCommand(ShowProject, () => !IsShowingProject && IsProjectOpen);
     TestCommand                        = commandsManager.CreateRelayCommand(Test, () => !IsBusy);
     CreateProjectCommand               = commandsManager.CreateRelayCommand(CreateProject, () => !IsBusy && !IsDebugging);
     OpenProjectFromPathCommand         = commandsManager.CreateRelayCommand <string>(OpenProjectFromPath, _ => !IsBusy && !IsDebugging);
     OpenProjectCommand                 = commandsManager.CreateRelayCommand(OpenProject, () => !IsBusy && !IsDebugging);
     globals.PropertyChanged           += Globals_PropertyChanged;
     CloseProjectCommand                = commandsManager.CreateRelayCommand(CloseProject, () => IsProjectOpen && !IsDebugging);
     ExitCommand                        = new RelayCommand(() => CloseApp?.Invoke());
     ToggleErrorsVisibilityCommand      = new RelayCommand(() => IsShowingErrors = !IsShowingErrors);
     RunCommand                         = commandsManager.CreateRelayCommandAsync(StartDebuggingAsync, () => IsProjectOpen && (!IsDebugging || IsDebuggingPaused));
     StopCommand                        = commandsManager.CreateRelayCommand(StopDebugging, () => IsDebugging);
     PauseCommand                       = commandsManager.CreateRelayCommand(PauseDebugging, () => IsDebugging && !IsDebuggingPaused && IsViceConnected);
     StepIntoCommand                    = commandsManager.CreateRelayCommandAsync(StepIntoAsync, () => IsDebugging && IsDebuggingPaused);
     StepOverCommand                    = commandsManager.CreateRelayCommandAsync(StepOverAsync, () => IsDebugging && IsDebuggingPaused);
     UpdatePdbCommand                   = commandsManager.CreateRelayCommandAsync(UpdatePdbAsync, () => !IsBusy && IsDebugging);
     SwitchContent <DebuggerViewModel>();
     // by default opens most recent project
     if (globals.Settings.RecentProjects.Count > 0)
     {
         OpenProjectFromPath(globals.Settings.RecentProjects[0]);
     }
     stoppedExecution             = new TaskCompletionSource();
     resumedExecution             = new TaskCompletionSource();
     viceBridge.ConnectedChanged += ViceBridge_ConnectedChanged;
     viceBridge.ViceResponse     += ViceBridge_ViceResponse;
     viceBridge.Start();
     requiresBreakpointsRefresh = true;
     if (!Directory.Exists(globals.Settings.VicePath))
     {
         SwitchOverlayContent <SettingsViewModel>();
     }
 }