a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/* $Id$ */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/** @file
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * VBox Debugger GUI - Statistics.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * Copyright (C) 2006-2010 Oracle Corporation
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * available from http://www.virtualbox.org. This file is free software;
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * you can redistribute it and/or modify it under the terms of the GNU
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * General Public License (GPL) as published by the Free Software
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#ifndef ___Debugger_VBoxDbgStats_h
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#define ___Debugger_VBoxDbgStats_h
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include "VBoxDbgBase.h"
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QTreeView>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QTimer>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QComboBox>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QMenu>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncclass VBoxDbgStats;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncclass VBoxDbgStatsModel;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/** Pointer to a statistics sample. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsynctypedef struct DBGGUISTATSNODE *PDBGGUISTATSNODE;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/** Pointer to a const statistics sample. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsynctypedef struct DBGGUISTATSNODE const *PCDBGGUISTATSNODE;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * The VM statistics tree view.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync * A tree representation of the STAM statistics.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncclass VBoxDbgStatsView : public QTreeView, public VBoxDbgBase
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Q_OBJECT;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncpublic:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Creates a VM statistics list view widget.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_pDbgGui Pointer to the debugger gui object.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_pModel The model. Will take ownership of this and delete it together
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * with the view later
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_pParent Parent widget.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync VBoxDbgStatsView(VBoxDbgGui *a_pDbgGui, VBoxDbgStatsModel *a_pModel, VBoxDbgStats *a_pParent = NULL);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Destructor. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync virtual ~VBoxDbgStatsView();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Updates the view with current information from STAM.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * This will indirectly update the m_PatStr.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param rPatStr Selection pattern. NULL means everything, see STAM for further details.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void updateStats(const QString &rPatStr);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Resets the stats items matching the specified pattern.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * This pattern doesn't have to be the one used for update, thus m_PatStr isn't updated.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param rPatStr Selection pattern. NULL means everything, see STAM for further details.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void resetStats(const QString &rPatStr);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync /**
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync * Resizes the columns to fit the content.
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync */
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync void resizeColumnsToContent();
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncprotected:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Expands or collapses a sub-tree.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_rIndex The root of the sub-tree.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_fExpanded Expand/collapse.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void setSubTreeExpanded(QModelIndex const &a_rIndex, bool a_fExpanded);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Popup context menu.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_pEvt The event.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync virtual void contextMenuEvent(QContextMenuEvent *a_pEvt);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncprotected slots:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Slot for handling the view/header context menu.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_rPos The mouse location.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void headerContextMenuRequested(const QPoint &a_rPos);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** @name Action signal slots.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @{ */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void actExpand();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void actCollapse();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void actRefresh();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void actReset();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void actCopy();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void actToLog();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void actToRelLog();
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync void actAdjColumns();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** @} */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncprotected:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Pointer to the data model. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync VBoxDbgStatsModel *m_pModel;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The current selection pattern. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QString m_PatStr;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The parent widget. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync VBoxDbgStats *m_pParent;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Leaf item menu. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QMenu *m_pLeafMenu;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Branch item menu. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QMenu *m_pBranchMenu;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** View menu. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QMenu *m_pViewMenu;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The menu that's currently being executed. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QMenu *m_pCurMenu;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The current index relating to the context menu.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Considered invalid if m_pCurMenu is NULL. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QModelIndex m_CurIndex;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Expand Tree action. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QAction *m_pExpandAct;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Collapse Tree action. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QAction *m_pCollapseAct;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Refresh Tree action. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QAction *m_pRefreshAct;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Reset Tree action. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QAction *m_pResetAct;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Copy (to clipboard) action. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QAction *m_pCopyAct;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** To Log action. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QAction *m_pToLogAct;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** To Release Log action. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QAction *m_pToRelLogAct;
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync /** Adjust the columns. */
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync QAction *m_pAdjColumns;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#if 0
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Save Tree (to file) action. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QAction *m_SaveFileAct;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Load Tree (from file) action. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QAction *m_LoadFileAct;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Take Snapshot action. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QAction *m_TakeSnapshotAct;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Load Snapshot action. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QAction *m_LoadSnapshotAct;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Diff With Snapshot action. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QAction *m_DiffSnapshotAct;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#endif
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync};
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * The VM statistics window.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * This class displays the statistics of a VM. The UI contains
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * a entry field for the selection pattern, a refresh interval
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * spinbutton, and the tree view with the statistics.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncclass VBoxDbgStats : public VBoxDbgBaseWindow
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Q_OBJECT;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncpublic:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Creates a VM statistics list view widget.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_pDbgGui Pointer to the debugger gui object.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pszPat Initial selection pattern. NULL means everything. (See STAM for details.)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param uRefreshRate The refresh rate. 0 means not to refresh and is the default.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pParent Parent widget.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync VBoxDbgStats(VBoxDbgGui *a_pDbgGui, const char *pszPat = NULL, unsigned uRefreshRate= 0, QWidget *pParent = NULL);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Destructor. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync virtual ~VBoxDbgStats();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncprotected:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Destroy the widget on close.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_pCloseEvt The close event.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync virtual void closeEvent(QCloseEvent *a_pCloseEvt);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync /**
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync * Event filter for various purposes.
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync *
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync * @param pWatched The object event came to.
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync * @param pEvent The event being handled.
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync */
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync virtual bool eventFilter(QObject *pWatched, QEvent *pEvent);
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncprotected slots:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Apply the activated combobox pattern. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void apply(const QString &Str);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The "All" button was pressed. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void applyAll();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Refresh the data on timer tick and pattern changed. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void refresh();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Set the refresh rate.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param iRefresh The refresh interval in seconds.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void setRefresh(int iRefresh);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Change the focus to the pattern combo box.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void actFocusToPat();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncprotected:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The current selection pattern. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QString m_PatStr;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The pattern combo box. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QComboBox *m_pPatCB;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The refresh rate in seconds.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * 0 means not to refresh. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync unsigned m_uRefreshRate;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The refresh timer .*/
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QTimer *m_pTimer;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The tree view widget. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync VBoxDbgStatsView *m_pView;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Move to pattern field action. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QAction *m_pFocusToPat;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync};
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#endif
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync